glimmer-dsl-libui 0.4.6 → 0.4.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/README.md +601 -323
  4. data/VERSION +1 -1
  5. data/examples/button_counter.rb +2 -1
  6. data/examples/cpu_percentage.rb +36 -0
  7. data/examples/date_time_picker.rb +19 -14
  8. data/examples/date_time_picker2.rb +20 -0
  9. data/examples/meta_example.rb +17 -6
  10. data/examples/midi_player.rb +5 -6
  11. data/examples/midi_player2.rb +83 -0
  12. data/examples/midi_player3.rb +84 -0
  13. data/examples/snake.rb +19 -10
  14. data/examples/snake2.rb +97 -0
  15. data/examples/tetris.rb +15 -18
  16. data/examples/tic_tac_toe.rb +1 -0
  17. data/examples/tic_tac_toe2.rb +84 -0
  18. data/glimmer-dsl-libui.gemspec +0 -0
  19. data/lib/glimmer/libui/control_proxy/checkbox_proxy.rb +4 -0
  20. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +1 -2
  21. data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +17 -2
  22. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +4 -0
  23. data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +4 -0
  24. data/lib/glimmer/libui/control_proxy/entry_proxy.rb +1 -2
  25. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +5 -1
  26. data/lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb +4 -0
  27. data/lib/glimmer/libui/control_proxy/menu_item_proxy/radio_menu_item_proxy.rb +16 -4
  28. data/lib/glimmer/libui/control_proxy/multiline_entry_proxy.rb +1 -2
  29. data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +19 -0
  30. data/lib/glimmer/libui/control_proxy/slider_proxy.rb +1 -2
  31. data/lib/glimmer/libui/control_proxy/spinbox_proxy.rb +1 -2
  32. data/lib/glimmer/libui/control_proxy.rb +2 -2
  33. data/lib/glimmer/libui/data_bindable.rb +27 -2
  34. 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
- items[selected]
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
@@ -64,6 +64,10 @@ module Glimmer
64
64
  Fiddle.free @time unless @time.nil?
65
65
  super
66
66
  end
67
+
68
+ def data_bind_write(property, model_binding)
69
+ handle_listener('on_changed') { model_binding.call(time) } if property == 'time'
70
+ end
67
71
  end
68
72
  end
69
73
  end
@@ -39,6 +39,10 @@ module Glimmer
39
39
  end
40
40
  alias set_items items
41
41
  alias items= items
42
+
43
+ def data_bind_write(property, model_binding)
44
+ handle_listener('on_changed') { model_binding.call(text) } if property == 'text'
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -28,8 +28,7 @@ module Glimmer
28
28
  #
29
29
  # Follows the Proxy Design Pattern
30
30
  class EntryProxy < ControlProxy
31
- def data_bind(property, model_binding)
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 data_bind(property, model_binding)
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 !value.nil?
34
- if Glimmer::LibUI.integer_to_boolean(value) != checked?
35
- super
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 if !checked?
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 data_bind(property, model_binding)
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 data_bind(property, model_binding)
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 data_bind(property, model_binding)
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
- # Data-binds model to update view.
27
- # Subclasses can override to do inverse data-binding by observing view control for property changes and updating model binding accordingly
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.6
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-29 00:00:00.000000000 Z
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