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,89 @@
|
|
|
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, flags = {}) #flags = :hide_date => true, hide_time => true, :format => "%d %b %Y %I:%M%p"
|
|
33
|
+
@format = flags[:format]
|
|
34
|
+
@format ||= flags[:hide_date] ? "%I:%M%p" : "%d %b %Y %I:%M%p"
|
|
35
|
+
@format ||= flags[:hide_time] ? "%d %b %Y" : @date_format
|
|
36
|
+
@hide_date = flags[:hide_date]
|
|
37
|
+
@hide_time = flags[:hide_time]
|
|
38
|
+
@show_calendar = show_calendar
|
|
39
|
+
@date = datetime
|
|
40
|
+
@hour = @date.strftime("%I").to_f
|
|
41
|
+
@minute = @date.min()
|
|
42
|
+
@am = (@date.hour < 12)
|
|
43
|
+
@pm = !@am
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def show_glade(parent = nil)
|
|
47
|
+
super
|
|
48
|
+
@builder["hboxTime"].hide if @hide_time
|
|
49
|
+
@builder["date"].hide if @hide_date
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# displays time according to the @date_format instance variable. If you want to
|
|
53
|
+
# change the appearance of this object, assign a new vale to @date_format.
|
|
54
|
+
|
|
55
|
+
def to_s
|
|
56
|
+
@date.strftime(@format)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def am__toggled(*args) # :nodoc:
|
|
60
|
+
@builder["pm"].active = !@builder["am"].active?
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def pm__toggled(*args) # :nodoc:
|
|
64
|
+
@builder["am"].active = !@builder["pm"].active?
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def buttonSave__clicked(*args) # :nodoc:
|
|
68
|
+
get_glade_variables()
|
|
69
|
+
m = @builder["am"].active? ? "AM" : "PM"
|
|
70
|
+
t = DateTime.strptime("#{@hour.to_i.to_s} #{@minute.to_i.to_s} #{m}", "%I %M %p")
|
|
71
|
+
@date = DateTime.new(@date.year, @date.month, @date.day, t.hour, t.min, 0)
|
|
72
|
+
@builder["window1"].destroy
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def buttonCancel__clicked(*args) # :nodoc:
|
|
76
|
+
@builder["window1"].destroy
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def <=>(calendar)
|
|
80
|
+
return @date <=> calendar.date
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def value
|
|
84
|
+
@date
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
# This class is a helper to VR::ListView and VR::TreeView. When
|
|
4
|
+
# colums are created, this class is used as the renderer because
|
|
5
|
+
# it adds functionality to the Gtk Renderer.
|
|
6
|
+
#
|
|
7
|
+
# When you call ListView#render(model_col) an instance of this class
|
|
8
|
+
# will be returned. It is a subclass of
|
|
9
|
+
#
|
|
10
|
+
# {Gtk::CellRendererCombo}[http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ACellRendererCombo]
|
|
11
|
+
#
|
|
12
|
+
# So it has all the functionality of its parent, plus the methods listed here.
|
|
13
|
+
#
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CellRendererCombo < Gtk::CellRendererCombo
|
|
17
|
+
|
|
18
|
+
attr_accessor :edited_callback, :validate_block
|
|
19
|
+
attr_reader :model_col, :column, :model_sym
|
|
20
|
+
|
|
21
|
+
def initialize(model_col, column, view, model_sym) # :nodoc:
|
|
22
|
+
super()
|
|
23
|
+
@model_col = model_col
|
|
24
|
+
@column = column
|
|
25
|
+
@view = view
|
|
26
|
+
@model_sym = model_sym
|
|
27
|
+
@view.model.set_sort_func(@model_col) { |m,x,y| x[@model_col].selected <=> y[@model_col].selected }
|
|
28
|
+
@validate_block = Proc.new { |text, model_sym, row, view | true }
|
|
29
|
+
self.editable = true
|
|
30
|
+
self.has_entry = false
|
|
31
|
+
@edited_callback = nil
|
|
32
|
+
self.signal_connect('edited') do |ren, path, text| # iter for
|
|
33
|
+
iter = @view.model.get_iter(path)
|
|
34
|
+
if @validate_block.call(text, @model_sym, @view.vr_row(iter), @view)
|
|
35
|
+
iter[@model_col].selected = text
|
|
36
|
+
@edited_callback.call(@model_sym, @view.vr_row(iter)) if @edited_callback
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# This sets the renderer's "editable" property to true, and makes it save
|
|
42
|
+
# the edited value to the model. When a user edits a row in the ListView
|
|
43
|
+
# the value isn't automatically saved by Gtk. This method groups both actions
|
|
44
|
+
# together, so setting edit_save=true, allows both editing and saving of
|
|
45
|
+
# the field.
|
|
46
|
+
#
|
|
47
|
+
# Also, you can use VR::ListView and VR::TreeView's convenience methods to
|
|
48
|
+
# envoke call this method:
|
|
49
|
+
#
|
|
50
|
+
# NAME = 0
|
|
51
|
+
# ADDR = 1
|
|
52
|
+
# @view.set_attr([NAME, ADDR], :edit_save => true) #sets model_col = 0, 1
|
|
53
|
+
# @view.set_edit_save( 0 => true, 1 => false)
|
|
54
|
+
#
|
|
55
|
+
# is_editable = boolean
|
|
56
|
+
#
|
|
57
|
+
|
|
58
|
+
def set_model(vr_combo) # :nodoc:
|
|
59
|
+
self.model = Gtk::ListStore.new(String)
|
|
60
|
+
vr_combo.selections.each { |s| r = self.model.append ; r[0] = s }
|
|
61
|
+
self.text_column = 0
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
# This class is a helper to VR::ListView and VR::TreeView. When
|
|
4
|
+
# colums are created, this class is used as the renderer because
|
|
5
|
+
# it adds functionality to the Gtk Renderer.
|
|
6
|
+
#
|
|
7
|
+
# When you call ListView#render(model_col) an instance of this class
|
|
8
|
+
# will be returned. It is a subclass of
|
|
9
|
+
#
|
|
10
|
+
# {Gtk::CellRendererText}[http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ACellRendererText]
|
|
11
|
+
#
|
|
12
|
+
# So it has all the functionality of its parent, plus the methods listed here.
|
|
13
|
+
|
|
14
|
+
class CellRendererDate < Gtk::CellRendererText
|
|
15
|
+
|
|
16
|
+
attr_accessor :date_format, :edited_callback, :model_col, :column, :model_sym
|
|
17
|
+
|
|
18
|
+
def initialize(model_col, column, view, model_sym) # :nodoc:
|
|
19
|
+
super()
|
|
20
|
+
@model_col = model_col
|
|
21
|
+
@column = column
|
|
22
|
+
@view = view
|
|
23
|
+
@model_sym = model_sym
|
|
24
|
+
@view.model.set_sort_func(@model_col) { |m,x,y| x[@model_col] <=> y[@model_col] }
|
|
25
|
+
@date_format = "%m-%d-%Y"
|
|
26
|
+
@validate_block = Proc.new { |text, model_sym, row, view|
|
|
27
|
+
begin
|
|
28
|
+
Date.strptime(text, @date_format)
|
|
29
|
+
true
|
|
30
|
+
rescue
|
|
31
|
+
alert("Unrecognized date format: " + text)
|
|
32
|
+
false
|
|
33
|
+
end }
|
|
34
|
+
@edited_block = nil
|
|
35
|
+
self.signal_connect('edited') do |ren, path, text|
|
|
36
|
+
next unless iter = @view.model.get_iter(path)
|
|
37
|
+
if @validate_block.call(text, @model_sym, @view.vr_row(iter), @view)
|
|
38
|
+
iter[@model_col] = DateTime.strptime(text, @date_format)
|
|
39
|
+
@edited_callback.call(@model_sym, @view.vr_row(iter)) if @edited_callback
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
# This class is a helper to VR::ListView and VR::TreeView. When
|
|
4
|
+
# colums are created, this class is used as the renderer because
|
|
5
|
+
# it adds functionality to the Gtk Renderer.
|
|
6
|
+
#
|
|
7
|
+
# When you call ListView#render(model_col) an instance of this class
|
|
8
|
+
# will be returned. It is a subclass of
|
|
9
|
+
#
|
|
10
|
+
# {Gtk::CellRendererText}[http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ACellRendererText]
|
|
11
|
+
#
|
|
12
|
+
# So it has all the functionality of its parent, plus the methods listed here.
|
|
13
|
+
|
|
14
|
+
class CellRendererObject < Gtk::CellRendererText
|
|
15
|
+
|
|
16
|
+
attr_accessor :model_col, :column, :edited_callback, :visual_attributes_method, :model_sym
|
|
17
|
+
|
|
18
|
+
def initialize(model_col, column, view, model_sym) # :nodoc:
|
|
19
|
+
super()
|
|
20
|
+
@model_col = model_col
|
|
21
|
+
@model_sym = model_sym
|
|
22
|
+
@view = view
|
|
23
|
+
@column = column
|
|
24
|
+
@edit = true
|
|
25
|
+
@edited_callback = nil
|
|
26
|
+
@visual_attributes_method = "visual_attributes"
|
|
27
|
+
@view.model.set_sort_func(@model_col) { |m,x,y| x[@model_col] <=> y[@model_col] }
|
|
28
|
+
@show_block = Proc.new { |obj| obj.show_glade() if obj.respond_to? "show_glade" }
|
|
29
|
+
@view.signal_connect("row_activated") do | view, path, col |
|
|
30
|
+
next if !@edit or !col.eql? @column
|
|
31
|
+
iter = @view.model.get_iter(path)
|
|
32
|
+
obj = iter[@model_col]
|
|
33
|
+
@show_block.call(obj)
|
|
34
|
+
block = @edited_callback ? @edited_callback.call(@model_sym, @view.vr_row(iter)) : true
|
|
35
|
+
@view.signal_emit_stop("row_activated") if block
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
alias :set_editable :editable=
|
|
40
|
+
def editable=(e)
|
|
41
|
+
@edit = e
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def render_object(iter)
|
|
45
|
+
obj = iter[@view.id(@model_col)]
|
|
46
|
+
self.text = obj.respond_to?(:to_s) ? obj.to_s : "Define to_s!"
|
|
47
|
+
if obj.respond_to? @visual_attributes_method
|
|
48
|
+
return unless attrib = obj.send(@visual_attributes_method)
|
|
49
|
+
attrib.each_pair do | key, val |
|
|
50
|
+
self.send( key.to_s + "=", val)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
# This class is a helper to VR::ListView and VR::TreeView. When
|
|
4
|
+
# colums are created, this class is used as the renderer because
|
|
5
|
+
# it adds functionality to the Gtk Renderer.
|
|
6
|
+
#
|
|
7
|
+
# When you call ListView#render(model_col) an instance of this class
|
|
8
|
+
# will be returned. It is a subclass of
|
|
9
|
+
#
|
|
10
|
+
# {Gtk::CellRendererText}[http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ACellRendererText]
|
|
11
|
+
#
|
|
12
|
+
# So it has all the functionality of its parent, plus the methods listed here.
|
|
13
|
+
|
|
14
|
+
class CellRendererPhone < Gtk::CellRendererText
|
|
15
|
+
|
|
16
|
+
attr_accessor :phone_format, :edited_callback, :model_col, :column, :model_sym
|
|
17
|
+
|
|
18
|
+
def initialize(model_col, column, view, model_sym) # :nodoc:
|
|
19
|
+
super()
|
|
20
|
+
@model_col = model_col
|
|
21
|
+
@column = column
|
|
22
|
+
@view = view
|
|
23
|
+
@model_sym = model_sym
|
|
24
|
+
@view.model.set_sort_func(@model_col) { |m,x,y| x[@model_col] <=> y[@model_col] }
|
|
25
|
+
@phone_format = "%3-%3-%4"
|
|
26
|
+
@validate_block = Proc.new { |text, model_sym, row, view|
|
|
27
|
+
only_numbers = text.gsub(/[^0-9]/, "")
|
|
28
|
+
if (only_numbers.size == 10)
|
|
29
|
+
true
|
|
30
|
+
else
|
|
31
|
+
alert("Unrecognized phone number: " + text)
|
|
32
|
+
false
|
|
33
|
+
end }
|
|
34
|
+
@edited_block = nil
|
|
35
|
+
self.signal_connect('edited') do |ren, path, text|
|
|
36
|
+
next unless iter = @view.model.get_iter(path)
|
|
37
|
+
if @validate_block.call(text, @model_sym, @view.vr_row(iter), @view)
|
|
38
|
+
iter[@model_col] = DateTime.strptime(text, @date_format)
|
|
39
|
+
@edited_callback.call(@model_sym, @view.vr_row(iter)) if @edited_callback
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
class CellRendererPixbuf < Gtk::CellRendererPixbuf # :nodoc:
|
|
4
|
+
|
|
5
|
+
attr_reader :model_col, :column, :model_sym
|
|
6
|
+
|
|
7
|
+
def initialize(model_col, column, view, model_sym)
|
|
8
|
+
super()
|
|
9
|
+
@column = column
|
|
10
|
+
@model_col = model_col
|
|
11
|
+
@model_sym = model_sym
|
|
12
|
+
@view = view
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
class CellRendererProgress < Gtk::CellRendererProgress # :nodoc:
|
|
4
|
+
|
|
5
|
+
attr_reader :model_col, :column, :model_sym
|
|
6
|
+
|
|
7
|
+
def initialize(model_col, column, view, model_sym)
|
|
8
|
+
super()
|
|
9
|
+
@model_col = model_col
|
|
10
|
+
@model_sym = model_sym
|
|
11
|
+
@column = column
|
|
12
|
+
@view = view
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
# This class is a helper to VR::ListView and VR::TreeView. When
|
|
4
|
+
# colums are created, this class is used as the renderer because
|
|
5
|
+
# it adds functionality to the Gtk Renderer.
|
|
6
|
+
#
|
|
7
|
+
# When you call ListView#render(column_id) an instance of this class
|
|
8
|
+
# will be returned. It is a subclass of
|
|
9
|
+
#
|
|
10
|
+
# GtkCellRendererSpin
|
|
11
|
+
#
|
|
12
|
+
# So it has all the functionality of its parent, plus the methods listed here.
|
|
13
|
+
|
|
14
|
+
class CellRendererSpin < Gtk::CellRendererSpin
|
|
15
|
+
|
|
16
|
+
attr_reader :model_col, :column, :model_sym
|
|
17
|
+
attr_accessor :edited_callback
|
|
18
|
+
|
|
19
|
+
def initialize(model_col, column, view, model_sym) # :nodoc:
|
|
20
|
+
super()
|
|
21
|
+
@model_col = model_col
|
|
22
|
+
@model_sym = model_sym
|
|
23
|
+
@column = column
|
|
24
|
+
@view = view
|
|
25
|
+
self.editable = true
|
|
26
|
+
@view.model.set_sort_func(@model_col) { |m,x,y| x[@model_col].value <=> y[@model_col].value }
|
|
27
|
+
@edited_callback = nil
|
|
28
|
+
self.signal_connect('edited') do |ren, path, text|
|
|
29
|
+
next unless iter = @view.model.get_iter(path)
|
|
30
|
+
iter[@model_col].value = text.to_f if (iter)
|
|
31
|
+
@edited_callback.call(@model_sym, @view.vr_row(iter)) if @edited_callback
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
# This class is a helper to VR::ListView and VR::TreeView. When
|
|
4
|
+
# colums are created, this class is used as the renderer because
|
|
5
|
+
# it adds functionality to the Gtk Renderer.
|
|
6
|
+
#
|
|
7
|
+
# When you call ListView#render(model_col) an instance of this class
|
|
8
|
+
# will be returned. It is a subclass of
|
|
9
|
+
#
|
|
10
|
+
# {Gtk::CellRendererText}[http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ACellRendererText]
|
|
11
|
+
#
|
|
12
|
+
# So it has all the functionality of its parent, plus the methods listed here.
|
|
13
|
+
|
|
14
|
+
class CellRendererText < Gtk::CellRendererText
|
|
15
|
+
|
|
16
|
+
attr_accessor :validate_block, :edited_callback
|
|
17
|
+
attr_reader :model_col, :column, :model_sym
|
|
18
|
+
|
|
19
|
+
def initialize(model_col, column, view, model_sym) # :nodoc:
|
|
20
|
+
super()
|
|
21
|
+
@column = column
|
|
22
|
+
@model_sym = model_sym
|
|
23
|
+
@model_col = model_col
|
|
24
|
+
@view = view
|
|
25
|
+
@validate_block = Proc.new { |text, model_sym, row, view| true }
|
|
26
|
+
@edited_callback = nil
|
|
27
|
+
self.signal_connect('edited') do |ren, path, text|
|
|
28
|
+
next unless iter = @view.model.get_iter(path)
|
|
29
|
+
if @validate_block.call(text, @model_sym, @view.vr_row(iter), @view)
|
|
30
|
+
iter[@model_col] = (iter[@model_col].is_a? String) ? text : text.to_f
|
|
31
|
+
@edited_callback.call(@model_sym, @view.vr_row(iter)) if @edited_callback
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module VR
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# This renderer has a slightly different validate_block than the others. Its validate_block will be called with three
|
|
5
|
+
# parameters:
|
|
6
|
+
#
|
|
7
|
+
# @view.renderer(:name).validate_block = Proc.new { | model_sym, row, view |
|
|
8
|
+
# (row[:name].length < 3)
|
|
9
|
+
# }
|
|
10
|
+
#
|
|
11
|
+
# Also, you can use the VR::CellRendererToggle#edited= method to allow editing.
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
class CellRendererToggle < Gtk::CellRendererToggle
|
|
15
|
+
|
|
16
|
+
attr_accessor :validate_block, :edited_callback
|
|
17
|
+
attr_reader :model_col, :column, :model_sym
|
|
18
|
+
|
|
19
|
+
def initialize(model_col, column, view, model_sym)
|
|
20
|
+
super()
|
|
21
|
+
@model_col = model_col
|
|
22
|
+
@model_sym = model_sym
|
|
23
|
+
@column = column
|
|
24
|
+
@view = view
|
|
25
|
+
@edited_callback = nil
|
|
26
|
+
@validate_block = Proc.new { |model_sym, row, view | true }
|
|
27
|
+
self.signal_connect('toggled') do |ren, path|
|
|
28
|
+
@view.model.each { |mod, path, iter| iter[@model_col] = false } if self.radio?
|
|
29
|
+
next unless iter = @view.model.get_iter(path)
|
|
30
|
+
if @validate_block.call(@model_sym, @view.vr_row(iter), @view)
|
|
31
|
+
iter[model_col] = !iter[model_col]
|
|
32
|
+
@edited_callback.call(@model_col, iter) if @edited_callback
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def editable=(is_editable)
|
|
38
|
+
self.sensitive = is_editable
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def set_editable(is_editable)
|
|
42
|
+
self.sensitive = is_editable
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
module VR
|
|
4
|
+
|
|
5
|
+
# The Combo class is for use with VR::ListView and VR::TreeView. It
|
|
6
|
+
# simply holds the values for a combobox to be displayed in the view.
|
|
7
|
+
# It is not a visual component, it just holds data.
|
|
8
|
+
#
|
|
9
|
+
# It is one of the data types that you can pass to the constructors for VR::ListView and
|
|
10
|
+
# VR::TreeView. For example, to make the second column render as a combobox:
|
|
11
|
+
#
|
|
12
|
+
# @view = VR::Treeview.new(Gdk::Pixbuf, VR::Combo, String)
|
|
13
|
+
#
|
|
14
|
+
# Then when you add data to the model:
|
|
15
|
+
#
|
|
16
|
+
# @view.add_row(@pixbuf, VR::Combo.new("Mr", "Mr", "Mrs", "Ms"), "Hello World")
|
|
17
|
+
#
|
|
18
|
+
# This would set the combobox for this row so that "Mr" is selected, and "Mr", "Mrs", and "Ms" are the choices.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ComboCol # can't subclass String tried twice!!!
|
|
22
|
+
|
|
23
|
+
attr_accessor :selected, :selections
|
|
24
|
+
|
|
25
|
+
# This defines a combobox for a row in VR::ListView or VR::TreeView. You pass three or more strings
|
|
26
|
+
# to the constructor, and the first string is the selected value that appears in the row in the
|
|
27
|
+
# view.
|
|
28
|
+
#
|
|
29
|
+
# - current_selection (type String)
|
|
30
|
+
# - selections (comma separated list of Strings)
|
|
31
|
+
#
|
|
32
|
+
def initialize(current_selection, *selections)
|
|
33
|
+
@selected = current_selection
|
|
34
|
+
@selections = selections
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def valid?(str)
|
|
38
|
+
@selections.include?(str)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
module VR
|
|
3
|
+
|
|
4
|
+
class CurrencyCol
|
|
5
|
+
|
|
6
|
+
attr_accessor :value, :format
|
|
7
|
+
|
|
8
|
+
def initialize(value, format = "$%.2f")
|
|
9
|
+
set_value(value, format)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def set_value(value, format = "$%.2f")
|
|
13
|
+
@value = value
|
|
14
|
+
@format = format
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_s
|
|
18
|
+
format % @value.to_f
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
module VR
|
|
4
|
+
|
|
5
|
+
class DateCol
|
|
6
|
+
|
|
7
|
+
attr_accessor :date
|
|
8
|
+
|
|
9
|
+
def initialize(date, format = "%Y-%m-%d")
|
|
10
|
+
set_date(date, format)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def set_date(date, format = "%Y-%m-%d")
|
|
14
|
+
@date = date
|
|
15
|
+
# gsub!(self, @date.strftime(format))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
module VR
|
|
3
|
+
|
|
4
|
+
class ImageCol #< Gdk::Pixbuf
|
|
5
|
+
|
|
6
|
+
include GladeGUI
|
|
7
|
+
|
|
8
|
+
def initialize(image)
|
|
9
|
+
# super(File.dirname(__FILE__) + "/../../../img/image-x-generic.png")
|
|
10
|
+
@image1 = image
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def before_show()
|
|
14
|
+
@builder["window1"].resize 500, 360
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_s
|
|
18
|
+
"<Img>"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# def visual_attributes
|
|
22
|
+
# { :pixbuf => self }
|
|
23
|
+
# end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
# ==The VR Module hold all the classes of the vrlib gem. The most useful APIs are:
|
|
3
|
+
#
|
|
4
|
+
# ===GladeGUI -- loads glade form
|
|
5
|
+
# ===VR::ListView -- makes Gtk::TreeView easy!
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
module VR
|
|
9
|
+
|
|
10
|
+
# This class is simply a wrapper for an Integer. It signals VR::Listview's
|
|
11
|
+
# and VR::Treeviews constructor to make this column a progressbar using
|
|
12
|
+
# VR::CellRendererProgress. For example, whwn you create a VR::ListView,
|
|
13
|
+
# you can pass VR::Progress as a column type:
|
|
14
|
+
#
|
|
15
|
+
# @view = VR::ListView.new(String, VR::Progress, Gdk::Pixbif)
|
|
16
|
+
#
|
|
17
|
+
# This makes model_col #1 a progress bar. When you set the value of the column,
|
|
18
|
+
# provide an integer value from 0 to 100:
|
|
19
|
+
#
|
|
20
|
+
# @view.add_row("Hello World", 65, @pixbuf)
|
|
21
|
+
#
|
|
22
|
+
#
|
|
23
|
+
|
|
24
|
+
class ProgressCol < Integer
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
|
|
2
|
+
module VR
|
|
3
|
+
|
|
4
|
+
# The TextCol class is a simple text editor for editing strings of data:
|
|
5
|
+
#
|
|
6
|
+
# http://visualruby.net/img/textcol.jpg
|
|
7
|
+
#
|
|
8
|
+
# It is a very useful class when you want to display and edit long strings
|
|
9
|
+
# of data in a VR::ListView. To create a coulmn of long strings in a VR::ListView,
|
|
10
|
+
# simply define the column type as VR::TextCol:
|
|
11
|
+
#
|
|
12
|
+
# @view = VR::ListView.new(:name => String, :quote => VR::TextCol)
|
|
13
|
+
# row = @view.add_row
|
|
14
|
+
# row[:name] = "Eric"
|
|
15
|
+
# row[:quote] = VR::TextCol.new("I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth. - Umberto Eco) ")
|
|
16
|
+
#
|
|
17
|
+
# The above listview will only display the first 20 characters of the quote, so
|
|
18
|
+
# it won't destroy the appearance of the listview. When a user clicks on the
|
|
19
|
+
# quote column, a window like the one above will appear.
|
|
20
|
+
#
|
|
21
|
+
# See the example project, "listview_objects" for more.
|
|
22
|
+
|
|
23
|
+
class TextCol
|
|
24
|
+
|
|
25
|
+
include GladeGUI
|
|
26
|
+
|
|
27
|
+
attr_accessor :text, :length_to_display
|
|
28
|
+
#
|
|
29
|
+
# - text - String value of the field
|
|
30
|
+
# - length_to_display - Integer number of characters to display in the listview. Default: 20
|
|
31
|
+
#
|
|
32
|
+
def initialize(text, length_to_display = 20)
|
|
33
|
+
@length_to_display = length_to_display
|
|
34
|
+
@text = text
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def before_show()
|
|
38
|
+
@builder["window1"].resize 650, 360
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# The to_s method outputs the string that is shown in the VR::ListView. By default
|
|
42
|
+
# it will display the first 20 characters of the string. If you
|
|
43
|
+
# want to change the number of characters it displays, change the
|
|
44
|
+
# value of the length_to_display variable.
|
|
45
|
+
|
|
46
|
+
def to_s
|
|
47
|
+
(@text.size > @length_to_display ? @text[0, @length_to_display - 4] + "..." : @text).gsub("\n"," ")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def buttonSave__clicked(*args) # :nodoc:
|
|
51
|
+
get_glade_variables()
|
|
52
|
+
@builder["window1"].destroy
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def buttonCancel__clicked(*args) # :nodoc:
|
|
56
|
+
@builder["window1"].destroy
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def <=>(text_col)
|
|
60
|
+
self.text <=> text_col.text
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|