glimmer-dsl-libui 0.4.7 → 0.4.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/README.md +1043 -493
  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 +1 -1
  8. data/examples/button_counter.rb +2 -1
  9. data/examples/cpu_percentage.rb +36 -0
  10. data/examples/editable_table.rb +1 -1
  11. data/examples/form_table.rb +21 -17
  12. data/examples/form_table2.rb +104 -85
  13. data/examples/form_table3.rb +113 -0
  14. data/examples/form_table4.rb +110 -0
  15. data/examples/form_table5.rb +94 -0
  16. data/examples/meta_example.rb +21 -8
  17. data/examples/midi_player.rb +1 -1
  18. data/examples/snake.rb +19 -10
  19. data/examples/snake2.rb +97 -0
  20. data/examples/tetris.rb +15 -18
  21. data/examples/tic_tac_toe.rb +1 -0
  22. data/examples/tic_tac_toe2.rb +84 -0
  23. data/glimmer-dsl-libui.gemspec +0 -0
  24. data/lib/glimmer/dsl/libui/control_expression.rb +2 -1
  25. data/lib/glimmer/dsl/libui/shape_expression.rb +2 -2
  26. data/lib/glimmer/dsl/libui/string_expression.rb +2 -1
  27. data/lib/glimmer/libui/attributed_string.rb +3 -2
  28. data/lib/glimmer/libui/control_proxy/checkbox_proxy.rb +4 -0
  29. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +1 -2
  30. data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +1 -2
  31. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +1 -2
  32. data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +4 -5
  33. data/lib/glimmer/libui/control_proxy/entry_proxy.rb +1 -2
  34. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +5 -1
  35. data/lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb +4 -0
  36. data/lib/glimmer/libui/control_proxy/menu_item_proxy/radio_menu_item_proxy.rb +16 -4
  37. data/lib/glimmer/libui/control_proxy/multiline_entry_proxy.rb +1 -2
  38. data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +19 -0
  39. data/lib/glimmer/libui/control_proxy/slider_proxy.rb +1 -2
  40. data/lib/glimmer/libui/control_proxy/spinbox_proxy.rb +1 -2
  41. data/lib/glimmer/libui/control_proxy/table_proxy.rb +88 -24
  42. data/lib/glimmer/libui/control_proxy.rb +6 -4
  43. data/lib/glimmer/libui/data_bindable.rb +34 -4
  44. data/lib/glimmer/libui/shape.rb +3 -2
  45. data/lib/glimmer-dsl-libui.rb +1 -0
  46. 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 data_bind(property, model_binding)
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) }
@@ -65,8 +65,7 @@ module Glimmer
65
65
  super
66
66
  end
67
67
 
68
- def data_bind(property, model_binding)
69
- super
68
+ def data_bind_write(property, model_binding)
70
69
  handle_listener('on_changed') { model_binding.call(time) } if property == 'time'
71
70
  end
72
71
  end
@@ -39,11 +39,10 @@ module Glimmer
39
39
  end
40
40
  alias set_items items
41
41
  alias items= items
42
- end
43
-
44
- def data_bind(property, model_binding)
45
- super
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 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
@@ -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 = rows
86
- @cell_rows.tap do
87
- @last_cell_rows = array_deep_clone(@cell_rows)
88
- Glimmer::DataBinding::Observer.proc do |new_cell_rows|
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.observe(self, :cell_rows, recursive: true)
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][column] = ::LibUI.table_value_string(val).to_s
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][column] ||= []
201
- @cell_rows[row][column][0] = ::LibUI.table_value_string(val).to_s
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][column] ||= []
206
- @cell_rows[row][column][1] = ::LibUI.table_value_string(val).to_s
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][column] = ::LibUI.table_value_int(val).to_i == 1
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][column] ||= []
217
- @cell_rows[row][column][0] = ::LibUI.table_value_int(val).to_i == 1
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
- # 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
 
@@ -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.7
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-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
@@ -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