freightrain 0.6.4 → 0.6.5
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.rdoc +4 -1
- data/Rakefile +1 -1
- data/lib/extensions/gtk/gtk_bootstrapper.rb +12 -14
- data/lib/extensions/gtk/widgets/gtk_layout.rb +0 -5
- data/lib/extensions/gtk/widgets/gtk_widget.rb +1 -1
- data/lib/extensions/qt/dialog_helper.rb +19 -0
- data/lib/extensions/qt/interface_builder.rb +76 -0
- data/lib/extensions/qt/qt_bootstrapper.rb +24 -0
- data/lib/extensions/qt/widgets/qt_abstract_button.rb +12 -0
- data/lib/extensions/qt/widgets/qt_base.rb +27 -0
- data/lib/extensions/qt/widgets/qt_label.rb +18 -0
- data/lib/extensions/qt/widgets/qt_line_edit.rb +13 -0
- data/lib/extensions/qt/widgets/qt_widget.rb +85 -0
- data/lib/freightrain/binding/binding_base.rb +19 -0
- data/lib/freightrain/binding/binding_host.rb +3 -3
- data/lib/freightrain/binding/binding_loader.rb +1 -0
- data/lib/freightrain/binding/freight_binding.rb +9 -7
- data/lib/freightrain/elements/freight_element_view.rb +1 -0
- data/lib/freightrain/elements/freight_element_view_model.rb +1 -0
- data/lib/freightrain/elements/layout_widget.rb +1 -0
- data/lib/freightrain/regions/region_host.rb +1 -0
- data/lib/freightrain/services/freight_service.rb +1 -0
- data/lib/freightrain/services/service_host.rb +0 -1
- data/lib/freightrain/signals/freight_signal.rb +1 -0
- data/lib/freightrain/signals/signal_host.rb +0 -1
- data/lib/freightrain/string_patch.rb +1 -0
- data/lib/freightrain/views/callback_wrapper.rb +1 -0
- data/lib/freightrain/views/freight_view.rb +1 -0
- data/lib/scaffolding/scaffolding.rb +1 -0
- metadata +37 -15
- data/lib/extensions/gtk/binding_base.rb +0 -17
- data/lib/freightrain/elements/element_extension.rb +0 -1
data/README.rdoc
CHANGED
@@ -8,10 +8,13 @@ Freightrain is a MVVM (model/view/viewmodel) framework for developing desktop ap
|
|
8
8
|
== HOW DO I GET IT?
|
9
9
|
gem install freightrain
|
10
10
|
|
11
|
-
(also make sure you have the latest ruby/gnome2 bindings installed (=> 0.19.
|
11
|
+
(also make sure you have the latest ruby/gnome2 bindings installed (=> 0.19.4) )
|
12
|
+
WARNING! As of ruby/gnome2 0.19.4, the accessor "name", which freightrain depends on, is removed from Gtk::Widget.
|
13
|
+
Long story short: you should get the latest version from the ruby/gnome2 svn. At the moment the problem is fixed in the ruby/gnome2 trunk.
|
12
14
|
|
13
15
|
== HOW DO I USE IT?
|
14
16
|
For now, you should take a look at http://github.com/bolthar/rubydraulica
|
17
|
+
(broken - callback handling doesn't work like that anymore. doc coming really really soon)
|
15
18
|
|
16
19
|
Note that the project is currently in ALPHA state. Use it in production at your own risk :-)
|
17
20
|
|
data/Rakefile
CHANGED
@@ -1,21 +1,19 @@
|
|
1
1
|
|
2
2
|
#TODO: use require all
|
3
|
-
#TODO: use File.join for god's sake!
|
4
3
|
|
5
4
|
require 'libglade2'
|
6
|
-
require File.dirname(__FILE__)
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require File.dirname(__FILE__) + "/dialog_helper.rb"
|
5
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_image.rb")
|
6
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_toggle_button.rb")
|
7
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_toggle_tool_button.rb")
|
8
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_widget.rb")
|
9
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_combo_box.rb")
|
10
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_calendar.rb")
|
11
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_treeview.rb")
|
12
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_treeviewcolumn.rb")
|
13
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_layout.rb")
|
14
|
+
require File.join(File.dirname(__FILE__), "widgets/gtk_statusicon.rb")
|
15
|
+
require File.join(File.dirname(__FILE__), "interface_builder.rb")
|
16
|
+
require File.join(File.dirname(__FILE__), "dialog_helper.rb")
|
19
17
|
|
20
18
|
module Freightrain
|
21
19
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Freightrain
|
4
|
+
module Toolkit
|
5
|
+
|
6
|
+
module DialogHelper
|
7
|
+
|
8
|
+
def open_file_dialog(description = "Open file...")
|
9
|
+
raise "not implemented"
|
10
|
+
end
|
11
|
+
|
12
|
+
def yes_no_dialog(description, title = "Warning!", secondary_text = "It will not be possible to recover the deleted item")
|
13
|
+
raise "not implemented"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
|
2
|
+
module Freightrain
|
3
|
+
|
4
|
+
module Toolkit
|
5
|
+
|
6
|
+
class InterfaceBuilder
|
7
|
+
|
8
|
+
attr_reader :toplevel
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@builder = Qt::UiLoader.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def file_found?(file_name)
|
15
|
+
return get_ui_files(file_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_objects_from_file(file_name)
|
19
|
+
file = Qt::File.new(get_ui_files(file_name))
|
20
|
+
file.open(Qt::File::ReadOnly)
|
21
|
+
@toplevel = @builder.load(file)
|
22
|
+
file.close
|
23
|
+
widgets = get_all_objects(@toplevel).select do |widget|
|
24
|
+
widget.objectName && widget.objectName != ""
|
25
|
+
end.map
|
26
|
+
return widgets
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_object_accessors(widgets, view)
|
30
|
+
widgets.each do |widget|
|
31
|
+
name = widget.objectName
|
32
|
+
view.instance_eval "def #{name}; @widgets.select { |w| w.objectName == '#{name}' }.first ;end;"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def connect_to_callback(widget, event_name, method)
|
37
|
+
begin
|
38
|
+
decoy_class = Class.new(Qt::Widget)
|
39
|
+
decoy_class.slots("#{widget.name}()")
|
40
|
+
decoy_class.send(:define_method, widget.name) do |*args|
|
41
|
+
method.call(*args)
|
42
|
+
end
|
43
|
+
decoy = decoy_class.new
|
44
|
+
widget.connect(SIGNAL(widget.get_event_signature(event_name)), decoy, widget.name.to_sym)
|
45
|
+
rescue Exception => ex
|
46
|
+
# p ex
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_ui_files(file_name)
|
51
|
+
search_path = File.join(
|
52
|
+
Freightrain.app_path,
|
53
|
+
"views",
|
54
|
+
"**",
|
55
|
+
file_name.to_convention + ".ui")
|
56
|
+
results = Dir.glob(search_path)
|
57
|
+
return results.first
|
58
|
+
end
|
59
|
+
|
60
|
+
def control
|
61
|
+
return @toplevel
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
def get_all_objects(parent, objects = [])
|
66
|
+
objects << parent
|
67
|
+
parent.children.each do |child|
|
68
|
+
get_all_objects(child, objects)
|
69
|
+
end
|
70
|
+
return objects
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
require 'Qt4'
|
3
|
+
require 'qtuitools'
|
4
|
+
require File.join(File.dirname(__FILE__), "widgets/qt_base.rb")
|
5
|
+
require File.join(File.dirname(__FILE__), "widgets/qt_widget.rb")
|
6
|
+
require File.join(File.dirname(__FILE__), "widgets/qt_abstract_button.rb")
|
7
|
+
require File.join(File.dirname(__FILE__), "widgets/qt_line_edit.rb")
|
8
|
+
require File.join(File.dirname(__FILE__), "widgets/qt_label.rb")
|
9
|
+
require File.join(File.dirname(__FILE__), "interface_builder.rb")
|
10
|
+
require File.join(File.dirname(__FILE__), "dialog_helper.rb")
|
11
|
+
|
12
|
+
module Freightrain
|
13
|
+
|
14
|
+
module Toolkit
|
15
|
+
|
16
|
+
def self.start_main_loop
|
17
|
+
app = Qt::Application.new([])
|
18
|
+
yield
|
19
|
+
app.exec
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
module Qt
|
3
|
+
|
4
|
+
class Base
|
5
|
+
include Freightrain::BindingBase
|
6
|
+
|
7
|
+
def plug_in(region_widget)
|
8
|
+
region_widget.setParent(self)
|
9
|
+
region_widget.show
|
10
|
+
end
|
11
|
+
|
12
|
+
def name
|
13
|
+
return self.objectName
|
14
|
+
end
|
15
|
+
|
16
|
+
def signals
|
17
|
+
return {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_event_signature(event_name)
|
21
|
+
return signals[event_name.to_sym] || "#{event_name}()"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Qt
|
4
|
+
|
5
|
+
class Label
|
6
|
+
|
7
|
+
def image=(value)
|
8
|
+
file = ::File.new(::File.join(::Dir.tmpdir,"tempimg#{self.object_id.to_s}"),'w')
|
9
|
+
file << value
|
10
|
+
file.close
|
11
|
+
image = Qt::Image.new(::File.join(::Dir.tmpdir,"tempimg#{self.object_id.to_s}"))
|
12
|
+
self.pixmap = image
|
13
|
+
self.resize(self.pixmap.size)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
module Qt
|
3
|
+
|
4
|
+
class Widget
|
5
|
+
include Freightrain::LayoutWidget
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@signals ||= {}
|
9
|
+
selected_callback = @signals[:selected]
|
10
|
+
@signals[:selected] = lambda do |value|
|
11
|
+
elements.each do |item|
|
12
|
+
item.set_selection(item.value == value)
|
13
|
+
end
|
14
|
+
selected_callback.call(value) if selected_callback
|
15
|
+
end
|
16
|
+
@elements ||= []
|
17
|
+
@ready = true
|
18
|
+
end
|
19
|
+
|
20
|
+
def elements=(enumerable)
|
21
|
+
setup unless @ready
|
22
|
+
delta = enumerable.length - @elements.length
|
23
|
+
@height_factor = self.get_new_item.control.height unless @height_factor
|
24
|
+
height = @elements.length
|
25
|
+
delta.abs.times do
|
26
|
+
if delta > 0
|
27
|
+
item = self.get_new_item
|
28
|
+
item.control.geometry = Qt::Rect.new(
|
29
|
+
0,
|
30
|
+
item.control.height * height,
|
31
|
+
item.control.width,
|
32
|
+
item.control.height
|
33
|
+
)
|
34
|
+
item.control.setParent(self)
|
35
|
+
item.control.show
|
36
|
+
@elements << item
|
37
|
+
height += 1
|
38
|
+
else
|
39
|
+
item = self.children.last
|
40
|
+
item.control.setParent(nil)
|
41
|
+
@elements.delete_if {|element| element.control == item }
|
42
|
+
item.control = nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
self.setMinimumHeight(@elements.length * @height_factor)
|
46
|
+
self.show
|
47
|
+
@elements.each do |element|
|
48
|
+
element.value = enumerable[@elements.index(element)]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def elements()
|
53
|
+
return @elements
|
54
|
+
end
|
55
|
+
|
56
|
+
def selected
|
57
|
+
return @elements.select { |element| element.selected == true}.first
|
58
|
+
end
|
59
|
+
|
60
|
+
def selected=(val)
|
61
|
+
@elements.each do |element|
|
62
|
+
element.set_selection(val == element.value)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_new_item
|
67
|
+
item = Freightrain[@viewmodel]
|
68
|
+
item.signals.each do |key, signal|
|
69
|
+
signal.connect(@signals[key]) if @signals[key]
|
70
|
+
end
|
71
|
+
return item
|
72
|
+
end
|
73
|
+
|
74
|
+
def bind(options)
|
75
|
+
if options[:property].to_sym == :elements
|
76
|
+
@viewmodel = (options[:element].to_s + "_element_view_model").to_sym
|
77
|
+
@signals = options[:signals]
|
78
|
+
options[:force] = true
|
79
|
+
end
|
80
|
+
super(options)
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
module Freightrain
|
3
|
+
module BindingBase
|
4
|
+
|
5
|
+
def bind(binding_options)
|
6
|
+
@bindings ||= {}
|
7
|
+
binding = FreightBinding.new(self, binding_options)
|
8
|
+
#TODO: send out warning on override?
|
9
|
+
@bindings[binding_options[:property]] = binding
|
10
|
+
return binding
|
11
|
+
end
|
12
|
+
|
13
|
+
def bindings
|
14
|
+
@bindings ||= {}
|
15
|
+
return @bindings.values
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -14,7 +14,7 @@ module Freightrain
|
|
14
14
|
def data_source=(source)
|
15
15
|
bindings.each do |binding|
|
16
16
|
binding.data_source = source
|
17
|
-
binding.update
|
17
|
+
binding.update #TODO: is this necessary?
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -27,9 +27,9 @@ module Freightrain
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def update
|
30
|
-
bindings.each { |binding| binding.update}
|
30
|
+
bindings.each { |binding| binding.update }
|
31
31
|
end
|
32
32
|
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
end
|
@@ -6,11 +6,11 @@ module Freightrain
|
|
6
6
|
attr_accessor :data_source
|
7
7
|
|
8
8
|
def initialize(widget, options)
|
9
|
-
@cache = :__NOVALUE
|
9
|
+
@cache = :__NOVALUE #TODO: this is necessary but really ugly - evaluate a possible replacement
|
10
10
|
@widget = widget
|
11
11
|
@property = options[:property].to_s.split('.')
|
12
12
|
@path = options[:path].to_s.split('.')
|
13
|
-
@converter = ConverterFactory.create(options[:converter]) || DefaultConverter.new
|
13
|
+
@converter = ConverterFactory.create(options[:converter]) || DefaultConverter.new #TODO: if in converterfactory?
|
14
14
|
@force = options[:force]
|
15
15
|
end
|
16
16
|
|
@@ -21,10 +21,10 @@ module Freightrain
|
|
21
21
|
set(@property, @converter.from(value), @widget)
|
22
22
|
@cache = value
|
23
23
|
end
|
24
|
-
rescue Exception => ex
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
rescue Exception => ex #TODO: logger...
|
25
|
+
p "#{@widget.name} - update"
|
26
|
+
p ex.message
|
27
|
+
p @path
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -32,13 +32,14 @@ module Freightrain
|
|
32
32
|
begin
|
33
33
|
value = get(@widget, @property)
|
34
34
|
set(@path, @converter.to(value), data_source)
|
35
|
-
rescue Exception => ex
|
35
|
+
rescue Exception => ex #TODO: logger...
|
36
36
|
# p "#{@widget.name} - commit"
|
37
37
|
# p ex.message
|
38
38
|
# p @path
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
#TODO: find a way not to raise except when absolutely necessary
|
42
43
|
private
|
43
44
|
def get(source, path)
|
44
45
|
my_path = path.clone
|
@@ -47,6 +48,7 @@ module Freightrain
|
|
47
48
|
get(source.send(target), my_path)
|
48
49
|
end
|
49
50
|
|
51
|
+
#TODO: find a way not to raise except when absolutely necessary
|
50
52
|
def set(path, value, source)
|
51
53
|
my_path = path.clone
|
52
54
|
return source.send(my_path[0].to_s + "=",value) if my_path.length == 1
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: freightrain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 6
|
8
|
+
- 5
|
9
|
+
version: 0.6.5
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Andrea Dallera
|
@@ -9,29 +14,37 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-17 00:00:00 +02:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: require_all
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 1
|
30
|
+
- 0
|
23
31
|
version: 1.1.0
|
24
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: needle
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ">="
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 3
|
44
|
+
- 0
|
33
45
|
version: 1.3.0
|
34
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
35
48
|
description: ruby desktop development made easy
|
36
49
|
email: andrea@andreadallera.com
|
37
50
|
executables:
|
@@ -62,6 +75,7 @@ files:
|
|
62
75
|
- lib/freightrain/binding/converters/default_converter.rb
|
63
76
|
- lib/freightrain/binding/converters/converter_factory.rb
|
64
77
|
- lib/freightrain/binding/freight_binding.rb
|
78
|
+
- lib/freightrain/binding/binding_base.rb
|
65
79
|
- lib/freightrain/binding/binding_loader.rb
|
66
80
|
- lib/freightrain/binding/binding_host.rb
|
67
81
|
- lib/freightrain/views/interface_builder.rb
|
@@ -84,8 +98,15 @@ files:
|
|
84
98
|
- lib/freightrain/services/freight_service.rb
|
85
99
|
- lib/freightrain/elements/freight_element_view.rb
|
86
100
|
- lib/freightrain/elements/freight_element_view_model.rb
|
87
|
-
- lib/freightrain/elements/element_extension.rb
|
88
101
|
- lib/freightrain/elements/layout_widget.rb
|
102
|
+
- lib/extensions/qt/widgets/qt_label.rb
|
103
|
+
- lib/extensions/qt/widgets/qt_base.rb
|
104
|
+
- lib/extensions/qt/widgets/qt_line_edit.rb
|
105
|
+
- lib/extensions/qt/widgets/qt_abstract_button.rb
|
106
|
+
- lib/extensions/qt/widgets/qt_widget.rb
|
107
|
+
- lib/extensions/qt/interface_builder.rb
|
108
|
+
- lib/extensions/qt/dialog_helper.rb
|
109
|
+
- lib/extensions/qt/qt_bootstrapper.rb
|
89
110
|
- lib/extensions/gtk/gtk_bootstrapper.rb
|
90
111
|
- lib/extensions/gtk/widgets/gtk_calendar.rb
|
91
112
|
- lib/extensions/gtk/widgets/gtk_toggle_button.rb
|
@@ -99,7 +120,6 @@ files:
|
|
99
120
|
- lib/extensions/gtk/widgets/gtk_combo_box.rb
|
100
121
|
- lib/extensions/gtk/interface_builder.rb
|
101
122
|
- lib/extensions/gtk/dialog_helper.rb
|
102
|
-
- lib/extensions/gtk/binding_base.rb
|
103
123
|
- lib/freightrain.rb
|
104
124
|
has_rdoc: true
|
105
125
|
homepage: http://github.com/bolthar/freightrain
|
@@ -114,18 +134,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
134
|
requirements:
|
115
135
|
- - ">="
|
116
136
|
- !ruby/object:Gem::Version
|
137
|
+
segments:
|
138
|
+
- 0
|
117
139
|
version: "0"
|
118
|
-
version:
|
119
140
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
141
|
requirements:
|
121
142
|
- - ">="
|
122
143
|
- !ruby/object:Gem::Version
|
144
|
+
segments:
|
145
|
+
- 0
|
123
146
|
version: "0"
|
124
|
-
version:
|
125
147
|
requirements: []
|
126
148
|
|
127
149
|
rubyforge_project:
|
128
|
-
rubygems_version: 1.3.
|
150
|
+
rubygems_version: 1.3.6
|
129
151
|
signing_key:
|
130
152
|
specification_version: 3
|
131
153
|
summary: ruby desktop development made easy
|
@@ -1,17 +0,0 @@
|
|
1
|
-
|
2
|
-
module BindingBase
|
3
|
-
|
4
|
-
def bind(binding_options)
|
5
|
-
@bindings ||= {}
|
6
|
-
binding = FreightBinding.new(self, binding_options)
|
7
|
-
#TODO: send out warning on override?
|
8
|
-
@bindings[binding_options[:property]] = binding
|
9
|
-
return binding
|
10
|
-
end
|
11
|
-
|
12
|
-
def bindings
|
13
|
-
@bindings ||= {}
|
14
|
-
return @bindings.values
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
|