Subclassing in Ruby/GTK+
Davyd is spot on when bringing up the use of subclassing in GTK+. This is a step that comes natural for most people used to OO programming but (probably due to having to write a lot of boiler plate code) often is neglected by GTK+ application developers.
While many feel it’s daunting to subclass GTK+ widgets in C, it can be really nice when writing applications in other languages. Just like Davyd showed, Python is such a language, so is Ruby which I will show a similar brief example of here for those that are trying to get into Ruby/GTK+.
require 'gtk2'
# Defining OpenFileDialog
class OpenFileDialog < Gtk::FileChooserDialog
@@CWD = nil
def initialize(parent_window)
super("Open file", parent_window,
Gtk::FileChooser::ACTION_OPEN, nil,
[Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
[Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_OK])
self.default_response = Gtk::Dialog::RESPONSE_OK
self.current_folder = @@CWD unless @@CWD.nil?
signal_connect :response do |dialog, response|
@@CWD = self.current_folder if response == Gtk::Dialog::RESPONSE_OK
end
end
end
# Using OpenFileDialog
2.times do
d = OpenFileDialog.new(nil)
d.run do |response|
puts "filename = #{d.filename}" if response == Gtk::Dialog::RESPONSE_OK
end
d.destroy
end
The second half simply to try it out. For a nicer paste, see http://pastie.caboo.se/148847.
But it’s so hard in C!
Writing all the boilerplate by hand is a lot of work and error prone. However, here are two tips for making life easier.
The first way is to implement a dummy object that you later copy and query/replace. A nice tool for using this method is Regexxer) that lets you easily change the dummy name into your object name. I suggest you hook up your dummy object in the Makefile in order to make sure it always builds.
The other solution is to use a generator script such as Spuug to generate all the boilerplate for you. It makes it very easy to create new subclasses when you need them.
Update: As Johannes pointed out in a comment, Anjuta also comes with a generator for subclassing.
