glimmer-dsl-libui 0.2.0 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +47 -0
  3. data/README.md +975 -23
  4. data/VERSION +1 -1
  5. data/examples/area_gallery.rb +7 -1
  6. data/examples/area_gallery2.rb +14 -4
  7. data/examples/area_gallery3.rb +8 -2
  8. data/examples/area_gallery4.rb +15 -5
  9. data/examples/basic_draw_text.rb +65 -0
  10. data/examples/basic_draw_text2.rb +68 -0
  11. data/examples/color_the_circles.rb +220 -0
  12. data/examples/custom_draw_text.rb +84 -0
  13. data/examples/custom_draw_text2.rb +95 -0
  14. data/examples/midi_player.rb +2 -2
  15. data/examples/timer.rb +135 -0
  16. data/glimmer-dsl-libui.gemspec +0 -0
  17. data/lib/glimmer/dsl/libui/control_expression.rb +0 -1
  18. data/lib/glimmer/dsl/libui/property_expression.rb +3 -1
  19. data/lib/glimmer/dsl/libui/string_expression.rb +48 -0
  20. data/lib/glimmer/libui/attributed_string.rb +135 -0
  21. data/lib/glimmer/libui/control_proxy/area_proxy.rb +14 -3
  22. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +0 -1
  23. data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +18 -0
  24. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +3 -3
  25. data/lib/glimmer/libui/control_proxy/menu_item_proxy/radio_menu_item_proxy.rb +69 -0
  26. data/lib/glimmer/libui/control_proxy/menu_proxy.rb +3 -0
  27. data/lib/glimmer/libui/control_proxy/path_proxy.rb +0 -2
  28. data/lib/glimmer/libui/control_proxy/text_proxy.rb +172 -0
  29. data/lib/glimmer/libui/control_proxy/window_proxy.rb +0 -6
  30. data/lib/glimmer/libui/control_proxy.rb +7 -1
  31. data/lib/glimmer/libui/shape/arc.rb +6 -3
  32. data/lib/glimmer/libui/shape/circle.rb +50 -0
  33. data/lib/glimmer/libui/shape/rectangle.rb +4 -0
  34. data/lib/glimmer/libui/shape/square.rb +4 -0
  35. data/lib/glimmer/libui.rb +73 -6
  36. metadata +13 -2
@@ -0,0 +1,172 @@
1
+ # Copyright (c) 2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/libui/control_proxy'
23
+ require 'glimmer/libui/control_proxy/area_proxy'
24
+ require 'glimmer/libui/parent'
25
+ require 'glimmer/libui/control_proxy/transformable'
26
+
27
+ module Glimmer
28
+ module LibUI
29
+ class ControlProxy
30
+ # Proxy for LibUI text objects
31
+ #
32
+ # Follows the Proxy Design Pattern
33
+ class TextProxy < ControlProxy
34
+ include Parent
35
+ prepend Transformable
36
+
37
+ def initialize(keyword, parent, args, &block)
38
+ @keyword = keyword
39
+ @parent_proxy = parent
40
+ @args = args
41
+ @block = block
42
+ post_add_content if @block.nil?
43
+ end
44
+
45
+ def post_add_content
46
+ super
47
+ if @parent_proxy.nil? && AreaProxy.current_area_draw_params
48
+ draw(AreaProxy.current_area_draw_params)
49
+ destroy
50
+ end
51
+ end
52
+
53
+ def draw(area_draw_params)
54
+ reset_attributed_string
55
+ children.dup.each {|child| child.draw(area_draw_params)}
56
+ build_control
57
+ ::LibUI.draw_text(area_draw_params[:context], @libui, x, y)
58
+ ::LibUI.draw_free_text_layout(@libui)
59
+ end
60
+
61
+ def destroy
62
+ @parent_proxy&.children&.delete(self)
63
+ ControlProxy.control_proxies.delete(self)
64
+ end
65
+
66
+ def redraw
67
+ @parent_proxy&.queue_redraw_all
68
+ end
69
+
70
+ def x(value = nil)
71
+ if value.nil?
72
+ @x ||= args[0] || 0
73
+ else
74
+ @x = value
75
+ end
76
+ end
77
+ alias x= x
78
+ alias set_x x
79
+
80
+ def y(value = nil)
81
+ if value.nil?
82
+ @y ||= args[1] || 0
83
+ else
84
+ @y = value
85
+ end
86
+ end
87
+ alias y= y
88
+ alias set_y y
89
+
90
+ def width(value = nil)
91
+ if value.nil?
92
+ @width ||= args[2] || (AreaProxy.current_area_draw_params && AreaProxy.current_area_draw_params[:area_width])
93
+ else
94
+ @width = value
95
+ redraw
96
+ end
97
+ end
98
+ alias width= width
99
+ alias set_width width
100
+
101
+ def attributed_string
102
+ @attributed_string ||= reset_attributed_string
103
+ end
104
+
105
+ def reset_attributed_string
106
+ @attributed_string = ::LibUI.new_attributed_string('')
107
+ end
108
+
109
+ def default_font(value = nil)
110
+ if value.nil?
111
+ @default_font ||= {
112
+ family: 'Helvetica',
113
+ size: 12.0,
114
+ weight: :normal,
115
+ italic: :normal,
116
+ stretch: :normal,
117
+ }
118
+ else
119
+ @default_font = value
120
+ redraw
121
+ end
122
+ end
123
+ alias default_font= default_font
124
+ alias set_default_font default_font
125
+
126
+ def default_font_descriptor
127
+ @default_font_descriptor ||= ::LibUI::FFI::FontDescriptor.malloc
128
+ @default_font_descriptor.Family = default_font[:family] || 'Helvetica'
129
+ @default_font_descriptor.Size = default_font[:size] || 12.0
130
+ @default_font_descriptor.Weight = Glimmer::LibUI.enum_symbol_to_value(:text_weight, default_font[:weight], default_symbol: :normal)
131
+ @default_font_descriptor.Italic = Glimmer::LibUI.enum_symbol_to_value(:text_italic, default_font[:italic], default_symbol: :normal)
132
+ @default_font_descriptor.Stretch = Glimmer::LibUI.enum_symbol_to_value(:text_stretch, default_font[:stretch], default_symbol: :normal)
133
+ @default_font_descriptor
134
+ end
135
+
136
+ def align(value = nil)
137
+ if value.nil?
138
+ @align
139
+ else
140
+ @align = value
141
+ redraw
142
+ end
143
+ end
144
+ alias align= align
145
+ alias set_align align
146
+
147
+ def draw_text_layout_params
148
+ @draw_text_layout_params ||= ::LibUI::FFI::DrawTextLayoutParams.malloc
149
+ @draw_text_layout_params.String = attributed_string
150
+ @draw_text_layout_params.DefaultFont = default_font_descriptor
151
+ @draw_text_layout_params.Width = width
152
+ @draw_text_layout_params.Align = Glimmer::LibUI.enum_symbol_to_value(:draw_text_align, align, default_symbol: :left)
153
+ @draw_text_layout_params
154
+ end
155
+
156
+ private
157
+
158
+ def build_control
159
+ @libui = ::LibUI.draw_new_text_layout(draw_text_layout_params)
160
+ end
161
+
162
+ def init_draw_brush(draw_brush, draw_brush_args)
163
+ draw_brush.Type = Glimmer::LibUI.enum_symbol_to_value(:draw_brush_type, draw_brush_args[:type])
164
+ draw_brush.R = (draw_brush_args[:r] || draw_brush_args[:red]).to_f / 255.0
165
+ draw_brush.G = (draw_brush_args[:g] || draw_brush_args[:green]).to_f / 255.0
166
+ draw_brush.B = (draw_brush_args[:b] || draw_brush_args[:blue]).to_f / 255.0
167
+ draw_brush.A = (draw_brush_args[:a] || draw_brush_args[:alpha])
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
@@ -35,12 +35,6 @@ module Glimmer
35
35
  DEFAULT_HAS_MENUBAR = 1
36
36
 
37
37
  def post_initialize_child(child)
38
- if child.is_a?(AreaProxy)
39
- vertical_box_parent = ControlProxy.create('vertical_box', self, [])
40
- child.instance_variable_set(:@parent_proxy, vertical_box_parent)
41
- vertical_box_parent.post_initialize_child(child)
42
- child = vertical_box_parent
43
- end
44
38
  ::LibUI.window_set_child(@libui, child.libui)
45
39
  end
46
40
 
@@ -223,7 +223,13 @@ module Glimmer
223
223
  elsif ::LibUI.respond_to?("#{libui_api_keyword}_set_#{method_name.to_s.sub(/=$/, '')}") && !args.empty?
224
224
  property = method_name.to_s.sub(/=$/, '')
225
225
  args[0] = Glimmer::LibUI.boolean_to_integer(args.first) if BOOLEAN_PROPERTIES.include?(property) && (args.first.is_a?(TrueClass) || args.first.is_a?(FalseClass))
226
- ::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args)
226
+ if property.to_s == 'checked'
227
+ current_value = Glimmer::LibUI.integer_to_boolean(::LibUI.send("#{libui_api_keyword}_checked", @libui))
228
+ new_value = Glimmer::LibUI.integer_to_boolean(args[0])
229
+ ::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args) if new_value != current_value
230
+ else
231
+ ::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args)
232
+ end
227
233
  elsif ::LibUI.respond_to?("#{libui_api_keyword}_#{method_name}") && !args.empty?
228
234
  ::LibUI.send("#{libui_api_keyword}_#{method_name}", @libui, *args)
229
235
  elsif ::LibUI.respond_to?("control_#{method_name.to_s.sub(/\?$/, '')}") && args.empty?
@@ -29,11 +29,14 @@ module Glimmer
29
29
  parameter_defaults 0, 0, 0, 0, 360, false
30
30
 
31
31
  def draw(area_draw_params)
32
- @args[5] ||= Glimmer::LibUI.boolean_to_integer(@args[5], allow_nil: false)
32
+ arc_args = @args.dup
33
+ arc_args[3] = Glimmer::LibUI.degrees_to_radians(arc_args[3])
34
+ arc_args[4] = Glimmer::LibUI.degrees_to_radians(arc_args[4])
35
+ arc_args[5] = Glimmer::LibUI.boolean_to_integer(arc_args[5], allow_nil: false)
33
36
  if parent.is_a?(Figure) && parent.x.nil? && parent.y.nil?
34
- ::LibUI.draw_path_new_figure_with_arc(path_proxy.libui, *@args)
37
+ ::LibUI.draw_path_new_figure_with_arc(path_proxy.libui, *arc_args)
35
38
  else
36
- ::LibUI.draw_path_arc_to(path_proxy.libui, *@args)
39
+ ::LibUI.draw_path_arc_to(path_proxy.libui, *arc_args)
37
40
  end
38
41
  super
39
42
  end
@@ -0,0 +1,50 @@
1
+ # Copyright (c) 2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/libui/shape'
23
+
24
+ module Glimmer
25
+ module LibUI
26
+ class Shape
27
+ class Circle < Shape
28
+ parameters :x_center, :y_center, :radius
29
+ parameter_defaults 0, 0, 0
30
+
31
+ def draw(area_draw_params)
32
+ arc_args = @args.dup
33
+ arc_args[3] = 0
34
+ arc_args[4] = Math::PI * 2.0
35
+ arc_args[5] = 0
36
+ if parent.is_a?(Figure) && parent.x.nil? && parent.y.nil?
37
+ ::LibUI.draw_path_new_figure_with_arc(path_proxy.libui, *arc_args)
38
+ else
39
+ ::LibUI.draw_path_arc_to(path_proxy.libui, *arc_args)
40
+ end
41
+ super
42
+ end
43
+
44
+ def include?(x, y)
45
+ (x - x_center)**2 + (y - y_center)**2 < radius**2
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -32,6 +32,10 @@ module Glimmer
32
32
  ::LibUI.draw_path_add_rectangle(path_proxy.libui, *@args)
33
33
  super
34
34
  end
35
+
36
+ def include?(x, y)
37
+ x.between?(self.x, self.x + width) && y.between?(self.y, self.y + height)
38
+ end
35
39
  end
36
40
  end
37
41
  end
@@ -32,6 +32,10 @@ module Glimmer
32
32
  ::LibUI.draw_path_add_rectangle(path_proxy.libui, *@args, length)
33
33
  super
34
34
  end
35
+
36
+ def include?(x, y)
37
+ x.between?(self.x, self.x + length) && y.between?(self.y, self.y + length)
38
+ end
35
39
  end
36
40
  end
37
41
  end
data/lib/glimmer/libui.rb CHANGED
@@ -19,15 +19,23 @@
19
19
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
+ require 'glimmer/fiddle_consumer'
23
+
22
24
  module Glimmer
23
25
  module LibUI
24
26
  class << self
27
+ include Glimmer::FiddleConsumer
28
+
25
29
  def integer_to_boolean(int, allow_nil: true)
26
- int.nil? ? (allow_nil ? nil : false) : int == 1
30
+ int.nil? ? (allow_nil ? nil : false) : ((int.is_a?(TrueClass) || int.is_a?(FalseClass)) ? int : int == 1)
27
31
  end
28
32
 
29
33
  def boolean_to_integer(bool, allow_nil: true)
30
- bool.nil? ? (allow_nil ? nil : 0) : (bool ? 1 : 0)
34
+ bool.nil? ? (allow_nil ? nil : 0) : (bool.is_a?(Integer) ? bool : (bool == true ? 1 : 0))
35
+ end
36
+
37
+ def degrees_to_radians(degrees)
38
+ ((Math::PI * 2.0) / 360.00) * degrees.to_f
31
39
  end
32
40
 
33
41
  def interpret_color(value)
@@ -88,22 +96,81 @@ module Glimmer
88
96
  value
89
97
  end
90
98
 
91
- # Returns ruby underscored symbols for enum values starting with enum name (camelcase, e.g. 'ext_key')
92
99
  def enum_symbols(enum_name)
100
+ enum_symbol_values(enum_name).keys
101
+ end
102
+
103
+ # Returns ruby underscored symbols for enum values starting with enum name (camelcase, e.g. 'ext_key')
104
+ def enum_symbol_values(enum_name)
93
105
  enum_name = enum_name.to_s.underscore.to_sym
94
106
  @enum_symbols ||= {}
95
- @enum_symbols[enum_name] ||= ::LibUI.constants.select { |c| c.to_s.start_with?(enum_name.to_s.camelcase(:upper)) }.map { |c| c.to_s.underscore.sub("#{enum_name}_", '').to_sym }
107
+ @enum_symbols[enum_name] ||= ::LibUI.constants.select { |c| c.to_s.start_with?(enum_name.to_s.camelcase(:upper)) }.map { |c| [c.to_s.underscore.sub("#{enum_name}_", '').to_sym, ::LibUI.const_get(c)] }.to_h
108
+ end
109
+
110
+ def enum_value_to_symbol(enum_name, enum_value)
111
+ enum_symbol_values(enum_name).invert[enum_value]
96
112
  end
97
113
 
98
- def enum_symbol_to_value(enum_name, enum_symbol, default_index: 0)
114
+ def enum_symbol_to_value(enum_name, enum_symbol, default_symbol: nil, default_index: 0)
99
115
  if enum_symbol.is_a?(Integer)
100
116
  enum_symbol
101
117
  elsif enum_symbols(enum_name).include?(enum_symbol.to_s.to_sym)
102
- ::LibUI.const_get("#{enum_name}_#{enum_symbol}".camelcase(:upper))
118
+ enum_symbol_values(enum_name)[enum_symbol.to_s.to_sym]
119
+ elsif default_symbol
120
+ enum_symbol_to_value(enum_name, default_symbol)
103
121
  else
104
122
  enum_symbol_to_value(enum_name, enum_symbols(enum_name)[default_index])
105
123
  end
106
124
  end
125
+
126
+ def x11_colors
127
+ Color::RGB.constants.reject {|c| c.to_s.upcase == c.to_s}.map(&:to_s).map(&:underscore).map(&:to_sym)
128
+ end
129
+
130
+ # Queues block to execute at the nearest opportunity possible on the main GUI event loop
131
+ def queue_main(&block)
132
+ closure = fiddle_closure_block_caller(4, [0]) do
133
+ result = boolean_to_integer(block.call)
134
+ result = 1 if result.nil?
135
+ result
136
+ end
137
+ ::LibUI.queue_main(closure)
138
+ closure
139
+ end
140
+
141
+ # Calls block on the main GUI event loop after time_in_seconds delay, repeating indefinitely by default
142
+ # If `repeat:` keyword arg is passed with an Integer value, it repeats for that number of times
143
+ # If `repeat:` keyword arg is passed with false or 0, then the block is only called once
144
+ # If block returns false at any point, the timer is stopped from further repetitions regardless of `repeat:` keyword arg value
145
+ # If block returns true at any point, the timer continues for another repetition regardless of `repeat:` keyword arg value
146
+ def timer(time_in_seconds = 0.1, repeat: true, &block)
147
+ closure = fiddle_closure_block_caller(4, [0]) do
148
+ result = boolean_to_integer(block.call)
149
+ repeat -= 1 if repeat.is_a?(Integer)
150
+ if result.nil?
151
+ if (repeat == true || (repeat.is_a?(Integer) && repeat > 0))
152
+ result = 1
153
+ else
154
+ result = 0
155
+ end
156
+ end
157
+ result
158
+ end
159
+ ::LibUI.timer(time_in_seconds * 1000.0, closure)
160
+ closure
161
+ end
162
+
163
+ def respond_to?(method_name, *args)
164
+ super || ::LibUI.respond_to?(method_name, *args)
165
+ end
166
+
167
+ def method_missing(method_name, *args, &block)
168
+ if ::LibUI.respond_to?(method_name, true)
169
+ ::LibUI.send(method_name, *args, &block)
170
+ else
171
+ super
172
+ end
173
+ end
107
174
  end
108
175
  end
109
176
  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.2.0
4
+ version: 0.2.4
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-10-04 00:00:00.000000000 Z
11
+ date: 2021-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -215,6 +215,8 @@ files:
215
215
  - examples/basic_area.rb
216
216
  - examples/basic_area2.rb
217
217
  - examples/basic_button.rb
218
+ - examples/basic_draw_text.rb
219
+ - examples/basic_draw_text2.rb
218
220
  - examples/basic_entry.rb
219
221
  - examples/basic_table.rb
220
222
  - examples/basic_table_button.rb
@@ -227,7 +229,10 @@ files:
227
229
  - examples/basic_window.rb
228
230
  - examples/basic_window2.rb
229
231
  - examples/color_button.rb
232
+ - examples/color_the_circles.rb
230
233
  - examples/control_gallery.rb
234
+ - examples/custom_draw_text.rb
235
+ - examples/custom_draw_text2.rb
231
236
  - examples/date_time_picker.rb
232
237
  - examples/dynamic_area.rb
233
238
  - examples/dynamic_area2.rb
@@ -242,6 +247,7 @@ files:
242
247
  - examples/meta_example.rb
243
248
  - examples/midi_player.rb
244
249
  - examples/simple_notepad.rb
250
+ - examples/timer.rb
245
251
  - glimmer-dsl-libui.gemspec
246
252
  - lib/glimmer-dsl-libui.rb
247
253
  - lib/glimmer/dsl/libui/control_expression.rb
@@ -252,9 +258,11 @@ files:
252
258
  - lib/glimmer/dsl/libui/property_expression.rb
253
259
  - lib/glimmer/dsl/libui/save_file_expression.rb
254
260
  - lib/glimmer/dsl/libui/shape_expression.rb
261
+ - lib/glimmer/dsl/libui/string_expression.rb
255
262
  - lib/glimmer/dsl/libui/tab_item_expression.rb
256
263
  - lib/glimmer/fiddle_consumer.rb
257
264
  - lib/glimmer/libui.rb
265
+ - lib/glimmer/libui/attributed_string.rb
258
266
  - lib/glimmer/libui/control_proxy.rb
259
267
  - lib/glimmer/libui/control_proxy/area_proxy.rb
260
268
  - lib/glimmer/libui/control_proxy/area_proxy/scrolling_area_proxy.rb
@@ -296,6 +304,7 @@ files:
296
304
  - lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb
297
305
  - lib/glimmer/libui/control_proxy/menu_item_proxy/preferences_menu_item_proxy.rb
298
306
  - lib/glimmer/libui/control_proxy/menu_item_proxy/quit_menu_item_proxy.rb
307
+ - lib/glimmer/libui/control_proxy/menu_item_proxy/radio_menu_item_proxy.rb
299
308
  - lib/glimmer/libui/control_proxy/menu_item_proxy/separator_menu_item_proxy.rb
300
309
  - lib/glimmer/libui/control_proxy/menu_proxy.rb
301
310
  - lib/glimmer/libui/control_proxy/message_box.rb
@@ -307,12 +316,14 @@ files:
307
316
  - lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb
308
317
  - lib/glimmer/libui/control_proxy/tab_item_proxy.rb
309
318
  - lib/glimmer/libui/control_proxy/table_proxy.rb
319
+ - lib/glimmer/libui/control_proxy/text_proxy.rb
310
320
  - lib/glimmer/libui/control_proxy/transformable.rb
311
321
  - lib/glimmer/libui/control_proxy/window_proxy.rb
312
322
  - lib/glimmer/libui/parent.rb
313
323
  - lib/glimmer/libui/shape.rb
314
324
  - lib/glimmer/libui/shape/arc.rb
315
325
  - lib/glimmer/libui/shape/bezier.rb
326
+ - lib/glimmer/libui/shape/circle.rb
316
327
  - lib/glimmer/libui/shape/figure.rb
317
328
  - lib/glimmer/libui/shape/line.rb
318
329
  - lib/glimmer/libui/shape/rectangle.rb