29 Mart 2025 Cumartesi

WxRuby3 ile Masaüstü Uygulama Geliştirmek 5

https://ujk-ujk.blogspot.com/2025/03/wxruby3-ile-masaustu-uygulama_29.html
İçindekiler +


Selam, WxRuby öğrenmeye kendi widget'larımızı üreterek devam ediyoruz. 


Kendi Wx Nesnemizi Tanımlamak  

GUI araç kitlerinde genelde button'lar, text widget'lar, scrollbar'lar, slider'lar gibi temel elemanlar olur. Her istediğimizi barındırmaları mümkün değil tabi ki. Daha gelişmiş elemanları programcı kendi üretir. 

Kendi widget'ımızı iki yolla üretebiliriz. Ya mevcut bir nesneyi değiştiririz ya da sıfırdan yeni bir widget tanımlarız.


Bir Hyperlink nesnesi

İlk örneğimizde bir link yazısı nesnesi yapacağız. Bunu geliştirirken mevcut olan Wx::StaticText nesnesini kullanacağız. 


hyperlink.rb

require "wx"

class Link < Wx::StaticText

  def initialize(*args)
      super *args

      @font1 = Wx::Font.new 11, Wx::FONTFAMILY_SWISS, Wx::FONTSTYLE_NORMAL,
        Wx::FONTWEIGHT_BOLD, true, 'Verdana'
      @font1 = Wx::Font.new   Wx::FontInfo.new(11).bold.underlined.
        family(Wx::FONTFAMILY_SWISS).face_name('Verdana')

      @font2 = Wx::Font.new 11, Wx::FONTFAMILY_SWISS, Wx::FONTSTYLE_NORMAL,
        Wx::FONTWEIGHT_BOLD, false, 'Verdana'
      @font2 = Wx::Font.new   Wx::FontInfo.new(11).bold.
        family(Wx::FONTFAMILY_SWISS).face_name('Verdana')

      set_font @font2
      set_foreground_colour '#0000ff'

      evt_mouse_events :on_mouse_event
      evt_motion :on_mouse_event
  end

  def url=(url)
    @url = url
  end

  def on_mouse_event(e)
   
    if e.moving
      set_cursor Wx::Cursor.new(Wx::CURSOR_HAND)
      set_font @font1

    elsif e.left_up
      system "start #{@url}"

    else
      set_cursor Wx::NULL_CURSOR
      set_font @font2
    end

    e.skip
  end
end

class Örnek < Wx::Frame
  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    set_size [450, 150]
    set_title "Kendi Widget'ım"
    centre

    panel = Wx::Panel.new self

    vbox = Wx::BoxSizer.new Wx::VERTICAL
    hbox = Wx::BoxSizer.new Wx::HORIZONTAL

    st = Wx::StaticText.new panel, label: 'Web sitesine gidiniz:'
    st.font = Wx::Font.new Wx::FontInfo.new(11).bold.
      family(Wx::FONTFAMILY_SWISS).face_name('Verdana')
    hbox.add st, 0, Wx::LEFT, 20

    link_wid = Link.new panel, label: 'Boş Gezenin Boş Kalfası'
    link_wid.url = 'http://www.ujk-ujk.blogspot.com'
    hbox.add link_wid, 0, Wx::LEFT, 20

    vbox.add hbox, 0, Wx::TOP, 30
    panel.sizer = vbox
  end
end

Wx::App.run {
  Örnek.new(nil).show
}


Hyperlink widget'ımız mevcut bir widget'dan yapıldı. Hazır bir sınıfı alıp küçük modifikasyonlar yaptık. 

      set_font @font2
      set_foreground_colour '#0000ff'

Link nesnemizin yazı rengini mavi olarak belirliyoruz. 

      @font1 = Wx::Font.new 11, Wx::FONTFAMILY_SWISS, Wx::FONTSTYLE_NORMAL,
        Wx::FONTWEIGHT_BOLD, true, 'Verdana'
      @font1 = Wx::Font.new   Wx::FontInfo.new(11).bold.underlined.
        family(Wx::FONTFAMILY_SWISS).face_name('Verdana')

      @font2 = Wx::Font.new 11, Wx::FONTFAMILY_SWISS, Wx::FONTSTYLE_NORMAL,
        Wx::FONTWEIGHT_BOLD, false, 'Verdana'
      @font2 = Wx::Font.new   Wx::FontInfo.new(11).bold.
        family(Wx::FONTFAMILY_SWISS).face_name('Verdana')

Burada örnek olsun diye @font1 (altı çizili yazı) ve @font2 (normal yazı) fontlarının üretimini iki değişik teknikte gösterdim, istediğimizi kullanabiliriz, fikir olsun. 

    if e.moving
      set_cursor Wx::Cursor.new(Wx::CURSOR_HAND)
      set_font @font1

movig değeri bir mouse olay nesnesinde , mouse'un obje üzerinde olduğu ve butonlarının basılı olmadığını gösterir, buton basılıysa dragging özelliği true olur. Kursör yazı üzerine gelince "el" şeklini alıyor ve yazı altı çizgili font'a geçiyor. 

    elsif e.left_up
      system "start #{@url}"

Link üzerinde tıklanıp bırakınca bir sistem komutuyla web sayfası @url adresini sistemde default tarayıcıda açarız. 




Yanan widget

Bu örnekte bir widget'ı baştan tanımlayacağız. Pencere altına bir Wx::Panel nesnesi yerleştirip yeni widget'ımızı orada çizeceğiz. Eğer bir CD ya da DVD yazıyorsanız buna benzer bir şey görürsünüz. 

burning.rb

require "wx"

class Burning < Wx::Panel

  def initialize(parent)
      super parent, size: [-1, 30], style: Wx::SUNKEN_BORDER

      @parent = parent
      @font = Wx::Font.new 9, Wx::FONTFAMILY_DEFAULT, Wx::FONTSTYLE_NORMAL,
            Wx::FONTWEIGHT_NORMAL, false, 'Courier 10 Pitch'

      evt_paint :on_paint
      evt_size :on_size
  end

  def on_paint(e)
    num = (75..700).step(75).to_a

    self.paint do |dc|
      dc.set_font @font
      w, h = get_size

      @cw = @parent.get_parent.cw

      step = (w / 10.0).round.to_i

      j = 0

      till = (w / 750.0 * @cw).to_i
      full = (w / 750.0 * 700).to_i

      if @cw >= 700
        dc.pen = Wx::Pen.new '#FFFFB8'
        dc.brush = Wx::Brush.new '#FFFFB8'
        dc.draw_rectangle 0, 0, full, 30
        dc.pen = Wx::Pen.new '#ffafaf'
        dc.brush = Wx::Brush.new '#ffafaf'
        dc.draw_rectangle full, 0, till-full, 30

      else
        dc.pen = Wx::Pen.new '#FFFFB8'
        dc.brush = Wx::Brush.new '#FFFFB8'
        dc.draw_rectangle 0, 0, till, 30
      end

      dc.pen = Wx::Pen.new '#5C5142'

      (step..10*step).step(step).each do |i|
        dc.draw_line i, 0, i, 6
        width, height = dc.get_text_extent num[j].to_s
        dc.draw_text num[j].to_s, i-width/2, 8
        j = j + 1
      end
    end
       
  end

  def on_size(e)
    refresh
  end
end

class Örnek < Wx::Frame
  attr_accessor :cw
  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    set_size [350, 250]
    set_title "Kendi Widget'ım"
    centre

    @cw = 75

    panel = Wx::Panel.new self
    center_panel = Wx::Panel.new panel

    @sld = Wx::Slider.new center_panel, Wx::ID_ANY, 75, 0, 750,
        size: [200, -1], style: Wx::SL_LABELS

    vbox = Wx::BoxSizer.new Wx::VERTICAL
    hbox = Wx::BoxSizer.new Wx::HORIZONTAL
    hbox2 = Wx::BoxSizer.new Wx::HORIZONTAL
    hbox3 = Wx::BoxSizer.new Wx::HORIZONTAL

    @wid = Burning.new panel
    hbox.add @wid, 1, Wx::EXPAND

    hbox2.add center_panel, 1, Wx::EXPAND
    hbox3.add @sld, 0, Wx::LEFT|Wx::TOP, 35

    center_panel.sizer = hbox3

    vbox.add hbox2, 1, Wx::EXPAND
    vbox.add hbox, 0, Wx::EXPAND

    evt_scroll :on_scroll

    panel.sizer = vbox

    @sld.set_focus
  end

  def on_scroll(e)
    @cw = @sld.value
    @wid.refresh
  end
end

Wx::App.run {
  Örnek.new(nil).show
}


Bu widget ile örneğin CD'de dolu alanı ve kalanı görebiliyoruz. Widget görünümünü bir slider değerine göre değiştiriyoruz. Eğer değer 700'ü geçerse renk kırmızıya geçiyor. 

      w, h = get_size

      @cw = @parent.get_parent.cw

....

      till = (w / 750.0 * @cw).to_i
      full = (w / 750.0 * 700).to_i

Widget boyaması pencere boyutu ile orantılı oluyor. İçinde bulunulan pencereden @cw (yani slider) değerini alıyoruz. till değişkeninde o anki değere karşı widget ne kadarı boyanacağı var. full değişkeninde is nereden sonra kırmızı renge geçileceğiz var. 

Boyama 3 adımda oluyor, önce sarı bölge dikdörtgen olarak çiziliyor, sonra varsa kırmızı bölüm dikdörtgen olarak çiziliyor, en son hepsinin üzerine cetvel çizgileri ve skala yazıları yazılıyor. 

  def on_size(e)
    refresh
  end

Pencere boyutu değişirse widget'ımızı tekrar boyuyoruz. 

  def on_scroll(e)
    @cw = @sld.value
    @wid.refresh
  end

Slider kaydırılınca değerini @cw değişkenine alıyoruz ve widget'ımız @wid nesnesini tekrar boyuyoruz. 




CPU nesnesi

Bazı uygulamalar vardır , CPU kullanımı, sıcaklık, hafıza kullanımı vs. sistem bilgilerini gösterir. Özelleştirilmiş widget'lar uygulamayı daha çekici yapar. 

Aşağıdaki widget sistem uygulamalarında kullanılabilir. 

cpu.rb

require "wx"

class CPU < Wx::Panel

  def initialize(parent)
      super parent, size: [80, 110]

      @parent = parent
      set_background_colour '#000000'

      evt_paint :on_paint
  end

  def on_paint(e)

    self.paint do |dc|
      dc.set_device_origin 0, -100
      dc.set_axis_orientation true, true

      pos = parent.get_parent.get_parent.sel
      rect = pos / 5

      (1..21).each do |i|

        if i > rect
         
          dc.brush = Wx::Brush.new '#075100'
          dc.draw_rectangle 10, i*4, 30, 5
          dc.draw_rectangle 41, i*4, 30, 5

        else
          dc.brush = Wx::Brush.new '#36ff27'
          dc.draw_rectangle 10, i*4, 30, 5
          dc.draw_rectangle 41, i*4, 30, 5
        end
      end
    end
  end
end

class Örnek < Wx::Frame
  attr_accessor :sel
  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    set_size [350, 250]
    set_title "CPU"
    centre

    @sel = 0

    panel = Wx::Panel.new self
    center_panel = Wx::Panel.new panel

    @cpu = CPU.new center_panel

    hbox = Wx::BoxSizer.new Wx::HORIZONTAL

    @slider = Wx::Slider.new panel, Wx::ID_ANY, @sel, 0, 100,
        size: [-1, 100], style: Wx::VERTICAL | Wx::SL_INVERSE
    @slider.set_focus

    hbox.add center_panel, 0,  Wx::LEFT | Wx::TOP, 20
    hbox.add @slider, 0, Wx::LEFT | Wx::TOP, 30

    panel.sizer = hbox

    evt_scroll :on_scroll
  end

  def on_scroll(e)
    @sel = e.get_int
    @cpu.refresh
  end
end

Wx::App.run {
  Örnek.new(nil).show
}


Siyah bir panel yapıp içine ince dikdörtgenler çizdik. Dikdörtgenlerin renkleri slider değerine göre değişiyor. 

      dc.set_device_origin 0, -100
      dc.set_axis_orientation true, true

Bu satırlar koordinatları sol alta göre hesaplamak üzerine yazılmış Bunun yerine dikdörtgenler çizerken basit bir hesapla da aşağıdan yukarıya doğru çizilmesi sağlanabilirdi. 

      pos = parent.get_parent.get_parent.sel
      rect = pos / 5

Slider pozisyonunu içinde bulunduğumuz pencerenin @sld değerinden alıyoruz. Slider 0-100 arası olup bizde 20 dikdörtgen boyanacağı için değeri 5'e bölüp parlak renkli dikdörtgen sayısını buluyoruz. 

  attr_accessor :sel

Bu satır sayesinde dışarıdan nesne oluşum değişkeni @sld'ye erişebiliyoruz. 

      (1..21).each do |i|

        if i > rect
         
          dc.brush = Wx::Brush.new '#075100'
          dc.draw_rectangle 10, i*4, 30, 5
          dc.draw_rectangle 41, i*4, 30, 5

        else
          dc.brush = Wx::Brush.new '#36ff27'
          dc.draw_rectangle 10, i*4, 30, 5
          dc.draw_rectangle 41, i*4, 30, 5
        end
      end

rect değerine kadar parlak yeşil , sonrası silik yeşil 21 çift dikdörtgen çiziyoruz. 

İşte orijin değiştirmeden eksen döndürmeden burada draw_rectangle metodunun sadece 2. argümanlarına müdahale edip default eksenlerde de çizebiliriz. 

#dc.set_device_origin 0, -100
      #dc.set_axis_orientation true, true

      pos = parent.get_parent.get_parent.sel
      rect = pos / 5

      (1..21).each do |i|

        if i > rect
         
          dc.brush = Wx::Brush.new '#075100'
          dc.draw_rectangle 10, 100-i*4, 30, 5
          dc.draw_rectangle 41, 100-i*4, 30, 5

        else
          dc.brush = Wx::Brush.new '#36ff27'
          dc.draw_rectangle 10, 100-i*4, 30, 5
          dc.draw_rectangle 41, 100-i*4, 30, 5
        end
      end

Çıktımız





WxRuby Uygulama Şablonları 

Eğlenceli bir bölüme daha girdik. Şimdiye kadar hep elemanları gördük ama pek de uygulama gibi görünmüyorlardı. Bu bölümde bazı iyi tanıdığımız uygulamaların benzerlerini WxRuby kullanarak nasıl yaparız, onu deneyeceğiz. 



Dosya yöneticisi

File Hunter bir dosya yöneticinin iskeleti. Unix sistemlerdeki Krusader dosya yöneticisinin görünümünü canlandırıyor. Splitter widget üzerinde çift tıklarsak pencereyi eşit genişlikte iki parçaya ayırır. Pencereyi yeniden boyutlandırırsak aynı şey olur.

file_hunter.rb

require "wx"

ID_BUTTON = 100
ID_EXIT = 200
ID_SPLITTER = 300

class MyListCtrl < Wx::ListCtrl

  def initialize(parent)
    super parent, style: Wx::LC_REPORT

    insert_column 0, 'Name'
    insert_column 1, 'Ext'
    insert_column 2, 'Size', Wx::LIST_FORMAT_RIGHT
    insert_column 3, 'Modified'

    set_column_width 0, 150
    set_column_width 1, 50
    set_column_width 2, 100
    set_column_width 3, 250

    il = Wx::ImageList.new 16, 16
    il.add Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_MISSING_IMAGE, Wx::ART_OTHER, [16,16]))
    il.add Wx::BitmapBundle.from_svg_file("images/folder.svg", [16, 16] ).bitmap([16, 16])
    il.add Wx::BitmapBundle.from_svg_file("images/source-rb.svg", [16, 16] ).bitmap([16, 16])
    il.add Wx::BitmapBundle.from_svg_file("images/image.svg", [16, 16] ).bitmap([16, 16])
    il.add Wx::BitmapBundle.from_svg_file("images/pdf.svg", [16, 16] ).bitmap([16, 16])
    il.add Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_UP, Wx::ART_OTHER, [16,16]))

    set_image_list il, Wx::IMAGE_LIST_SMALL

    j = 1

    insert_item 0, '..'
    set_item_image 0, 5

    files = Dir.children(".")
   
    files.each do |i|
      name = File.basename(i)
      ex = File.extname(i)[1..]
      size = File.size(i)
      sec = File.mtime(i)
     
      insert_item j, name
      set_item j, 1, ex.to_s
      set_item j, 2, size.to_s + ' B'
      set_item j, 3, sec.strftime('%Y-%m-%d %H:%M')

      if File.directory?(i)
        set_item_image j, 1
      elsif ex == 'rb'
        set_item_image j, 2
      elsif ex == 'jpg' or ex == 'png'
        set_item_image j, 3
      elsif ex == 'pdf'
        set_item_image j, 4
      else
        set_item_image j, 0
      end

      if (j % 2) == 0
        set_item_background_colour j, '#e6f1f5'
      end

      j += 1
    end
  end
end

class Örnek < Wx::Frame
  attr_accessor :sel
  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    set_size [800, 300]
    set_title "File Hunter"
    centre

    @splitter = Wx::SplitterWindow.new self, ID_SPLITTER, style: Wx::SP_BORDER
    @splitter.minimum_pane_size = 50

    p1 = MyListCtrl.new @splitter
    p2 = MyListCtrl.new @splitter
    @splitter.split_vertically p1, p2

    evt_size :on_size
    evt_splitter_dclick ID_SPLITTER, :on_double_click

    filemenu= Wx::Menu.new
    filemenu.append Wx::ID_EXIT, "E&xit"," Terminate the program"
    editmenu = Wx::Menu.new
    netmenu = Wx::Menu.new
    showmenu = Wx::Menu.new
    configmenu = Wx::Menu.new
    helpmenu = Wx::Menu.new

    menu_bar = Wx::MenuBar.new
    menu_bar.append filemenu, "&File"
    menu_bar.append editmenu, "&Edit"
    menu_bar.append netmenu, "&Net"
    menu_bar.append showmenu, "&Show"
    menu_bar.append configmenu, "&Config"
    menu_bar.append helpmenu, "&Help"
    set_menu_bar menu_bar

    evt_menu(ID_EXIT) { close }

    tb = create_tool_bar Wx::TB_HORIZONTAL | Wx::NO_BORDER |
          Wx::TB_FLAT

    tb.add_tool 10, 'Previous',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_BACK)), 'Previous'
    tb.add_tool 20, 'Up',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_UP)), 'Up one directory'
    tb.add_tool 30, 'Home',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_HOME)), 'Home'
    tb.add_tool 40, 'Refresh',
      Wx::BitmapBundle.from_svg_file("images/refresh.svg", [16, 16] ).bitmap([16, 16]), 'Refresh'
    tb.add_separator
    tb.add_tool 50, 'Edit text',
      Wx::BitmapBundle.from_svg_file("images/edit.svg", [16, 16] ).bitmap([16, 16]), 'Edit text'
    tb.add_tool 60, 'Terminal',
      Wx::BitmapBundle.from_svg_file("images/display.svg", [16, 16] ).bitmap([16, 16]), 'Terminal'
    tb.add_separator
    tb.add_tool 70, 'Help',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_HELP)), 'Show help'

    tb.realize

    sizer2 = Wx::BoxSizer.new Wx::HORIZONTAL

    button1 = Wx::Button.new self, ID_BUTTON + 1, "F3 View"
    button2 = Wx::Button.new self, ID_BUTTON + 2, "F4 Edit"
    button3 = Wx::Button.new self, ID_BUTTON + 3, "F5 Copy"
    button4 = Wx::Button.new self, ID_BUTTON + 4, "F6 Move"
    button5 = Wx::Button.new self, ID_BUTTON + 5, "F7 Mkdir"
    button6 = Wx::Button.new self, ID_BUTTON + 6, "F8 Delete"
    button7 = Wx::Button.new self, ID_BUTTON + 7, "F9 Rename"
    button8 = Wx::Button.new self, ID_EXIT, "F10 Quit"

    sizer2.add button1, 1, Wx::EXPAND
    sizer2.add button2, 1, Wx::EXPAND
    sizer2.add button3, 1, Wx::EXPAND
    sizer2.add button4, 1, Wx::EXPAND
    sizer2.add button5, 1, Wx::EXPAND
    sizer2.add button6, 1, Wx::EXPAND
    sizer2.add button7, 1, Wx::EXPAND
    sizer2.add button8, 1, Wx::EXPAND

    evt_button(ID_EXIT) { close }

    sizer = Wx::BoxSizer.new Wx::VERTICAL
    sizer.add @splitter, 1, Wx::EXPAND
    sizer.add sizer2, 0, Wx::EXPAND
    set_sizer sizer

    sb = create_status_bar
    sb.status_text = Dir.pwd
  end

  def on_size(e)
    size = get_size
    @splitter.sash_position = size.x / 2

    e.skip
  end

  def on_double_click(e)
    size = get_size
    @splitter.sash_position = size.x / 2
  end
end

Wx::App.run {
  Örnek.new(nil).show
}


Koda bak maşallah 180 satırı buldu. İşte böyle böyle binlerce satırı buluyor. 

class MyListCtrl < Wx::ListCtrl

  def initialize(parent)
    super parent, style: Wx::LC_REPORT

Uygulama esas elemanı Wx::ListCtrl'den türetildi. 

    il = Wx::ImageList.new 16, 16
    il.add Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_MISSING_IMAGE, Wx::ART_OTHER, [16,16]))
    il.add Wx::BitmapBundle.from_svg_file("images/folder.svg", [16, 16] ).bitmap([16, 16])
    il.add Wx::BitmapBundle.from_svg_file("images/source-rb.svg", [16, 16] ).bitmap([16, 16])
    il.add Wx::BitmapBundle.from_svg_file("images/image.svg", [16, 16] ).bitmap([16, 16])
    il.add Wx::BitmapBundle.from_svg_file("images/pdf.svg", [16, 16] ).bitmap([16, 16])
    il.add Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_UP, Wx::ART_OTHER, [16,16]))

    set_image_list il, Wx::IMAGE_LIST_SMALL

Listemizde dosya türlerini göstermek için bir Wx::ImageList içinde ikonlarımızı topluyoruz. Burada hem hazırda bulunan ART grafiklerini hem de svg dosyalardaki grafikleri nasıl bitmap'e çevirip ikon olarak kullanacağımızı gösterdim. Bu svg dosyalarını nereden bulduğumu sorarsanız, aşağıdaki başlığa bakınız. 

    files = Dir.children(".")
   
    files.each do |i|
      name = File.basename(i)
      ex = File.extname(i)[1..]
      size = File.size(i)
      sec = File.mtime(i)
.....

Bulunduğumuz klasörden dosya isimlerini topladık. Her dosyanın ayrıntısını , name değeri dosya adını, ex değeri dosya uzantısını, size değeri dosya boyutunu ve sec değeri dosyanın en son ellendiği zamanı gösterecek şekilde topladık. Ruby'nin File sınıfının ne çok işe yaradığını görüyorsunuz. 

      if File.directory?(i)
        set_item_image j, 1
      elsif ex == 'rb'
        set_item_image j, 2
      elsif ex == 'jpg' or ex == 'png'
        set_item_image j, 3
      elsif ex == 'pdf'
        set_item_image j, 4
      else
        set_item_image j, 0
      end

Dosyanın uzantısına göre onu sembolize eden image listeden getiriliyor. 

    @splitter = Wx::SplitterWindow.new self, ID_SPLITTER, style: Wx::SP_BORDER
    @splitter.minimum_pane_size = 50

    p1 = MyListCtrl.new @splitter
    p2 = MyListCtrl.new @splitter
    @splitter.split_vertically p1, p2

İki tane listeyi bir SplitterWindow nesnesinin iki yanına yerleştiriyoruz. 

    menu_bar = Wx::MenuBar.new
    menu_bar.append filemenu, "&File"
    menu_bar.append editmenu, "&Edit"
    menu_bar.append netmenu, "&Net"
....

Bir MenuBar'ımız da var.

    tb = create_tool_bar Wx::TB_HORIZONTAL | Wx::NO_BORDER |
          Wx::TB_FLAT

    tb.add_tool 10, 'Previous',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_BACK)), 'Previous'
    tb.add_tool 20, 'Up',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_UP)), 'Up one directory'
....

Araç kutularımız da var.

    sizer2 = Wx::BoxSizer.new Wx::HORIZONTAL

    button1 = Wx::Button.new self, ID_BUTTON + 1, "F3 View"
    button2 = Wx::Button.new self, ID_BUTTON + 2, "F4 Edit"
    button3 = Wx::Button.new self, ID_BUTTON + 3, "F5 Copy"
....

8 tane butonu bir yatay boyutlandırıcıda yan yana diziyoruz. 






SVG dosyalarını ikon olarak kullanmak

Birçok uygulamada ikon dosyaları çok lazım oluyor. Bir işletim sisteminden ikonları yoplasam dedim. https://www.gnome-look.org/p/1998755 adresinde ikonların dosyasını indirdim. Dosya içindeki alt klasörlerden 16 dizinindeki her şeyi uygulamalarımı koyduğum klasöre kopyaladım. Bu klasörler içinde bulunan her svg dosyayı tek tek incelemek yerine bir Ruby program yazayım ve hepsini bir arada göreyim dedim. 

require "wx"
require "clipboard"


class Örnek < Wx::Frame
  def initialize(*args)
    super(*args)
    init_UI
  end
  def init_UI
    set_size [460, 250]
    set_title "Klasördeki SVG Dosyalar"
    centre

    files = Dir.children(File.dirname $0).grep(/.svg/)#[0..999]
    #p files
   
    @panel = Wx::ScrolledWindow.new self
    @panel.set_scrollbars(20, 20, 50, 50)
    @panel.background_colour = :white
    vb = Wx::BoxSizer.new Wx::VERTICAL
    hboxes = []

    files.each_with_index do |v,i|
     
      if i % 30 == 0
        hboxes << Wx::BoxSizer.new(Wx::HORIZONTAL)
      end

      z = Wx::StaticBitmap.new @panel, Wx::ID_ANY,
          Wx::BitmapBundle.from_svg_file(File.dirname($0) + "/" + v, [32,32])
      z.tool_tip = v
      hboxes.last.add z, 0, Wx::ALL, 5

      z.evt_left_down do |e|
        Clipboard.copy v
        p "Kopyalandı"
      end

      if i % 30 == 29
        vb.add hboxes.last
      end
    end
    vb.add hboxes.last

    @panel.sizer = vb
  end

end

Wx::App.run {
  Örnek.new(nil).show
}


Bu kod klasörde bulunan tüm .svg dosyaları gösteriyor. Bazı klasörlerde binlerce dosya olması dolayısıyla programı çalıştırınca biraz beklemeniz gerekebilir. 


Bunun dışında bir de WxRuby'de kayıtlı ART ikonları toptan göreyim diye bir kod yazdım üşenmeden

art_images.rb

require "wx"

class Örnek < Wx::Frame
  def initialize(*args)
    super(*args)
    init_UI
  end
  def init_UI
    set_size [460, 250]
    set_title "Basit Araç Kutusu"
    centre

    @panel = Wx::Panel.new self
    @panel.background_colour = :gray
    vb = Wx::BoxSizer.new Wx::VERTICAL

    hb1 = Wx::BoxSizer.new Wx::HORIZONTAL

    add_h Wx::ART_ADD_BOOKMARK, hb1
    add_h Wx::ART_DEL_BOOKMARK, hb1
    add_h Wx::ART_HELP_SIDE_PANEL, hb1
    add_h Wx::ART_HELP_SETTINGS, hb1
    add_h Wx::ART_HELP_BOOK, hb1
    add_h Wx::ART_HELP_FOLDER, hb1
    add_h Wx::ART_HELP_PAGE, hb1
    add_h Wx::ART_GO_BACK, hb1
    add_h Wx::ART_GO_FORWARD, hb1
    add_h Wx::ART_GO_UP, hb1
    add_h Wx::ART_GO_DOWN, hb1
    add_h Wx::ART_GO_TO_PARENT, hb1
    add_h Wx::ART_GO_HOME, hb1
    add_h Wx::ART_GOTO_FIRST, hb1
    add_h Wx::ART_GOTO_LAST, hb1
    vb.add hb1

    hb2 = Wx::BoxSizer.new Wx::HORIZONTAL

    add_h Wx::ART_FILE_OPEN, hb2
    add_h Wx::ART_FILE_SAVE, hb2
    add_h Wx::ART_FILE_SAVE_AS, hb2
    add_h Wx::ART_PRINT, hb2
    add_h Wx::ART_HELP, hb2
    add_h Wx::ART_TIP, hb2
    add_h Wx::ART_REPORT_VIEW, hb2
    add_h Wx::ART_LIST_VIEW, hb2
    add_h Wx::ART_NEW_DIR, hb2
    add_h Wx::ART_HARDDISK, hb2
    add_h Wx::ART_FLOPPY, hb2
    add_h Wx::ART_CDROM, hb2
    add_h Wx::ART_REMOVABLE, hb2
    vb.add hb2

    hb3 = Wx::BoxSizer.new Wx::HORIZONTAL

    add_h Wx::ART_FOLDER, hb3
    add_h Wx::ART_FOLDER_OPEN, hb3
    add_h Wx::ART_GO_DIR_UP, hb3
    add_h Wx::ART_EXECUTABLE_FILE, hb3
    add_h Wx::ART_NORMAL_FILE, hb3
    add_h Wx::ART_TICK_MARK, hb3
    add_h Wx::ART_CROSS_MARK, hb3
    add_h Wx::ART_ERROR, hb3
    add_h Wx::ART_QUESTION, hb3
    add_h Wx::ART_WARNING, hb3
    add_h Wx::ART_INFORMATION, hb3
    add_h Wx::ART_MISSING_IMAGE, hb3
    add_h Wx::ART_COPY, hb3
    vb.add hb3

    hb4 = Wx::BoxSizer.new Wx::HORIZONTAL

    add_h Wx::ART_CUT, hb4
    add_h Wx::ART_PASTE, hb4
    add_h Wx::ART_DELETE, hb4
    add_h Wx::ART_NEW, hb4
    add_h Wx::ART_UNDO, hb4
    add_h Wx::ART_REDO, hb4
    add_h Wx::ART_PLUS, hb4
    add_h Wx::ART_MINUS, hb4
    add_h Wx::ART_CLOSE, hb4
    add_h Wx::ART_QUIT, hb4
    add_h Wx::ART_FIND, hb4
    add_h Wx::ART_FIND_AND_REPLACE, hb4
    add_h Wx::ART_FULL_SCREEN, hb4
    vb.add hb4

    hb5 = Wx::BoxSizer.new Wx::HORIZONTAL

    add_h Wx::ART_EDIT, hb5
    add_h Wx::ART_WX_LOGO, hb5

    vb.add hb5

    @panel.sizer = vb
  end

  def add_h(item, hbox)
    a = Wx::StaticBitmap.new @panel, Wx::ID_ANY,
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(item))
    a.set_tool_tip(item)
    hbox.add a, 0, Wx::ALL, 5
  end
end

Wx::App.run {
  Örnek.new(nil).show
}


Bir ikonun üzerine gelince tooltip olarak hangi sabit değer olduğu görülür ve bu kodda görüldüğü gibi ikon olarak kullanılabilir. 

.




E-tablo

Sıarada bir SpreadSheet uygulaması iskeleti var. 

spreadsheet.rb

require "wx"

class MySheet < Wx::GRID::Grid

  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    n_of_rows = 55
    n_of_cols = 25

    row = col = 0
    create_grid n_of_rows, n_of_cols

    set_col_label_size 20
    set_row_label_size 50

    evt_grid_select_cell :on_grid_select_cell

    for i in (0...n_of_rows)
      set_row_size i, 20
    end

    for i in (0...n_of_cols)
      set_col_size i, 75
    end
  end

  def on_grid_select_cell(e)
    row, col = e.row, e.col

    control = get_parent.get_parent.position_text

    value =  get_col_label_value(col) + get_row_label_value(row)
    control.set_value value

    e.skip
  end
end

class Örnek < Wx::Frame
  attr_accessor :position_text
  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    set_size [550, 550]
    set_title "E-Tablo"
    centre

    fonts = ['Times New Roman', 'Times', 'Courier', 'Courier New', 'Helvetica',
                'Sans', 'verdana', 'utkal', 'aakar', 'Arial']
    font_sizes = ['10', '11', '12', '14', '16']

    box = Wx::BoxSizer.new Wx::VERTICAL
    menu_bar = Wx::MenuBar.new

    menu1 = Wx::Menu.new
    menu_bar.append menu1, '&File'
    menu2 = Wx::Menu.new
    menu_bar.append menu2, '&Edit'
    menu3 = Wx::Menu.new
    menu_bar.append menu3, '&View'
    menu4 = Wx::Menu.new
    menu_bar.append menu4, '&Insert'
    menu5 = Wx::Menu.new
    menu_bar.append menu5, 'F&ormat'
    menu6 = Wx::Menu.new
    menu_bar.append menu6, '&Tools'
    menu7 = Wx::Menu.new
    menu_bar.append menu7, '&Data'
    menu8 = Wx::Menu.new
    menu_bar.append menu8, '&Help'

    set_menu_bar menu_bar

    toolbar1 = Wx::ToolBar.new self, style: Wx::TB_HORIZONTAL

    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_NEW)), "New"
    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_FILE_OPEN)), "Open"
    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_FILE_SAVE)), "Save"

    toolbar1.add_separator

    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_CUT)), "Cut"
    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_COPY)), "Copy"
    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_PASTE)), "Paste"
    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_DELETE)), "Delete"

    toolbar1.add_separator

    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_UNDO)), "Undo"
    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_REDO)), "Redo"

    toolbar1.add_separator

    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::BitmapBundle.from_svg_file("images/ascending-name.svg", [16, 16] ).
bitmap([16, 16]), 'Ascending'
    toolbar1.add_tool Wx::ID_ANY, '',
      Wx::BitmapBundle.from_svg_file("images/descending-name.svg", [16, 16] ).
bitmap([16, 16]), 'Descending'

    toolbar1.add_separator

    toolbar1.add_tool Wx::ID_ANY, '',
        Wx::BitmapBundle.from_svg_file("images/chart.svg", [16, 16] ).
bitmap([16, 16]), 'Chart'
       
    toolbar1.add_separator

    toolbar1.add_tool Wx::ID_EXIT, '',
        Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_QUIT)), "Exit"
 
    toolbar1.realize

    toolbar2 = Wx::ToolBar.new self, Wx::TB_HORIZONTAL | Wx::TB_TEXT

    @position_text = Wx::TextCtrl.new toolbar2
    font_combo = Wx::ComboBox.new toolbar2, value: 'Times', choices: fonts,
size: [100, -1], style: Wx::CB_DROPDOWN
    font_height = Wx::ComboBox.new toolbar2, value: '10', choices: font_sizes,
size: [50, -1], style: Wx::CB_DROPDOWN

    toolbar2.add_control position_text
    toolbar2.add_control font_combo
    toolbar2.add_control font_height

    toolbar2.add_separator

    toolbar2.add_check_tool Wx::ID_ANY, '',
      Wx::BitmapBundle.from_svg_file("images/text-bold.svg", [16, 16] ).
bitmap([16, 16])
    toolbar2.add_check_tool Wx::ID_ANY, '',
      Wx::BitmapBundle.from_svg_file("images/text-italic.svg", [16, 16] ).
bitmap([16, 16])
    toolbar2.add_check_tool Wx::ID_ANY, '',
      Wx::BitmapBundle.from_svg_file("images/text-underline.svg", [16, 16] ).
bitmap([16, 16])

    toolbar2.add_separator

    toolbar2.add_tool Wx::ID_ANY, '',
      Wx::BitmapBundle.from_svg_file("images/justify-left.svg", [16, 16] ).
bitmap([16, 16]), "Align Left"
    toolbar2.add_tool Wx::ID_ANY, '',
      Wx::BitmapBundle.from_svg_file("images/justify-center.svg", [16, 16] ).
bitmap([16, 16]), "Align Center"
    toolbar2.add_tool Wx::ID_ANY, '',
      Wx::BitmapBundle.from_svg_file("images/justify-right.svg", [16, 16] ).
bitmap([16, 16]), "Align Right"

    toolbar2.realize

    box.add toolbar1
    box.add 5, 5, 0
    box.add toolbar2
    box.add 5, 10, 0

    notebook = Wx::Notebook.new self, style: Wx::RIGHT
    sheet1 = MySheet.new notebook
    sheet2 = MySheet.new notebook
    sheet3 = MySheet.new notebook

    notebook.add_page sheet1, 'Sheet1'
    notebook.add_page sheet2, 'Sheet2'
    notebook.add_page sheet3, 'Sheet3'

    box.add notebook, 1, Wx::EXPAND

    set_sizer box

    create_status_bar
  end
end

Wx::App.run {
  Örnek.new(nil).show
}


Örnek kodumuz OpenOffice Calc benzeri bir Etablo uygulamasının iskeletini gösteriyor. Menübarı toolbarı ve bir grid tablosu var.

class MySheet < Wx::GRID::Grid

  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    n_of_rows = 55
    n_of_cols = 25

    row = col = 0
    create_grid n_of_rows, n_of_cols
....

MySheet nesnemizi Wx::GRID::Grid nesnesinden kalıtımla üretiyoruz. Her sayfamızda 55 satır ve 26 sütun olacak. Hücrelerden oluşan grid, create_grid metodu ile üretiliyor. 

    control = get_parent.get_parent.position_text

Ana penceremizin position_text nesnesinde bulunulan hücrenin sütun ve satır değerini gösteriyoruz. Bu ikinci araç barında bulunuyor. Nesne özelliği olarak erişmek için @position_text olarak oluşum değişkeni olarak tanımlıyoruz ve dışardan elemana ulaşmak için 

  attr_accessor :position_text

satırını kodumuza ekledik. Sayfamız bir MySheet nesnesi ve o da notebook nesnesinin çocuğu, notebook nesnemizde Örnek sınıfından ürettiğimiz nesnenin çocuğu. Bu yüzden penceremize hücreye tıklanınca erişmek için get_parent.get_parent. şeklinde 2 parent yukarı çıkıyoruz. 

    notebook = Wx::Notebook.new self, style: Wx::RIGHT
    sheet1 = MySheet.new notebook
    sheet2 = MySheet.new notebook
    sheet3 = MySheet.new notebook

    notebook.add_page sheet1, 'Sheet1'
    notebook.add_page sheet2, 'Sheet2'
    notebook.add_page sheet3, 'Sheet3'

3 adet sayfamızdan üretip pencereye ekliyoruz. Bu uygulamamızda da önceki uygulamalardaki gibi Wx::ART ikonları ve svg ikonları karışık kullandım.




Player

Şimdiki örneğimiz bir video player örneği olacak

player.rb

require "wx"

class Örnek < Wx::Frame
 
  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    set_size [350, 200]
    set_title "Player"
    centre

    create_menu_bar

    panel = Wx::Panel.new self

    pnl1 = Wx::Panel.new self
    pnl1.background_colour = :black
    pnl2 = Wx::Panel.new self

    slider1 = Wx::Slider.new pnl2, Wx::ID_ANY, 18, 0, 1000
    pause = Wx::BitmapButton.new pnl2, -1, svg_to_bitmap_icon("images/media-pause.svg")
    play = Wx::BitmapButton.new pnl2, -1, svg_to_bitmap_icon("images/media-play.svg")
    fwd = Wx::BitmapButton.new pnl2, -1, svg_to_bitmap_icon("images/media-fwd.svg")
    rew = Wx::BitmapButton.new pnl2, -1, svg_to_bitmap_icon("images/media-rew.svg")
    mute = Wx::BitmapButton.new pnl2, -1, svg_to_bitmap_icon("images/voice.svg")    
    volume = Wx::Slider.new pnl2, -1, 1, 0, 100, size: [120, -1]

    vbox = Wx::BoxSizer.new Wx::VERTICAL
    hbox1 = Wx::BoxSizer.new Wx::HORIZONTAL
    hbox2 = Wx::BoxSizer.new Wx::HORIZONTAL

    hbox1.add slider1, 1
    hbox2.add pause
    hbox2.add play, 0, Wx::RIGHT, 5
    hbox2.add fwd, 0, Wx::LEFT, 5
    hbox2.add rew
    hbox2.add -1, -1, 1
    hbox2.add mute
    hbox2.add volume, 0, Wx::TOP | Wx::LEFT, 5

    vbox.add hbox1, 0, Wx::EXPAND | Wx::BOTTOM, 10
    vbox.add hbox2, 1, Wx::EXPAND
    pnl2.set_sizer vbox

    sizer = Wx::BoxSizer.new Wx::VERTICAL
    sizer.add pnl1, 1, Wx::EXPAND
    sizer.add pnl2, 0, Wx::EXPAND | Wx::BOTTOM | Wx::TOP, 10

    set_sizer sizer
    set_min_size [350, 300]
    create_status_bar
  end

  def create_menu_bar
    menubar = Wx::MenuBar.new
    filem = Wx::Menu.new
    play = Wx::Menu.new
    view = Wx::Menu.new
    tools = Wx::Menu.new
    favorites = Wx::Menu.new
    help = Wx::Menu.new

    filem.append Wx::ID_EXIT, "&Quit", "Quit Application"

    menubar.append filem, '&File'
    menubar.append play, '&Play'
    menubar.append view, '&View'
    menubar.append tools, '&Tools'
    menubar.append favorites, 'F&avorites'
    menubar.append help, '&Help'

    set_menu_bar menubar
  end

  def svg_to_bitmap_icon(file_name)
    Wx::BitmapBundle.from_svg_file(file_name, [16, 16] ).bitmap([16, 16])
  end
end

Wx::App.run {
  Örnek.new(nil).show
}


Arabirimi yapmak için slider'lar bitmap butonlar ve menüler kullandık. 

    pnl1 = Wx::Panel.new self
    pnl1.background_colour = :black

Uygulamanın ana elemanı siyah arka planlı bir panel nesnesi. 

    slider1 = Wx::Slider.new pnl2, Wx::ID_ANY, 18, 0, 1000

Slider nesnesi ile video ilerlemesini gösteriyoruz. 

  pause = Wx::BitmapButton.new pnl2, -1, svg_to_bitmap_icon("images/media-pause.svg")
  play = Wx::BitmapButton.new pnl2, -1, svg_to_bitmap_icon("images/media-play.svg")

Kontrol butonları olarak BitmapButton nesneleri kullanıyoruz. 

    set_min_size [350, 300]

Pencere boyutlandırmasını minimum bir yerde sınırlıyor.




Tarayıcı

Şimdiki taslağımız da bir web tarayıcı görseli. 

browser.rb

require "wx"

class Örnek < Wx::Frame
 
  def initialize(*args)
    super(*args)
    init_UI
  end

  def init_UI
    set_size [500, 350]
    set_title "Tarayıcı"
    centre

    create_menu_bar

    panel = Wx::Panel.new self

    vbox = Wx::BoxSizer.new Wx::VERTICAL
    hbox1 = Wx::BoxSizer.new Wx::HORIZONTAL
    hbox2 = Wx::BoxSizer.new Wx::HORIZONTAL

    line1 = Wx::StaticLine.new panel
    vbox.add line1, 0, Wx::EXPAND

    toolbar1 = Wx::Panel.new panel, size: [-1, 30]

    back = Wx::BitmapButton.new toolbar1,
      bitmap: Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_BACK)),
      style: Wx::NO_BORDER
    forward = Wx::BitmapButton.new toolbar1,
      bitmap: Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_FORWARD)),
      style: Wx::NO_BORDER
    refresh = Wx::BitmapButton.new toolbar1,
      bitmap: svg_to_bitmap_icon("images/refresh.svg"),
      style: Wx::NO_BORDER
    stop = Wx::BitmapButton.new toolbar1,
      bitmap: svg_to_bitmap_icon("images/media-stop.svg"),
      style: Wx::NO_BORDER
    home = Wx::BitmapButton.new toolbar1,
      bitmap: Wx::Bitmap.new(Wx::ArtProvider.get_bitmap(Wx::ART_GO_HOME)),
      style: Wx::NO_BORDER
    address = Wx::ComboBox.new toolbar1, size: [50, -1]
    go = Wx::BitmapButton.new toolbar1,
      bitmap: svg_to_bitmap_icon("images/media-play.svg"),
      style: Wx::NO_BORDER
    text = Wx::TextCtrl.new toolbar1, size: [150, -1]
   
    hbox1.add back
    hbox1.add forward
    hbox1.add refresh
    hbox1.add stop
    hbox1.add home
    hbox1.add address, 1, Wx::TOP, 3
    hbox1.add go, 0, Wx::TOP|Wx::LEFT, 3
    hbox1.add text, 0, Wx::TOP|Wx::RIGHT, 3

    toolbar1.sizer = hbox1
    vbox.add toolbar1, 0, Wx::EXPAND
    line = Wx::StaticLine.new panel
    vbox.add line, 0, Wx::EXPAND

    toolbar2 = Wx::Panel.new panel, size: [-1, 30]
    bookmark1 = Wx::BitmapButton.new toolbar2,
      bitmap: svg_to_bitmap_icon("images/flag-blue.svg"),
      style: Wx::NO_BORDER
    bookmark2 = Wx::BitmapButton.new toolbar2,
      bitmap: svg_to_bitmap_icon("images/source-rb.svg"),
      style: Wx::NO_BORDER
    bookmark3 = Wx::BitmapButton.new toolbar2,
      bitmap: svg_to_bitmap_icon("images/playlist.svg"),
      style: Wx::NO_BORDER

    hbox2.add bookmark1, 0, Wx::RIGHT, 5
    hbox2.add bookmark2, 0, Wx::RIGHT, 5
    hbox2.add bookmark3

    toolbar2.sizer = hbox2
    vbox.add toolbar2, 0, Wx::EXPAND

    line2 = Wx::StaticLine.new panel
    vbox.add line2, 0, Wx::EXPAND

    panel.sizer = vbox

    create_status_bar
  end

  def create_menu_bar
    menubar = Wx::MenuBar.new
    filem = Wx::Menu.new
    filem.append Wx::ID_EXIT, "&Quit", "Quit Application"

    edit = Wx::Menu.new
    view = Wx::Menu.new
    go = Wx::Menu.new
    bookmarks = Wx::Menu.new
    tools = Wx::Menu.new
    help = Wx::Menu.new


    menubar.append filem, '&File'
    menubar.append edit, '&Edit'
    menubar.append view, '&View'
    menubar.append go, '&Go'
    menubar.append bookmarks, '&Bookmarks'
    menubar.append tools, '&Tools'
    menubar.append help, '&Help'

    set_menu_bar menubar
  end

  def svg_to_bitmap_icon(file_name)
    Wx::BitmapBundle.from_svg_file(file_name, [16, 16] ).bitmap([24, 24])
  end
end

Wx::App.run {
  Örnek.new(nil).show
}


Boyutlanabilir bir ComboBox elde edebilmek için ToolBar yerine panel üzerinde araç butonları oluşturduk.

    toolbar1 = Wx::Panel.new panel, size: [-1, 30]

Düz bir Wx::Panel oluşturduk

    hbox1 = Wx::BoxSizer.new Wx::HORIZONTAL
.....
   
    hbox1.add back
    hbox1.add forward
    hbox1.add refresh
    hbox1.add stop

Yatay bir boyutlandırıcı üzerine araç butonlarını yerleştirdik.

    hbox1.add address, 1, Wx::TOP, 3

ComboBox nesnemizi pencere ile beraber boyutlanacak şekilde ekledik. Tarayıcılarda buna adres kutusu denir. 

    line2 = Wx::StaticLine.new panel
    vbox.add line2, 0, Wx::EXPAND

Ana paneli yatay çizgilerle bölümlere ayırıyoruz. 



Bu bölüm de burada bitti. Sonraki yazımda WxPython ile yazılmış bir programı WxRuby ile yazmaya çalışacağım nasipse. Şimdilik kalın sağlıcakla..




Hiç yorum yok:

Yorum Gönder