visualruby 1.0.19 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Splash.rb +40 -0
- data/bin/editor/VR_Document.rb +81 -74
- data/bin/editor/VR_TabSearch.rb +5 -7
- data/bin/editor/VR_Tabs.rb +57 -36
- data/bin/editor/VR_TextShell.rb +12 -34
- data/bin/editor/VR_TextViewCommon.rb +9 -28
- data/bin/main/NewProjectGUI.rb +14 -13
- data/bin/main/OpenProject.rb +69 -0
- data/bin/main/ProjectChooserView.rb +3 -2
- data/bin/main/ProjectTree.rb +25 -0
- data/bin/main/RubygemsAPI.rb +15 -11
- data/bin/main/VR_ENV.rb +38 -60
- data/bin/main/VR_ENV_GLOBAL.rb +45 -44
- data/bin/main/VR_File_Tree.rb +29 -21
- data/bin/main/VR_Local_Gem_Tree.rb +4 -19
- data/bin/main/VR_Main.rb +128 -144
- data/bin/main/VR_Remote_Gem_Tree.rb +6 -19
- data/bin/main/glade/NewProjectGUI.glade +94 -98
- data/bin/main/glade/OpenProject.glade +259 -0
- data/bin/main/glade/RubygemsAPI.glade +98 -62
- data/bin/main/glade/VR_ENV.glade +46 -55
- data/bin/main/glade/VR_ENV_GLOBAL.glade +251 -180
- data/bin/main/glade/VR_File_Tree.glade +25 -16
- data/bin/main/glade/VR_Local_Gem_Tree.glade +16 -8
- data/bin/main/glade/VR_Main.glade +410 -449
- data/bin/main/glade/VR_Remote_Gem_Tree.glade +33 -31
- data/bin/tools/VR_Tools.rb +60 -46
- data/{visualruby_examples → examples}/active_record/active_record.rb +16 -10
- data/{visualruby_examples → examples}/active_record/bin/ChoosePerson.rb +7 -0
- data/examples/active_record/bin/Person.rb +21 -0
- data/examples/active_record/bin/glade/ChoosePerson.glade +89 -0
- data/examples/active_record/bin/glade/Person.glade +197 -0
- data/{visualruby_examples → examples}/active_record/db/development.sqlite3 +0 -0
- data/{visualruby_examples → examples}/active_record2/bin/CompanyGUI.rb +7 -7
- data/{visualruby_examples → examples}/active_record2/bin/Employee.rb +0 -0
- data/{visualruby_examples → examples}/active_record2/bin/Employer.rb +0 -0
- data/{visualruby_examples → examples}/active_record2/bin/Paycheck.rb +0 -0
- data/examples/active_record2/bin/glade/CompanyGUI.glade +149 -0
- data/examples/active_record2/bin/glade/Employee.glade +126 -0
- data/{visualruby_examples → examples}/active_record2/bin/glade/Employer.glade +0 -0
- data/{visualruby_examples → examples}/active_record2/bin/glade/Paycheck.glade +0 -0
- data/{visualruby_examples → examples}/active_record2/db/development.sqlite3 +0 -0
- data/{visualruby_examples → examples}/active_record2/main.rb +15 -9
- data/examples/alert_box/bin/AlertBoxDemo.rb +80 -0
- data/examples/alert_box/bin/glade/AlertBoxDemo.glade +234 -0
- data/examples/alert_box/main.rb +12 -0
- data/{visualruby_examples → examples}/all_widgets/bin/AllWidgets.rb +18 -10
- data/{visualruby_examples → examples}/all_widgets/bin/glade/AllWidgets.glade +52 -16
- data/{visualruby_examples → examples}/all_widgets/bin/splash.png +0 -0
- data/examples/all_widgets/main.rb +12 -0
- data/{visualruby_examples → examples}/calculator/bin/Calculator.rb +23 -22
- data/{visualruby_examples → examples}/calculator/bin/glade/Calculator.glade +81 -51
- data/examples/calculator/main.rb +13 -0
- data/examples/child_window/bin/ChildWindowDemo.rb +52 -0
- data/examples/child_window/bin/ModalWindow.rb +9 -0
- data/examples/child_window/bin/ModelessWindow.rb +9 -0
- data/examples/child_window/bin/MyChildClass.rb +21 -0
- data/examples/child_window/bin/glade/ChildWindowDemo.glade +87 -0
- data/examples/child_window/bin/glade/ModalWindow.glade +61 -0
- data/examples/child_window/bin/glade/ModelessWindow.glade +61 -0
- data/{visualruby_examples → examples}/child_window/bin/glade/MyChildClass.glade +14 -12
- data/examples/child_window/main.rb +12 -0
- data/{visualruby_examples → examples}/drag_drop/bin/DragDropDemo.rb +9 -10
- data/examples/drag_drop/bin/glade/DragDropDemo.glade +161 -0
- data/{visualruby_examples → examples}/drag_drop/img/folder.png +0 -0
- data/{visualruby_examples → examples}/drag_drop/img/glade.png +0 -0
- data/{visualruby_examples → examples}/drag_drop/img/gtk-edit.png +0 -0
- data/{visualruby_examples → examples}/drag_drop/img/obj.png +0 -0
- data/{visualruby_examples → examples}/drag_drop/img/png.png +0 -0
- data/{visualruby_examples → examples}/drag_drop/img/rb.png +0 -0
- data/{visualruby_examples → examples}/drag_drop/img/ruby.png +0 -0
- data/{visualruby_examples → examples}/drag_drop/img/unknown.png +0 -0
- data/examples/drag_drop/main.rb +11 -0
- data/examples/filetreeview/bin/ProjectTree.rb +32 -0
- data/examples/filetreeview/bin/ProjectTreeGUI.rb +28 -0
- data/examples/filetreeview/bin/glade/ProjectTreeGUI.glade +156 -0
- data/examples/filetreeview/main.rb +13 -0
- data/{visualruby_examples → examples}/listview/bin/SongListView.rb +24 -20
- data/{visualruby_examples → examples}/listview/bin/SongListViewGUI.rb +12 -11
- data/{visualruby_examples → examples}/listview/bin/audio-x-generic.png +0 -0
- data/examples/listview/bin/glade/SongListViewGUI.glade +195 -0
- data/examples/listview/main.rb +10 -0
- data/examples/listview_objects/bin/DataObject.rb +53 -0
- data/{visualruby_examples → examples}/listview_objects/bin/ListViewObjects.rb +7 -4
- data/examples/listview_objects/bin/ListViewObjectsGUI.rb +26 -0
- data/examples/listview_objects/bin/glade/DataObject.glade +196 -0
- data/examples/listview_objects/bin/glade/ListViewObjectsGUI.glade +87 -0
- data/examples/listview_objects/main.rb +12 -0
- data/examples/settings_file/bin/MainApp.rb +38 -0
- data/examples/settings_file/bin/SavableSettings.rb +39 -0
- data/examples/settings_file/bin/glade/MainApp.glade +87 -0
- data/examples/settings_file/bin/glade/SavableSettings.glade +162 -0
- data/examples/settings_file/main.rb +14 -0
- data/examples/settings_file/settings.yaml +15 -0
- data/examples/simple_ruby_gui/bin/DataObjectGUI.rb +21 -0
- data/examples/simple_ruby_gui/bin/glade/DataObjectGUI.glade +195 -0
- data/examples/simple_ruby_gui/main.rb +16 -0
- data/{visualruby_examples → examples}/treeview/bin/MyClass.rb +1 -5
- data/examples/treeview/bin/glade/MyClass.glade +24 -0
- data/examples/treeview/main.rb +13 -0
- data/skeleton/document/New.glade +3 -4
- data/skeleton/document/NewWindow.rb +1 -1
- data/skeleton/project/bin/MyClass.rb +2 -2
- data/skeleton/project/bin/glade/MyClass.glade +12 -26
- data/skeleton/project/main.rb +4 -8
- data/vr +41 -37
- data/vrlib/lib/Alert.rb +67 -0
- data/vrlib/lib/DragDrop.rb +90 -0
- data/vrlib/lib/GladeGUI.rb +433 -0
- data/vrlib/lib/IconHash.rb +18 -0
- data/vrlib/lib/SavableClass.rb +56 -0
- data/vrlib/lib/SimpleComboBoxEntry.rb +8 -0
- data/vrlib/lib/glade/Alert.glade +119 -0
- data/vrlib/lib/treeview/FileTreeView.rb +113 -0
- data/vrlib/lib/treeview/IterMethods.rb +82 -0
- data/vrlib/lib/treeview/ListView.rb +85 -0
- data/vrlib/lib/treeview/TreeView.rb +43 -0
- data/vrlib/lib/treeview/ViewCommon.rb +370 -0
- data/vrlib/lib/treeview/columns/CalendarCol.rb +89 -0
- data/vrlib/lib/treeview/columns/CellRendererCombo.rb +66 -0
- data/vrlib/lib/treeview/columns/CellRendererDate.rb +45 -0
- data/vrlib/lib/treeview/columns/CellRendererObject.rb +57 -0
- data/vrlib/lib/treeview/columns/CellRendererPhone.rb +45 -0
- data/vrlib/lib/treeview/columns/CellRendererPixbuf.rb +16 -0
- data/vrlib/lib/treeview/columns/CellRendererProgress.rb +17 -0
- data/vrlib/lib/treeview/columns/CellRendererSpin.rb +37 -0
- data/vrlib/lib/treeview/columns/CellRendererText.rb +38 -0
- data/vrlib/lib/treeview/columns/CellRendererToggle.rb +47 -0
- data/vrlib/lib/treeview/columns/ComboCol.rb +43 -0
- data/vrlib/lib/treeview/columns/CurrencyCol.rb +23 -0
- data/vrlib/lib/treeview/columns/DateCol.rb +20 -0
- data/vrlib/lib/treeview/columns/ImageCol.rb +27 -0
- data/vrlib/lib/treeview/columns/ProgressCol.rb +27 -0
- data/vrlib/lib/treeview/columns/SpinCol.rb +11 -0
- data/vrlib/lib/treeview/columns/TextCol.rb +65 -0
- data/vrlib/lib/treeview/columns/TreeViewColumn.rb +93 -0
- data/{bin/main/glade/ProjectChooserGUI.glade → vrlib/lib/treeview/columns/glade/CalendarCol.glade} +71 -63
- data/{bin/main/glade/Splash.glade → vrlib/lib/treeview/columns/glade/ImageCol.glade} +5 -6
- data/vrlib/lib/treeview/columns/glade/TextCol.glade +82 -0
- data/vrlib/rdoc_replace.yaml +77 -0
- data/vrlib/vrlib.rb +7 -0
- metadata +163 -136
- data/bin/editor/glade/VR_Document.glade +0 -160
- data/bin/main/ProjectChooserGUI.rb +0 -41
- data/bin/main/Splash.rb +0 -22
- data/visualruby_examples/active_record/.vr_settings.yaml +0 -47
- data/visualruby_examples/active_record/bin/Person.rb +0 -13
- data/visualruby_examples/active_record/bin/glade/ChoosePerson.glade +0 -61
- data/visualruby_examples/active_record/bin/glade/Person.glade +0 -148
- data/visualruby_examples/active_record2/.vr_settings.yaml +0 -16
- data/visualruby_examples/active_record2/bin/glade/CompanyGUI.glade +0 -167
- data/visualruby_examples/active_record2/bin/glade/Employee.glade +0 -123
- data/visualruby_examples/all_widgets/.vr_settings.yaml +0 -13
- data/visualruby_examples/all_widgets/main.rb +0 -14
- data/visualruby_examples/calculator/.vr_settings.yaml +0 -11
- data/visualruby_examples/calculator/main.rb +0 -13
- data/visualruby_examples/child_window/.vr_settings.yaml +0 -16
- data/visualruby_examples/child_window/bin/ChildWindowDemo.rb +0 -39
- data/visualruby_examples/child_window/bin/MyChildClass.rb +0 -40
- data/visualruby_examples/child_window/bin/glade/ChildWindowDemo.glade +0 -101
- data/visualruby_examples/child_window/main.rb +0 -13
- data/visualruby_examples/drag_drop/.vr_settings.yaml +0 -12
- data/visualruby_examples/drag_drop/bin/glade/DragDropDemo.glade +0 -143
- data/visualruby_examples/drag_drop/main.rb +0 -14
- data/visualruby_examples/listview/.vr_settings.yaml +0 -12
- data/visualruby_examples/listview/bin/glade/SongListViewGUI.glade +0 -220
- data/visualruby_examples/listview/main.rb +0 -19
- data/visualruby_examples/listview_objects/.vr_settings.yaml +0 -16
- data/visualruby_examples/listview_objects/bin/DataObject.rb +0 -32
- data/visualruby_examples/listview_objects/bin/DataObjectGUI.rb +0 -41
- data/visualruby_examples/listview_objects/bin/ListViewObjectsGUI.rb +0 -18
- data/visualruby_examples/listview_objects/bin/glade/DataObject.glade +0 -198
- data/visualruby_examples/listview_objects/bin/glade/ListViewObjectsGUI.glade +0 -102
- data/visualruby_examples/listview_objects/main.rb +0 -13
- data/visualruby_examples/simple_ruby_gui/.vr_settings.yaml +0 -16
- data/visualruby_examples/simple_ruby_gui/bin/DataObjectGUI.rb +0 -20
- data/visualruby_examples/simple_ruby_gui/bin/glade/DataObjectGUI.glade +0 -163
- data/visualruby_examples/simple_ruby_gui/main.rb +0 -16
- data/visualruby_examples/treeview/.vr_settings.yaml +0 -12
- data/visualruby_examples/treeview/bin/glade/MyClass.glade +0 -48
- data/visualruby_examples/treeview/main.rb +0 -14
@@ -0,0 +1,433 @@
|
|
1
|
+
#
|
2
|
+
# GladeGUI connects your class to a glade form.
|
3
|
+
# It will load a .glade
|
4
|
+
# file into memory, enabling your ruby programs to have a GUI interface.
|
5
|
+
#
|
6
|
+
# GladeGUI works by adding an instance variable, @builder to your class. The @builder
|
7
|
+
# variable is an instance of {Gtk::Builder}[http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ABuilder]
|
8
|
+
# It holds references to all your windows and widgets.
|
9
|
+
#
|
10
|
+
# ==Include the GladeGUI interface
|
11
|
+
#
|
12
|
+
# To use the GladeGUI interface, include this line after your
|
13
|
+
# “class” declaration:
|
14
|
+
#
|
15
|
+
# include GladeGUI
|
16
|
+
#
|
17
|
+
# Here is an example of a class that uses GladeGUI:
|
18
|
+
#
|
19
|
+
# class MyClass
|
20
|
+
# include GladeGUI
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# GladeGUI will load a corresponding
|
24
|
+
# glade file for this class. It knows which glade file to load by using a naming
|
25
|
+
# convention:
|
26
|
+
#
|
27
|
+
# /home/me/visualruby/projectname/bin/MyClass.rb
|
28
|
+
#
|
29
|
+
# Will load this glade file:
|
30
|
+
#
|
31
|
+
# /home/me/visualrubyprojectname/bin/glade/MyClass.glade
|
32
|
+
#
|
33
|
+
# Note: it will use this format: /my/path/glade/<class_name>.glade.
|
34
|
+
# In the example, the class and the file have the same name,
|
35
|
+
# MyClass. You should always name your class, script, and glade file
|
36
|
+
# the same name (case sensitive).
|
37
|
+
#
|
38
|
+
# ==@builder holds all your widgets
|
39
|
+
#
|
40
|
+
# So when you "load" your class's glade file where is it loaded?
|
41
|
+
#
|
42
|
+
# GladeGUI adds an instance variable, @builder to your class.
|
43
|
+
# It loads all the windows and widgets from your glade file into @builder.
|
44
|
+
# So, you use @builder to manipulate everything in you class's GUI.
|
45
|
+
# @builder is set when you call the show_glade() method, as this code shows:
|
46
|
+
#
|
47
|
+
# class MyClass
|
48
|
+
#
|
49
|
+
# include GladeGUI
|
50
|
+
#
|
51
|
+
# def initialize()
|
52
|
+
# puts @builder.to_s # => nil
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# def before_show()
|
56
|
+
# puts @builder.to_s # => Gtk::Builder
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# After show_glade() is called, you can access any of your form's windows or widgets
|
62
|
+
# using the @builder variable:
|
63
|
+
#
|
64
|
+
# @builder["window1"].title = "This is the title that appears at the top."
|
65
|
+
#
|
66
|
+
#
|
67
|
+
# Here's another example: Suppose you have a glade form with a Gtk::Entry box on it named "email."
|
68
|
+
# You could set the text that appears in the Gtk::Entry by setting the Gtk::Entry#text property:
|
69
|
+
#
|
70
|
+
# @builder["email"].text = "harvey@harveyserver.com"
|
71
|
+
#
|
72
|
+
# Now the email adddess is set with a new value:
|
73
|
+
#
|
74
|
+
# http://visualruby.net/img/gladegui_simple.jpg
|
75
|
+
#
|
76
|
+
# ==Auto fill your glade form
|
77
|
+
# You can streamline the process of setting-up your forms by
|
78
|
+
# auto-filling the widgets from instance variables with the same name.
|
79
|
+
#
|
80
|
+
# When assigning names to widgets in glade, give them names that
|
81
|
+
# correspond to your instance variables. For example, if you want
|
82
|
+
# to edit an email address on the glade form, create an instance
|
83
|
+
# variable named @email in your class. Then, in glade, you
|
84
|
+
# add a Gtk::Entry widget to your form and set its name to
|
85
|
+
# “email”. The advantage of this is that GladeGUI will populate
|
86
|
+
# the “email” widget in glade using the @email variable. so
|
87
|
+
# you don’t need to include the above line of code. (see
|
88
|
+
# set_glade_variables() method.)
|
89
|
+
|
90
|
+
|
91
|
+
module GladeGUI
|
92
|
+
|
93
|
+
attr_accessor :builder
|
94
|
+
|
95
|
+
##
|
96
|
+
#
|
97
|
+
# drag_to() will make it so you can drag-n-drop the source_widget onto the target widget.
|
98
|
+
# You may pass a reference to a widget object, or a String that gives the name of the
|
99
|
+
# widget on your glade form. So, it functions the same as this statement:
|
100
|
+
#
|
101
|
+
# widget_source.drag_to(widget_target)
|
102
|
+
#
|
103
|
+
# It also functions the same as this statement:
|
104
|
+
#
|
105
|
+
# @builder["widget_source"].drag_to(@builder["widget_target"])
|
106
|
+
#
|
107
|
+
#
|
108
|
+
|
109
|
+
def set_drag_drop(hash)
|
110
|
+
hash.each do |key,val|
|
111
|
+
src = key.is_a?(Gtk::Widget) ? key : @builder[key]
|
112
|
+
target = @builder[val]
|
113
|
+
src.extend(VR::Draggable) unless src.is_a?(VR::Draggable)
|
114
|
+
src.add_target_widget(target)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
##
|
121
|
+
# This will Load the glade form.
|
122
|
+
# It will create a Gtk::Builder object from your glade file.
|
123
|
+
# The Gtk::Builder object is stored in the instance variable, @builder.
|
124
|
+
# You can get a reference to any of the widgets on the glade form by
|
125
|
+
# using the @builder object:
|
126
|
+
#
|
127
|
+
# widget = @builder["name"]
|
128
|
+
#
|
129
|
+
# Normally, you should give your widgets names of instance variables: i.e. "MyClass.var"
|
130
|
+
# so they can be autoloaded using the set_glade_all() method.
|
131
|
+
#
|
132
|
+
# You can also pass a reference to a parent class that also includes GladeGUI.
|
133
|
+
# Then the child window will run simultaniously with the parent.
|
134
|
+
#
|
135
|
+
|
136
|
+
def load_glade()
|
137
|
+
caller__FILE__ = my_class_file_path()
|
138
|
+
file_name = File.split(caller__FILE__)[0] + '/glade/' + class_name(self) + ".glade"
|
139
|
+
@builder = Gtk::Builder.new
|
140
|
+
@builder << file_name
|
141
|
+
@builder.connect_signals{ |handle| method(handle) }
|
142
|
+
# parse_signals() should be called after before_show()
|
143
|
+
end
|
144
|
+
|
145
|
+
def class_name(obj) # :nodoc:
|
146
|
+
/.*\b(\w+)$/.match(obj.class.name)[1]
|
147
|
+
end
|
148
|
+
|
149
|
+
def parse_signals() # :nodoc:
|
150
|
+
meths = self.class.instance_methods()
|
151
|
+
meths.each do |meth|
|
152
|
+
meth = meth.to_s #bug fix ruby 1.9 gives stmbol
|
153
|
+
glade_name, signal_name = *(meth.split("__"))
|
154
|
+
next if (signal_name.to_s == "" or glade_name.to_s == "") #covers nil
|
155
|
+
if @builder
|
156
|
+
@builder.objects.each do |obj|
|
157
|
+
next unless obj.respond_to?(:builder_name)
|
158
|
+
if obj.builder_name == glade_name or obj.builder_name =~ /^(?:#{class_name(self)}\.|)#{glade_name}\[\d+\]$/ #arrays
|
159
|
+
obj.signal_connect(signal_name) { |*args| method(meth.to_sym).call(*args) }
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
obj = glade_name == "self" ? self : self.instance_variable_get("@" + glade_name)
|
164
|
+
obj ||= eval(glade_name) if respond_to?(glade_name) and method(glade_name.to_sym).arity == 0 # no arguments!
|
165
|
+
obj.signal_connect(signal_name) { |*args| method(meth.to_sym).call(*args) } if obj.respond_to?("signal_connect")
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# This method is the most useful method to populate a glade form. It will
|
170
|
+
# populate from active_record fields and instance variables. It will simply
|
171
|
+
# call both of these methods:
|
172
|
+
#
|
173
|
+
# set_glade_active_record()
|
174
|
+
# set_glade_variables()
|
175
|
+
#
|
176
|
+
# So, to set all the values of a form, simply call the set_glade_all() method instead.
|
177
|
+
|
178
|
+
def set_glade_all(obj = self)
|
179
|
+
set_glade_active_record(obj)
|
180
|
+
set_glade_variables(obj)
|
181
|
+
# set_glade_hash(obj) if obj.is_a?(Hash) #only needed for Hash subclass. needed?
|
182
|
+
end
|
183
|
+
|
184
|
+
# This method is the most useful method to retreive values from a glade form. It will
|
185
|
+
# populate from active_record fields and instance variables. It will simply
|
186
|
+
# call both of these methods:
|
187
|
+
#
|
188
|
+
# get_glade_active_record()
|
189
|
+
# get_glade_variables()
|
190
|
+
#
|
191
|
+
# So, to retreive all the values of a form back into your ActiveRecord object and instance variables, simply call the set_glade_all() method instead.
|
192
|
+
|
193
|
+
def get_glade_all(obj = self)
|
194
|
+
get_glade_active_record(obj)
|
195
|
+
get_glade_variables(obj)
|
196
|
+
end
|
197
|
+
|
198
|
+
# Populates the glade form from the fields of an ActiveRecord object.
|
199
|
+
# So instead of having to assign each widget a value:
|
200
|
+
#
|
201
|
+
# @builder["ARObject.name"].text = @name
|
202
|
+
# @builder["ARObject.address"].text = @address
|
203
|
+
# @builder["ARObject.email"].text = @eamil
|
204
|
+
# @builder["ARObject.phone"].text = @phone
|
205
|
+
#
|
206
|
+
# you can write one line of code:
|
207
|
+
#
|
208
|
+
# set_glade_active_record()
|
209
|
+
#
|
210
|
+
# The optional parameter is seldom used because you usually want the
|
211
|
+
# glade form to populate from the calling class. If you passed another object,
|
212
|
+
# the form would populate from it.
|
213
|
+
#
|
214
|
+
# obj - type ActiveRecord::Base
|
215
|
+
#
|
216
|
+
|
217
|
+
def set_glade_active_record(obj = self)
|
218
|
+
return if not defined? @attributes
|
219
|
+
obj.attributes.each_pair { |key, val| fill_control(class_name(obj) + "." + key, val) }
|
220
|
+
end
|
221
|
+
|
222
|
+
def set_glade_hash(hash)
|
223
|
+
return unless hash.is_a?(Hash)
|
224
|
+
hash.each { |key,val| fill_control( key.to_s, val.to_s) }
|
225
|
+
end
|
226
|
+
|
227
|
+
#Populates the glade form from the instance variables of the class.
|
228
|
+
#This works for Gtk:Button, Gtk::Entry, Gtk::Label and Gtk::Checkbutton.
|
229
|
+
#So instead of having to assign each widget a value:
|
230
|
+
#
|
231
|
+
# @builder["DataObjectGUI.name"].text = @name
|
232
|
+
# @builder["DataObjectGUI.address"].text = @address
|
233
|
+
# @builder["DataObjectGUI.email"].text = @eamil
|
234
|
+
# @builder["DataObjectGUI.phone"].text = @phone
|
235
|
+
#
|
236
|
+
#you can write one line of code:
|
237
|
+
#
|
238
|
+
# set_glade_variables()
|
239
|
+
#
|
240
|
+
#The optional parameter is seldom used because you usually want the
|
241
|
+
#glade form to populate from the calling class. If you passed another object,
|
242
|
+
#the form would populate from it.
|
243
|
+
#
|
244
|
+
#obj - type Object
|
245
|
+
#
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
def set_glade_variables(obj = self)
|
250
|
+
# set_glade_hash(obj) if obj.is_a?(Hash)
|
251
|
+
obj.instance_variables.each do |name|
|
252
|
+
name = name.to_s #ruby 1.9 passes symbol!
|
253
|
+
v = obj.instance_variable_get(name)
|
254
|
+
x = v.to_s
|
255
|
+
if v.class == Array
|
256
|
+
(0..v.size-1).each do |i|
|
257
|
+
fill_control(class_name(obj) + "." + name.gsub("@", "") + "[" + i.to_s + "]", v[i] )
|
258
|
+
end
|
259
|
+
else
|
260
|
+
fill_control(class_name(obj) + "." + name.gsub("@", ""), v)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
|
266
|
+
|
267
|
+
def fill_control(glade_name, val) # :nodoc:
|
268
|
+
control = @builder[glade_name]
|
269
|
+
control_name = glade_name.split(".")[1]
|
270
|
+
control ||= @builder[control_name] if control_name
|
271
|
+
case control
|
272
|
+
when Gtk::Window then control.title = val
|
273
|
+
when Gtk::CheckButton then control.active = val
|
274
|
+
when Gtk::TextView then control.buffer.text = val.to_s
|
275
|
+
when Gtk::Entry then control.text = val.to_s
|
276
|
+
when Gtk::FontButton then control.font_name = val.to_s
|
277
|
+
when Gtk::LinkButton then control.uri = control.label = val.to_s
|
278
|
+
when Gtk::Label, Gtk::Button then control.label = val.to_s
|
279
|
+
when Gtk::Image then control.file = val.to_s
|
280
|
+
when Gtk::SpinButton then control.value = val.to_f
|
281
|
+
when Gtk::ProgressBar then control.fraction = val.to_f
|
282
|
+
when Gtk::Calendar then control.select_month(val.month, val.year) ; control.select_day(val.day) ; control.mark_day(val.day)
|
283
|
+
when Gtk::Adjustment then control.value = val.to_f
|
284
|
+
when Gtk::ScrolledWindow, Gtk::Frame, Gtk::VBox, Gtk::HBox then control.add(val)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
|
289
|
+
#
|
290
|
+
# def fill_control(glade_name, val) # :nodoc:
|
291
|
+
# return unless glade_name and val
|
292
|
+
#puts glade_name + val.to_s
|
293
|
+
# control = @builder[glade_name]
|
294
|
+
#puts control.class
|
295
|
+
# control_name = glade_name.split(".")[1]
|
296
|
+
# control ||= @builder[control_name] unless control_name.nil?
|
297
|
+
# return if control.nil?
|
298
|
+
# case control.class
|
299
|
+
# when Gtk::Window then control.title = val
|
300
|
+
# when Gtk::CheckButton then control.active = val
|
301
|
+
# when Gtk::TextView then control.buffer.text = val.to_s
|
302
|
+
# when Gtk::Entry then control.text = val.to_s
|
303
|
+
# when Gtk::FontButton then control.font_name = val.to_s
|
304
|
+
# when Gtk::LinkButton then control.uri = control.label = val.to_s
|
305
|
+
# when Gtk::Label, Gtk::Button then control.label = val.to_s
|
306
|
+
# when Gtk::Image then control.file = val.to_s
|
307
|
+
# when Gtk::SpinButton then control.value = val.to_f
|
308
|
+
# when Gtk::ProgressBar then control.fraction = val.to_f
|
309
|
+
# when Gtk::Calendar then control.select_month(val.month, val.year) ; control.select_day(val.day) ; control.mark_day(val.day)
|
310
|
+
# when Gtk::Adjustment then control.value = val.to_f
|
311
|
+
# when Gtk::ScrolledWindow, Gtk::Frame, Gtk::Box then control.add(val)
|
312
|
+
# end
|
313
|
+
# end
|
314
|
+
#
|
315
|
+
# Populates the instance variables from the glade form.
|
316
|
+
# This works for Gtk:Button, Gtk::Entry, Gtk::Label and Gtk::Checkbutton.
|
317
|
+
# So instead of having to assign instance variable:
|
318
|
+
#
|
319
|
+
# @name = @builder["DataObjectGUI.name"].text
|
320
|
+
# @address = @builder["DataObjectGUI.address"].text
|
321
|
+
# @eamil = @builder["DataObjectGUI.email"].text
|
322
|
+
# @phone = @builder["DataObjectGUI.phone"].text
|
323
|
+
#
|
324
|
+
# you can write one line of code:
|
325
|
+
#
|
326
|
+
# get_glade_variables()
|
327
|
+
#
|
328
|
+
# The optional parameter is seldom used because you usually want the
|
329
|
+
# glade form to populate from the calling class. If you passed another object,
|
330
|
+
# the form would populate from it.
|
331
|
+
#
|
332
|
+
# obj - type Object
|
333
|
+
#
|
334
|
+
|
335
|
+
def get_glade_variables(obj = self)
|
336
|
+
obj.instance_variables.each do |v|
|
337
|
+
v = v.to_s #fix for ruby 1.9 giving symbols
|
338
|
+
control = @builder[class_name(obj) + v.gsub("@", ".")]
|
339
|
+
control ||= @builder[v.gsub("@", "")]
|
340
|
+
case control
|
341
|
+
when Gtk::CheckButton then obj.instance_variable_set(v, control.active?)
|
342
|
+
when Gtk::Entry then obj.instance_variable_set(v, control.text)
|
343
|
+
when Gtk::TextView then obj.instance_variable_set(v, control.buffer.text)
|
344
|
+
when Gtk::FontButton then obj.instance_variable_set(v, control.font_name)
|
345
|
+
when Gtk::Label, Gtk::Button then obj.instance_variable_set(v, control.label)
|
346
|
+
when Gtk::SpinButton then obj.instance_variable_set(v, control.value)
|
347
|
+
when Gtk::Image then obj.instance_variable_set(v, control.file)
|
348
|
+
when Gtk::ProgressBar then obj.instance_variable_set(v, control.fraction)
|
349
|
+
when Gtk::Calendar then obj.instance_variable_set(v, DateTime.new(*control.date))
|
350
|
+
when Gtk::Adjustment then obj.instance_variable_set(v, control.value)
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
|
356
|
+
def get_glade_active_record(obj) # :nodoc:
|
357
|
+
return if not defined? @attributes
|
358
|
+
obj.attributes.each_pair do |key, val|
|
359
|
+
control = @builder[class_name(obj) + "." + key]
|
360
|
+
control ||= @builder[key]
|
361
|
+
case control
|
362
|
+
when Gtk::CheckButton then self.send("#{key}=", control.active?)
|
363
|
+
when Gtk::Entry then self.send("#{key}=", control.text)
|
364
|
+
when Gtk::TextView then self.send("#{key}=", control.buffer.text)
|
365
|
+
when Gtk::FontButton then self.send("#{key}=", control.font_name)
|
366
|
+
when Gtk::Label, Gtk::Button then self.send("#{key}=", control.label)
|
367
|
+
when Gtk::SpinButton then self.send("#{key}=", control.value)
|
368
|
+
when Gtk::Image then self.send("#{key}=", control.file)
|
369
|
+
when Gtk::ProgressBar then self.send("#{key}=", control.fraction)
|
370
|
+
when Gtk::Calendar then self.send("#{key}=", DateTime.new(*control.date))
|
371
|
+
when Gtk::Adjustment then self.send("#{key}=", control.value)
|
372
|
+
end
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
|
377
|
+
|
378
|
+
def self.included(obj)
|
379
|
+
temp = caller[0].split(":") #correct for windows C:\Users\george etc.
|
380
|
+
caller_path_to_class_file, = temp[0].size == 1 ? temp[0] + ":" + temp[1] : temp[0]
|
381
|
+
obj.class_eval do
|
382
|
+
define_method :my_class_file_path do
|
383
|
+
return caller_path_to_class_file
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
|
389
|
+
#
|
390
|
+
#This shows the window and will start the Gtk.main loop (for top level windows.)
|
391
|
+
#Using show_glade() is better than using Gtk.main and
|
392
|
+
#Gtk.main.quit because visualruby automatically opens and closes all windows properly.
|
393
|
+
#
|
394
|
+
#
|
395
|
+
def show_glade(parent = nil)
|
396
|
+
load_glade()
|
397
|
+
if parent then
|
398
|
+
@builder[:window1].transient_for = parent.builder[:window1]
|
399
|
+
# @builder[:window1].modal = true
|
400
|
+
end
|
401
|
+
before_show() if respond_to? :before_show
|
402
|
+
parse_signals()
|
403
|
+
set_glade_all()
|
404
|
+
@builder[:window1].show #show_all can't hide widgets in before_show
|
405
|
+
@top_level_window = Gtk.main_level == 0 ? true : false
|
406
|
+
Gtk.main if @top_level_window or @builder[:window1].modal? #need new Gtk.main for blocking!
|
407
|
+
end
|
408
|
+
|
409
|
+
|
410
|
+
|
411
|
+
|
412
|
+
def window1__destroy(*args)
|
413
|
+
Gtk.main_quit if @top_level_window or @builder["window1"].modal?
|
414
|
+
end
|
415
|
+
|
416
|
+
def buttonCancel__clicked(*a)
|
417
|
+
@builder[:window1].destroy
|
418
|
+
end
|
419
|
+
|
420
|
+
|
421
|
+
def active_record_valid?(show_errors = true)
|
422
|
+
get_glade_all
|
423
|
+
if not self.valid?
|
424
|
+
alset(self.errors.full_messages.join("\n\n")) if show_errors
|
425
|
+
self.reload
|
426
|
+
return false
|
427
|
+
end
|
428
|
+
return true
|
429
|
+
end
|
430
|
+
|
431
|
+
end
|
432
|
+
|
433
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module VR
|
2
|
+
|
3
|
+
class IconHash < Hash # :nodoc:
|
4
|
+
|
5
|
+
def initialize(path)
|
6
|
+
Dir.glob(path + "/*.png").each do |f|
|
7
|
+
ext = File.basename(f, ".png")
|
8
|
+
self[ext] = Gdk::Pixbuf.new(f)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_icon(file_name)
|
13
|
+
ext = File.extname(file_name).gsub(".", "")
|
14
|
+
self.has_key?(ext) ? self[ext] : self["unknown"]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module VR
|
2
|
+
|
3
|
+
def self.load_yaml(flags)
|
4
|
+
me = nil
|
5
|
+
if File.file?(flags[:file_name])
|
6
|
+
me = YAML.load(File.open(flags[:file_name]).read)
|
7
|
+
elsif flags[:class]
|
8
|
+
me = flags[:class].new()
|
9
|
+
end
|
10
|
+
me.instance_variable_set(:@vr_yaml_file, flags[:file_name])
|
11
|
+
me.defaults() if me.respond_to?(:defaults)
|
12
|
+
VR::save_yaml(me)
|
13
|
+
return me
|
14
|
+
end
|
15
|
+
|
16
|
+
# todo create folders if don't exist
|
17
|
+
def self.save_yaml(obj, filename = nil)
|
18
|
+
filename ||= obj.instance_variable_get(:@vr_yaml_file)
|
19
|
+
data = YAML.dump(obj)
|
20
|
+
File.open(filename, "w") {|f| f.puts(data)}
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
#class VR::SavableClass
|
27
|
+
#
|
28
|
+
# def initialize(filename = nil)
|
29
|
+
# @filename = filename
|
30
|
+
# defaults
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# def self.load_yaml(filename)
|
34
|
+
# if File.file?(filename)
|
35
|
+
# me = YAML.load(File.open(filename).read)
|
36
|
+
# me.filename = filename
|
37
|
+
# me.defaults()
|
38
|
+
# return me
|
39
|
+
# else
|
40
|
+
# return nil
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# def save_yaml(new_filename = nil)
|
45
|
+
# @filename = new_filename if new_filename
|
46
|
+
# data = YAML.dump(self)
|
47
|
+
# File.open(@filename, "w") {|f| f.puts(data)}
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
#
|
51
|
+
#end
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
@@ -0,0 +1,119 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!-- Generated with glade 3.16.1 -->
|
3
|
+
<interface>
|
4
|
+
<requires lib="gtk+" version="3.0"/>
|
5
|
+
<object class="GtkWindow" id="window1">
|
6
|
+
<property name="width_request">300</property>
|
7
|
+
<property name="can_focus">False</property>
|
8
|
+
<property name="title" translatable="yes">Visual Ruby</property>
|
9
|
+
<property name="modal">True</property>
|
10
|
+
<property name="window_position">center</property>
|
11
|
+
<property name="destroy_with_parent">True</property>
|
12
|
+
<property name="type_hint">dialog</property>
|
13
|
+
<property name="urgency_hint">True</property>
|
14
|
+
<child>
|
15
|
+
<object class="GtkBox" id="box1">
|
16
|
+
<property name="visible">True</property>
|
17
|
+
<property name="can_focus">False</property>
|
18
|
+
<property name="margin_left">20</property>
|
19
|
+
<property name="margin_right">20</property>
|
20
|
+
<property name="margin_top">20</property>
|
21
|
+
<property name="margin_bottom">20</property>
|
22
|
+
<property name="orientation">vertical</property>
|
23
|
+
<child>
|
24
|
+
<object class="GtkLabel" id="headline">
|
25
|
+
<property name="can_focus">False</property>
|
26
|
+
<property name="label" translatable="yes">label</property>
|
27
|
+
<attributes>
|
28
|
+
<attribute name="size" value="18000"/>
|
29
|
+
</attributes>
|
30
|
+
</object>
|
31
|
+
<packing>
|
32
|
+
<property name="expand">False</property>
|
33
|
+
<property name="fill">True</property>
|
34
|
+
<property name="position">0</property>
|
35
|
+
</packing>
|
36
|
+
</child>
|
37
|
+
<child>
|
38
|
+
<object class="GtkLabel" id="message">
|
39
|
+
<property name="visible">True</property>
|
40
|
+
<property name="can_focus">False</property>
|
41
|
+
<property name="margin_top">10</property>
|
42
|
+
<property name="label" translatable="yes">label</property>
|
43
|
+
<property name="use_markup">True</property>
|
44
|
+
<property name="wrap">True</property>
|
45
|
+
</object>
|
46
|
+
<packing>
|
47
|
+
<property name="expand">True</property>
|
48
|
+
<property name="fill">True</property>
|
49
|
+
<property name="position">1</property>
|
50
|
+
</packing>
|
51
|
+
</child>
|
52
|
+
<child>
|
53
|
+
<object class="GtkEntry" id="input_text">
|
54
|
+
<property name="can_focus">True</property>
|
55
|
+
<property name="margin_top">10</property>
|
56
|
+
</object>
|
57
|
+
<packing>
|
58
|
+
<property name="expand">False</property>
|
59
|
+
<property name="fill">True</property>
|
60
|
+
<property name="position">2</property>
|
61
|
+
</packing>
|
62
|
+
</child>
|
63
|
+
<child>
|
64
|
+
<object class="GtkButtonBox" id="buttonbox1">
|
65
|
+
<property name="visible">True</property>
|
66
|
+
<property name="can_focus">False</property>
|
67
|
+
<property name="margin_top">10</property>
|
68
|
+
<property name="margin_bottom">5</property>
|
69
|
+
<property name="spacing">15</property>
|
70
|
+
<property name="layout_style">end</property>
|
71
|
+
<child>
|
72
|
+
<object class="GtkButton" id="button_cancel">
|
73
|
+
<property name="label" translatable="yes">button</property>
|
74
|
+
<property name="can_focus">True</property>
|
75
|
+
<property name="receives_default">True</property>
|
76
|
+
</object>
|
77
|
+
<packing>
|
78
|
+
<property name="expand">False</property>
|
79
|
+
<property name="fill">True</property>
|
80
|
+
<property name="position">0</property>
|
81
|
+
</packing>
|
82
|
+
</child>
|
83
|
+
<child>
|
84
|
+
<object class="GtkButton" id="button_no">
|
85
|
+
<property name="label" translatable="yes">button</property>
|
86
|
+
<property name="can_focus">True</property>
|
87
|
+
<property name="receives_default">True</property>
|
88
|
+
</object>
|
89
|
+
<packing>
|
90
|
+
<property name="expand">True</property>
|
91
|
+
<property name="fill">True</property>
|
92
|
+
<property name="position">1</property>
|
93
|
+
</packing>
|
94
|
+
</child>
|
95
|
+
<child>
|
96
|
+
<object class="GtkButton" id="button_yes">
|
97
|
+
<property name="label" translatable="yes">Ok</property>
|
98
|
+
<property name="visible">True</property>
|
99
|
+
<property name="can_focus">True</property>
|
100
|
+
<property name="receives_default">True</property>
|
101
|
+
</object>
|
102
|
+
<packing>
|
103
|
+
<property name="expand">True</property>
|
104
|
+
<property name="fill">True</property>
|
105
|
+
<property name="position">2</property>
|
106
|
+
</packing>
|
107
|
+
</child>
|
108
|
+
</object>
|
109
|
+
<packing>
|
110
|
+
<property name="expand">False</property>
|
111
|
+
<property name="fill">True</property>
|
112
|
+
<property name="pack_type">end</property>
|
113
|
+
<property name="position">3</property>
|
114
|
+
</packing>
|
115
|
+
</child>
|
116
|
+
</object>
|
117
|
+
</child>
|
118
|
+
</object>
|
119
|
+
</interface>
|