vr-corelib 0.0.36
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 +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
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
module VR
|
3
|
+
#
|
4
|
+
# TreeView is almost identical to VR::ListView. The only difference
|
5
|
+
# is how rows are added, and that they use a different model class.
|
6
|
+
# See VR::ListView for in-depth docs. Also, see GtkTreeView for more.
|
7
|
+
#
|
8
|
+
# Also, most of the useful methods for VR::TreeView are found in VR::ViewCommon.
|
9
|
+
# All the methods in VR::ViewCommon work on VR::TreeViews and VR::ListViews.
|
10
|
+
#
|
11
|
+
class TreeView < Gtk::TreeView
|
12
|
+
unless defined? TREEVIEW_GTYPE
|
13
|
+
TREEVIEW_GTYPE = self.name.split(":").collect {|x| x.empty? ? nil : x}.compact.join("_")
|
14
|
+
type_register(TREEVIEW_GTYPE)
|
15
|
+
end
|
16
|
+
|
17
|
+
include ViewCommon
|
18
|
+
|
19
|
+
# See VR::ListView constructor. (exactly the same)
|
20
|
+
|
21
|
+
def initialize(cols)
|
22
|
+
super()
|
23
|
+
self.model = Gtk::TreeStore.new(*flatten_hash(cols).values)
|
24
|
+
load_columns(cols)
|
25
|
+
end
|
26
|
+
#
|
27
|
+
# Adds row to the model. This will return a "row" type iter that responds
|
28
|
+
# to column IDs (symbols). You need to provide a parent row (iter).
|
29
|
+
# See GtkTreeView#append for more.
|
30
|
+
#
|
31
|
+
# The iter is a GtkTreeIter object for the parent or nil for the root of the tree. The hash argument is a Hash of values to add:
|
32
|
+
#
|
33
|
+
# @view.add_row(iter, :name => "Chester", :email => "chester@chesterizer.com")
|
34
|
+
#
|
35
|
+
#
|
36
|
+
def add_row(parent, hash)
|
37
|
+
child = model.append(parent)
|
38
|
+
(0..args.size-1).each { |i| child[i] = args[i] }
|
39
|
+
return child
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,351 @@
|
|
1
|
+
module VR
|
2
|
+
|
3
|
+
# This module holds all the methods that both VR::ListView
|
4
|
+
# and VR::TreeView use. All the methods listed here can be called from a
|
5
|
+
# VR::ListView or a VR::TreeView.
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
#
|
10
|
+
# ==The col_<propery>, ren_<property>, col_attr, and ren_attr methods
|
11
|
+
#
|
12
|
+
# All of these methods do the same thing: set the properties of your VR::ListView.
|
13
|
+
#
|
14
|
+
# The way to configure a VR::ListView or VR::TreeView is to set the properties
|
15
|
+
# of its columns (and renderers). For example,
|
16
|
+
# setting the "title" property of a column will set the title that appears at the top.
|
17
|
+
#
|
18
|
+
# The normal Gtk approach to setting properties of a GtkTreeViewColumn, (or renderer) is to set
|
19
|
+
# them individually:
|
20
|
+
#
|
21
|
+
# col = Gtk::TreeViewColumn.new()
|
22
|
+
# col.title = "My Title"
|
23
|
+
#
|
24
|
+
# This is slow, and tedious. However, you can completely configure any VR::ListView or
|
25
|
+
# VR::TreeView object with only a few lines of code using the above methods. They can set many properties on many columns
|
26
|
+
# at once.
|
27
|
+
#
|
28
|
+
# The first thing to understand is that there are several ways to set properties. In fact all
|
29
|
+
# of these lines of code do the exact same thing:
|
30
|
+
#
|
31
|
+
# column(:name).title = "Person's Name"
|
32
|
+
# col_title(:name => "Person's Name")
|
33
|
+
# ren_title(:name => "Person's Name")
|
34
|
+
# col_attr(:name, :title => "Person's Name")
|
35
|
+
# ren_attr(:name, :title => "Person's Name")
|
36
|
+
#
|
37
|
+
# All the above lines of code simply set the title of the :name column. So why
|
38
|
+
# is one method better than another? Answer: because you can set multiple
|
39
|
+
# properties on multiple columns with one line of code. For example, you can set all the titles
|
40
|
+
# with this line:
|
41
|
+
#
|
42
|
+
# col_titles(:name => "Name", :email => "Address", :phone => "Phone Number")
|
43
|
+
#
|
44
|
+
# The col_<property> method is very good at setting <b>multiple columns</b>.
|
45
|
+
#
|
46
|
+
# Likewise, the VR::ListView#col_attr method is good at setting the same property on multiple columns:
|
47
|
+
#
|
48
|
+
# col_attr(:name, :email, :phone, :width => 200, :weight => 700) #bold
|
49
|
+
#
|
50
|
+
# Either way, you can set everything with one line of code. Also, if you want to set
|
51
|
+
# a propery for all the columns, simply omit any column IDs:
|
52
|
+
#
|
53
|
+
# col_width(200)
|
54
|
+
# ren_background("yellow")
|
55
|
+
# col_attr(:font => "Sans")
|
56
|
+
# ren_attr(:visible => true)
|
57
|
+
#
|
58
|
+
# There are many, many possibilities of properties you can set using these methods.
|
59
|
+
# You need to know the name of the property that you want to set from consulting
|
60
|
+
# the docs for GtkTreeViewColumn and the docs for the column's renderer type (listed on the left of this webpage)
|
61
|
+
#
|
62
|
+
# Any of the properties of these classes can be set using the above methods.
|
63
|
+
#
|
64
|
+
# If you consult, GtkCellRendererText for example, you'll see that it has a "background" property.
|
65
|
+
# Therefore you can use ren_background() to set the color of the background of that column.
|
66
|
+
#
|
67
|
+
# Method names like "col_title" are just one possibility of methods you can use.
|
68
|
+
# You could call any of these as well:
|
69
|
+
#
|
70
|
+
# col_width
|
71
|
+
# col_xalign # (0.00 to 1.00, 1 = right justify)
|
72
|
+
# col_weight # (100 to 900)
|
73
|
+
# col_background
|
74
|
+
# col_foreground
|
75
|
+
# col_font
|
76
|
+
# col_markup
|
77
|
+
# col_size
|
78
|
+
# col_spacing
|
79
|
+
#
|
80
|
+
# You'll notice that some of the methods listed above don't look valid. For example,
|
81
|
+
# col_background doesn't seem to make sense because the GtkTreeViewColumn doesn't
|
82
|
+
# have a <b>background</b> property. The <b>background</b> property belongs to the
|
83
|
+
# renderer, GtkCellRendererText. But, the col_<attribute> method is programmed
|
84
|
+
# to try to set the property on the column first, and if the column object doesn't
|
85
|
+
# support the propery, it will look in the renderer. If the renderer doesn't support it,
|
86
|
+
# it DOES NOTHING.
|
87
|
+
#
|
88
|
+
# Likewise, the ren_<property> method will look first in the renderer for the property, then
|
89
|
+
# the column. The only difference between the ren_<property> and col_<propery> methods
|
90
|
+
# is that the ren_<property> looks in the renderer object first. These two methods
|
91
|
+
# are almost interchangable. In fact, I always just use the col_<propery> method
|
92
|
+
# because it looks better. The only time I have a problem is when the column and the renderer
|
93
|
+
# have the same property (i.e. "visible" and "xalign"). Then, I simply substitute the ren_<property> method.
|
94
|
+
#
|
95
|
+
# ==Summary
|
96
|
+
#
|
97
|
+
# - To set the <b>same attribute value</b> on multiple columns use col_attr() or ren_attr()
|
98
|
+
# - To set <b>different attribute values</b> on multiple columns, use col_<property> or ren_<property>
|
99
|
+
# - The ren_<property> and col_<property> methods are almost interchangable.
|
100
|
+
# - The ren_attr() and col_attr() methods are almost interchangable.
|
101
|
+
# - To set the properties of <b>all</b> the columns, omit any column iDs
|
102
|
+
# - Consult the documentation for GtkTreeViewColumn to learn about properties to set.
|
103
|
+
# - Consult the Gtk docs for the renderer by locating the type on the left of this webpage.
|
104
|
+
#
|
105
|
+
# Some examples are:
|
106
|
+
# ren_background(:name => "yellow", :email => black) #renderer for :name bg = yellow
|
107
|
+
# col_editable(false) #makes all columns un-editable
|
108
|
+
# col_width(:name => 300, email => 200)
|
109
|
+
# ren_xalign(:email => 1) # right justify email
|
110
|
+
# ren_attr(:name, :email, :font => "Courier")
|
111
|
+
# ren_attr(:font => "Sans") # all columns now Sans font
|
112
|
+
# col_attr(:name, :email, :visible => true)
|
113
|
+
#
|
114
|
+
|
115
|
+
module ViewCommon
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
def load_columns(cols) # :nodoc:
|
120
|
+
model_col = 0
|
121
|
+
cols.each_pair do | sym, type|
|
122
|
+
col = VR::TreeViewColumn.new(self, model_col, sym, type)
|
123
|
+
model_col = model_col + (type.class == Hash ? type.size : 1)
|
124
|
+
self.append_column(col)
|
125
|
+
end
|
126
|
+
turn_on_comboboxes()
|
127
|
+
@column_keys = flatten_hash(cols).keys
|
128
|
+
end
|
129
|
+
|
130
|
+
def method_missing(meth, *args) # :nodoc:
|
131
|
+
unless m = /^(ren_|col_)(.+)$/.match(meth.to_s)
|
132
|
+
super
|
133
|
+
return
|
134
|
+
end
|
135
|
+
if args.first.is_a? Hash
|
136
|
+
args.first.each_pair { |key, val| method(m[1] + "attr").call(key, m[2] => val) }
|
137
|
+
else
|
138
|
+
method(m[1] + "attr").call(m[2] => args.first)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# Sets properties on renderers (and columns) See VR::ViewCommon#col_attr for more.
|
143
|
+
|
144
|
+
def ren_attr(*args)
|
145
|
+
cols = args.select { |arg| !arg.is_a? Hash }
|
146
|
+
return unless hash = args.detect { |arg| arg.is_a? Hash }
|
147
|
+
cols = @column_keys if cols.empty?
|
148
|
+
cols.each do |c|
|
149
|
+
hash.each_pair do | key, val |
|
150
|
+
if renderer(c).respond_to?(key.to_s + "=")
|
151
|
+
renderer(c).send(key.to_s + '=', val)
|
152
|
+
elsif column(c).respond_to?(key.to_s + "=")
|
153
|
+
column(c).send(key.to_s + '=', val)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Sets properties on many columns at once. It can be called with many columns and many attributes.
|
160
|
+
# Also, if you don't specify any columns, it will set the properties on all of them. There are
|
161
|
+
# many ways to call this method, here are a few:
|
162
|
+
#
|
163
|
+
# @view.col_attr(:name, :date, :background => "yellow", foreground => "black")
|
164
|
+
# @view.col_attr(:background => "yellow", foreground => "black") #sets all columns
|
165
|
+
# @view.col_attr(:name, :date, :editable => true) # both editable now
|
166
|
+
# @view.col_attr(:editable => false) # turns off editing to all columns
|
167
|
+
#
|
168
|
+
# Also, if the column VR::TreeViewColumn object doesn't support the property, it will try to
|
169
|
+
# set the property on the renderer instead. In the above example, the col_attr() method tries to
|
170
|
+
# set teh "<b>background</b>" property of a VR:TreeViewColumn. However, that object doesn't
|
171
|
+
# support the "background" property, but the renderer for the column, VR::CellRendererText does.
|
172
|
+
# So it sets the renderer's property instead. So, in this example this line of code would do exactly the same
|
173
|
+
# thing:
|
174
|
+
#
|
175
|
+
# @view.ren_attr(:name, :date, :background => "yellow", foreground => "black")
|
176
|
+
#
|
177
|
+
# In the vast majority of cases, VR::ViewCommon#col_attr and VR::ViewCommon#ren_attr are interchangable.
|
178
|
+
|
179
|
+
|
180
|
+
def col_attr(*args)
|
181
|
+
cols = args.select { |arg| !arg.is_a? Hash }
|
182
|
+
return unless hash = args.detect { |arg| arg.is_a? Hash }
|
183
|
+
cols = @column_keys if cols.empty?
|
184
|
+
cols.each do |c|
|
185
|
+
hash.each_pair do | key, val |
|
186
|
+
if column(c).respond_to?(key.to_s + "=")
|
187
|
+
column(c).send(key.to_s + '=', val)
|
188
|
+
elsif renderer(c).respond_to?(key.to_s + "=")
|
189
|
+
renderer(c).send(key.to_s + '=', val)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
|
196
|
+
# Returns an array of rows that are selected in the VR::TreeView or VR::ListView.
|
197
|
+
# If nothing is selected, it returns an empty array. If you've configured your
|
198
|
+
# listview to accept multiple selections, it will return all of them. In single
|
199
|
+
# selection mode, it will return an array with one row. These rows are
|
200
|
+
# able to respond to column IDs. They are the same types of rows as returned by
|
201
|
+
# VR::ViewCommon#vr_row.
|
202
|
+
|
203
|
+
def selected_rows()
|
204
|
+
rows = []
|
205
|
+
selection.selected_each do |model, path, iter|
|
206
|
+
rows << vr_row(iter)
|
207
|
+
end
|
208
|
+
rows
|
209
|
+
end
|
210
|
+
|
211
|
+
def turn_on_comboboxes() # :nodoc:
|
212
|
+
#detect if comboboxes are present:
|
213
|
+
found = false
|
214
|
+
self.each_renderer do |r|
|
215
|
+
if r.is_a? VR::CellRendererCombo
|
216
|
+
found = true
|
217
|
+
break
|
218
|
+
end
|
219
|
+
end
|
220
|
+
return unless found
|
221
|
+
self.signal_connect("cursor_changed") do |view|
|
222
|
+
next unless iter = view.selection.selected
|
223
|
+
view.each_renderer do |r|
|
224
|
+
r.set_model( iter[r.model_col] ) if r.is_a? VR::CellRendererCombo
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def flatten_hash(hash) # :nodoc:
|
230
|
+
h = {}
|
231
|
+
hash.each do | k, v |
|
232
|
+
if v.class == Hash
|
233
|
+
v.each_pair { |key, val| h[key] = val }
|
234
|
+
else
|
235
|
+
h[k] = v
|
236
|
+
end
|
237
|
+
end
|
238
|
+
return h
|
239
|
+
end
|
240
|
+
|
241
|
+
# Enumerates each row in the model and returns an instance of GtkTreeIter.
|
242
|
+
# However, the iters returned have been converted into a "row" using VR::ViewCommon#vr_row
|
243
|
+
# so they will respond to colum IDs (symbols). Like this:
|
244
|
+
#
|
245
|
+
# @view.each_row { |row| puts row[:name] } # works!
|
246
|
+
#
|
247
|
+
|
248
|
+
def each_row
|
249
|
+
self.model.each { |mod, pth, itr| yield vr_row(itr) }
|
250
|
+
end
|
251
|
+
|
252
|
+
# Converts a normal GtkTreeIter to use VR's column IDs. You can use it like this:
|
253
|
+
#
|
254
|
+
# row = @view.vr_row(iter) # iter is a Gtk::TreeIter
|
255
|
+
# row[:name] = "Chester" # works!
|
256
|
+
|
257
|
+
|
258
|
+
def vr_row(iter)
|
259
|
+
iter.extend(VR::IterMethods)
|
260
|
+
iter.column_keys = @column_keys
|
261
|
+
return iter
|
262
|
+
end
|
263
|
+
|
264
|
+
|
265
|
+
# Returns a VR::TreeViewColumn object for the column. You can pass this method either
|
266
|
+
# a column ID (symbol) or the column number. Since, VR::TreeViewColumn is a subclass
|
267
|
+
# of Gtk::TreeViewColumn, you should consult Gtk::TreeViewColumn's documentation to
|
268
|
+
# see all the properties you can set on this object:
|
269
|
+
#
|
270
|
+
# @view.column(:name).title = "Person's Name"
|
271
|
+
# @view.column(:ok).visible = false
|
272
|
+
# @view.column(:name).class.name # => VR:TreeViewColumn
|
273
|
+
#
|
274
|
+
# Even though the above statements are valid, its usually easier to use the col_<property>
|
275
|
+
# methods instead. See VR::ViewCommon for more.
|
276
|
+
|
277
|
+
|
278
|
+
def column(id)
|
279
|
+
renderer(id).column
|
280
|
+
end
|
281
|
+
|
282
|
+
def each_renderer
|
283
|
+
self.columns.each do |c|
|
284
|
+
c.cell_renderers.each do |r|
|
285
|
+
yield r
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
#Returns the renderer for a given column ID.
|
291
|
+
#
|
292
|
+
#In VR::ListView#new (and VR::TreeView#new) method, a data model (VR::ListStore or VR::TreeStore) is automatically contstructed.
|
293
|
+
#Then the class will automatically assign a renderer to show it on the screen. These renderers
|
294
|
+
#simply convert a piece of data to something visual on the screen. For example, a column in the model
|
295
|
+
#might contain a value "true," but the renderer converts it to a GtkCheckButton which shows a check-mark.
|
296
|
+
#The VR::ListView class will
|
297
|
+
#automatically assign renderers to each column based on its type:
|
298
|
+
#
|
299
|
+
#String, Fixnum, Integer, Float => VR::CellRendererText
|
300
|
+
#TrueClass => VR::CellRendererToggle
|
301
|
+
#GdkPixbuf => VR::CellRendererPixbuf
|
302
|
+
#DateTime => VR::CellRendererDate
|
303
|
+
#VR::CalendarCol, VR::TextCol => VR::CellRendererObject
|
304
|
+
#VR::SpinCol => VR::CellRendererSpin
|
305
|
+
#VR::ProgressCol => VR::CellRendererProgress
|
306
|
+
#VR::ComboCol => VR::CellRendererCombo
|
307
|
+
#
|
308
|
+
#The renderer() method will return one of these renderers:
|
309
|
+
#
|
310
|
+
# ren = @view.renderer(:ok)
|
311
|
+
# puts ren.class.name # VR::CellRendererToggle (:ok column is a TrueClass)
|
312
|
+
# puts @view.renderer(:name).class.name # => VR::CellRendererText
|
313
|
+
#
|
314
|
+
#All the types of renderers are subclasses of Gtk renderers. For example, VR::CellRendererText
|
315
|
+
#is a subclass of Gtk::CellRendererText. So, you can use these objects just as you would use a
|
316
|
+
#normal Gtk renderer:
|
317
|
+
#
|
318
|
+
# @view.renderer(:name).width = 100
|
319
|
+
#
|
320
|
+
#This is perfectly valid even though there are better ways of setting these properties in visualruby.
|
321
|
+
|
322
|
+
def renderer(id)
|
323
|
+
each_renderer do |r|
|
324
|
+
return r if r.model_col == id(id)
|
325
|
+
end
|
326
|
+
return nil
|
327
|
+
end
|
328
|
+
|
329
|
+
# Returns the number of the given column ID. This is very useful when you're
|
330
|
+
# working with Gtk's methods because they require column numbers (not Column IDs)
|
331
|
+
# This method converts the column ID symbols from the VR::ListView#new constructor
|
332
|
+
# to Integers:
|
333
|
+
#
|
334
|
+
# @view = VR::ListView.new(:name => String, :date => VR::CalendarCol)
|
335
|
+
#
|
336
|
+
# Later in code...
|
337
|
+
#
|
338
|
+
# iter = get_iter(path)
|
339
|
+
# col_num = id(:date) # 1
|
340
|
+
# iter[col_num]
|
341
|
+
#
|
342
|
+
# You won't need to use this when adding rows with VR::ListView#add_row, and
|
343
|
+
# you also have the option of converting the whole iter to use column IDs (symbols)
|
344
|
+
# using VR::ViewCommon#vr_row.
|
345
|
+
|
346
|
+
def id(id)
|
347
|
+
return (id.is_a? Fixnum or id.is_a? Integer) ? id : @column_keys.index(id)
|
348
|
+
end
|
349
|
+
|
350
|
+
end
|
351
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
|
2
|
+
module VR
|
3
|
+
|
4
|
+
# The CalendarCol class is a simple calendar window where you can edit
|
5
|
+
# the date:
|
6
|
+
#
|
7
|
+
# http://visualruby.net/img/calendar.jpg
|
8
|
+
#
|
9
|
+
# This class is very useful when you want to display and edit dates
|
10
|
+
# in a VR::ListView. You can define a column with the type VR::CalendarCol
|
11
|
+
# and the column will display as a date, and when the user clicks on the
|
12
|
+
# date, a calendar window will appear so he/she can edit it:
|
13
|
+
#
|
14
|
+
# @view = VR::ListView.new(:name => String, :birthday => VR::CalendarCol)
|
15
|
+
# row = @view.add_row
|
16
|
+
# row[:name] = "Eric"
|
17
|
+
# row[:birthday] = VR::CalendarCol.new(DateTime.new(1966, 7, 14))
|
18
|
+
#
|
19
|
+
# See the example project, "listview_objects" for more.
|
20
|
+
|
21
|
+
class CalendarCol
|
22
|
+
|
23
|
+
include GladeGUI
|
24
|
+
|
25
|
+
attr_accessor :date, :date_format, :show_time, :show_calendar
|
26
|
+
#
|
27
|
+
# - datetime - Instance of DateTime class that holds the date value.
|
28
|
+
# - date_format - String that holds the Ruby date format. Default: "%d %b %Y %I:%M%p"
|
29
|
+
# - show_time - true/false If this is false, the time will not appear in the edit window.
|
30
|
+
# - show_calendar - true/false If this is false, Calendar will not appear. Only time will edit.
|
31
|
+
#
|
32
|
+
def initialize(datetime, date_format = nil, show_time = true, show_calendar = true)
|
33
|
+
@show_time = show_time
|
34
|
+
@show_calendar = show_calendar
|
35
|
+
@date_format = date_format ||= date_format = "%d %b %Y %I:%M%p"
|
36
|
+
@date = datetime
|
37
|
+
end
|
38
|
+
|
39
|
+
def show(show_time = true)
|
40
|
+
load_glade(__FILE__)
|
41
|
+
@hour = @date.strftime("%I").to_f
|
42
|
+
@minute = @date.min()
|
43
|
+
@am = (@date.hour < 12)
|
44
|
+
@pm = !@am
|
45
|
+
set_glade_variables()
|
46
|
+
@builder["hboxTime"].hide unless @show_time
|
47
|
+
@builder["date"].hide unless @show_calendar
|
48
|
+
show_window()
|
49
|
+
end
|
50
|
+
|
51
|
+
# displays time according to the @date_format instance variable. If you want to
|
52
|
+
# change the appearance of this object, assign a new vale to @date_format.
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
@date.strftime(@date_format)
|
56
|
+
end
|
57
|
+
|
58
|
+
def am__toggled(*args) # :nodoc:
|
59
|
+
@builder["pm"].active = !@builder["am"].active?
|
60
|
+
end
|
61
|
+
|
62
|
+
def pm__toggled(*args) # :nodoc:
|
63
|
+
@builder["am"].active = !@builder["pm"].active?
|
64
|
+
end
|
65
|
+
|
66
|
+
def buttonSave__clicked(*args) # :nodoc:
|
67
|
+
get_glade_variables()
|
68
|
+
m = @builder["am"].active? ? "AM" : "PM"
|
69
|
+
t = DateTime.strptime("#{@hour.to_i.to_s} #{@minute.to_i.to_s} #{m}", "%I %M %p")
|
70
|
+
@date = DateTime.new(@date.year, @date.month, @date.day, t.hour, t.min, 0)
|
71
|
+
destroy_window()
|
72
|
+
end
|
73
|
+
|
74
|
+
def buttonCancel__clicked(*args) # :nodoc:
|
75
|
+
destroy_window()
|
76
|
+
end
|
77
|
+
|
78
|
+
def <=>(calendar)
|
79
|
+
return @date <=> calendar.date
|
80
|
+
end
|
81
|
+
|
82
|
+
def value
|
83
|
+
@date
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|