Glader: quick .glade -> Ruby

Here’s a tiny script I wrote to go the last mile when generating Ruby
programs to make
use of Glade forms. The ruby-glade-create-template program that comes in
the
libglade2-ruby.18 package creates an example program that will be
overwritten each
time the script is re-run.

Glader makes a script that uses the example program, allowing you to
repeatedly save
your .glade file, convert it and “run” it to see changes.

I hope that makes sense to someone

Example session:

lesliev@lesliev-laptop:~/glade_test/calbox$ ./glader.rb layout.glade
Making class file (layout_glade.rb)…
Making main file (layout.rb)…

lesliev@lesliev-laptop:~/glade_test/calbox$ ruby layout.rb (to play
with the form)

…now you can edit and re-save your .glade form and quickly regen
without overwriting any of your changes to layout.rb by running glader
again.

Glader:

#!/usr/bin/ruby -w

This class is a quick way of creating a runnable Ruby program from

a single Glade form.

class Glader
def initialize(glade_filename)
raise ArgumentError.new(“File missing: #{glade_filename}”) if
!File.exist?(glade_filename)
raise ArgumentError.new(“Not a .glade file: #{glade_filename}”) if
glade_filename !~ /.*.glade/

@glade_filename = glade_filename
@base_filename = File.basename(@glade_filename, ".glade")
@class_filename = @base_filename + "_glade.rb"

end

Runs the ruby-glade-create-template script to create a file with a

class that corresponds to the form. This can be called repeatedly

to keep creating the class every time the .glade file changes.

def make_class
/usr/bin/ruby-glade-create-template #{@glade_filename} > #{@class_filename}
@class_filename
end

Creates a main program that uses the glade class created with

make_class and opens the window with the form. It will do nothing

if the main program file already exists, since the user is likely

to add code to this file.

def make_main
main_filename = @base_filename + ‘.rb’

if(File.exist?(main_filename))
  raise ArgumentError.new("#{main_filename} already exists, 

skipping")
else
File.open(main_filename, “w”) {|f| f.write generate_main}
end
main_filename
end

private
def generate_main()
class_name = File.read(@class_filename).scan(/class (.)/).to_s
window_id = File.read(@glade_filename).scan(/class=“GtkWindow”
id="(\w
)">/).to_s

main =<<END

require ‘#{@base_filename}_glade’

class #{class_name}
def show
@glade["#{window_id}"].show
end

#if this signal exists, exit nicely

def on_#{window_id}_destroy(widget)
Gtk.main_quit
end
end

form = #{class_name}.new("#{@glade_filename}", nil, “Application”)
form.show

Gtk.main

END
end
end

if FILE == $0
if ARGV.length != 1
puts
puts “This script creates a class and a main program that shows a
window using”
puts “that class from a .glade file. It can be used to quickly
generate a functional Ruby”
puts “program from a .glade file”
puts
puts “Usage: #{FILE} <file.glade>”
puts
exit
end

glader = Glader.new(ARGV[0])
print “Making class file (#{glader.make_class})…\n”

begin
print “Making main file (#{glader.make_main})…\n”
rescue => e
puts e.message
end
puts

end