ruby_mvc 0.0.0
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/LICENSE +19 -0
- data/README.md +69 -0
- data/lib/ruby_mvc.rb +33 -0
- data/lib/ruby_mvc/application.rb +53 -0
- data/lib/ruby_mvc/controllers/app_controller.rb +93 -0
- data/lib/ruby_mvc/controllers/rails_controller.rb +71 -0
- data/lib/ruby_mvc/models.rb +28 -0
- data/lib/ruby_mvc/models/array_table_model.rb +59 -0
- data/lib/ruby_mvc/models/keyed_array_table_model.rb +83 -0
- data/lib/ruby_mvc/models/table_model.rb +42 -0
- data/lib/ruby_mvc/module.rb +35 -0
- data/lib/ruby_mvc/renderers.rb +26 -0
- data/lib/ruby_mvc/renderers/html4_table_model_renderer.rb +100 -0
- data/lib/ruby_mvc/toolkit.rb +31 -0
- data/lib/ruby_mvc/toolkit/app.rb +32 -0
- data/lib/ruby_mvc/toolkit/dialog.rb +31 -0
- data/lib/ruby_mvc/toolkit/frame.rb +34 -0
- data/lib/ruby_mvc/toolkit/notification.rb +202 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby.rb +31 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/app.rb +44 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/box_layout.rb +48 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/common.rb +72 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/frame.rb +49 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/web_view.rb +87 -0
- data/lib/ruby_mvc/toolkit/web_view.rb +60 -0
- data/lib/ruby_mvc/toolkit/widget.rb +108 -0
- data/lib/ruby_mvc/views.rb +85 -0
- data/lib/ruby_mvc/views/ar_model_editor.rb +84 -0
- data/lib/ruby_mvc/views/ar_type_editor.rb +65 -0
- data/lib/ruby_mvc/views/ar_type_list.rb +45 -0
- data/lib/ruby_mvc/views/table_view.rb +96 -0
- data/lib/ruby_mvc/views/web_view.rb +65 -0
- data/lib/ruby_mvc/wx.rb +26 -0
- data/ruby_mvc.gemspec +37 -0
- data/sample/frame.rb +28 -0
- data/sample/mvc.rb +29 -0
- data/sample/test.html +118 -0
- data/sample/web_view.rb +34 -0
- data/test/unit/models/test_array_table_model.rb +56 -0
- data/test/unit/models/test_keyed_array_table_model.rb +54 -0
- data/test/unit/test_array_table_model.rb +38 -0
- metadata +107 -0
@@ -0,0 +1,85 @@
|
|
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: views.rb
|
21
|
+
# Created: Sat 19 Nov 2011 11:28:08 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
class View
|
30
|
+
def self.widget_def(targ = nil)
|
31
|
+
if targ == nil
|
32
|
+
@widget_def
|
33
|
+
else
|
34
|
+
if (x = targ.widget_def).nil?
|
35
|
+
if targ != RubyMVC::Views::View
|
36
|
+
self.widget_def(targ.superclass)
|
37
|
+
end
|
38
|
+
else
|
39
|
+
x
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.create_widget(klass)
|
45
|
+
w = self.widget_def(klass)
|
46
|
+
args = w[:args]
|
47
|
+
block = w[:block]
|
48
|
+
args[0].new(*args[1..-1], &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
class << self
|
52
|
+
# This method is used to define the primary widget
|
53
|
+
# class through which this view may be added to other
|
54
|
+
# widgets.
|
55
|
+
|
56
|
+
def widget(*args, &block)
|
57
|
+
puts "Set widget for #{self}: #{args.inspect}"
|
58
|
+
@widget_def = { :args => args, :block => block }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def peer
|
63
|
+
@widget.peer
|
64
|
+
end
|
65
|
+
|
66
|
+
attr_accessor :controller, :widget
|
67
|
+
def initialize(*args)
|
68
|
+
@widget = View.create_widget(self.class)
|
69
|
+
if(options = args.last).is_a? Hash
|
70
|
+
self.controller = options[:controller]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def method_missing(m, *a, &b)
|
75
|
+
@widget.send(m, *a, &b)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
#require 'ruby_mvc/views/table_view'
|
82
|
+
#require 'ruby_mvc/views/ar_model_editor'
|
83
|
+
#require 'ruby_mvc/views/ar_type_list'
|
84
|
+
#require 'ruby_mvc/views/ar_type_editor'
|
85
|
+
require 'ruby_mvc/views/web_view'
|
@@ -0,0 +1,84 @@
|
|
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
|
@@ -0,0 +1,65 @@
|
|
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_type_editor.rb
|
21
|
+
# Created: Mon 21 Nov 2011 18:00:49 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
class ActiveRecordTypeEditor < View
|
30
|
+
include RubyMVC::LinkDispatcher
|
31
|
+
|
32
|
+
def initialize(type, options = {}, &block)
|
33
|
+
ctrl = options[:controller] = options[:controller] || self
|
34
|
+
super(options, &block)
|
35
|
+
@type = type
|
36
|
+
@list = active_record_type_list type
|
37
|
+
para link("New...") {
|
38
|
+
ctrl.link_activated(self, "/create_instance")
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_instance(sender, link)
|
43
|
+
debug("create instance of type #{@type}")
|
44
|
+
obj = @type.new
|
45
|
+
window do
|
46
|
+
stack do
|
47
|
+
obj.description = "Some text"
|
48
|
+
editor = active_record_model_editor obj
|
49
|
+
flow :margin_left => 0, :left => "-25%" do
|
50
|
+
button "Cancel", :align => "right" do
|
51
|
+
close
|
52
|
+
end
|
53
|
+
button "Save", :align => "right" do
|
54
|
+
editor.save
|
55
|
+
close
|
56
|
+
end
|
57
|
+
debug("created buttons")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,45 @@
|
|
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_type_list.rb
|
21
|
+
# Created: Mon 21 Nov 2011 15:57:27 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
class ActiveRecordTypeList < TableView
|
30
|
+
def load(model, options = {}, &block)
|
31
|
+
@entity_type = model
|
32
|
+
super(model.find(options[:query] || :all), options, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def columns(model, options)
|
36
|
+
cols = []
|
37
|
+
@entity_type.attribute_names.each do |key|
|
38
|
+
cols << { :key => key, :label => key.capitalize }
|
39
|
+
end
|
40
|
+
cols
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,96 @@
|
|
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: table_view.rb
|
21
|
+
# Created: Sat 19 Nov 2011 20:14:33 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
# This class provides a basic TableView control based
|
30
|
+
# loosely on the Archistry JavaScript TreeGrid API. It
|
31
|
+
# requires that the data to be displayed be supplied as a
|
32
|
+
# TableModel instance.
|
33
|
+
|
34
|
+
class TableView < View
|
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 table model.
|
42
|
+
|
43
|
+
def load(model, options = {}, &block)
|
44
|
+
cols = columns(model, options)
|
45
|
+
defw = "#{100 / cols.size}%"
|
46
|
+
build_header(model, cols, defw, options)
|
47
|
+
stack(:width => "100%") do
|
48
|
+
model.each { |row| build_row(cols, row, defw) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
# This method extracts or creates the column model for the
|
54
|
+
# view.
|
55
|
+
|
56
|
+
def columns(model, options)
|
57
|
+
if cols = options[:columns]
|
58
|
+
cols
|
59
|
+
else
|
60
|
+
cols = model.keys.collect do |k|
|
61
|
+
{ :key => k.to_sym, :label => "#{k.capitalize}" }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def build_header(model, cols, defw, options)
|
67
|
+
if options[:headers] != false
|
68
|
+
stack(:width => "100%") do
|
69
|
+
flow do
|
70
|
+
cols.each do |col|
|
71
|
+
flow(:width => defw) do
|
72
|
+
para col[:label], :weight => "bold", :align => "center"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def build_row(cols, row, defw)
|
81
|
+
flow do
|
82
|
+
cols.each do |col|
|
83
|
+
flow(:width => defw) do
|
84
|
+
if(r = col[:renderer])
|
85
|
+
r.render(self, row, col)
|
86
|
+
else
|
87
|
+
para row[col[:key]], col[:style]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,65 @@
|
|
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: web_view.rb
|
21
|
+
# Created: Wed 23 Nov 2011 17:08:02 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
# This is a more sophisticated view control vs. the standard
|
30
|
+
# toolkit widget.
|
31
|
+
|
32
|
+
class WebView < View
|
33
|
+
widget Toolkit::WebView
|
34
|
+
|
35
|
+
# This method is used to load the view with the
|
36
|
+
# information in the table model.
|
37
|
+
|
38
|
+
def load(model, options = {}, &block)
|
39
|
+
cols = columns(model, options)
|
40
|
+
if r = options[:renderer]
|
41
|
+
html = r.render(model, cols, options[:renderer_options])
|
42
|
+
puts "HTML:\n#{html}"
|
43
|
+
widget.load_html(html)
|
44
|
+
else
|
45
|
+
raise ArgumentError,"renderer not specified"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
# This method extracts or creates the column model for the
|
51
|
+
# view.
|
52
|
+
|
53
|
+
def columns(model, options)
|
54
|
+
if cols = options[:columns]
|
55
|
+
cols
|
56
|
+
else
|
57
|
+
cols = model.keys.collect do |k|
|
58
|
+
{ :key => k.to_sym, :label => "#{k.capitalize}" }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|