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,31 @@
|
|
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: wxruby.rb
|
21
|
+
# Created: Wed 23 Nov 2011 10:35:20 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
require 'wx'
|
27
|
+
|
28
|
+
require 'ruby_mvc/toolkit/peers/wxruby/common'
|
29
|
+
require 'ruby_mvc/toolkit/peers/wxruby/app'
|
30
|
+
require 'ruby_mvc/toolkit/peers/wxruby/frame'
|
31
|
+
require 'ruby_mvc/toolkit/peers/wxruby/web_view'
|
@@ -0,0 +1,44 @@
|
|
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: app.rb
|
21
|
+
# Created: Wed 23 Nov 2011 11:53:28 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
module WxRuby
|
29
|
+
class App < Wx::App
|
30
|
+
Toolkit::App.peer_class = self
|
31
|
+
|
32
|
+
def initialize(&block)
|
33
|
+
super
|
34
|
+
@block = block
|
35
|
+
main_loop
|
36
|
+
end
|
37
|
+
|
38
|
+
def on_init
|
39
|
+
@block.call
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,48 @@
|
|
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: box_layout.rb
|
21
|
+
# Created: Wed 23 Nov 2011 13:41:15 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
module WxRuby
|
29
|
+
class BoxLayout
|
30
|
+
Toolkit::BoxLayout.peer_class = self
|
31
|
+
|
32
|
+
def initialize(options)
|
33
|
+
@options = options
|
34
|
+
case(options[:axis])
|
35
|
+
when :horizontal, :x, :x_axis
|
36
|
+
@widget = Wx::BoxSizer.new(Wx::HORIZONTAL)
|
37
|
+
else
|
38
|
+
@widget = Wx::BoxSizer.new(Wx::VERTICAL)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def add(child, options = {})
|
43
|
+
@widget.add
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,72 @@
|
|
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: common.rb
|
21
|
+
# Created: Wed 23 Nov 2011 10:46:35 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
module WxRuby
|
29
|
+
|
30
|
+
# This method is a hack to deal with the parenting
|
31
|
+
# issues around the way wxWindows requires a parent for
|
32
|
+
# all child windows, and other toolkits don't.
|
33
|
+
|
34
|
+
def self.default_parent
|
35
|
+
@@parent ||= 1
|
36
|
+
if 1 == @@parent
|
37
|
+
@@parent = Wx::Frame.new(nil, :size => [40, 40])
|
38
|
+
class << @@parent
|
39
|
+
def should_prevent_app_exit
|
40
|
+
false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
@@parent
|
45
|
+
end
|
46
|
+
|
47
|
+
# This method is used to retrieve the parent window from
|
48
|
+
# the options, or it will use the default parent window.
|
49
|
+
|
50
|
+
def self.parent(options = {})
|
51
|
+
if (p = options[:parent]) && (p = p.peer)
|
52
|
+
p
|
53
|
+
else
|
54
|
+
default_parent
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# This module has some common things that map between
|
59
|
+
# controls in the WxRuby universe
|
60
|
+
|
61
|
+
module Common
|
62
|
+
def title
|
63
|
+
get_title
|
64
|
+
end
|
65
|
+
|
66
|
+
def title=(title)
|
67
|
+
set_title(title)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,49 @@
|
|
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: frame.rb
|
21
|
+
# Created: Wed 23 Nov 2011 10:46:44 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
module WxRuby
|
29
|
+
class Frame < Wx::Frame
|
30
|
+
include Common
|
31
|
+
Toolkit::Frame.peer_class = self
|
32
|
+
|
33
|
+
def initialize(options)
|
34
|
+
opts = {}
|
35
|
+
opts[:title] = options[:title]
|
36
|
+
opts[:size] = [ options[:width], options[:height] ]
|
37
|
+
super(options[:parent], opts)
|
38
|
+
end
|
39
|
+
|
40
|
+
# This method is used to add a child to the existing
|
41
|
+
# frame.
|
42
|
+
|
43
|
+
def add(child, options = {})
|
44
|
+
child.peer.reparent(self)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,87 @@
|
|
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: html_view.rb
|
21
|
+
# Created: Wed 23 Nov 2011 12:43:10 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
module WxRuby
|
29
|
+
class WebView < Wx::HtmlWindow
|
30
|
+
include Toolkit::SignalHandler
|
31
|
+
include Common
|
32
|
+
Toolkit::WebView.peer_class = self
|
33
|
+
|
34
|
+
def initialize(options = {}, &block)
|
35
|
+
super(WxRuby.parent(options))
|
36
|
+
set_background_colour(Wx::WHITE)
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :location
|
40
|
+
|
41
|
+
def can_go_back?
|
42
|
+
history_can_back
|
43
|
+
end
|
44
|
+
|
45
|
+
def can_go_forward?
|
46
|
+
history_can_forward
|
47
|
+
end
|
48
|
+
|
49
|
+
def go_back
|
50
|
+
history_back
|
51
|
+
end
|
52
|
+
|
53
|
+
def go_forward
|
54
|
+
history_forward
|
55
|
+
end
|
56
|
+
|
57
|
+
def open(uri)
|
58
|
+
@location = uri
|
59
|
+
load_page(uri)
|
60
|
+
end
|
61
|
+
|
62
|
+
def stop_loading
|
63
|
+
# apparently, we can't do this
|
64
|
+
end
|
65
|
+
|
66
|
+
def reload
|
67
|
+
open(location)
|
68
|
+
end
|
69
|
+
|
70
|
+
def load_html(html, base_uri = nil)
|
71
|
+
# FIXME: this isn't quite right...
|
72
|
+
set_page(html)
|
73
|
+
@location = base_uri
|
74
|
+
end
|
75
|
+
|
76
|
+
#--
|
77
|
+
# wxRuby event handlers
|
78
|
+
#++
|
79
|
+
|
80
|
+
def on_link_clicked(link)
|
81
|
+
signal_emit("navigation-requested", self, link.href, link.target)
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,60 @@
|
|
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 12:54:26 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
|
29
|
+
# This class provides a web/HTML view whose API is
|
30
|
+
# modelled on WebKit
|
31
|
+
|
32
|
+
class WebView < Widget
|
33
|
+
api_method :load_html
|
34
|
+
api_methods :can_go_back?, :go_back
|
35
|
+
api_methods :can_go_forward?, :go_forward
|
36
|
+
api_methods :open, :reload, :go_home, :location
|
37
|
+
api_methods :stop_loading, :is_loading?
|
38
|
+
|
39
|
+
# This signal is emitted when the user requests
|
40
|
+
# navigation to another web resource.
|
41
|
+
|
42
|
+
signal "navigation-requested", :vetoable => true
|
43
|
+
|
44
|
+
# This signal is emitted when the title of the content
|
45
|
+
# in the view changes
|
46
|
+
|
47
|
+
signal "title-changed"
|
48
|
+
|
49
|
+
# This signal is emitted when the page begins to load
|
50
|
+
|
51
|
+
signal "load-started"
|
52
|
+
|
53
|
+
# This signal is emitted when the page load has
|
54
|
+
# completed.
|
55
|
+
|
56
|
+
signal "load-finished"
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,108 @@
|
|
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: widget.rb
|
21
|
+
# Created: Wed 23 Nov 2011 10:34:52 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
|
29
|
+
# This class defines the base toolkit widget class. Each
|
30
|
+
# widget has one - and only one - UI peer that is
|
31
|
+
# registered automatically when the UI peer is loaded.
|
32
|
+
|
33
|
+
class Widget
|
34
|
+
include SignalHandler
|
35
|
+
extend SignalHandler::ClassMethods
|
36
|
+
|
37
|
+
class << self
|
38
|
+
attr_accessor :peer_class
|
39
|
+
|
40
|
+
# This method is used to manage the API methods
|
41
|
+
# available to the toolkit widgets. Methods listed
|
42
|
+
# here will be forwarded to the peer class if they
|
43
|
+
# aren't defined by the toolkit widget subclass.
|
44
|
+
|
45
|
+
def api_methods(*args)
|
46
|
+
if !@api
|
47
|
+
@api = []
|
48
|
+
if self.superclass.respond_to? :api_methods
|
49
|
+
@api.concat(self.superclass.api_methods)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
@api.concat(args) if args.size > 0
|
53
|
+
@api
|
54
|
+
end
|
55
|
+
alias :api_method :api_methods
|
56
|
+
end
|
57
|
+
|
58
|
+
attr_reader :peer
|
59
|
+
api_methods :show, :hide
|
60
|
+
|
61
|
+
def initialize(*args, &block)
|
62
|
+
if pc = self.class.peer_class
|
63
|
+
@peer = pc.new(*args, &block)
|
64
|
+
connect_peer_signals
|
65
|
+
else
|
66
|
+
raise RuntimeError, "no peer class registered for #{self.class}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# This method will forward only those registered API
|
71
|
+
# methods to the peer class. Doing it this way ensures
|
72
|
+
# that we don't leak APIs from the peers into
|
73
|
+
# applications, but that we can still be efficient in
|
74
|
+
# how we manage the implementations.
|
75
|
+
#
|
76
|
+
# FIXME: there may be performance implications...
|
77
|
+
|
78
|
+
def method_missing(method, *args, &block)
|
79
|
+
if (self.class.api_methods || []).include? method
|
80
|
+
@peer.send(method, *args, &block)
|
81
|
+
else
|
82
|
+
super
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
protected
|
87
|
+
|
88
|
+
# This method is used to ensure that the signals defined
|
89
|
+
# for the widget are appropriately connected to the new
|
90
|
+
# peer instance when it's created.
|
91
|
+
#
|
92
|
+
# The normal mechanism is to simply forward the signal
|
93
|
+
# to the registered listeners on the toolkit widget. It
|
94
|
+
# is assumed that the peer classes send the appropriate
|
95
|
+
# arguments to the signal handlers.
|
96
|
+
|
97
|
+
def connect_peer_signals
|
98
|
+
self.class.signals.each do |s, opts|
|
99
|
+
puts "connecting signal '#{s}' to #{peer}"
|
100
|
+
peer.signal_connect(s) do |*args|
|
101
|
+
args[0] = self
|
102
|
+
signal_emit(s, *args)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|