glimmer-dsl-libui 0.4.8 → 0.4.12

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -0
  3. data/README.md +1361 -461
  4. data/VERSION +1 -1
  5. data/examples/basic_table_button.rb +54 -30
  6. data/examples/basic_table_button2.rb +34 -0
  7. data/examples/basic_table_color.rb +104 -26
  8. data/examples/basic_table_color2.rb +2 -14
  9. data/examples/basic_table_color3.rb +37 -0
  10. data/examples/basic_table_image.rb +1 -1
  11. data/examples/basic_table_image2.rb +2 -14
  12. data/examples/basic_table_image3.rb +44 -0
  13. data/examples/basic_table_image_text.rb +1 -2
  14. data/examples/basic_table_image_text2.rb +2 -13
  15. data/examples/basic_table_image_text3.rb +44 -0
  16. data/examples/cpu_percentage.rb +36 -0
  17. data/examples/editable_table.rb +1 -1
  18. data/examples/form_table.rb +21 -17
  19. data/examples/form_table2.rb +104 -85
  20. data/examples/form_table3.rb +113 -0
  21. data/examples/form_table4.rb +110 -0
  22. data/examples/form_table5.rb +94 -0
  23. data/examples/meta_example.rb +6 -4
  24. data/examples/snake.rb +19 -10
  25. data/examples/snake2.rb +97 -0
  26. data/examples/tic_tac_toe.rb +1 -0
  27. data/examples/tic_tac_toe2.rb +84 -0
  28. data/glimmer-dsl-libui.gemspec +0 -0
  29. data/lib/glimmer/dsl/libui/control_expression.rb +2 -1
  30. data/lib/glimmer/dsl/libui/shape_expression.rb +2 -2
  31. data/lib/glimmer/dsl/libui/string_expression.rb +2 -1
  32. data/lib/glimmer/libui/attributed_string.rb +3 -2
  33. data/lib/glimmer/libui/control_proxy/checkbox_proxy.rb +1 -2
  34. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +1 -2
  35. data/lib/glimmer/libui/control_proxy/column/background_color_column_proxy.rb +4 -0
  36. data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +1 -2
  37. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +1 -2
  38. data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +1 -2
  39. data/lib/glimmer/libui/control_proxy/entry_proxy.rb +1 -2
  40. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +5 -1
  41. data/lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb +1 -2
  42. data/lib/glimmer/libui/control_proxy/menu_item_proxy/radio_menu_item_proxy.rb +1 -2
  43. data/lib/glimmer/libui/control_proxy/multiline_entry_proxy.rb +1 -2
  44. data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +1 -2
  45. data/lib/glimmer/libui/control_proxy/slider_proxy.rb +1 -2
  46. data/lib/glimmer/libui/control_proxy/spinbox_proxy.rb +1 -2
  47. data/lib/glimmer/libui/control_proxy/table_proxy.rb +95 -29
  48. data/lib/glimmer/libui/control_proxy.rb +4 -2
  49. data/lib/glimmer/libui/data_bindable.rb +34 -4
  50. data/lib/glimmer/libui/shape.rb +3 -2
  51. data/lib/glimmer/libui.rb +2 -2
  52. data/lib/glimmer-dsl-libui.rb +1 -0
  53. metadata +12 -2
@@ -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
- # 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 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
- model_attribute_observer
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
@@ -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/libui.rb CHANGED
@@ -63,7 +63,7 @@ module Glimmer
63
63
  value[:b] = value.delete(:blue) if value[:blue]
64
64
  value[:a] = value.delete(:alpha) if value[:alpha]
65
65
  value
66
- elsif value.is_a?(String) && !value.start_with?('0x') && !value.downcase.match(/^((([1-9a-f]){6})|(([1-9a-f]){3}))$/)
66
+ elsif value.is_a?(String) && !value.start_with?('0x') && !value.start_with?('#') && !value.downcase.match(/^((([1-9a-f]){6})|(([1-9a-f]){3}))$/)
67
67
  color = Color::RGB.extract_colors(value).first
68
68
  color.nil? ? {} : {
69
69
  r: color.red,
@@ -79,11 +79,11 @@ module Glimmer
79
79
 
80
80
  def hex_to_rgb(value)
81
81
  if value.is_a?(String)
82
+ value = "0x#{value[1..-1]}" if value.start_with?('#')
82
83
  if !value.start_with?('0x')
83
84
  value = value.chars.map {|char| [char, char]}.flatten.join if value.length == 3
84
85
  value = "0x#{value}"
85
86
  end
86
- value = "0x#{value[1..-1]}" if value.start_with?('#')
87
87
  value = value.to_i(16)
88
88
  end
89
89
  if value.is_a?(Integer)
@@ -30,6 +30,7 @@ require 'color'
30
30
  require 'os'
31
31
  require 'array_include_methods'
32
32
  require 'facets/hash/stringify_keys'
33
+ require 'facets/string/underscore'
33
34
  require 'libui'
34
35
 
35
36
  # Internal requires
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.8
4
+ version: 0.4.12
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-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -232,14 +232,18 @@ 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
238
239
  - examples/basic_table_color2.rb
240
+ - examples/basic_table_color3.rb
239
241
  - examples/basic_table_image.rb
240
242
  - examples/basic_table_image2.rb
243
+ - examples/basic_table_image3.rb
241
244
  - examples/basic_table_image_text.rb
242
245
  - examples/basic_table_image_text2.rb
246
+ - examples/basic_table_image_text3.rb
243
247
  - examples/basic_table_progress_bar.rb
244
248
  - examples/basic_transform.rb
245
249
  - examples/basic_transform2.rb
@@ -250,6 +254,7 @@ files:
250
254
  - examples/color_button2.rb
251
255
  - examples/color_the_circles.rb
252
256
  - examples/control_gallery.rb
257
+ - examples/cpu_percentage.rb
253
258
  - examples/custom_draw_text.rb
254
259
  - examples/custom_draw_text2.rb
255
260
  - examples/date_time_picker.rb
@@ -266,6 +271,9 @@ files:
266
271
  - examples/form2.rb
267
272
  - examples/form_table.rb
268
273
  - examples/form_table2.rb
274
+ - examples/form_table3.rb
275
+ - examples/form_table4.rb
276
+ - examples/form_table5.rb
269
277
  - examples/grid.rb
270
278
  - examples/histogram.rb
271
279
  - examples/histogram2.rb
@@ -288,6 +296,7 @@ files:
288
296
  - examples/snake/model/vertebra.rb
289
297
  - examples/snake/presenter/cell.rb
290
298
  - examples/snake/presenter/grid.rb
299
+ - examples/snake2.rb
291
300
  - examples/tetris.rb
292
301
  - examples/tetris/model/block.rb
293
302
  - examples/tetris/model/game.rb
@@ -296,6 +305,7 @@ files:
296
305
  - examples/tic_tac_toe.rb
297
306
  - examples/tic_tac_toe/board.rb
298
307
  - examples/tic_tac_toe/cell.rb
308
+ - examples/tic_tac_toe2.rb
299
309
  - examples/timer.rb
300
310
  - examples/timer2.rb
301
311
  - glimmer-dsl-libui.gemspec