glimmer-dsl-libui 0.2.1 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -60,7 +60,18 @@ module Glimmer
60
60
  end
61
61
 
62
62
  def post_add_content
63
- super
63
+ unless parent_proxy.is_a?(Box)
64
+ original_parent_proxy = @parent_proxy
65
+ @vertical_box_parent_proxy = ControlProxy.create('vertical_box', parent_proxy, []) {} # block prevents calling post add content
66
+ append_properties.each do |property|
67
+ @vertical_box_parent_proxy.append_property(property, append_property(property))
68
+ end
69
+ @vertical_box_parent_proxy.post_add_content
70
+ @parent_proxy = @vertical_box_parent_proxy
71
+ @vertical_box_parent_proxy.post_initialize_child(self)
72
+ else
73
+ super
74
+ end
64
75
  install_listeners
65
76
  end
66
77
 
@@ -72,7 +83,7 @@ module Glimmer
72
83
  def redraw
73
84
  queue_redraw_all
74
85
  end
75
-
86
+
76
87
  private
77
88
 
78
89
  def build_control
@@ -169,7 +180,7 @@ module Glimmer
169
180
  end
170
181
 
171
182
  def ext_key_to_symbol(ext_key_value)
172
- Glimmer::LibUI.enum_symbols(:ext_key)[ext_key_value - 1].to_s.to_sym if ext_key_value > 0
183
+ Glimmer::LibUI.enum_value_to_symbol(:ext_key, ext_key_value)
173
184
  end
174
185
 
175
186
  def modifiers_to_symbols(modifiers_value)
@@ -29,7 +29,6 @@ module Glimmer
29
29
  # Follows the Proxy Design Pattern
30
30
  class ColorButtonProxy < ControlProxy
31
31
  def color(value = nil)
32
- # TODO support hex color value
33
32
  if value.nil?
34
33
  @red ||= Fiddle::Pointer.malloc(8) # double
35
34
  @green ||= Fiddle::Pointer.malloc(8) # double
@@ -52,6 +51,8 @@ module Glimmer
52
51
  ::LibUI.color_button_set_color(@libui, value[:r].to_f / 255.0, value[:g].to_f / 255.0, value[:b].to_f / 255.0, value[:a])
53
52
  end
54
53
  end
54
+ alias color= color
55
+ alias set_color color
55
56
 
56
57
  def red(value = nil)
57
58
  if value.nil?
@@ -28,6 +28,20 @@ module Glimmer
28
28
  #
29
29
  # Follows the Proxy Design Pattern
30
30
  class ComboboxProxy < ControlProxy
31
+ def selected(value = nil)
32
+ if value.nil?
33
+ super()
34
+ else
35
+ if value.is_a?(String)
36
+ super(items.index(value).to_i)
37
+ else
38
+ super
39
+ end
40
+ end
41
+ end
42
+ alias selected= selected
43
+ alias set_selected selected
44
+
31
45
  def items(*values)
32
46
  values = values.first if values.first.is_a?(Array)
33
47
  if values.empty?
@@ -39,6 +53,10 @@ module Glimmer
39
53
  end
40
54
  alias set_items items
41
55
  alias items= items
56
+
57
+ def selected_item
58
+ items[selected]
59
+ end
42
60
  end
43
61
  end
44
62
  end
@@ -34,9 +34,9 @@ module Glimmer
34
34
  {
35
35
  family: @font_descriptor.Family.to_s,
36
36
  size: @font_descriptor.Size,
37
- weight: @font_descriptor.Weight,
38
- italic: @font_descriptor.Italic,
39
- stretch: @font_descriptor.Stretch
37
+ weight: Glimmer::LibUI.enum_value_to_symbol(:text_weight, @font_descriptor.Weight),
38
+ italic: Glimmer::LibUI.enum_value_to_symbol(:text_italic, @font_descriptor.Italic),
39
+ stretch: Glimmer::LibUI.enum_value_to_symbol(:text_stretch, @font_descriptor.Stretch),
40
40
  }
41
41
  end
42
42
 
@@ -34,13 +34,11 @@ module Glimmer
34
34
  include Parent
35
35
  prepend Transformable
36
36
 
37
- # TODO support mode without parent proxy
38
37
  def initialize(keyword, parent, args, &block)
39
38
  @keyword = keyword
40
39
  @parent_proxy = parent
41
40
  @args = args
42
41
  @block = block
43
- @enabled = true
44
42
  post_add_content if @block.nil?
45
43
  end
46
44
 
@@ -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
 
data/lib/glimmer/libui.rb CHANGED
@@ -96,18 +96,28 @@ module Glimmer
96
96
  value
97
97
  end
98
98
 
99
- # Returns ruby underscored symbols for enum values starting with enum name (camelcase, e.g. 'ext_key')
100
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)
101
105
  enum_name = enum_name.to_s.underscore.to_sym
102
106
  @enum_symbols ||= {}
103
- @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]
104
112
  end
105
113
 
106
- 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)
107
115
  if enum_symbol.is_a?(Integer)
108
116
  enum_symbol
109
117
  elsif enum_symbols(enum_name).include?(enum_symbol.to_s.to_sym)
110
- ::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)
111
121
  else
112
122
  enum_symbol_to_value(enum_name, enum_symbols(enum_name)[default_index])
113
123
  end
@@ -130,7 +140,7 @@ module Glimmer
130
140
 
131
141
  # Calls block on the main GUI event loop after time_in_seconds delay, repeating indefinitely by default
132
142
  # If `repeat:` keyword arg is passed with an Integer value, it repeats for that number of times
133
- # If `repeat:` keyword arg is passed with false or 0, then the block is only called onces
143
+ # If `repeat:` keyword arg is passed with false or 0, then the block is only called once
134
144
  # If block returns false at any point, the timer is stopped from further repetitions regardless of `repeat:` keyword arg value
135
145
  # If block returns true at any point, the timer continues for another repetition regardless of `repeat:` keyword arg value
136
146
  def timer(time_in_seconds = 0.1, repeat: true, &block)
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.1
4
+ version: 0.2.5
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-05 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
@@ -229,6 +231,8 @@ files:
229
231
  - examples/color_button.rb
230
232
  - examples/color_the_circles.rb
231
233
  - examples/control_gallery.rb
234
+ - examples/custom_draw_text.rb
235
+ - examples/custom_draw_text2.rb
232
236
  - examples/date_time_picker.rb
233
237
  - examples/dynamic_area.rb
234
238
  - examples/dynamic_area2.rb
@@ -254,9 +258,11 @@ files:
254
258
  - lib/glimmer/dsl/libui/property_expression.rb
255
259
  - lib/glimmer/dsl/libui/save_file_expression.rb
256
260
  - lib/glimmer/dsl/libui/shape_expression.rb
261
+ - lib/glimmer/dsl/libui/string_expression.rb
257
262
  - lib/glimmer/dsl/libui/tab_item_expression.rb
258
263
  - lib/glimmer/fiddle_consumer.rb
259
264
  - lib/glimmer/libui.rb
265
+ - lib/glimmer/libui/attributed_string.rb
260
266
  - lib/glimmer/libui/control_proxy.rb
261
267
  - lib/glimmer/libui/control_proxy/area_proxy.rb
262
268
  - lib/glimmer/libui/control_proxy/area_proxy/scrolling_area_proxy.rb
@@ -310,6 +316,7 @@ files:
310
316
  - lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb
311
317
  - lib/glimmer/libui/control_proxy/tab_item_proxy.rb
312
318
  - lib/glimmer/libui/control_proxy/table_proxy.rb
319
+ - lib/glimmer/libui/control_proxy/text_proxy.rb
313
320
  - lib/glimmer/libui/control_proxy/transformable.rb
314
321
  - lib/glimmer/libui/control_proxy/window_proxy.rb
315
322
  - lib/glimmer/libui/parent.rb