ruby_mvc 0.0.1 → 0.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.
- data/README.md +14 -0
- data/lib/ruby_mvc.rb +3 -1
- data/lib/ruby_mvc/application.rb +52 -2
- data/lib/ruby_mvc/controllers.rb +28 -0
- data/lib/ruby_mvc/controllers/action.rb +93 -0
- data/lib/ruby_mvc/controllers/action_group.rb +70 -0
- data/lib/ruby_mvc/controllers/app_controller.rb +4 -2
- data/lib/ruby_mvc/controllers/rails_controller.rb +2 -0
- data/lib/ruby_mvc/models.rb +2 -0
- data/lib/ruby_mvc/models/ar_table_model.rb +133 -0
- data/lib/ruby_mvc/models/array_table_model.rb +81 -13
- data/lib/ruby_mvc/models/keyed_array_table_model.rb +1 -1
- data/lib/ruby_mvc/models/model.rb +129 -0
- data/lib/ruby_mvc/models/table_model.rb +107 -10
- data/lib/ruby_mvc/models/view_model_template.rb +140 -0
- data/lib/ruby_mvc/renderers.rb +1 -0
- data/lib/ruby_mvc/renderers/html4_table_model_renderer.rb +7 -6
- data/lib/ruby_mvc/renderers/hyperlink_cell_renderer.rb +47 -0
- data/lib/ruby_mvc/toolkit.rb +5 -1
- data/lib/ruby_mvc/toolkit/browser_history.rb +115 -0
- data/lib/ruby_mvc/toolkit/dialog.rb +12 -1
- data/lib/ruby_mvc/toolkit/frame.rb +3 -1
- data/lib/ruby_mvc/toolkit/grid_view.rb +46 -0
- data/lib/ruby_mvc/toolkit/messagebox.rb +32 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby.rb +5 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/app.rb +23 -2
- data/lib/ruby_mvc/toolkit/peers/wxruby/common.rb +11 -1
- data/lib/ruby_mvc/toolkit/peers/wxruby/dialog.rb +82 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/form_builder.rb +108 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/frame.rb +85 -1
- data/lib/ruby_mvc/toolkit/peers/wxruby/grid_model.rb +79 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/grid_view.rb +117 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/messagebox.rb +58 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/web_view.rb +40 -10
- data/lib/ruby_mvc/toolkit/property_change_notifier.rb +46 -0
- data/lib/ruby_mvc/toolkit/signal_handler.rb +149 -0
- data/lib/ruby_mvc/toolkit/web_view.rb +1 -1
- data/lib/ruby_mvc/toolkit/widget.rb +13 -6
- data/lib/ruby_mvc/views.rb +8 -59
- data/lib/ruby_mvc/views/{ar_type_list.rb → ar_form_view.rb} +10 -13
- data/lib/ruby_mvc/views/ar_support.rb +29 -0
- data/lib/ruby_mvc/views/ar_type_editor.rb +17 -28
- data/lib/ruby_mvc/views/ar_web_model_view.rb +59 -0
- data/lib/ruby_mvc/views/ar_web_type_list.rb +44 -0
- data/lib/ruby_mvc/views/browser_view.rb +185 -0
- data/lib/ruby_mvc/views/form_view.rb +111 -0
- data/lib/ruby_mvc/views/grid_table_view.rb +96 -0
- data/lib/ruby_mvc/views/table_view.rb +0 -39
- data/lib/ruby_mvc/views/view.rb +121 -0
- data/lib/ruby_mvc/views/web_content_table_view.rb +40 -0
- data/lib/ruby_mvc/views/{web_view.rb → web_content_view.rb} +17 -28
- data/lib/ruby_mvc/views/web_model_view.rb +67 -0
- data/ruby_mvc.gemspec +1 -1
- data/sample/browser_view.rb +57 -0
- data/sample/form.rb +59 -0
- data/sample/form2.rb +63 -0
- data/sample/grid_table_view.rb +68 -0
- data/sample/grid_view.rb +44 -0
- data/sample/grid_view2.rb +57 -0
- data/sample/test.html +1 -0
- data/sample/test2.html +33 -0
- data/sample/web_view.rb +4 -0
- data/test/unit/models/test_array_table_model.rb +19 -3
- data/test/unit/models/test_keyed_array_table_model.rb +3 -2
- data/test/unit/models/test_model.rb +88 -0
- metadata +39 -20
- data/lib/ruby_mvc/toolkit/notification.rb +0 -202
- data/lib/ruby_mvc/views/ar_model_editor.rb +0 -84
@@ -23,10 +23,11 @@
|
|
23
23
|
######################################################################
|
24
24
|
#++
|
25
25
|
|
26
|
+
$:.unshift File.join(File.dirname(__FILE__), "../../../lib")
|
26
27
|
require 'testy'
|
27
|
-
require '
|
28
|
+
require 'ruby_mvc/models'
|
28
29
|
|
29
|
-
include
|
30
|
+
include RubyMVC::Models
|
30
31
|
|
31
32
|
Testy.testing "Core KeyedArrayTableModel tests" do
|
32
33
|
test "Basic functionality" do |result|
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: test_model.rb
|
21
|
+
# Created: Sat 31 Dec 2011 16:07:07 CET
|
22
|
+
#
|
23
|
+
######################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
$:.unshift File.join(File.dirname(__FILE__), "../../../lib")
|
27
|
+
|
28
|
+
require 'testy'
|
29
|
+
require 'ruby_mvc'
|
30
|
+
|
31
|
+
include RubyMVC::Models
|
32
|
+
|
33
|
+
Testy.testing "Core Model tests" do
|
34
|
+
test "Basic functionality" do |result|
|
35
|
+
model = Model.new
|
36
|
+
model[:key1] = "val1"
|
37
|
+
model[:key2] = "val2"
|
38
|
+
|
39
|
+
result.check "keys are correct",
|
40
|
+
:expect => [ :key1, :key2 ],
|
41
|
+
:actual => model.keys.sort
|
42
|
+
|
43
|
+
result.check "labels are correct",
|
44
|
+
:expect => [ { :key => :key1, :label => "Key1" }, { :key => :key2, :label => "Key2" } ],
|
45
|
+
:actual => model.labels
|
46
|
+
|
47
|
+
result.check ":key1 is editable",
|
48
|
+
:expect => true,
|
49
|
+
:actual => model.is_editable?(:key1)
|
50
|
+
|
51
|
+
result.check ":key2 is editable",
|
52
|
+
:expect => true,
|
53
|
+
:actual => model.is_editable?(:key2)
|
54
|
+
|
55
|
+
result.check "#[] accessor",
|
56
|
+
:expect => "val1",
|
57
|
+
:actual => model[:key1]
|
58
|
+
|
59
|
+
result.check "#size accessor",
|
60
|
+
:expect => 2,
|
61
|
+
:actual => model.size
|
62
|
+
|
63
|
+
result.check "#label_for :key1",
|
64
|
+
:expect => "Key1",
|
65
|
+
:actual => model.label_for(:key1)
|
66
|
+
|
67
|
+
result.check "#label_for :key2",
|
68
|
+
:expect => "Key2",
|
69
|
+
:actual => model.label_for(:key2)
|
70
|
+
end
|
71
|
+
|
72
|
+
test "Signal tests" do |result|
|
73
|
+
model = Model.new
|
74
|
+
|
75
|
+
event = {}
|
76
|
+
model.signal_connect("property-changed") do |m, k, o, v|
|
77
|
+
event[:model] = m
|
78
|
+
event[:key] = k
|
79
|
+
event[:old] = o
|
80
|
+
event[:value] = v
|
81
|
+
end
|
82
|
+
model[:key1] = "val1"
|
83
|
+
|
84
|
+
result.check "signal emit",
|
85
|
+
:expect => { :model => model, :key => :key1, :old => nil, :value => "val1" },
|
86
|
+
:actual => event
|
87
|
+
end
|
88
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_mvc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 29
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
5
|
+
version: 0.0.2
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Andrew S. Townley
|
@@ -15,8 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date:
|
19
|
-
default_executable:
|
13
|
+
date: 2012-01-09 00:00:00 Z
|
20
14
|
dependencies: []
|
21
15
|
|
22
16
|
description: A simple, cross-platform MVC framework for Ruby
|
@@ -29,47 +23,78 @@ extra_rdoc_files: []
|
|
29
23
|
|
30
24
|
files:
|
31
25
|
- lib/ruby_mvc/application.rb
|
26
|
+
- lib/ruby_mvc/controllers/action.rb
|
27
|
+
- lib/ruby_mvc/controllers/action_group.rb
|
32
28
|
- lib/ruby_mvc/controllers/app_controller.rb
|
33
29
|
- lib/ruby_mvc/controllers/rails_controller.rb
|
30
|
+
- lib/ruby_mvc/controllers.rb
|
31
|
+
- lib/ruby_mvc/models/ar_table_model.rb
|
34
32
|
- lib/ruby_mvc/models/array_table_model.rb
|
35
33
|
- lib/ruby_mvc/models/keyed_array_table_model.rb
|
34
|
+
- lib/ruby_mvc/models/model.rb
|
36
35
|
- lib/ruby_mvc/models/table_model.rb
|
36
|
+
- lib/ruby_mvc/models/view_model_template.rb
|
37
37
|
- lib/ruby_mvc/models.rb
|
38
38
|
- lib/ruby_mvc/module.rb
|
39
39
|
- lib/ruby_mvc/renderers/html4_table_model_renderer.rb
|
40
|
+
- lib/ruby_mvc/renderers/hyperlink_cell_renderer.rb
|
40
41
|
- lib/ruby_mvc/renderers.rb
|
41
42
|
- lib/ruby_mvc/toolkit/app.rb
|
43
|
+
- lib/ruby_mvc/toolkit/browser_history.rb
|
42
44
|
- lib/ruby_mvc/toolkit/dialog.rb
|
43
45
|
- lib/ruby_mvc/toolkit/frame.rb
|
44
|
-
- lib/ruby_mvc/toolkit/
|
46
|
+
- lib/ruby_mvc/toolkit/grid_view.rb
|
47
|
+
- lib/ruby_mvc/toolkit/messagebox.rb
|
45
48
|
- lib/ruby_mvc/toolkit/peers/wxruby/app.rb
|
46
49
|
- lib/ruby_mvc/toolkit/peers/wxruby/box_layout.rb
|
47
50
|
- lib/ruby_mvc/toolkit/peers/wxruby/common.rb
|
51
|
+
- lib/ruby_mvc/toolkit/peers/wxruby/dialog.rb
|
52
|
+
- lib/ruby_mvc/toolkit/peers/wxruby/form_builder.rb
|
48
53
|
- lib/ruby_mvc/toolkit/peers/wxruby/frame.rb
|
54
|
+
- lib/ruby_mvc/toolkit/peers/wxruby/grid_model.rb
|
55
|
+
- lib/ruby_mvc/toolkit/peers/wxruby/grid_view.rb
|
56
|
+
- lib/ruby_mvc/toolkit/peers/wxruby/messagebox.rb
|
49
57
|
- lib/ruby_mvc/toolkit/peers/wxruby/web_view.rb
|
50
58
|
- lib/ruby_mvc/toolkit/peers/wxruby.rb
|
59
|
+
- lib/ruby_mvc/toolkit/property_change_notifier.rb
|
60
|
+
- lib/ruby_mvc/toolkit/signal_handler.rb
|
51
61
|
- lib/ruby_mvc/toolkit/web_view.rb
|
52
62
|
- lib/ruby_mvc/toolkit/widget.rb
|
53
63
|
- lib/ruby_mvc/toolkit.rb
|
54
|
-
- lib/ruby_mvc/views/
|
64
|
+
- lib/ruby_mvc/views/ar_form_view.rb
|
65
|
+
- lib/ruby_mvc/views/ar_support.rb
|
55
66
|
- lib/ruby_mvc/views/ar_type_editor.rb
|
56
|
-
- lib/ruby_mvc/views/
|
67
|
+
- lib/ruby_mvc/views/ar_web_model_view.rb
|
68
|
+
- lib/ruby_mvc/views/ar_web_type_list.rb
|
69
|
+
- lib/ruby_mvc/views/browser_view.rb
|
70
|
+
- lib/ruby_mvc/views/form_view.rb
|
71
|
+
- lib/ruby_mvc/views/grid_table_view.rb
|
57
72
|
- lib/ruby_mvc/views/table_view.rb
|
58
|
-
- lib/ruby_mvc/views/
|
73
|
+
- lib/ruby_mvc/views/view.rb
|
74
|
+
- lib/ruby_mvc/views/web_content_table_view.rb
|
75
|
+
- lib/ruby_mvc/views/web_content_view.rb
|
76
|
+
- lib/ruby_mvc/views/web_model_view.rb
|
59
77
|
- lib/ruby_mvc/views.rb
|
60
78
|
- lib/ruby_mvc/wx.rb
|
61
79
|
- lib/ruby_mvc.rb
|
80
|
+
- sample/browser_view.rb
|
81
|
+
- sample/form.rb
|
82
|
+
- sample/form2.rb
|
62
83
|
- sample/frame.rb
|
84
|
+
- sample/grid_table_view.rb
|
85
|
+
- sample/grid_view.rb
|
86
|
+
- sample/grid_view2.rb
|
63
87
|
- sample/mvc.rb
|
64
88
|
- sample/test.html
|
89
|
+
- sample/test2.html
|
65
90
|
- sample/web_view.rb
|
66
91
|
- test/unit/models/test_array_table_model.rb
|
67
92
|
- test/unit/models/test_keyed_array_table_model.rb
|
93
|
+
- test/unit/models/test_model.rb
|
68
94
|
- test/unit/test_array_table_model.rb
|
69
95
|
- LICENSE
|
70
96
|
- README.md
|
71
97
|
- ruby_mvc.gemspec
|
72
|
-
has_rdoc: true
|
73
98
|
homepage: https://github.com/atownley/ruby_mvc
|
74
99
|
licenses: []
|
75
100
|
|
@@ -83,23 +108,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
83
108
|
requirements:
|
84
109
|
- - ">="
|
85
110
|
- !ruby/object:Gem::Version
|
86
|
-
hash: 3
|
87
|
-
segments:
|
88
|
-
- 0
|
89
111
|
version: "0"
|
90
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
113
|
none: false
|
92
114
|
requirements:
|
93
115
|
- - ">="
|
94
116
|
- !ruby/object:Gem::Version
|
95
|
-
hash: 3
|
96
|
-
segments:
|
97
|
-
- 0
|
98
117
|
version: "0"
|
99
118
|
requirements: []
|
100
119
|
|
101
120
|
rubyforge_project:
|
102
|
-
rubygems_version: 1.
|
121
|
+
rubygems_version: 1.8.10
|
103
122
|
signing_key:
|
104
123
|
specification_version: 3
|
105
124
|
summary: Ruby MVC
|
@@ -1,202 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
######################################################################
|
3
|
-
#
|
4
|
-
# Copyright 2008, Andrew S. Townley
|
5
|
-
#
|
6
|
-
# Permission to use, copy, modify, and disribute this software for
|
7
|
-
# any purpose with or without fee is hereby granted, provided that
|
8
|
-
# the above copyright notices and this permission notice appear in
|
9
|
-
# all copies.
|
10
|
-
#
|
11
|
-
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
-
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
-
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
-
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
-
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
-
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
-
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
-
#
|
20
|
-
# File: notification.rb
|
21
|
-
# Author: Andrew S. Townley
|
22
|
-
# Created: Sat Nov 1 14:27:10 GMT 2008
|
23
|
-
# Borrowed: Wed 23 Nov 2011 22:29:22 GMT
|
24
|
-
#
|
25
|
-
######################################################################
|
26
|
-
#++
|
27
|
-
|
28
|
-
module RubyMVC
|
29
|
-
module Toolkit
|
30
|
-
|
31
|
-
# This class allows obsevers to register a single block
|
32
|
-
# rather than implementing public observer methods (which
|
33
|
-
# can get messy and unnecessarily pollute the public API
|
34
|
-
# of the class)
|
35
|
-
#
|
36
|
-
# Each registered block will be called with the following
|
37
|
-
# arguments:
|
38
|
-
#
|
39
|
-
# 1) The notification name (or the method name to be called)
|
40
|
-
# 2) The sender of the notification
|
41
|
-
# 3) The notification parameters.
|
42
|
-
|
43
|
-
class ObserverReference
|
44
|
-
attr_reader :observer
|
45
|
-
|
46
|
-
def initialize(observer, &block)
|
47
|
-
@observer = observer
|
48
|
-
@block = block
|
49
|
-
end
|
50
|
-
|
51
|
-
def method_missing(method, *args, &block)
|
52
|
-
if @observer.respond_to? method
|
53
|
-
@observer.send(method, *args, &block)
|
54
|
-
elsif !@block.nil?
|
55
|
-
@block.call(method, *args)
|
56
|
-
else
|
57
|
-
super
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
class ObserverList
|
63
|
-
def initialize
|
64
|
-
@observers = {}
|
65
|
-
end
|
66
|
-
|
67
|
-
def <<(val)
|
68
|
-
if !val.is_a? ObserverReference
|
69
|
-
raise ArgumentError, "can only have observer references in the list!"
|
70
|
-
end
|
71
|
-
|
72
|
-
@observers[val.observer] = val if !@observers.include? val.observer
|
73
|
-
end
|
74
|
-
|
75
|
-
def delete(val)
|
76
|
-
@observers.delete(val)
|
77
|
-
end
|
78
|
-
|
79
|
-
def each(&block)
|
80
|
-
@observers.each_value(&block)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# This class is used to relay notifications from one sender
|
85
|
-
# to another sender's registered listeners.
|
86
|
-
|
87
|
-
class NotificationRelay
|
88
|
-
def initialize(sender, listeners)
|
89
|
-
@listeners = listeners
|
90
|
-
@sender = sender
|
91
|
-
end
|
92
|
-
|
93
|
-
def method_missing(method, *args, &block)
|
94
|
-
args[0] = @sender
|
95
|
-
@listeners.each { |l| l.send(method, *args, &block) }
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
module ViewChangeNotifier
|
100
|
-
def register_view_change_observer(observer, &block)
|
101
|
-
observers = (@view_change_observers ||= ObserverList.new)
|
102
|
-
observers << ObserverReference.new(observer, &block)
|
103
|
-
end
|
104
|
-
|
105
|
-
def unregister_view_change_observer(observer)
|
106
|
-
observers = (@view_change_observers ||= ObserverList.new)
|
107
|
-
observers.delete(observer)
|
108
|
-
end
|
109
|
-
|
110
|
-
protected
|
111
|
-
def fire_view_changed
|
112
|
-
observers = (@view_change_observers ||= [])
|
113
|
-
observers.each { |o| o.view_changed(self) }
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
module ChangeNotifier
|
118
|
-
def register_change_observer(observer, &block)
|
119
|
-
observers = (@change_observers ||= ObserverList.new)
|
120
|
-
observers << ObserverReference.new(observer, &block)
|
121
|
-
end
|
122
|
-
|
123
|
-
def unregister_change_observer(observer)
|
124
|
-
observers = (@change_observers ||= [])
|
125
|
-
observers.delete(observer)
|
126
|
-
end
|
127
|
-
|
128
|
-
def squelch=(val)
|
129
|
-
@notification_squelch = val
|
130
|
-
end
|
131
|
-
|
132
|
-
protected
|
133
|
-
def fire_changed
|
134
|
-
return if @notification_squelch
|
135
|
-
observers = (@change_observers ||= [])
|
136
|
-
observers.each { |o| o.changed(self) }
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
module PropertyChangeNotifier
|
141
|
-
def register_property_change_observer(observer, &block)
|
142
|
-
observers = (@property_change_observers ||= [])
|
143
|
-
observers << ObserverReference.new(observer, &block)
|
144
|
-
end
|
145
|
-
|
146
|
-
def unregister_property_change_observer(observer)
|
147
|
-
observers = (@property_change_observers ||= [])
|
148
|
-
observers.delete(observer)
|
149
|
-
end
|
150
|
-
|
151
|
-
def squelch=(val)
|
152
|
-
@notification_squelch = val
|
153
|
-
end
|
154
|
-
|
155
|
-
protected
|
156
|
-
def fire_property_changed(property, old_val, new_val)
|
157
|
-
return if @notification_squelch
|
158
|
-
observers = (@property_change_observers ||= [])
|
159
|
-
observers.each { |o| o.property_changed(self, property, old_val, new_val) }
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
module SignalHandler
|
164
|
-
module ClassMethods
|
165
|
-
def signals
|
166
|
-
@signals ||= {}
|
167
|
-
end
|
168
|
-
|
169
|
-
def signal(signal, options = { :vetoable => false })
|
170
|
-
signals[signal] = options
|
171
|
-
end
|
172
|
-
|
173
|
-
def valid_signal?(signal)
|
174
|
-
if !signals.has_key? signal
|
175
|
-
raise ArgumentError, "class #{self} does not support signal '#{signal}'"
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
def signal_connect(signal, &block)
|
181
|
-
self.class.valid_signal? signal if self.class.respond_to? :signals
|
182
|
-
signals = (@signals ||= {})
|
183
|
-
signals[signal] = block
|
184
|
-
end
|
185
|
-
|
186
|
-
def signal_disconnect(signal)
|
187
|
-
self.class.valid_signal? signal if self.class.respond_to? :signals
|
188
|
-
signals = (@signals ||= {})
|
189
|
-
signals.delete(signal)
|
190
|
-
end
|
191
|
-
|
192
|
-
def signal_emit(signal, *args)
|
193
|
-
self.class.valid_signal? signal if self.class.respond_to? :signals
|
194
|
-
signals = (@signals ||= {})
|
195
|
-
if signals.key? signal
|
196
|
-
proc = signals[signal]
|
197
|
-
proc.call(*args) if !proc.nil?
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
######################################################################
|
3
|
-
#
|
4
|
-
# Copyright 2011 Andrew S. Townley
|
5
|
-
#
|
6
|
-
# Permission to use, copy, modify, and disribute this software for
|
7
|
-
# any purpose with or without fee is hereby granted, provided that
|
8
|
-
# the above copyright notices and this permission notice appear in
|
9
|
-
# all copies.
|
10
|
-
#
|
11
|
-
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
-
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
-
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
-
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
-
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
-
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
-
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
-
#
|
20
|
-
# File: ar_model_editor.rb
|
21
|
-
# Created: Sat 19 Nov 2011 11:26:37 GMT
|
22
|
-
#
|
23
|
-
#####################################################################
|
24
|
-
#++
|
25
|
-
|
26
|
-
module RubyMVC
|
27
|
-
module Views
|
28
|
-
|
29
|
-
# This class is responsible for building a form for the
|
30
|
-
# given ActiveRecord model
|
31
|
-
|
32
|
-
class ActiveRecordModelEditor < View
|
33
|
-
DEFAULTS = { :label_width => 0.3 }.freeze
|
34
|
-
|
35
|
-
def initialize(model, options = {}, &block)
|
36
|
-
super(options, &block)
|
37
|
-
load(model, options, &block)
|
38
|
-
end
|
39
|
-
|
40
|
-
# This method is used to load the view with the
|
41
|
-
# information in the AR model.
|
42
|
-
|
43
|
-
def load(model, options = {}, &block)
|
44
|
-
lwidth = options[:label_width] || DEFAULTS[:label_width]
|
45
|
-
|
46
|
-
stack :width => "100%" do
|
47
|
-
flow :width => "100%" do
|
48
|
-
model.attributes.keys.sort.each do |key|
|
49
|
-
# FIXME: I can't believe that you have to do this
|
50
|
-
# this way with AR. I'm surely missing
|
51
|
-
# something...
|
52
|
-
m = "#{key}=".to_sym
|
53
|
-
value = model.attributes[key]
|
54
|
-
flow :width => lwidth, :margin_top => 2 do
|
55
|
-
para key, :weight => 'bold', :align => "right"
|
56
|
-
end
|
57
|
-
flow :width => 1 - lwidth do
|
58
|
-
edit_line model.attributes[key] do |e|
|
59
|
-
model.send(m, e.text)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
@model = model
|
67
|
-
@options = options
|
68
|
-
end
|
69
|
-
|
70
|
-
def save
|
71
|
-
@model.save!
|
72
|
-
end
|
73
|
-
|
74
|
-
def create
|
75
|
-
if @model
|
76
|
-
load(@model.class.new, options)
|
77
|
-
else
|
78
|
-
alert("No template model.\nUse the #load method instead.")
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|