27 Eylül 2013 Cuma

Ruby & GTK-3

Bu dönem Gtk ve Ruby kullanarak proje yapacağım. Aslında Gtk ve Ruby kullanma konusunda biraz tereddüt ettik. Gtk-3 sürümünün Ruby bağlayıcısı (binding) mevcut, gtk3 gemi ile kurulumunu sağlayabiliriz, ancak belgesi yok. Projeye karar verirken olan tereddütümüz de bundan kaynaklıydı.

Gtk kullanırken buradan oldukça yararlanmıştım. Gtk-3'ün belgesi olmadığından kullanmaya pek sıcak bakmıyordum. Sonra Gtk-3 ile arasındaki söz dizim farklarını görmek için buradan yararlandım. Burada Gtk-2 ile yazılmış olan örneklerin Gtk-3 için olan karşılıklarını Github'daki depoda tutuyorum. Bu sayede proje üzerinde çalışırken Gtk-3'teki söz dizimi, fonksiyon argüman farklılıkları, kaldırılan ve eklenen özelliklerden kaynaklanan hataların çözümünü her seferinde baştan keşfetmem gerekmeyecek.

Gtk-3 kullanırken bildiğim söz dizimi olarak Gtk-2 kullanıyorum. Eğer hata alırsam bunu çözmeye çalışıyorum. Karşılaştığım söz diziminden kaynaklanan bazı hata çıktıkları "bunun yerine şunu kullanın" gibi net bir biçiminde belirtilmiş. Ancak her hata çıktısı bu kadar yardımcı olmuyor ve bazı durumlarda Gtk-2'de kullanılan fonksiyon yerine Gtk-3'deki fonksiyon adı tamamen farklı olup, argüman sayısı gibi bir çok etken bir arada değiştiğinde işler biraz karışabiliyor. Bunun için Irb'den daha yetenekli bir etkileşimli kabuk kullanırsam işim kolaylaşır diye düşündüm. Bu yüzden PRY kullanmaya başladım ve beğendim :)

Gtk2'den Gtk3'e değişen bazı fonksiyonlar şu şekilde:

Yatay ve Dikey Ölçekleme:
# deprecated -> scale = Gtk::HScale.new
# use Gtk::Scale.new(:horizontal, *args)

scale = Gtk::Scale.new(:horizontal)

Butonlar:
# deprecated -> button = Gtk::Button.new "About"
button = Gtk::Button.new(:label => "About")

Renk Seçim Penceresi:
# deprecated -> cdia = Gtk::ColorSelectionDialog.new "Select color"
cdia = Gtk::ColorSelectionDialog.new(:title => "Select color")

colorsel = cdia.color_selection
# color = colorsel.current_color, .current_color returns Gtk::Color but it should return Gdk::RGBA
color = colorsel.current_rgba

Font Seçim Penceresi:
# deprecated fdia = Gtk::FontSelectionDialog.new "Select font name"
fdia = Gtk::FontChooserDialog.new(:title => "Select font name", :parent => nil)

# deprecated if response == Gtk::Dialog::RESPONSE_OK, you can use Gtk::ResponseType::OK
if response == Gtk::ResponseType::OK

# deprecated -> font_desc = Pango::FontDescription.new fdia.font_name
font_desc_ = Pango::FontDescription.new fdia.font_desc

@label = Gtk::Label.new "The only victory over love is flight."
# deprecated -> @label.modify_font font_desc
@label.override_font(font_desc_)

Bilgilendirme Mesaj Pencereleri:
# deprecated ->  md = Gtk::MessageDialog.new(self, Gtk::Dialog::MODAL |
# Gtk::Dialog::DESTROY_WITH_PARENT, Gtk::MessageDialog::ERROR, 
# Gtk::MessageDialog::BUTTONS_CLOSE, "Error loading file")
md = Gtk::MessageDialog.new(:parent => self, :flags => :destroy_with_parent,
                            :type => :info, :buttons_type => :close, 
                            :message => "Download completed")
                            
# deprecated -> Gtk::MessageDialog::ERROR, you should use :error
# deprecated -> Gtk::MessageDialog::QUESTION, you should use :question
# deprecated -> Gtk::MessageDialog::WARNING, you should use :warning

Pencere:
window = Gtk::Window.new
# deprecated -> window.set_window_position Gtk::Window::POS_CENTER
# you can use :center or Gtk::Window::Position::CENTER
window.set_window_position(Gtk::Window::Position::CENTER)


# deprecated -> window.modify_bg Gtk::STATE_NORMAL, Gdk::Color.new(6400, 6400, 6440) 
window.override_background_color = :normal, Gdk::Color.new(6400, 6400, 6440)

Yatay ve Dikey Kutular:
# deprecated -> vbox = Gtk::VBox.new false, 5 
vbox = Gtk::Box.new(:vertical, 5)
# deprecated -> hbox = Gtk::HBox.new true, 3

# deprecated -> vbox.pack_start halign, false, false, 3
# 'Gtk::Box#pack_start(child, :expand => true, :fill => true, :padding => 0)'
vbox.pack_start(halign, :expand => false, :fill => false, :padding => 3) 

Tablo Yapısı:
# deprecated -> table.attach Gtk::Button.new("Cls"), 0, 1, 0, 1
table.attach Gtk::Button.new(:label => "Cls"), 0, 1, 0, 1

# use Gtk::AttachOptions::FILL instead of Gtk::FILL
table.attach(halign, 0, 1, 0, 1, Gtk::AttachOptions::FILL,
             Gtk::AttachOptions::FILL, 0, 0)

# use Gtk::AttachOptions::EXPAND instead of Gtk::EXPAND
# use Gtk::AttachOptions::SHRINK instead of Gtk::SHRINK

Resimler:
bardejov = Gdk::Pixbuf.new(:file => "sample_image.jpg")
# deprecated -> image1 = Gtk::Image.new bardejov
# all options
# image1 = Gtk::Image.new(:stock => nil, :icon_name => nil, :icon_set => nil, 
# :gicon => nil, :file => nil, :pixbuf => bardejov, :animation => nil, :size => nil)
image1 = Gtk::Image.new(:pixbuf => bardejov)

# deprecated ->  newi = Gtk::ImageMenuItem.new Gtk::Stock::NEW, agr
newi = Gtk::ImageMenuItem.new(:stock_id => Gtk::Stock::NEW, :accel_group => agr)

# deprecated -> newi.add_accelerator("activate", agr, key, 
#                                    mod, Gtk::ACCEL_VISIBLE)
# you can use ":visible" instead of Gtk::AccelFlags::VISIBLE
newi.add_accelerator("activate", agr, key,
                     mod, Gtk::AccelFlags::VISIBLE)

Araç Çubuğu ve Butonu:
# deprecated -> newtb = Gtk::ToolButton.new Gtk::Stock::NEW
newtb = Gtk::ToolButton.new(:stock_id => Gtk::Stock::NEW)

# deprecated -> toolbar.insert 0, newtb
toolbar.insert(newtb, 0)

Çizim:
darea = Gtk::DrawingArea.new  
# deprecated -> @darea.signal_connect("expose-event"){..}
darea.signal_connect('draw'){...}

Seçmeli Düşen Menü:
# deprecated -> cb = Gtk::ComboBox.new
cb = Gtk::ComboBoxText.new

Gtk-3'ü daha fazla kullandıkça gördüğüm değişiklikleri Github'a eklemeye devam edeceğim.

Hiç yorum yok:

Yorum Gönder