glimmer-dsl-libui 0.4.7 → 0.4.11
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/CHANGELOG.md +33 -0
- data/README.md +1043 -493
- data/VERSION +1 -1
- data/examples/basic_table_button.rb +54 -30
- data/examples/basic_table_button2.rb +34 -0
- data/examples/basic_table_color.rb +1 -1
- data/examples/button_counter.rb +2 -1
- data/examples/cpu_percentage.rb +36 -0
- data/examples/editable_table.rb +1 -1
- data/examples/form_table.rb +21 -17
- data/examples/form_table2.rb +104 -85
- data/examples/form_table3.rb +113 -0
- data/examples/form_table4.rb +110 -0
- data/examples/form_table5.rb +94 -0
- data/examples/meta_example.rb +21 -8
- data/examples/midi_player.rb +1 -1
- data/examples/snake.rb +19 -10
- data/examples/snake2.rb +97 -0
- data/examples/tetris.rb +15 -18
- data/examples/tic_tac_toe.rb +1 -0
- data/examples/tic_tac_toe2.rb +84 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/control_expression.rb +2 -1
- data/lib/glimmer/dsl/libui/shape_expression.rb +2 -2
- data/lib/glimmer/dsl/libui/string_expression.rb +2 -1
- data/lib/glimmer/libui/attributed_string.rb +3 -2
- data/lib/glimmer/libui/control_proxy/checkbox_proxy.rb +4 -0
- data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +1 -2
- data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +1 -2
- data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +1 -2
- data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +4 -5
- data/lib/glimmer/libui/control_proxy/entry_proxy.rb +1 -2
- data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +5 -1
- data/lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb +4 -0
- data/lib/glimmer/libui/control_proxy/menu_item_proxy/radio_menu_item_proxy.rb +16 -4
- data/lib/glimmer/libui/control_proxy/multiline_entry_proxy.rb +1 -2
- data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +19 -0
- data/lib/glimmer/libui/control_proxy/slider_proxy.rb +1 -2
- data/lib/glimmer/libui/control_proxy/spinbox_proxy.rb +1 -2
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +88 -24
- data/lib/glimmer/libui/control_proxy.rb +6 -4
- data/lib/glimmer/libui/data_bindable.rb +34 -4
- data/lib/glimmer/libui/shape.rb +3 -2
- data/lib/glimmer-dsl-libui.rb +1 -0
- metadata +9 -2
@@ -64,8 +64,7 @@ module Glimmer
|
|
64
64
|
alias set_selected_item selected_item
|
65
65
|
alias selected_item= selected_item
|
66
66
|
|
67
|
-
def
|
68
|
-
super
|
67
|
+
def data_bind_write(property, model_binding)
|
69
68
|
case property
|
70
69
|
when 'selected'
|
71
70
|
handle_listener('on_selected') { model_binding.call(selected) }
|
@@ -39,11 +39,10 @@ module Glimmer
|
|
39
39
|
end
|
40
40
|
alias set_items items
|
41
41
|
alias items= items
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
handle_listener('on_changed') { model_binding.call(text) } if property == 'text'
|
42
|
+
|
43
|
+
def data_bind_write(property, model_binding)
|
44
|
+
handle_listener('on_changed') { model_binding.call(text) } if property == 'text'
|
45
|
+
end
|
47
46
|
end
|
48
47
|
end
|
49
48
|
end
|
@@ -28,8 +28,7 @@ module Glimmer
|
|
28
28
|
#
|
29
29
|
# Follows the Proxy Design Pattern
|
30
30
|
class EntryProxy < ControlProxy
|
31
|
-
def
|
32
|
-
super
|
31
|
+
def data_bind_write(property, model_binding)
|
33
32
|
handle_listener('on_changed') { model_binding.call(text) } if property == 'text'
|
34
33
|
end
|
35
34
|
|
@@ -65,7 +65,11 @@ module Glimmer
|
|
65
65
|
super
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
68
|
+
def data_bind_read(property, model_binding)
|
69
|
+
# No Op
|
70
|
+
end
|
71
|
+
|
72
|
+
def data_bind_write(property, model_binding)
|
69
73
|
handle_listener('on_changed') { model_binding.call(font) } if property == 'font'
|
70
74
|
end
|
71
75
|
end
|
@@ -29,6 +29,10 @@ module Glimmer
|
|
29
29
|
#
|
30
30
|
# Follows the Proxy Design Pattern
|
31
31
|
class CheckMenuItemProxy < MenuItemProxy
|
32
|
+
def data_bind_write(property, model_binding)
|
33
|
+
handle_listener('on_clicked') { model_binding.call(checked) } if property == 'checked'
|
34
|
+
end
|
35
|
+
|
32
36
|
private
|
33
37
|
|
34
38
|
def build_control
|
@@ -29,15 +29,23 @@ module Glimmer
|
|
29
29
|
#
|
30
30
|
# Follows the Proxy Design Pattern
|
31
31
|
class RadioMenuItemProxy < MenuItemProxy
|
32
|
+
def initialize(keyword, parent, args, &block)
|
33
|
+
@last_checked = nil
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
32
37
|
def checked(value = nil)
|
33
|
-
if
|
34
|
-
|
35
|
-
|
38
|
+
if value.nil?
|
39
|
+
super()
|
40
|
+
else
|
41
|
+
super
|
42
|
+
if Glimmer::LibUI.integer_to_boolean(value, allow_nil: false) != Glimmer::LibUI.integer_to_boolean(@last_checked, allow_nil: false)
|
36
43
|
if Glimmer::LibUI.integer_to_boolean(value)
|
37
44
|
(@parent_proxy.children - [self]).select {|c| c.is_a?(MenuItemProxy)}.each do |menu_item|
|
38
45
|
menu_item.checked = false
|
39
46
|
end
|
40
47
|
end
|
48
|
+
@last_checked = checked
|
41
49
|
end
|
42
50
|
end
|
43
51
|
end
|
@@ -48,7 +56,7 @@ module Glimmer
|
|
48
56
|
def handle_listener(listener_name, &listener)
|
49
57
|
if listener_name.to_s == 'on_clicked'
|
50
58
|
radio_listener = Proc.new do
|
51
|
-
self.checked = true
|
59
|
+
self.checked = true
|
52
60
|
listener.call(self)
|
53
61
|
end
|
54
62
|
super(listener_name, &radio_listener)
|
@@ -57,6 +65,10 @@ module Glimmer
|
|
57
65
|
end
|
58
66
|
end
|
59
67
|
|
68
|
+
def data_bind_write(property, model_binding)
|
69
|
+
handle_listener('on_clicked') { model_binding.call(checked) } if property == 'checked'
|
70
|
+
end
|
71
|
+
|
60
72
|
private
|
61
73
|
|
62
74
|
def build_control
|
@@ -28,8 +28,7 @@ module Glimmer
|
|
28
28
|
#
|
29
29
|
# Follows the Proxy Design Pattern
|
30
30
|
class MultilineEntryProxy < ControlProxy
|
31
|
-
def
|
32
|
-
super
|
31
|
+
def data_bind_write(property, model_binding)
|
33
32
|
handle_listener('on_changed') { model_binding.call(text) } if property == 'text'
|
34
33
|
end
|
35
34
|
|
@@ -39,6 +39,25 @@ module Glimmer
|
|
39
39
|
end
|
40
40
|
alias set_items items
|
41
41
|
alias items= items
|
42
|
+
|
43
|
+
def selected_item(value = nil)
|
44
|
+
if value.nil?
|
45
|
+
items[selected]
|
46
|
+
else
|
47
|
+
self.selected = items.index(value) || -1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
alias set_selected_item selected_item
|
51
|
+
alias selected_item= selected_item
|
52
|
+
|
53
|
+
def data_bind_write(property, model_binding)
|
54
|
+
case property
|
55
|
+
when 'selected'
|
56
|
+
handle_listener('on_selected') { model_binding.call(selected) }
|
57
|
+
when 'selected_item'
|
58
|
+
handle_listener('on_selected') { model_binding.call(selected_item) }
|
59
|
+
end
|
60
|
+
end
|
42
61
|
end
|
43
62
|
end
|
44
63
|
end
|
@@ -28,8 +28,7 @@ module Glimmer
|
|
28
28
|
#
|
29
29
|
# Follows the Proxy Design Pattern
|
30
30
|
class SliderProxy < ControlProxy
|
31
|
-
def
|
32
|
-
super
|
31
|
+
def data_bind_write(property, model_binding)
|
33
32
|
handle_listener('on_changed') { model_binding.call(value) } if property == 'value'
|
34
33
|
end
|
35
34
|
end
|
@@ -28,8 +28,7 @@ module Glimmer
|
|
28
28
|
#
|
29
29
|
# Follows the Proxy Design Pattern
|
30
30
|
class SpinboxProxy < ControlProxy
|
31
|
-
def
|
32
|
-
super
|
31
|
+
def data_bind_write(property, model_binding)
|
33
32
|
handle_listener('on_changed') { model_binding.call(value) } if property == 'value'
|
34
33
|
end
|
35
34
|
end
|
@@ -38,7 +38,7 @@ module Glimmer
|
|
38
38
|
|
39
39
|
LISTENERS = ['on_changed', 'on_edited']
|
40
40
|
|
41
|
-
attr_reader :model_handler, :model, :table_params, :columns
|
41
|
+
attr_reader :model_handler, :model, :table_params, :columns, :column_attributes
|
42
42
|
|
43
43
|
def initialize(keyword, parent, args, &block)
|
44
44
|
@keyword = keyword
|
@@ -75,6 +75,7 @@ module Glimmer
|
|
75
75
|
|
76
76
|
def destroy
|
77
77
|
super
|
78
|
+
@cell_rows_observer&.unobserve(self, :cell_rows, recursive: true)
|
78
79
|
@destroyed = true
|
79
80
|
end
|
80
81
|
|
@@ -82,10 +83,11 @@ module Glimmer
|
|
82
83
|
if rows.nil?
|
83
84
|
@cell_rows
|
84
85
|
else
|
85
|
-
@cell_rows
|
86
|
-
|
87
|
-
@
|
88
|
-
|
86
|
+
if rows != @cell_rows
|
87
|
+
@cell_rows = rows
|
88
|
+
@cell_rows = @cell_rows.to_a if @cell_rows.is_a?(Enumerator)
|
89
|
+
@last_cell_rows ||= array_deep_clone(@cell_rows)
|
90
|
+
@cell_rows_observer ||= Glimmer::DataBinding::Observer.proc do |new_cell_rows|
|
89
91
|
if @cell_rows.size < @last_cell_rows.size && @last_cell_rows.include_all?(*@cell_rows)
|
90
92
|
@last_cell_rows.array_diff_indexes(@cell_rows).reverse.each do |row|
|
91
93
|
::LibUI.table_model_row_deleted(model, row)
|
@@ -106,8 +108,11 @@ module Glimmer
|
|
106
108
|
end
|
107
109
|
@last_last_cell_rows = array_deep_clone(@last_cell_rows)
|
108
110
|
@last_cell_rows = array_deep_clone(@cell_rows)
|
109
|
-
end.
|
111
|
+
end.tap do |cell_rows_observer|
|
112
|
+
cell_rows_observer.observe(self, :cell_rows, recursive: true)
|
113
|
+
end
|
110
114
|
end
|
115
|
+
@cell_rows
|
111
116
|
end
|
112
117
|
end
|
113
118
|
alias cell_rows= cell_rows
|
@@ -119,6 +124,7 @@ module Glimmer
|
|
119
124
|
|
120
125
|
def expand(cell_rows)
|
121
126
|
cell_rows.to_a.map do |row|
|
127
|
+
row = @column_attributes.map {|attribute| row.send(attribute) } if @column_attributes&.any? && !row.is_a?(Array)
|
122
128
|
row.flatten(1)
|
123
129
|
end
|
124
130
|
end
|
@@ -134,6 +140,46 @@ module Glimmer
|
|
134
140
|
alias set_editable editable
|
135
141
|
alias editable? editable
|
136
142
|
|
143
|
+
def data_bind_read(property, model_binding)
|
144
|
+
if model_binding.binding_options[:column_attributes].is_a?(Array)
|
145
|
+
@column_attributes = model_binding.binding_options[:column_attributes]
|
146
|
+
else
|
147
|
+
column_attribute_mapping = model_binding.binding_options[:column_attributes].is_a?(Hash) ? model_binding.binding_options[:column_attributes] : {}
|
148
|
+
@column_attributes = columns.map(&:name).map {|column_name| column_attribute_mapping[column_name] || column_name.underscore}
|
149
|
+
end
|
150
|
+
model_attribute_observer = model_attribute_observer_registration = nil
|
151
|
+
model_attribute_observer = Glimmer::DataBinding::Observer.proc do
|
152
|
+
new_value = model_binding.evaluate_property
|
153
|
+
new_value = new_value.to_a if new_value.is_a?(Enumerator)
|
154
|
+
if model_binding.binding_options[:column_attributes] || (!new_value.empty? && !new_value.first.is_a?(Array))
|
155
|
+
@model_attribute_array_observer_registration&.deregister
|
156
|
+
@model_attribute_array_observer_registration = model_attribute_observer.observe(new_value, @column_attributes)
|
157
|
+
model_attribute_observer.add_dependent(model_attribute_observer_registration => @model_attribute_array_observer_registration)
|
158
|
+
end
|
159
|
+
# TODO look if multiple notifications are happening as a result of observing array and observing model binding
|
160
|
+
send("#{property}=", new_value) unless @last_cell_rows == new_value
|
161
|
+
end
|
162
|
+
model_attribute_observer_registration = model_attribute_observer.observe(model_binding)
|
163
|
+
model_attribute_observer.call # initial update
|
164
|
+
data_binding_model_attribute_observer_registrations << model_attribute_observer_registration
|
165
|
+
model_attribute_observer
|
166
|
+
end
|
167
|
+
|
168
|
+
def data_bind_write(property, model_binding)
|
169
|
+
# TODO ensure writing is happening to models if rows are not arrays
|
170
|
+
handle_listener('on_edited') { model_binding.call(cell_rows) } if property == 'cell_rows'
|
171
|
+
end
|
172
|
+
|
173
|
+
def array_deep_clone(array_or_object)
|
174
|
+
if array_or_object.is_a?(Array)
|
175
|
+
array_or_object.map do |element|
|
176
|
+
array_deep_clone(element)
|
177
|
+
end
|
178
|
+
else
|
179
|
+
array_or_object.clone
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
137
183
|
private
|
138
184
|
|
139
185
|
def build_control
|
@@ -193,28 +239,56 @@ module Glimmer
|
|
193
239
|
when Column::TextColumnProxy
|
194
240
|
column = @columns[column].index
|
195
241
|
@cell_rows[row] ||= []
|
196
|
-
@cell_rows[row]
|
242
|
+
if @cell_rows[row].is_a?(Array)
|
243
|
+
@cell_rows[row][column] = ::LibUI.table_value_string(val).to_s
|
244
|
+
else
|
245
|
+
attribute = @column_attributes[column]
|
246
|
+
@cell_rows[row].send("#{attribute}=", ::LibUI.table_value_string(val).to_s)
|
247
|
+
end
|
197
248
|
when Column::TextColorColumnProxy
|
198
249
|
column = @columns[column].index
|
199
250
|
@cell_rows[row] ||= []
|
200
|
-
@cell_rows[row]
|
201
|
-
|
251
|
+
if @cell_rows[row].is_a?(Array)
|
252
|
+
@cell_rows[row][column] ||= []
|
253
|
+
@cell_rows[row][column][0] = ::LibUI.table_value_string(val).to_s
|
254
|
+
else
|
255
|
+
attribute = @column_attributes[column]
|
256
|
+
@cell_rows[row].send("#{attribute}=", []) unless @cell_rows[row].send(attribute)
|
257
|
+
@cell_rows[row].send(attribute)[0] = ::LibUI.table_value_string(val).to_s
|
258
|
+
end
|
202
259
|
when :text
|
203
260
|
column = @columns[column - 1].index
|
204
261
|
@cell_rows[row] ||= []
|
205
|
-
@cell_rows[row]
|
206
|
-
|
262
|
+
if @cell_rows[row].is_a?(Array)
|
263
|
+
@cell_rows[row][column] ||= []
|
264
|
+
@cell_rows[row][column][1] = ::LibUI.table_value_string(val).to_s
|
265
|
+
else
|
266
|
+
attribute = @column_attributes[column]
|
267
|
+
@cell_rows[row].send("#{attribute}=", []) unless @cell_rows[row].send(attribute)
|
268
|
+
@cell_rows[row].send(attribute)[1] = ::LibUI.table_value_string(val).to_s
|
269
|
+
end
|
207
270
|
when Column::ButtonColumnProxy
|
208
271
|
@columns[column].notify_listeners(:on_clicked, row)
|
209
272
|
when Column::CheckboxColumnProxy
|
210
273
|
column = @columns[column].index
|
211
274
|
@cell_rows[row] ||= []
|
212
|
-
@cell_rows[row]
|
275
|
+
if @cell_rows[row].is_a?(Array)
|
276
|
+
@cell_rows[row][column] = ::LibUI.table_value_int(val).to_i == 1
|
277
|
+
else
|
278
|
+
attribute = @column_attributes[column]
|
279
|
+
@cell_rows[row].send("#{attribute}=", ::LibUI.table_value_int(val).to_i == 1)
|
280
|
+
end
|
213
281
|
when Column::CheckboxTextColumnProxy
|
214
282
|
column = @columns[column].index
|
215
283
|
@cell_rows[row] ||= []
|
216
|
-
@cell_rows[row]
|
217
|
-
|
284
|
+
if @cell_rows[row].is_a?(Array)
|
285
|
+
@cell_rows[row][column] ||= []
|
286
|
+
@cell_rows[row][column][0] = ::LibUI.table_value_int(val).to_i == 1
|
287
|
+
else
|
288
|
+
attribute = @column_attributes[column]
|
289
|
+
@cell_rows[row].send("#{attribute}=", []) unless @cell_rows[row].send(attribute)
|
290
|
+
@cell_rows[row].send(attribute)[0] = ::LibUI.table_value_int(val).to_i == 1
|
291
|
+
end
|
218
292
|
end
|
219
293
|
on_edited.each {|listener| listener.call(row, @cell_rows[row])}
|
220
294
|
end
|
@@ -238,16 +312,6 @@ module Glimmer
|
|
238
312
|
@next_column_index ||= -1
|
239
313
|
@next_column_index += 1
|
240
314
|
end
|
241
|
-
|
242
|
-
def array_deep_clone(array_or_object)
|
243
|
-
if array_or_object.is_a?(Array)
|
244
|
-
array_or_object.map do |element|
|
245
|
-
array_deep_clone(element)
|
246
|
-
end
|
247
|
-
else
|
248
|
-
array_or_object.clone
|
249
|
-
end
|
250
|
-
end
|
251
315
|
end
|
252
316
|
end
|
253
317
|
end
|
@@ -126,7 +126,8 @@ module Glimmer
|
|
126
126
|
]
|
127
127
|
|
128
128
|
# libui returns the contained LibUI object
|
129
|
-
attr_reader :parent_proxy, :libui, :args, :keyword, :block
|
129
|
+
attr_reader :parent_proxy, :libui, :args, :keyword, :block, :content_added
|
130
|
+
alias content_added? content_added
|
130
131
|
|
131
132
|
def initialize(keyword, parent, args, &block)
|
132
133
|
@keyword = keyword
|
@@ -245,8 +246,8 @@ module Glimmer
|
|
245
246
|
args[0] = Glimmer::LibUI.boolean_to_integer(args.first) if BOOLEAN_PROPERTIES.include?(property) && (args.first.is_a?(TrueClass) || args.first.is_a?(FalseClass))
|
246
247
|
args[0] = '' if STRING_PROPERTIES.include?(property) && args.first == nil
|
247
248
|
if property.to_s == 'checked'
|
248
|
-
current_value = Glimmer::LibUI.integer_to_boolean(::LibUI.send("#{libui_api_keyword}_checked", @libui))
|
249
|
-
new_value = Glimmer::LibUI.integer_to_boolean(args[0])
|
249
|
+
current_value = Glimmer::LibUI.integer_to_boolean(::LibUI.send("#{libui_api_keyword}_checked", @libui), allow_nil: false)
|
250
|
+
new_value = Glimmer::LibUI.integer_to_boolean(args[0], allow_nil: false)
|
250
251
|
::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args) if new_value != current_value
|
251
252
|
else
|
252
253
|
::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args)
|
@@ -288,6 +289,7 @@ module Glimmer
|
|
288
289
|
end
|
289
290
|
|
290
291
|
def destroy
|
292
|
+
data_binding_model_attribute_observer_registrations.each(&:deregister)
|
291
293
|
if parent_proxy.nil?
|
292
294
|
default_destroy
|
293
295
|
else
|
@@ -337,7 +339,7 @@ module Glimmer
|
|
337
339
|
alias visible= visible
|
338
340
|
|
339
341
|
def content(&block)
|
340
|
-
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::ControlExpression.new, @keyword, &block)
|
342
|
+
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::ControlExpression.new, @keyword, {post_add_content: @content_added}, &block)
|
341
343
|
end
|
342
344
|
|
343
345
|
private
|
@@ -23,16 +23,46 @@ module Glimmer
|
|
23
23
|
module LibUI
|
24
24
|
# Parent controls and shapes who have children and add child post_initialize_child
|
25
25
|
module DataBindable
|
26
|
-
#
|
27
|
-
#
|
26
|
+
# Sets up read/write (bidirectional) data-binding
|
27
|
+
#
|
28
|
+
# classes are expected to implement `data_bind_write(property, model_binding)` to setup write data-binding
|
29
|
+
# by observing view property for changes and writing to model attribute via model binding accordingly
|
30
|
+
#
|
31
|
+
# classes can override data_bind_read to disable read data-binding in rare scenarios that might need it
|
32
|
+
#
|
33
|
+
# returns model attribute reading observer registration by default
|
28
34
|
def data_bind(property, model_binding)
|
35
|
+
data_bind_read(property, model_binding).tap do
|
36
|
+
data_bind_write(property, model_binding) unless model_binding.binding_options[:read_only]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Sets up read data-binding (reading from model to update view)
|
41
|
+
#
|
42
|
+
# Default implementation observes model attribute for changes via model binding
|
43
|
+
# and updates view property accordingly
|
44
|
+
def data_bind_read(property, model_binding)
|
29
45
|
model_attribute_observer = Glimmer::DataBinding::Observer.proc do
|
30
46
|
new_value = model_binding.evaluate_property
|
31
47
|
send("#{property}=", new_value) unless send(property) == new_value
|
32
48
|
end
|
33
|
-
model_attribute_observer.observe(model_binding)
|
49
|
+
observer_registration = model_attribute_observer.observe(model_binding)
|
34
50
|
model_attribute_observer.call # initial update
|
35
|
-
|
51
|
+
data_binding_model_attribute_observer_registrations << observer_registration
|
52
|
+
observer_registration
|
53
|
+
end
|
54
|
+
|
55
|
+
# Sets up write data-binding (writing to model from view)
|
56
|
+
#
|
57
|
+
# Has no implementation by default. Classes are expected
|
58
|
+
# to implement this method by observing view property
|
59
|
+
# for changes and writing them to model accordingly via model binding
|
60
|
+
def data_bind_write(property, model_binding)
|
61
|
+
# No Op by default
|
62
|
+
end
|
63
|
+
|
64
|
+
def data_binding_model_attribute_observer_registrations
|
65
|
+
@data_binding_model_attribute_observer_registrations ||= []
|
36
66
|
end
|
37
67
|
end
|
38
68
|
end
|
data/lib/glimmer/libui/shape.rb
CHANGED
@@ -67,7 +67,8 @@ module Glimmer
|
|
67
67
|
include Parent
|
68
68
|
include DataBindable
|
69
69
|
|
70
|
-
attr_reader :parent, :args, :keyword, :block
|
70
|
+
attr_reader :parent, :args, :keyword, :block, :content_added
|
71
|
+
alias content_added? content_added
|
71
72
|
|
72
73
|
def initialize(keyword, parent, args, &block)
|
73
74
|
@keyword = keyword
|
@@ -97,7 +98,7 @@ module Glimmer
|
|
97
98
|
end
|
98
99
|
|
99
100
|
def content(&block)
|
100
|
-
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::ShapeExpression.new, @keyword, &block)
|
101
|
+
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::ShapeExpression.new, @keyword, {post_add_content: @content_added}, &block)
|
101
102
|
request_auto_redraw
|
102
103
|
end
|
103
104
|
|
data/lib/glimmer-dsl-libui.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-libui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|
@@ -232,6 +232,7 @@ files:
|
|
232
232
|
- examples/basic_scrolling_area.rb
|
233
233
|
- examples/basic_table.rb
|
234
234
|
- examples/basic_table_button.rb
|
235
|
+
- examples/basic_table_button2.rb
|
235
236
|
- examples/basic_table_checkbox.rb
|
236
237
|
- examples/basic_table_checkbox_text.rb
|
237
238
|
- examples/basic_table_color.rb
|
@@ -250,6 +251,7 @@ files:
|
|
250
251
|
- examples/color_button2.rb
|
251
252
|
- examples/color_the_circles.rb
|
252
253
|
- examples/control_gallery.rb
|
254
|
+
- examples/cpu_percentage.rb
|
253
255
|
- examples/custom_draw_text.rb
|
254
256
|
- examples/custom_draw_text2.rb
|
255
257
|
- examples/date_time_picker.rb
|
@@ -266,6 +268,9 @@ files:
|
|
266
268
|
- examples/form2.rb
|
267
269
|
- examples/form_table.rb
|
268
270
|
- examples/form_table2.rb
|
271
|
+
- examples/form_table3.rb
|
272
|
+
- examples/form_table4.rb
|
273
|
+
- examples/form_table5.rb
|
269
274
|
- examples/grid.rb
|
270
275
|
- examples/histogram.rb
|
271
276
|
- examples/histogram2.rb
|
@@ -288,6 +293,7 @@ files:
|
|
288
293
|
- examples/snake/model/vertebra.rb
|
289
294
|
- examples/snake/presenter/cell.rb
|
290
295
|
- examples/snake/presenter/grid.rb
|
296
|
+
- examples/snake2.rb
|
291
297
|
- examples/tetris.rb
|
292
298
|
- examples/tetris/model/block.rb
|
293
299
|
- examples/tetris/model/game.rb
|
@@ -296,6 +302,7 @@ files:
|
|
296
302
|
- examples/tic_tac_toe.rb
|
297
303
|
- examples/tic_tac_toe/board.rb
|
298
304
|
- examples/tic_tac_toe/cell.rb
|
305
|
+
- examples/tic_tac_toe2.rb
|
299
306
|
- examples/timer.rb
|
300
307
|
- examples/timer2.rb
|
301
308
|
- glimmer-dsl-libui.gemspec
|