glimmer-dsl-libui 0.1.2 → 0.1.6

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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +55 -0
  3. data/README.md +1127 -65
  4. data/VERSION +1 -1
  5. data/examples/area_gallery.rb +50 -0
  6. data/examples/area_gallery2.rb +111 -0
  7. data/examples/area_gallery3.rb +52 -0
  8. data/examples/area_gallery4.rb +113 -0
  9. data/examples/basic_area2.rb +1 -1
  10. data/examples/basic_button.rb +2 -2
  11. data/examples/basic_entry.rb +2 -2
  12. data/examples/basic_table_progress_bar.rb +13 -3
  13. data/examples/basic_transform.rb +27 -0
  14. data/examples/control_gallery.rb +3 -3
  15. data/examples/dynamic_area.rb +1 -1
  16. data/examples/form.rb +2 -2
  17. data/examples/histogram.rb +118 -0
  18. data/examples/meta_example.rb +71 -20
  19. data/examples/midi_player.rb +8 -10
  20. data/glimmer-dsl-libui.gemspec +0 -0
  21. data/lib/glimmer/dsl/libui/control_expression.rb +1 -3
  22. data/lib/glimmer/dsl/libui/dsl.rb +1 -0
  23. data/lib/glimmer/dsl/libui/file_expression.rb +5 -1
  24. data/lib/glimmer/dsl/libui/property_expression.rb +5 -1
  25. data/lib/glimmer/{libui/box.rb → dsl/libui/shape_expression.rb} +26 -29
  26. data/lib/glimmer/dsl/libui/tab_item_expression.rb +2 -2
  27. data/lib/glimmer/libui/control_proxy/area_proxy.rb +117 -0
  28. data/lib/glimmer/libui/{menu_item_proxy.rb → control_proxy/box/horizontal_box_proxy.rb} +9 -12
  29. data/lib/glimmer/libui/{vertical_box_proxy.rb → control_proxy/box/vertical_box_proxy.rb} +10 -6
  30. data/lib/glimmer/libui/control_proxy/box.rb +61 -0
  31. data/lib/glimmer/libui/{button_proxy.rb → control_proxy/button_proxy.rb} +14 -12
  32. data/lib/glimmer/libui/{checkbox_proxy.rb → control_proxy/checkbox_proxy.rb} +14 -12
  33. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +118 -0
  34. data/lib/glimmer/libui/control_proxy/column/button_column_proxy.rb +76 -0
  35. data/lib/glimmer/libui/control_proxy/column/checkbox_column_proxy.rb +46 -0
  36. data/lib/glimmer/libui/control_proxy/column/checkbox_text_column_proxy.rb +80 -0
  37. data/lib/glimmer/libui/{radio_buttons_proxy.rb → control_proxy/column/image_column_proxy.rb} +14 -13
  38. data/lib/glimmer/libui/control_proxy/column/image_text_column_proxy.rb +48 -0
  39. data/lib/glimmer/libui/{progress_bar_column_proxy.rb → control_proxy/column/progress_bar_column_proxy.rb} +14 -10
  40. data/lib/glimmer/libui/control_proxy/column/text_column_proxy.rb +46 -0
  41. data/lib/glimmer/libui/control_proxy/column.rb +55 -0
  42. data/lib/glimmer/libui/{checkbox_column_proxy.rb → control_proxy/combobox_proxy.rb} +16 -13
  43. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/date_picker_proxy.rb +43 -0
  44. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/time_picker_proxy.rb +43 -0
  45. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +72 -0
  46. data/lib/glimmer/libui/control_proxy/dual_column.rb +40 -0
  47. data/lib/glimmer/libui/control_proxy/editable_column.rb +46 -0
  48. data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +45 -0
  49. data/lib/glimmer/libui/{dual_column.rb → control_proxy/enableable_column.rb} +18 -10
  50. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +70 -0
  51. data/lib/glimmer/libui/{form_proxy.rb → control_proxy/form_proxy.rb} +26 -24
  52. data/lib/glimmer/libui/{grid_proxy.rb → control_proxy/grid_proxy.rb} +29 -27
  53. data/lib/glimmer/libui/{group_proxy.rb → control_proxy/group_proxy.rb} +24 -22
  54. data/lib/glimmer/libui/{image_part_proxy.rb → control_proxy/image_part_proxy.rb} +20 -18
  55. data/lib/glimmer/libui/{image_proxy.rb → control_proxy/image_proxy.rb} +32 -30
  56. data/lib/glimmer/libui/{combobox_proxy.rb → control_proxy/label_proxy.rb} +13 -13
  57. data/lib/glimmer/libui/control_proxy/matrix_proxy.rb +147 -0
  58. data/lib/glimmer/libui/{editable_column.rb → control_proxy/menu_item_proxy/about_menu_item_proxy.rb} +13 -16
  59. data/lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb +41 -0
  60. data/lib/glimmer/libui/{preferences_menu_item_proxy.rb → control_proxy/menu_item_proxy/preferences_menu_item_proxy.rb} +11 -9
  61. data/lib/glimmer/libui/control_proxy/menu_item_proxy/quit_menu_item_proxy.rb +66 -0
  62. data/lib/glimmer/libui/control_proxy/menu_item_proxy/separator_menu_item_proxy.rb +41 -0
  63. data/lib/glimmer/libui/control_proxy/menu_item_proxy.rb +45 -0
  64. data/lib/glimmer/libui/{editable_combobox_proxy.rb → control_proxy/menu_proxy.rb} +13 -13
  65. data/lib/glimmer/libui/{horizontal_box_proxy.rb → control_proxy/message_box/msg_box_error_proxy.rb} +9 -6
  66. data/lib/glimmer/libui/{multiline_entry_proxy.rb → control_proxy/message_box/msg_box_proxy.rb} +8 -6
  67. data/lib/glimmer/libui/{check_menu_item_proxy.rb → control_proxy/message_box.rb} +11 -10
  68. data/lib/glimmer/libui/control_proxy/multiline_entry_proxy/non_wrapping_multiline_entry_proxy.rb +34 -0
  69. data/lib/glimmer/libui/{image_column_proxy.rb → control_proxy/multiline_entry_proxy.rb} +10 -11
  70. data/lib/glimmer/libui/control_proxy/path_proxy.rb +169 -0
  71. data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +45 -0
  72. data/lib/glimmer/libui/{button_column_proxy.rb → control_proxy/tab_item_proxy.rb} +37 -40
  73. data/lib/glimmer/libui/control_proxy/table_proxy.rb +182 -0
  74. data/lib/glimmer/libui/control_proxy/transformable.rb +74 -0
  75. data/lib/glimmer/libui/control_proxy/window_proxy.rb +128 -0
  76. data/lib/glimmer/libui/control_proxy.rb +41 -22
  77. data/lib/glimmer/libui/{enableable_column.rb → parent.rb} +7 -15
  78. data/lib/glimmer/libui/shape/arc.rb +43 -0
  79. data/lib/glimmer/libui/{date_picker_proxy.rb → shape/bezier.rb} +8 -9
  80. data/lib/glimmer/libui/{quit_menu_item_proxy.rb → shape/figure.rb} +24 -32
  81. data/lib/glimmer/libui/{non_wrapping_multiline_entry_proxy.rb → shape/line.rb} +11 -5
  82. data/lib/glimmer/libui/{time_picker_proxy.rb → shape/rectangle.rb} +8 -9
  83. data/lib/glimmer/libui/{about_menu_item_proxy.rb → shape/square.rb} +9 -8
  84. data/lib/glimmer/libui/shape.rb +145 -0
  85. data/lib/glimmer/libui.rb +92 -0
  86. data/lib/glimmer-dsl-libui.rb +2 -0
  87. metadata +82 -48
  88. data/lib/glimmer/libui/area_proxy.rb +0 -105
  89. data/lib/glimmer/libui/checkbox_text_column_proxy.rb +0 -76
  90. data/lib/glimmer/libui/color_button_proxy.rb +0 -64
  91. data/lib/glimmer/libui/column.rb +0 -51
  92. data/lib/glimmer/libui/date_time_picker_proxy.rb +0 -68
  93. data/lib/glimmer/libui/font_button_proxy.rb +0 -68
  94. data/lib/glimmer/libui/image_text_column_proxy.rb +0 -44
  95. data/lib/glimmer/libui/label_proxy.rb +0 -41
  96. data/lib/glimmer/libui/menu_proxy.rb +0 -41
  97. data/lib/glimmer/libui/path_proxy.rb +0 -167
  98. data/lib/glimmer/libui/rectangle_proxy.rb +0 -100
  99. data/lib/glimmer/libui/separator_menu_item_proxy.rb +0 -37
  100. data/lib/glimmer/libui/tab_item_proxy.rb +0 -67
  101. data/lib/glimmer/libui/table_proxy.rb +0 -180
  102. data/lib/glimmer/libui/text_column_proxy.rb +0 -42
  103. data/lib/glimmer/libui/window_proxy.rb +0 -119
@@ -6,59 +6,110 @@ require 'facets'
6
6
  class MetaExample
7
7
  include Glimmer
8
8
 
9
+ def initialize
10
+ @selected_example_index = 0
11
+ end
12
+
9
13
  def examples
10
14
  if @examples.nil?
11
15
  example_files = Dir.glob(File.join(File.expand_path('.', __dir__), '**', '*.rb'))
12
16
  example_file_names = example_files.map { |f| File.basename(f, '.rb') }
13
- example_file_names = example_file_names.reject { |f| f == 'meta_example' }
17
+ example_file_names = example_file_names.reject { |f| f == 'meta_example' || f.match(/\d$/) }
14
18
  @examples = example_file_names.map { |f| f.underscore.titlecase }
15
19
  end
16
20
  @examples
17
21
  end
18
22
 
23
+ def examples_with_versions
24
+ examples.map do |example|
25
+ version_count_for(example) > 1 ? "#{example} (#{version_count_for(example)} versions)" : example
26
+ end
27
+ end
28
+
19
29
  def file_path_for(example)
20
30
  File.join(File.expand_path('.', __dir__), "#{example.underscore}.rb")
21
31
  end
22
32
 
33
+ def version_count_for(example)
34
+ Dir.glob(File.join(File.expand_path('.', __dir__), "#{example.underscore}*.rb")).select {|file| file.match(/\d\.rb$/)}.count + 1
35
+ end
36
+
23
37
  def glimmer_dsl_libui_file
24
38
  File.expand_path('../lib/glimmer-dsl-libui', __dir__)
25
39
  end
26
40
 
41
+ def selected_example
42
+ examples[@selected_example_index]
43
+ end
44
+
27
45
  def launch
28
- window('Meta-Example', 700, 500) { |w|
46
+ window('Meta-Example', 700, 500) {
29
47
  margined true
30
48
 
31
49
  horizontal_box {
32
50
  vertical_box {
51
+ stretchy false
52
+
33
53
  @rbs = radio_buttons {
34
54
  stretchy false
35
- items examples
36
- selected 0
55
+ items examples_with_versions
56
+ selected @selected_example_index
37
57
 
38
58
  on_selected do
39
- @nwme.text = File.read(file_path_for(@examples[@rbs.selected]))
59
+ @selected_example_index = @rbs.selected
60
+ example = selected_example
61
+ @nwme.text = File.read(file_path_for(example))
62
+ @sb.value = 1
40
63
  end
41
64
  }
42
- button('Launch') {
65
+
66
+ horizontal_box {
67
+ label('Version') {
68
+ stretchy false
69
+ }
70
+
71
+ @sb = spinbox(1, 100) {
72
+ value 1
73
+
74
+ on_changed do
75
+ example = selected_example
76
+ if @sb.value > version_count_for(example)
77
+ @sb.value -= 1
78
+ else
79
+ version_number = @sb.value == 1 ? '' : @sb.value
80
+ example = "#{selected_example}#{version_number}"
81
+ @nwme.text = File.read(file_path_for(example))
82
+ end
83
+ end
84
+ }
85
+ }
86
+
87
+ horizontal_box {
43
88
  stretchy false
44
89
 
45
- on_clicked do
46
- begin
47
- meta_example_file = File.join(Dir.home, '.meta_example.rb')
48
- File.write(meta_example_file, @nwme.text)
49
- result = `ruby -r #{glimmer_dsl_libui_file} #{meta_example_file} 2>&1`
50
- msg_box(w, 'Error Running Example', result) if result.include?('error')
51
- rescue => e
52
- puts 'Unable to write code changes! Running original example...'
53
- system "ruby -r #{glimmer_dsl_libui_file} #{file_path_for(@examples[@rbs.selected])}"
90
+ button('Launch') {
91
+ on_clicked do
92
+ begin
93
+ meta_example_file = File.join(Dir.home, '.meta_example.rb')
94
+ File.write(meta_example_file, @nwme.text)
95
+ result = `ruby -r #{glimmer_dsl_libui_file} #{meta_example_file} 2>&1`
96
+ msg_box('Error Running Example', result) if result.include?('error')
97
+ rescue => e
98
+ puts 'Unable to write code changes! Running original example...'
99
+ system "ruby -r #{glimmer_dsl_libui_file} #{file_path_for(selected_example)}"
100
+ end
54
101
  end
55
- end
102
+ }
103
+ button('Reset') {
104
+ on_clicked do
105
+ @nwme.text = File.read(file_path_for(selected_example))
106
+ end
107
+ }
56
108
  }
57
109
  }
58
- vertical_box {
59
- @nwme = non_wrapping_multiline_entry {
60
- text File.read(file_path_for(@examples[@rbs.selected]))
61
- }
110
+
111
+ @nwme = non_wrapping_multiline_entry {
112
+ text File.read(file_path_for(selected_example))
62
113
  }
63
114
  }
64
115
  }.show
@@ -40,23 +40,22 @@ class TinyMidiPlayer
40
40
  end
41
41
  end
42
42
 
43
- def show_version(main_window)
44
- msg_box(main_window,
45
- 'Tiny Midi Player',
46
- "Written in Ruby\n" \
47
- "https://github.com/kojix2/libui\n" \
48
- "Version #{VERSION}")
43
+ def show_version
44
+ msg_box('Tiny Midi Player',
45
+ "Written in Ruby\n" \
46
+ "https://github.com/kojix2/libui\n" \
47
+ "Version #{VERSION}")
49
48
  end
50
49
 
51
50
  def create_gui
52
51
  menu('Help') { |m|
53
52
  menu_item('Version') {
54
53
  on_clicked do
55
- show_version(@main_window)
54
+ show_version
56
55
  end
57
56
  }
58
57
  }
59
- @main_window = window('Tiny Midi Player', 200, 50) {
58
+ window('Tiny Midi Player', 200, 50) {
60
59
  horizontal_box {
61
60
  vertical_box {
62
61
  stretchy false
@@ -82,8 +81,7 @@ class TinyMidiPlayer
82
81
  end
83
82
  }
84
83
  }
85
- }
86
- @main_window.show
84
+ }.show
87
85
  end
88
86
  end
89
87
 
Binary file
@@ -29,7 +29,7 @@ module Glimmer
29
29
  include ParentExpression
30
30
 
31
31
  def can_interpret?(parent, keyword, *args, &block)
32
- Glimmer::LibUI::ControlProxy.control_exists?(keyword)
32
+ Glimmer::LibUI::ControlProxy.exists?(keyword)
33
33
  end
34
34
 
35
35
  def interpret(parent, keyword, *args, &block)
@@ -46,6 +46,4 @@ module Glimmer
46
46
  end
47
47
  end
48
48
 
49
- # TODO Consider moving all controls underneath Control namespace
50
49
  require 'glimmer/libui/control_proxy'
51
- Dir[File.expand_path('../../libui/*.rb', __dir__)].each {|f| require f}
@@ -39,6 +39,7 @@ module Glimmer
39
39
  listener
40
40
  property
41
41
  control
42
+ shape
42
43
  ]
43
44
  )
44
45
  end
@@ -19,12 +19,16 @@
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/libui/control_proxy'
23
+
22
24
  module Glimmer
23
25
  module DSL
24
26
  module Libui
25
27
  module FileExpression
26
28
  def interpret(parent, keyword, *args, &block)
27
- file_pointer = ::LibUI.send(self.class.name.underscore.split('::').last.sub(/_expression$/, ''), args.first.libui)
29
+ window = args.empty? ? Glimmer::LibUI::ControlProxy.main_window_proxy : args.first
30
+ window = window.libui if window.respond_to?(:libui)
31
+ file_pointer = ::LibUI.send(self.class.name.underscore.split('::').last.sub(/_expression$/, ''), window)
28
32
  file_pointer.to_s unless file_pointer.null?
29
33
  end
30
34
  end
@@ -21,13 +21,17 @@
21
21
 
22
22
  require 'glimmer/dsl/expression'
23
23
  require 'glimmer/libui/control_proxy'
24
+ require 'glimmer/libui/shape'
24
25
 
25
26
  module Glimmer
26
27
  module DSL
27
28
  module Libui
28
29
  class PropertyExpression < Expression
29
30
  def can_interpret?(parent, keyword, *args, &block)
30
- parent.is_a?(Glimmer::LibUI::ControlProxy) and
31
+ (
32
+ parent.is_a?(Glimmer::LibUI::ControlProxy) or
33
+ parent.is_a?(Glimmer::LibUI::Shape)
34
+ ) and
31
35
  block.nil? and
32
36
  parent.respond_to?(keyword, *args)
33
37
  end
@@ -19,39 +19,36 @@
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/libui/control_proxy'
22
+ require 'glimmer/dsl/expression'
23
+ require 'glimmer/dsl/parent_expression'
23
24
 
24
25
  module Glimmer
25
- module LibUI
26
- module Box
27
- APPEND_PROPERTIES = %w[stretchy]
28
-
29
- def post_initialize_child(child)
30
- child.stretchy = true if child.stretchy.nil?
31
- ::LibUI.box_append(@libui, child.libui, ControlProxy.boolean_to_integer(child.stretchy))
32
- children << child
33
- end
34
-
35
- def libui_api_keyword
36
- 'box'
37
- end
38
-
39
- def children
40
- @children ||= []
41
- end
42
-
43
- def destroy_child(child)
44
- ::LibUI.send("box_delete", @libui, children.index(child))
45
- ControlProxy.control_proxies.delete(child)
46
- end
47
-
48
- private
49
-
50
- def build_control
51
- super.tap do
52
- self.padded = true
26
+ module DSL
27
+ module Libui
28
+ class ShapeExpression < Expression
29
+ include ParentExpression
30
+
31
+ def can_interpret?(parent, keyword, *args, &block)
32
+ Glimmer::LibUI::Shape.exists?(keyword) and
33
+ (
34
+ parent.is_a?(Glimmer::LibUI::ControlProxy::PathProxy) or
35
+ parent.is_a?(Glimmer::LibUI::Shape)
36
+ )
53
37
  end
38
+
39
+ def interpret(parent, keyword, *args, &block)
40
+ Glimmer::LibUI::Shape.create(keyword, parent, args, &block)
41
+ end
42
+
43
+ def add_content(parent, keyword, *args, &block)
44
+ super
45
+ parent.post_add_content
46
+ end
47
+
54
48
  end
55
49
  end
56
50
  end
57
51
  end
52
+
53
+ require 'glimmer/libui/control_proxy/path_proxy'
54
+ require 'glimmer/libui/shape'
@@ -20,14 +20,14 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/dsl/static_expression'
23
- require 'glimmer/libui/tab_item_proxy'
23
+ require 'glimmer/libui/control_proxy/tab_item_proxy'
24
24
 
25
25
  module Glimmer
26
26
  module DSL
27
27
  module Libui
28
28
  class TabItemExpression < StaticExpression
29
29
  def interpret(parent, keyword, *args, &block)
30
- Glimmer::LibUI::TabItemProxy.create(keyword, parent, args, &block)
30
+ Glimmer::LibUI::ControlProxy::TabItemProxy.create(keyword, parent, args, &block)
31
31
  end
32
32
  end
33
33
  end
@@ -0,0 +1,117 @@
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/fiddle_consumer'
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 area objects
31
+ #
32
+ # Follows the Proxy Design Pattern
33
+ class AreaProxy < ControlProxy
34
+ class << self
35
+ # this attribute is only populated during on_draw call
36
+ attr_accessor :current_area_draw_params
37
+ end
38
+
39
+ include Glimmer::FiddleConsumer
40
+ include Parent
41
+ prepend Transformable
42
+
43
+ attr_reader :area_handler
44
+
45
+ def post_add_content
46
+ super
47
+ install_listeners
48
+ end
49
+
50
+ def on_draw(&block)
51
+ @on_draw_procs ||= []
52
+ if block.nil?
53
+ @on_draw_procs
54
+ else
55
+ @on_draw_procs << block
56
+ block
57
+ end
58
+ end
59
+
60
+ def can_handle_listener?(listener_name)
61
+ listener_name == 'on_draw' || super
62
+ end
63
+
64
+ def handle_listener(listener_name, &listener)
65
+ case listener_name
66
+ when 'on_draw'
67
+ on_draw(&listener)
68
+ else
69
+ super
70
+ end
71
+ end
72
+
73
+ def draw(area_draw_params)
74
+ children.dup.each {|child| child.draw(area_draw_params)}
75
+ on_draw.each {|listener| listener.call(area_draw_params)}
76
+ end
77
+
78
+ def redraw
79
+ queue_redraw_all
80
+ end
81
+
82
+ private
83
+
84
+ def build_control
85
+ @area_handler = ::LibUI::FFI::AreaHandler.malloc
86
+ @libui = ::LibUI.new_area(@area_handler)
87
+ end
88
+
89
+ def install_listeners
90
+ @area_handler.Draw = fiddle_closure_block_caller(0, [1, 1, 1]) do |_, _, area_draw_params|
91
+ area_draw_params = ::LibUI::FFI::AreaDrawParams.new(area_draw_params)
92
+ area_draw_params = area_draw_params_hash(area_draw_params)
93
+ AreaProxy.current_area_draw_params = area_draw_params
94
+ draw(area_draw_params)
95
+ AreaProxy.current_area_draw_params = nil
96
+ end
97
+ @area_handler.MouseEvent = fiddle_closure_block_caller(0, [0]) {}
98
+ @area_handler.MouseCrossed = fiddle_closure_block_caller(0, [0]) {}
99
+ @area_handler.DragBroken = fiddle_closure_block_caller(0, [0]) {}
100
+ @area_handler.KeyEvent = fiddle_closure_block_caller(0, [0]) {}
101
+ end
102
+
103
+ def area_draw_params_hash(area_draw_params)
104
+ {
105
+ context: area_draw_params.Context,
106
+ area_width: area_draw_params.AreaWidth,
107
+ area_height: area_draw_params.AreaHeight,
108
+ clip_x: area_draw_params.ClipX,
109
+ clip_y: area_draw_params.ClipY,
110
+ clip_width: area_draw_params.ClipWidth,
111
+ clip_height: area_draw_params.ClipHeight,
112
+ }
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -20,21 +20,18 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/libui/control_proxy'
23
+ require 'glimmer/libui/control_proxy/box'
23
24
 
24
25
  module Glimmer
25
26
  module LibUI
26
- # Proxy for LibUI menu item objects
27
- #
28
- # Follows the Proxy Design Pattern
29
- class MenuItemProxy < ControlProxy
30
- def libui_api_keyword
31
- 'menu_item'
32
- end
33
-
34
- private
35
-
36
- def build_control
37
- @libui = @parent_proxy.append_item(*@args)
27
+ class ControlProxy
28
+ module Box
29
+ # Proxy for LibUI horizontal box objects
30
+ #
31
+ # Follows the Proxy Design Pattern
32
+ class HorizontalBoxProxy < ControlProxy
33
+ include Box
34
+ end
38
35
  end
39
36
  end
40
37
  end
@@ -20,15 +20,19 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/libui/control_proxy'
23
- require 'glimmer/libui/box'
23
+ require 'glimmer/libui/control_proxy/box'
24
24
 
25
25
  module Glimmer
26
26
  module LibUI
27
- # Proxy for LibUI vertical box objects
28
- #
29
- # Follows the Proxy Design Pattern
30
- class VerticalBoxProxy < ControlProxy
31
- include Box
27
+ class ControlProxy
28
+ module Box
29
+ # Proxy for LibUI vertical box objects
30
+ #
31
+ # Follows the Proxy Design Pattern
32
+ class VerticalBoxProxy < ControlProxy
33
+ include Box
34
+ end
35
+ end
32
36
  end
33
37
  end
34
38
  end
@@ -0,0 +1,61 @@
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
+
24
+ module Glimmer
25
+ module LibUI
26
+ class ControlProxy
27
+ module Box
28
+ APPEND_PROPERTIES = %w[stretchy]
29
+
30
+ def post_initialize_child(child)
31
+ child.stretchy = true if child.stretchy.nil?
32
+ ::LibUI.box_append(@libui, child.libui, Glimmer::LibUI.boolean_to_integer(child.stretchy))
33
+ children << child
34
+ end
35
+
36
+ def libui_api_keyword
37
+ 'box'
38
+ end
39
+
40
+ def children
41
+ @children ||= []
42
+ end
43
+
44
+ def destroy_child(child)
45
+ ::LibUI.send("box_delete", @libui, children.index(child))
46
+ ControlProxy.control_proxies.delete(child)
47
+ end
48
+
49
+ private
50
+
51
+ def build_control
52
+ super.tap do
53
+ self.padded = true
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ Dir[File.expand_path("./#{File.basename(__FILE__, '.rb')}/*.rb", __dir__)].each {|f| require f}
@@ -23,18 +23,20 @@ require 'glimmer/libui/control_proxy'
23
23
 
24
24
  module Glimmer
25
25
  module LibUI
26
- # Proxy for LibUI button objects
27
- #
28
- # Follows the Proxy Design Pattern
29
- class ButtonProxy < ControlProxy
30
- DEFAULT_TEXT = ''
31
-
32
- private
33
-
34
- def build_control
35
- construction_args = @args.dup
36
- construction_args[0] = DEFAULT_TEXT if construction_args.size == 0
37
- @libui = ControlProxy.new_control(@keyword, construction_args)
26
+ class ControlProxy
27
+ # Proxy for LibUI button objects
28
+ #
29
+ # Follows the Proxy Design Pattern
30
+ class ButtonProxy < ControlProxy
31
+ DEFAULT_TEXT = ''
32
+
33
+ private
34
+
35
+ def build_control
36
+ construction_args = @args.dup
37
+ construction_args[0] = DEFAULT_TEXT if construction_args.size == 0
38
+ @libui = ControlProxy.new_control(@keyword, construction_args)
39
+ end
38
40
  end
39
41
  end
40
42
  end
@@ -23,18 +23,20 @@ require 'glimmer/libui/control_proxy'
23
23
 
24
24
  module Glimmer
25
25
  module LibUI
26
- # Proxy for LibUI checkbox objects
27
- #
28
- # Follows the Proxy Design Pattern
29
- class CheckboxProxy < ControlProxy
30
- DEFAULT_TEXT = ''
31
-
32
- private
33
-
34
- def build_control
35
- construction_args = @args.dup
36
- construction_args[0] = DEFAULT_TEXT if construction_args.size == 0
37
- @libui = ControlProxy.new_control(@keyword, construction_args)
26
+ class ControlProxy
27
+ # Proxy for LibUI checkbox objects
28
+ #
29
+ # Follows the Proxy Design Pattern
30
+ class CheckboxProxy < ControlProxy
31
+ DEFAULT_TEXT = ''
32
+
33
+ private
34
+
35
+ def build_control
36
+ construction_args = @args.dup
37
+ construction_args[0] = DEFAULT_TEXT if construction_args.size == 0
38
+ @libui = ControlProxy.new_control(@keyword, construction_args)
39
+ end
38
40
  end
39
41
  end
40
42
  end