glimmer-dsl-libui 0.4.6 → 0.4.10
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 +29 -0
- data/README.md +601 -323
- data/VERSION +1 -1
- data/examples/button_counter.rb +2 -1
- data/examples/cpu_percentage.rb +36 -0
- data/examples/date_time_picker.rb +19 -14
- data/examples/date_time_picker2.rb +20 -0
- data/examples/meta_example.rb +17 -6
- data/examples/midi_player.rb +5 -6
- data/examples/midi_player2.rb +83 -0
- data/examples/midi_player3.rb +84 -0
- 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/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 +17 -2
- data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +4 -0
- data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +4 -0
- 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.rb +2 -2
- data/lib/glimmer/libui/data_bindable.rb +27 -2
- metadata +8 -2
@@ -54,8 +54,23 @@ module Glimmer
|
|
54
54
|
alias set_items items
|
55
55
|
alias items= items
|
56
56
|
|
57
|
-
def selected_item
|
58
|
-
|
57
|
+
def selected_item(value = nil)
|
58
|
+
if value.nil?
|
59
|
+
items[selected]
|
60
|
+
else
|
61
|
+
self.selected = items.index(value)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
alias set_selected_item selected_item
|
65
|
+
alias selected_item= selected_item
|
66
|
+
|
67
|
+
def data_bind_write(property, model_binding)
|
68
|
+
case property
|
69
|
+
when 'selected'
|
70
|
+
handle_listener('on_selected') { model_binding.call(selected) }
|
71
|
+
when 'selected_item'
|
72
|
+
handle_listener('on_selected') { model_binding.call(selected_item) }
|
73
|
+
end
|
59
74
|
end
|
60
75
|
end
|
61
76
|
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
|
@@ -245,8 +245,8 @@ module Glimmer
|
|
245
245
|
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
246
|
args[0] = '' if STRING_PROPERTIES.include?(property) && args.first == nil
|
247
247
|
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])
|
248
|
+
current_value = Glimmer::LibUI.integer_to_boolean(::LibUI.send("#{libui_api_keyword}_checked", @libui), allow_nil: false)
|
249
|
+
new_value = Glimmer::LibUI.integer_to_boolean(args[0], allow_nil: false)
|
250
250
|
::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args) if new_value != current_value
|
251
251
|
else
|
252
252
|
::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args)
|
@@ -23,9 +23,25 @@ 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 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
|
@@ -34,6 +50,15 @@ module Glimmer
|
|
34
50
|
model_attribute_observer.call # initial update
|
35
51
|
model_attribute_observer
|
36
52
|
end
|
53
|
+
|
54
|
+
# Sets up write data-binding (writing to model from view)
|
55
|
+
#
|
56
|
+
# Has no implementation by default. Classes are expected
|
57
|
+
# to implement this method by observing view property
|
58
|
+
# for changes and writing them to model accordingly via model binding
|
59
|
+
def data_bind_write(property, model_binding)
|
60
|
+
# No Op by default
|
61
|
+
end
|
37
62
|
end
|
38
63
|
end
|
39
64
|
end
|
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.10
|
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
|
@@ -250,9 +250,11 @@ files:
|
|
250
250
|
- examples/color_button2.rb
|
251
251
|
- examples/color_the_circles.rb
|
252
252
|
- examples/control_gallery.rb
|
253
|
+
- examples/cpu_percentage.rb
|
253
254
|
- examples/custom_draw_text.rb
|
254
255
|
- examples/custom_draw_text2.rb
|
255
256
|
- examples/date_time_picker.rb
|
257
|
+
- examples/date_time_picker2.rb
|
256
258
|
- examples/dynamic_area.rb
|
257
259
|
- examples/dynamic_area2.rb
|
258
260
|
- examples/dynamic_area3.rb
|
@@ -277,6 +279,8 @@ files:
|
|
277
279
|
- examples/method_based_custom_keyword.rb
|
278
280
|
- examples/method_based_custom_keyword2.rb
|
279
281
|
- examples/midi_player.rb
|
282
|
+
- examples/midi_player2.rb
|
283
|
+
- examples/midi_player3.rb
|
280
284
|
- examples/simple_notepad.rb
|
281
285
|
- examples/snake.rb
|
282
286
|
- examples/snake/model/apple.rb
|
@@ -285,6 +289,7 @@ files:
|
|
285
289
|
- examples/snake/model/vertebra.rb
|
286
290
|
- examples/snake/presenter/cell.rb
|
287
291
|
- examples/snake/presenter/grid.rb
|
292
|
+
- examples/snake2.rb
|
288
293
|
- examples/tetris.rb
|
289
294
|
- examples/tetris/model/block.rb
|
290
295
|
- examples/tetris/model/game.rb
|
@@ -293,6 +298,7 @@ files:
|
|
293
298
|
- examples/tic_tac_toe.rb
|
294
299
|
- examples/tic_tac_toe/board.rb
|
295
300
|
- examples/tic_tac_toe/cell.rb
|
301
|
+
- examples/tic_tac_toe2.rb
|
296
302
|
- examples/timer.rb
|
297
303
|
- examples/timer2.rb
|
298
304
|
- glimmer-dsl-libui.gemspec
|