vr-corelib 0.0.36
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Demo.rb +41 -0
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/glade/Demo.glade +52 -0
- data/img/image-x-generic.png +0 -0
- data/lib/Dialog.rb +157 -0
- data/lib/GladeGUI.rb +358 -0
- data/lib/IconHash.rb +22 -0
- data/lib/SimpleComboBoxEntry.rb +14 -0
- data/lib/Thread.rb +59 -0
- data/lib/Widget.rb +37 -0
- data/lib/treeview/FileTreeView.rb +91 -0
- data/lib/treeview/IterMethods.rb +82 -0
- data/lib/treeview/ListView.rb +90 -0
- data/lib/treeview/ModelRow.rb +31 -0
- data/lib/treeview/TreeIter.rb +33 -0
- data/lib/treeview/TreeView.rb +43 -0
- data/lib/treeview/ViewCommon.rb +351 -0
- data/lib/treeview/columns/CalendarCol.rb +88 -0
- data/lib/treeview/columns/CellRendererCombo.rb +66 -0
- data/lib/treeview/columns/CellRendererDate.rb +45 -0
- data/lib/treeview/columns/CellRendererObject.rb +57 -0
- data/lib/treeview/columns/CellRendererPhone.rb +45 -0
- data/lib/treeview/columns/CellRendererPixbuf.rb +16 -0
- data/lib/treeview/columns/CellRendererProgress.rb +17 -0
- data/lib/treeview/columns/CellRendererSpin.rb +37 -0
- data/lib/treeview/columns/CellRendererText.rb +38 -0
- data/lib/treeview/columns/CellRendererToggle.rb +47 -0
- data/lib/treeview/columns/ComboCol.rb +43 -0
- data/lib/treeview/columns/CurrencyCol.rb +23 -0
- data/lib/treeview/columns/DateCol.rb +20 -0
- data/lib/treeview/columns/ImageCol.rb +30 -0
- data/lib/treeview/columns/ProgressCol.rb +27 -0
- data/lib/treeview/columns/SpinCol.rb +11 -0
- data/lib/treeview/columns/TextCol.rb +64 -0
- data/lib/treeview/columns/TreeViewColumn.rb +108 -0
- data/lib/treeview/columns/glade/CalendarCol.glade +133 -0
- data/lib/treeview/columns/glade/ImageCol.glade +16 -0
- data/lib/treeview/columns/glade/TextCol.glade +77 -0
- data/main.rb +3 -0
- data/vr-corelib.rb +7 -0
- data/vrlib.rb +7 -0
- metadata +138 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 72378b086e397a855e84859aa56f6fd688efc2b7
|
4
|
+
data.tar.gz: abaa10d0bb20c79fd0b35fce6ebbeb43694a31ec
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 45e40d50ebe36c3f2b378005b415d0bf5de1a6eb210064170e84fd44f06a9ba27fdd26091ef3b44457e601040b4537a2cc6766c711c5ad0f99116f676e251d18
|
7
|
+
data.tar.gz: 3a24d1054b5dc9ffed0173150ba46b3dc950cb1fecc6076a726ac80f68c5361f42701ee2e1823c8efe6870955731041167894a98bbfe479d5ae017e2ef9ea99a
|
data/Demo.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#require 'vrlib.rb'
|
2
|
+
# :nodoc: all
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
class Demo # :nodoc:
|
7
|
+
|
8
|
+
|
9
|
+
include GladeGUI
|
10
|
+
|
11
|
+
def show()
|
12
|
+
|
13
|
+
@view = VR::FileTreeView.new("/home/eric/vrp/vrx/img")
|
14
|
+
# r = @view.add_row()
|
15
|
+
# r[0] = Gtk::Adjustment.new(0.to_i,0,100,1,10,0)
|
16
|
+
# r[0] = combo
|
17
|
+
load_glade(__FILE__)
|
18
|
+
@view.refresh
|
19
|
+
|
20
|
+
@builder["scrolledwindow1"].add_child(@builder, @view)
|
21
|
+
@builder["window1"].resize 700, 500
|
22
|
+
|
23
|
+
show_window()
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def but__clicked(button)
|
28
|
+
VR::Dialog.message_box("clicked")
|
29
|
+
end
|
30
|
+
|
31
|
+
def button1__clicked(button)
|
32
|
+
VR::Dialog.message_box("clicked")
|
33
|
+
end
|
34
|
+
|
35
|
+
def view__row_activated(x,y,z)
|
36
|
+
VR::Dialog.message_box("row activated new!")
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
Demo.new.show
|
data/doc/images/add.png
ADDED
Binary file
|
Binary file
|
Binary file
|
data/doc/images/bug.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/doc/images/date.png
ADDED
Binary file
|
Binary file
|
data/doc/images/find.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/doc/images/ruby.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/doc/images/zoom.png
ADDED
Binary file
|
data/glade/Demo.glade
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<interface>
|
3
|
+
<requires lib="gtk+" version="2.16"/>
|
4
|
+
<!-- interface-naming-policy project-wide -->
|
5
|
+
<object class="GtkWindow" id="window1">
|
6
|
+
<property name="visible">True</property>
|
7
|
+
<property name="title" translatable="yes">Demo crap</property>
|
8
|
+
<property name="modal">True</property>
|
9
|
+
<signal name="destroy" handler="destroy_window"/>
|
10
|
+
<child>
|
11
|
+
<object class="GtkVBox" id="vbox1">
|
12
|
+
<property name="visible">True</property>
|
13
|
+
<child>
|
14
|
+
<object class="GtkScrolledWindow" id="scrolledwindow1">
|
15
|
+
<property name="visible">True</property>
|
16
|
+
<property name="can_focus">True</property>
|
17
|
+
<property name="hscrollbar_policy">automatic</property>
|
18
|
+
<property name="vscrollbar_policy">automatic</property>
|
19
|
+
<child>
|
20
|
+
<placeholder/>
|
21
|
+
</child>
|
22
|
+
</object>
|
23
|
+
<packing>
|
24
|
+
<property name="position">0</property>
|
25
|
+
</packing>
|
26
|
+
</child>
|
27
|
+
<child>
|
28
|
+
<object class="GtkButton" id="button1">
|
29
|
+
<property name="label" translatable="yes">button</property>
|
30
|
+
<property name="visible">True</property>
|
31
|
+
<property name="can_focus">True</property>
|
32
|
+
<property name="receives_default">True</property>
|
33
|
+
</object>
|
34
|
+
<packing>
|
35
|
+
<property name="position">1</property>
|
36
|
+
</packing>
|
37
|
+
</child>
|
38
|
+
<child>
|
39
|
+
<object class="GtkButton" id="but[3]">
|
40
|
+
<property name="label" translatable="yes">button</property>
|
41
|
+
<property name="visible">True</property>
|
42
|
+
<property name="can_focus">True</property>
|
43
|
+
<property name="receives_default">True</property>
|
44
|
+
</object>
|
45
|
+
<packing>
|
46
|
+
<property name="position">2</property>
|
47
|
+
</packing>
|
48
|
+
</child>
|
49
|
+
</object>
|
50
|
+
</child>
|
51
|
+
</object>
|
52
|
+
</interface>
|
Binary file
|
data/lib/Dialog.rb
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
module VR
|
2
|
+
|
3
|
+
def VR.msg(*a) Dialog.message_box(*a) end
|
4
|
+
|
5
|
+
module Dialog
|
6
|
+
|
7
|
+
# def Dialog.calendar(datetime)
|
8
|
+
# dialog = Gtk::Dialog.new(
|
9
|
+
# "Select Date", nil,
|
10
|
+
# Gtk::Dialog::MODAL,
|
11
|
+
# [Gtk::Stock::OK, Gtk::Dialog::RESPONSE_ACCEPT],
|
12
|
+
# [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_REJECT])
|
13
|
+
# c = Gtk::Calendar.new
|
14
|
+
# c.select_month(datetime.month, datetime.year)
|
15
|
+
# c.select_day(datetime.day)
|
16
|
+
# c.mark_day(datetime.day)
|
17
|
+
# dialog.vbox.add(c)
|
18
|
+
# dialog.show_all
|
19
|
+
# ret = dialog.run == Gtk::Dialog::RESPONSE_ACCEPT ? DateTime.new(*c.date) : nil
|
20
|
+
# dialog.destroy
|
21
|
+
# return ret
|
22
|
+
# end
|
23
|
+
|
24
|
+
def Dialog.message_box(message, title = "Visual Ruby")
|
25
|
+
dialog = Gtk::MessageDialog.new(
|
26
|
+
nil,
|
27
|
+
Gtk::Dialog::MODAL,
|
28
|
+
Gtk::MessageDialog::INFO,
|
29
|
+
Gtk::MessageDialog::BUTTONS_OK,
|
30
|
+
message)
|
31
|
+
dialog.title = title
|
32
|
+
dialog.show_all
|
33
|
+
dialog.run
|
34
|
+
dialog.destroy
|
35
|
+
end
|
36
|
+
|
37
|
+
def Dialog.input_box(message, default="", title = "Visual Ruby")
|
38
|
+
dialog = Gtk::MessageDialog.new(
|
39
|
+
nil,
|
40
|
+
Gtk::Dialog::MODAL,
|
41
|
+
Gtk::MessageDialog::QUESTION,
|
42
|
+
Gtk::MessageDialog::BUTTONS_OK_CANCEL,
|
43
|
+
message)
|
44
|
+
dialog.title = title
|
45
|
+
input = Gtk::Entry.new
|
46
|
+
dialog.vbox.add(input)
|
47
|
+
dialog.show_all
|
48
|
+
ret = ""
|
49
|
+
dialog.run do |response|
|
50
|
+
if response == Gtk::Dialog::RESPONSE_OK
|
51
|
+
ret = input.buffer.text
|
52
|
+
else
|
53
|
+
ret = false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
dialog.destroy
|
57
|
+
return ret
|
58
|
+
end
|
59
|
+
|
60
|
+
def Dialog.ok_box(message, title = "Visual Ruby")
|
61
|
+
dialog = Gtk::MessageDialog.new(
|
62
|
+
nil,
|
63
|
+
Gtk::Dialog::MODAL,
|
64
|
+
Gtk::MessageDialog::QUESTION,
|
65
|
+
Gtk::MessageDialog::BUTTONS_OK_CANCEL,
|
66
|
+
message)
|
67
|
+
dialog.title = title
|
68
|
+
ret = (dialog.run == Gtk::Dialog::RESPONSE_OK)
|
69
|
+
dialog.destroy
|
70
|
+
return ret
|
71
|
+
end
|
72
|
+
|
73
|
+
def Dialog.folder_box(builder)
|
74
|
+
dialog = Gtk::FileChooserDialog.new("Select Folder...",
|
75
|
+
builder['window1'],
|
76
|
+
Gtk::FileChooser::ACTION_SELECT_FOLDER,
|
77
|
+
nil,
|
78
|
+
[Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
|
79
|
+
[Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_ACCEPT])
|
80
|
+
|
81
|
+
# if pattern != nil
|
82
|
+
# filter = Gtk::FileFilter.new
|
83
|
+
# filter.add_pattern(pattern)
|
84
|
+
# filter.name = "VR Project Folders"
|
85
|
+
# dialog.add_filter(filter)
|
86
|
+
# end
|
87
|
+
if dialog.run == Gtk::Dialog::RESPONSE_ACCEPT
|
88
|
+
ret = dialog.current_folder
|
89
|
+
else
|
90
|
+
ret = false
|
91
|
+
end
|
92
|
+
dialog.destroy
|
93
|
+
return ret
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def Dialog.yesno(message, title = "Visual Ruby")
|
98
|
+
dialog = Gtk::MessageDialog.new(
|
99
|
+
nil,
|
100
|
+
Gtk::Dialog::MODAL,
|
101
|
+
Gtk::MessageDialog::QUESTION,
|
102
|
+
Gtk::MessageDialog::BUTTONS_YES_NO,
|
103
|
+
message)
|
104
|
+
dialog.title = title
|
105
|
+
ret = (dialog.run == Gtk::Dialog::RESPONSE_YES)
|
106
|
+
dialog.destroy
|
107
|
+
return ret
|
108
|
+
end
|
109
|
+
|
110
|
+
def Dialog.userpass(message, title = "Visual Ruby")
|
111
|
+
dialog = Gtk::Dialog.new(
|
112
|
+
title,
|
113
|
+
nil,
|
114
|
+
Gtk::Dialog::MODAL,
|
115
|
+
[Gtk::Stock::OK,Gtk::Dialog::RESPONSE_ACCEPT],
|
116
|
+
[Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_REJECT])
|
117
|
+
dialog.vbox.add(Gtk::Label.new(message))
|
118
|
+
hbox = Gtk::HBox.new
|
119
|
+
hbox.add(Gtk::Label.new("Username:"))
|
120
|
+
hbox.add(user = Gtk::Entry.new)
|
121
|
+
dialog.vbox.add(hbox)
|
122
|
+
hbox = Gtk::HBox.new
|
123
|
+
hbox.add(Gtk::Label.new("Password:"))
|
124
|
+
hbox.add(pass = Gtk::Entry.new)
|
125
|
+
dialog.vbox.add(hbox)
|
126
|
+
pass.visibility = false
|
127
|
+
ret = (dialog.run == Gtk::Dialog::RESPONSE_ACCEPT) ? {:user => user.text, :pass => pass.text } : nil
|
128
|
+
dialog.destroy
|
129
|
+
return ret
|
130
|
+
end
|
131
|
+
|
132
|
+
def Dialog.listbox(message,list,title="Visual Ruby",icon=Gtk::Stock::DIALOG_QUESTION)
|
133
|
+
dialog = Gtk::Dialog.new(
|
134
|
+
title,
|
135
|
+
nil,
|
136
|
+
Gtk::Dialog::MODAL,
|
137
|
+
[Gtk::Stock::YES, Gtk::Dialog::RESPONSE_ACCEPT],
|
138
|
+
[Gtk::Stock::NO,Gtk::Dialog::RESPONSE_REJECT])
|
139
|
+
hbox = Gtk::HBox.new
|
140
|
+
hbox.add(Gtk::Image.new(icon,Gtk::IconSize::DIALOG))
|
141
|
+
hbox.add(Gtk::Label.new(message))
|
142
|
+
dialog.vbox.add(hbox)
|
143
|
+
vrlist = VR::ListView.new({:item=>String})
|
144
|
+
list.each do |entry|
|
145
|
+
vrlist.add_row(:item => entry)
|
146
|
+
end
|
147
|
+
vrlist.headers_visible = false
|
148
|
+
holder = Gtk::ScrolledWindow.new
|
149
|
+
holder.add(vrlist)
|
150
|
+
dialog.vbox.add(holder)
|
151
|
+
dialog.vbox.show_all
|
152
|
+
ret = (dialog.run == Gtk::Dialog::RESPONSE_ACCEPT)
|
153
|
+
dialog.destroy
|
154
|
+
return ret
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
data/lib/GladeGUI.rb
ADDED
@@ -0,0 +1,358 @@
|
|
1
|
+
#
|
2
|
+
# GladeGUI connects your class to a glade form using
|
3
|
+
# the #load_glade(__FILE__) method. 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
|
+
#
|
21
|
+
# include GladeGUI
|
22
|
+
#
|
23
|
+
# def show()
|
24
|
+
# load_glade(__FILE__) #loads file, /glade/MyClass.glade into @builder
|
25
|
+
# show_window()
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# The load_glade() method is part of GladeGUI. It will load a corresponding
|
31
|
+
# glade file for this class. It knows which glade file to load by using a naming
|
32
|
+
# convention:
|
33
|
+
#
|
34
|
+
# /home/me/project/MyClass.rb
|
35
|
+
#
|
36
|
+
# Will load this glade file:
|
37
|
+
#
|
38
|
+
# /home/me/project/glade/MyClass.glade
|
39
|
+
#
|
40
|
+
# Note: it will use this format: /my/path/glade/<class_name>.glade.
|
41
|
+
# In the example, the class and the file have the same name,
|
42
|
+
# MyClass. You should always name your class, script, and glade file
|
43
|
+
# the same name (case sensitive).
|
44
|
+
#
|
45
|
+
# ==@builder holds all your widgets
|
46
|
+
#
|
47
|
+
# So when you "load" your class's glade file where is it loaded?
|
48
|
+
#
|
49
|
+
# GladeGUI adds an instance variable, @builder to your class.
|
50
|
+
# It loads all the windows and widgets from your glade file into @builder.
|
51
|
+
# So, you use @builder to manipulate everything in you class's GUI.
|
52
|
+
# @builder is set when you call the load_glade() method, as this code shows:
|
53
|
+
#
|
54
|
+
# class MyClass
|
55
|
+
#
|
56
|
+
# include GladeGUI
|
57
|
+
#
|
58
|
+
# def show()
|
59
|
+
# puts @builder.to_s # => nil
|
60
|
+
# load_glade(__FILE__) #loads file, /glade/MyClass.glade into @builder
|
61
|
+
# puts @builder.to_s # => Gtk::Builder
|
62
|
+
# show_window()
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# After load_glade() is called, you can access any of your form's windows or widgets
|
68
|
+
# using the @builder variable:
|
69
|
+
#
|
70
|
+
# @builder["window1"].title = "This is the title that appears at the top."
|
71
|
+
#
|
72
|
+
# You use the @builder variable to access everything on your form. In the above example,
|
73
|
+
# @builder["window1"] is a reference to the main Gtk::Window of your class.
|
74
|
+
# Gtk::Window#title sets the title that appears at the top of the
|
75
|
+
# window, So, this will set that property.
|
76
|
+
#
|
77
|
+
# Here's another example: Suppose you have a glade form with a Gtk::Entry box on it named "email."
|
78
|
+
# You could set the text that appears in the Gtk::Entry by setting the Gtk::Entry#text property:
|
79
|
+
#
|
80
|
+
# @builder["email"].text = "harvey@harveyserver.com"
|
81
|
+
#
|
82
|
+
# Now the email adddess is set with a new value:
|
83
|
+
#
|
84
|
+
# http://visualruby.net/img/gladegui_simple.jpg
|
85
|
+
#
|
86
|
+
# ==Auto fill your glade form
|
87
|
+
# You can streamline the process of setting-up your forms by
|
88
|
+
# auto-filling the widgets from instance variables with the same name.
|
89
|
+
#
|
90
|
+
# When assigning names to widgets in glade, give them names that
|
91
|
+
# correspond to your instance variables. For example, if you want
|
92
|
+
# to edit an email address on the glade form, create an instance
|
93
|
+
# variable named @email in your class. Then, in glade, you
|
94
|
+
# add a Gtk::Entry widget to your form and set its name to
|
95
|
+
# “email”. The advantage of this is that GladeGUI will populate
|
96
|
+
# the “email” widget in glade using the @email variable. so
|
97
|
+
# you don’t need to include the above line of code. (see
|
98
|
+
# set_glade_variables() method.)
|
99
|
+
|
100
|
+
|
101
|
+
module GladeGUI
|
102
|
+
|
103
|
+
attr_accessor :builder
|
104
|
+
|
105
|
+
def set_parent(parent) # :nodoc: parent = class derived from class GladeGUI
|
106
|
+
@builder["window1"].transient_for = parent.builder["window1"]
|
107
|
+
end
|
108
|
+
|
109
|
+
##
|
110
|
+
# This will Load the glade form.
|
111
|
+
# It will create a Gtk::Builder object from your glade file.
|
112
|
+
# The Gtk::Builder object is stored in the instance variable, @builder.
|
113
|
+
# You can get a reference to any of the widgets on the glade form by
|
114
|
+
# using the @builder object:
|
115
|
+
#
|
116
|
+
# widget = @builder["name"]
|
117
|
+
#
|
118
|
+
# Normally, you should give your widgets names of instance variables: i.e. "MyClass.var"
|
119
|
+
# so they can be autoloaded using the set_glade_all() method.
|
120
|
+
#
|
121
|
+
# You can also pass a reference to a parent class that also includes GladeGUI.
|
122
|
+
# Then the child window will run simultaniously with the parent.
|
123
|
+
#
|
124
|
+
|
125
|
+
def load_glade(caller__FILE__, parent = nil)
|
126
|
+
file_name = File.split(caller__FILE__)[0] + '/glade/' + class_name(self) + ".glade"
|
127
|
+
@builder = Gtk::Builder.new.add_from_file(file_name)
|
128
|
+
@builder.connect_signals{ |handle| method(handle) }
|
129
|
+
set_parent(parent) unless parent.nil?
|
130
|
+
parse_signals()
|
131
|
+
end
|
132
|
+
|
133
|
+
def class_name(obj) # :nodoc:
|
134
|
+
/.*\b(\w+)$/.match(obj.class.name)[1]
|
135
|
+
end
|
136
|
+
|
137
|
+
def parse_signals() # :nodoc:
|
138
|
+
meths = self.class.instance_methods()
|
139
|
+
meths.each do |meth|
|
140
|
+
meth = meth.to_s #bug fix ruby 1.9 gives stmbol
|
141
|
+
glade_name, signal_name = *(meth.split("__"))
|
142
|
+
next if (signal_name.to_s == "" or glade_name.to_s == "") #covers nil
|
143
|
+
@builder.objects.each do |obj|
|
144
|
+
next unless obj.respond_to?(:builder_name)
|
145
|
+
if obj.builder_name == glade_name or obj.builder_name =~ /^(?:#{class_name(self)}\.|)#{glade_name}\[\d+\]$/ #arrays
|
146
|
+
obj.signal_connect(signal_name) { |*args| method(meth.to_sym).call(*args) }
|
147
|
+
end
|
148
|
+
end
|
149
|
+
obj = glade_name == "self" ? self : instance_variable_get("@" + glade_name)
|
150
|
+
obj ||= eval(glade_name) if respond_to?(glade_name) and method(glade_name.to_sym).arity == 0 # no arguments!
|
151
|
+
obj.signal_connect(signal_name) { |*args| method(meth.to_sym).call(*args) } if obj.respond_to?("signal_connect")
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# This method is the most useful method to populate a glade form. It will
|
156
|
+
# populate from active_record fields and instance variables. It will simply
|
157
|
+
# call both of these methods:
|
158
|
+
#
|
159
|
+
# set_glade_active_record()
|
160
|
+
# set_glade_variables()
|
161
|
+
#
|
162
|
+
# So, to set all the values of a form, simply call the set_glade_all() method instead.
|
163
|
+
|
164
|
+
def set_glade_all(obj = self)
|
165
|
+
set_glade_active_record(obj)
|
166
|
+
set_glade_variables(obj)
|
167
|
+
end
|
168
|
+
|
169
|
+
# This method is the most useful method to retreive values from 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
|
+
# get_glade_active_record()
|
174
|
+
# get_glade_variables()
|
175
|
+
#
|
176
|
+
# 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.
|
177
|
+
|
178
|
+
def get_glade_all(obj = self)
|
179
|
+
get_glade_active_record(obj)
|
180
|
+
get_glade_variables(obj)
|
181
|
+
end
|
182
|
+
|
183
|
+
# Populates the glade form from the fields of an ActiveRecord object.
|
184
|
+
# So instead of having to assign each widget a value:
|
185
|
+
#
|
186
|
+
# @builder["ARObject.name"].text = @name
|
187
|
+
# @builder["ARObject.address"].text = @address
|
188
|
+
# @builder["ARObject.email"].text = @eamil
|
189
|
+
# @builder["ARObject.phone"].text = @phone
|
190
|
+
#
|
191
|
+
# you can write one line of code:
|
192
|
+
#
|
193
|
+
# set_glade_active_record()
|
194
|
+
#
|
195
|
+
# The optional parameter is seldom used because you usually want the
|
196
|
+
# glade form to populate from the calling class. If you passed another object,
|
197
|
+
# the form would populate from it.
|
198
|
+
#
|
199
|
+
# obj - type ActiveRecord::Base
|
200
|
+
#
|
201
|
+
|
202
|
+
def set_glade_active_record(obj = self)
|
203
|
+
return if not defined? @attributes
|
204
|
+
obj.attributes.each_pair { |key, val| fill_control(class_name(obj) + "." + key, val) }
|
205
|
+
end
|
206
|
+
|
207
|
+
#Populates the glade form from the instance variables of the class.
|
208
|
+
#This works for Gtk:Button, Gtk::Entry, Gtk::Label and Gtk::Checkbutton.
|
209
|
+
#So instead of having to assign each widget a value:
|
210
|
+
#
|
211
|
+
# @builder["DataObjectGUI.name"].text = @name
|
212
|
+
# @builder["DataObjectGUI.address"].text = @address
|
213
|
+
# @builder["DataObjectGUI.email"].text = @eamil
|
214
|
+
# @builder["DataObjectGUI.phone"].text = @phone
|
215
|
+
#
|
216
|
+
#you can write one line of code:
|
217
|
+
#
|
218
|
+
# set_glade_variables()
|
219
|
+
#
|
220
|
+
#The optional parameter is seldom used because you usually want the
|
221
|
+
#glade form to populate from the calling class. If you passed another object,
|
222
|
+
#the form would populate from it.
|
223
|
+
#
|
224
|
+
#obj - type Object
|
225
|
+
#
|
226
|
+
|
227
|
+
def set_glade_variables(obj = self)
|
228
|
+
obj.instance_variables.each do |name|
|
229
|
+
name = name.to_s #ruby 1.9 passes symbol!
|
230
|
+
v = obj.instance_variable_get(name)
|
231
|
+
if v.class == Array
|
232
|
+
(0..v.size-1).each do |i|
|
233
|
+
fill_control(class_name(obj) + "." + name.gsub("@", "") + "[" + i.to_s + "]", v[i] )
|
234
|
+
end
|
235
|
+
else
|
236
|
+
fill_control(class_name(obj) + "." + name.gsub("@", ""), v)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
def fill_control(glade_name, val) # :nodoc:
|
242
|
+
control = @builder[glade_name]
|
243
|
+
control ||= @builder[glade_name.split(".")[1]]
|
244
|
+
case control
|
245
|
+
when Gtk::CheckButton then control.active = val
|
246
|
+
when Gtk::TextView then control.buffer.text = val.to_s
|
247
|
+
when Gtk::Entry then control.text = val.to_s
|
248
|
+
when Gtk::FontButton then control.font_name = val.to_s
|
249
|
+
when Gtk::LinkButton then control.uri = control.label = val.to_s
|
250
|
+
when Gtk::Label, Gtk::Button then control.label = val.to_s
|
251
|
+
when Gtk::Image then control.file = val.to_s
|
252
|
+
when Gtk::SpinButton then control.value = val.to_f
|
253
|
+
when Gtk::ProgressBar then control.fraction = val.to_f
|
254
|
+
when Gtk::Calendar then control.select_month(val.month, val.year) ; control.select_day(val.day) ; control.mark_day(val.day)
|
255
|
+
when Gtk::Adjustment then control.value = val.to_f
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
# Populates the instance variables from the glade form.
|
260
|
+
# This works for Gtk:Button, Gtk::Entry, Gtk::Label and Gtk::Checkbutton.
|
261
|
+
# So instead of having to assign instance variable:
|
262
|
+
#
|
263
|
+
# @name = @builder["DataObjectGUI.name"].text
|
264
|
+
# @address = @builder["DataObjectGUI.address"].text
|
265
|
+
# @eamil = @builder["DataObjectGUI.email"].text
|
266
|
+
# @phone = @builder["DataObjectGUI.phone"].text
|
267
|
+
#
|
268
|
+
# you can write one line of code:
|
269
|
+
#
|
270
|
+
# get_glade_variables()
|
271
|
+
#
|
272
|
+
# The optional parameter is seldom used because you usually want the
|
273
|
+
# glade form to populate from the calling class. If you passed another object,
|
274
|
+
# the form would populate from it.
|
275
|
+
#
|
276
|
+
# obj - type Object
|
277
|
+
#
|
278
|
+
|
279
|
+
def get_glade_variables(obj = self)
|
280
|
+
obj.instance_variables.each do |v|
|
281
|
+
v = v.to_s #fix for ruby 1.9 giving symbols
|
282
|
+
control = @builder[class_name(obj) + v.gsub("@", ".")]
|
283
|
+
control ||= @builder[v.gsub("@", "")]
|
284
|
+
case control
|
285
|
+
when Gtk::CheckButton then obj.instance_variable_set(v, control.active?)
|
286
|
+
when Gtk::Entry then obj.instance_variable_set(v, control.text)
|
287
|
+
when Gtk::TextView then obj.instance_variable_set(v, control.buffer.text)
|
288
|
+
when Gtk::FontButton then obj.instance_variable_set(v, control.font_name)
|
289
|
+
when Gtk::Label, Gtk::Button then obj.instance_variable_set(v, control.label)
|
290
|
+
when Gtk::SpinButton then obj.instance_variable_set(v, control.value)
|
291
|
+
when Gtk::Image then obj.instance_variable_set(v, control.file)
|
292
|
+
when Gtk::ProgressBar then obj.instance_variable_set(v, control.fraction)
|
293
|
+
when Gtk::Calendar then obj.instance_variable_set(v, DateTime.new(*control.date))
|
294
|
+
when Gtk::Adjustment then obj.instance_variable_set(v, control.value)
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
|
300
|
+
def get_glade_active_record(obj) # :nodoc:
|
301
|
+
return if not defined? @attributes
|
302
|
+
obj.attributes.each_pair do |key, val|
|
303
|
+
control = @builder[class_name(obj) + "." + key]
|
304
|
+
control ||= @builder[key]
|
305
|
+
case control
|
306
|
+
when Gtk::CheckButton then self.send("#{key}=", control.active?)
|
307
|
+
when Gtk::Entry then self.send("#{key}=", control.text)
|
308
|
+
when Gtk::TextView then self.send("#{key}=", control.buffer.text)
|
309
|
+
when Gtk::FontButton then self.send("#{key}=", control.font_name)
|
310
|
+
when Gtk::Label, Gtk::Button then self.send("#{key}=", control.label)
|
311
|
+
when Gtk::SpinButton then self.send("#{key}=", control.value)
|
312
|
+
when Gtk::Image then self.send("#{key}=", control.file)
|
313
|
+
when Gtk::ProgressBar then self.send("#{key}=", control.fraction)
|
314
|
+
when Gtk::Calendar then self.send("#{key}=", DateTime.new(*control.date))
|
315
|
+
when Gtk::Adjustment then self.send("#{key}=", control.value)
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
#
|
324
|
+
#This shows the window and will start the Gtk.main loop (for top level windows.)
|
325
|
+
#This is called after calling load_glade() and setting-up all the form widgets.
|
326
|
+
#Using show_window() and destroy_window() is better than using Gtk.main and
|
327
|
+
#Gtk.main.quit because they automatically open and close windows properly.
|
328
|
+
#
|
329
|
+
def show_window()
|
330
|
+
@builder["window1"].show_all
|
331
|
+
Gtk.main if @builder["window1"].transient_for.nil?
|
332
|
+
end
|
333
|
+
#
|
334
|
+
#Destroys window that was opened with show_window(). destroy_window()
|
335
|
+
#will check if your window is a parent window or a child, and destroy
|
336
|
+
#the window in the proper way. (It will call Gtk.main.quit for
|
337
|
+
#parent windows.)
|
338
|
+
#
|
339
|
+
def destroy_window()
|
340
|
+
if @builder["window1"].transient_for.nil?
|
341
|
+
Gtk.main_quit
|
342
|
+
end
|
343
|
+
@builder["window1"].destroy
|
344
|
+
end
|
345
|
+
|
346
|
+
def active_record_valid?(show_errors = true)
|
347
|
+
get_glade_all
|
348
|
+
if not self.valid?
|
349
|
+
VR.msg(self.errors.full_messages.join("\n\n")) if show_errors
|
350
|
+
self.reload
|
351
|
+
return false
|
352
|
+
end
|
353
|
+
return true
|
354
|
+
end
|
355
|
+
|
356
|
+
end
|
357
|
+
|
358
|
+
|