L
Leslie Viljoen
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
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