glimmer-dsl-libui 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/README.md +63 -55
  4. data/VERSION +1 -1
  5. data/examples/basic_button.rb +2 -2
  6. data/examples/basic_entry.rb +2 -2
  7. data/examples/basic_transform.rb +1 -1
  8. data/examples/control_gallery.rb +3 -3
  9. data/examples/form.rb +2 -2
  10. data/examples/histogram.rb +18 -19
  11. data/examples/meta_example.rb +71 -20
  12. data/examples/midi_player.rb +8 -10
  13. data/glimmer-dsl-libui.gemspec +0 -0
  14. data/lib/glimmer/dsl/libui/control_expression.rb +0 -2
  15. data/lib/glimmer/dsl/libui/file_expression.rb +5 -1
  16. data/lib/glimmer/dsl/libui/shape_expression.rb +2 -4
  17. data/lib/glimmer/dsl/libui/tab_item_expression.rb +2 -2
  18. data/lib/glimmer/libui/control_proxy/area_proxy.rb +117 -0
  19. data/lib/glimmer/libui/{menu_item_proxy.rb → control_proxy/box/horizontal_box_proxy.rb} +9 -12
  20. data/lib/glimmer/libui/{horizontal_box_proxy.rb → control_proxy/box/vertical_box_proxy.rb} +10 -6
  21. data/lib/glimmer/libui/{box.rb → control_proxy/box.rb} +31 -27
  22. data/lib/glimmer/libui/{button_proxy.rb → control_proxy/button_proxy.rb} +14 -12
  23. data/lib/glimmer/libui/{checkbox_proxy.rb → control_proxy/checkbox_proxy.rb} +14 -12
  24. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +118 -0
  25. data/lib/glimmer/libui/control_proxy/column/button_column_proxy.rb +76 -0
  26. data/lib/glimmer/libui/control_proxy/column/checkbox_column_proxy.rb +46 -0
  27. data/lib/glimmer/libui/control_proxy/column/checkbox_text_column_proxy.rb +80 -0
  28. data/lib/glimmer/libui/{radio_buttons_proxy.rb → control_proxy/column/image_column_proxy.rb} +14 -13
  29. data/lib/glimmer/libui/control_proxy/column/image_text_column_proxy.rb +48 -0
  30. data/lib/glimmer/libui/control_proxy/column/progress_bar_column_proxy.rb +44 -0
  31. data/lib/glimmer/libui/{checkbox_column_proxy.rb → control_proxy/column/text_column_proxy.rb} +17 -13
  32. data/lib/glimmer/libui/control_proxy/column.rb +55 -0
  33. data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +45 -0
  34. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/date_picker_proxy.rb +43 -0
  35. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/time_picker_proxy.rb +43 -0
  36. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +72 -0
  37. data/lib/glimmer/libui/control_proxy/dual_column.rb +40 -0
  38. data/lib/glimmer/libui/control_proxy/editable_column.rb +46 -0
  39. data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +45 -0
  40. data/lib/glimmer/libui/{dual_column.rb → control_proxy/enableable_column.rb} +18 -10
  41. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +70 -0
  42. data/lib/glimmer/libui/{form_proxy.rb → control_proxy/form_proxy.rb} +26 -24
  43. data/lib/glimmer/libui/{grid_proxy.rb → control_proxy/grid_proxy.rb} +29 -27
  44. data/lib/glimmer/libui/{group_proxy.rb → control_proxy/group_proxy.rb} +24 -22
  45. data/lib/glimmer/libui/{image_part_proxy.rb → control_proxy/image_part_proxy.rb} +20 -18
  46. data/lib/glimmer/libui/{image_proxy.rb → control_proxy/image_proxy.rb} +32 -30
  47. data/lib/glimmer/libui/{combobox_proxy.rb → control_proxy/label_proxy.rb} +13 -13
  48. data/lib/glimmer/libui/control_proxy/matrix_proxy.rb +147 -0
  49. data/lib/glimmer/libui/{editable_column.rb → control_proxy/menu_item_proxy/about_menu_item_proxy.rb} +13 -16
  50. data/lib/glimmer/libui/{enableable_column.rb → control_proxy/menu_item_proxy/check_menu_item_proxy.rb} +13 -16
  51. data/lib/glimmer/libui/{date_picker_proxy.rb → control_proxy/menu_item_proxy/preferences_menu_item_proxy.rb} +10 -10
  52. data/lib/glimmer/libui/{quit_menu_item_proxy.rb → control_proxy/menu_item_proxy/quit_menu_item_proxy.rb} +33 -29
  53. data/lib/glimmer/libui/control_proxy/menu_item_proxy/separator_menu_item_proxy.rb +41 -0
  54. data/lib/glimmer/libui/control_proxy/menu_item_proxy.rb +45 -0
  55. data/lib/glimmer/libui/{editable_combobox_proxy.rb → control_proxy/menu_proxy.rb} +13 -13
  56. data/lib/glimmer/libui/{vertical_box_proxy.rb → control_proxy/message_box/msg_box_error_proxy.rb} +9 -6
  57. data/lib/glimmer/libui/{multiline_entry_proxy.rb → control_proxy/message_box/msg_box_proxy.rb} +8 -6
  58. data/lib/glimmer/libui/{time_picker_proxy.rb → control_proxy/message_box.rb} +9 -10
  59. data/lib/glimmer/libui/{rectangle.rb → control_proxy/multiline_entry_proxy/non_wrapping_multiline_entry_proxy.rb} +6 -8
  60. data/lib/glimmer/libui/{progress_bar_column_proxy.rb → control_proxy/multiline_entry_proxy.rb} +10 -11
  61. data/lib/glimmer/libui/control_proxy/path_proxy.rb +169 -0
  62. data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +45 -0
  63. data/lib/glimmer/libui/{button_column_proxy.rb → control_proxy/tab_item_proxy.rb} +37 -40
  64. data/lib/glimmer/libui/control_proxy/table_proxy.rb +182 -0
  65. data/lib/glimmer/libui/{transformable.rb → control_proxy/transformable.rb} +3 -1
  66. data/lib/glimmer/libui/control_proxy/window_proxy.rb +128 -0
  67. data/lib/glimmer/libui/control_proxy.rb +35 -8
  68. data/lib/glimmer/libui/{arc.rb → shape/arc.rb} +13 -11
  69. data/lib/glimmer/libui/shape/bezier.rb +38 -0
  70. data/lib/glimmer/libui/{figure.rb → shape/figure.rb} +23 -21
  71. data/lib/glimmer/libui/{line.rb → shape/line.rb} +9 -7
  72. data/lib/glimmer/libui/{bezier.rb → shape/rectangle.rb} +9 -7
  73. data/lib/glimmer/libui/{square.rb → shape/square.rb} +9 -7
  74. data/lib/glimmer/libui/shape.rb +8 -6
  75. data/lib/glimmer/libui.rb +43 -1
  76. data/lib/glimmer-dsl-libui.rb +1 -0
  77. metadata +72 -55
  78. data/lib/glimmer/libui/about_menu_item_proxy.rb +0 -37
  79. data/lib/glimmer/libui/area_proxy.rb +0 -115
  80. data/lib/glimmer/libui/check_menu_item_proxy.rb +0 -37
  81. data/lib/glimmer/libui/checkbox_text_column_proxy.rb +0 -76
  82. data/lib/glimmer/libui/color_button_proxy.rb +0 -116
  83. data/lib/glimmer/libui/column.rb +0 -51
  84. data/lib/glimmer/libui/date_time_picker_proxy.rb +0 -68
  85. data/lib/glimmer/libui/font_button_proxy.rb +0 -68
  86. data/lib/glimmer/libui/image_column_proxy.rb +0 -40
  87. data/lib/glimmer/libui/image_text_column_proxy.rb +0 -44
  88. data/lib/glimmer/libui/label_proxy.rb +0 -41
  89. data/lib/glimmer/libui/matrix_proxy.rb +0 -145
  90. data/lib/glimmer/libui/menu_proxy.rb +0 -41
  91. data/lib/glimmer/libui/non_wrapping_multiline_entry_proxy.rb +0 -32
  92. data/lib/glimmer/libui/path_proxy.rb +0 -166
  93. data/lib/glimmer/libui/preferences_menu_item_proxy.rb +0 -37
  94. data/lib/glimmer/libui/separator_menu_item_proxy.rb +0 -37
  95. data/lib/glimmer/libui/tab_item_proxy.rb +0 -67
  96. data/lib/glimmer/libui/table_proxy.rb +0 -180
  97. data/lib/glimmer/libui/text_column_proxy.rb +0 -42
  98. data/lib/glimmer/libui/window_proxy.rb +0 -126
@@ -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
@@ -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}
@@ -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
@@ -31,7 +31,7 @@ module Glimmer
31
31
  def can_interpret?(parent, keyword, *args, &block)
32
32
  Glimmer::LibUI::Shape.exists?(keyword) and
33
33
  (
34
- parent.is_a?(Glimmer::LibUI::PathProxy) or
34
+ parent.is_a?(Glimmer::LibUI::ControlProxy::PathProxy) or
35
35
  parent.is_a?(Glimmer::LibUI::Shape)
36
36
  )
37
37
  end
@@ -50,7 +50,5 @@ module Glimmer
50
50
  end
51
51
  end
52
52
 
53
- # TODO Consider moving all shapes underneath Shape namespace
54
- require 'glimmer/libui/path_proxy'
53
+ require 'glimmer/libui/control_proxy/path_proxy'
55
54
  require 'glimmer/libui/shape'
56
- Dir[File.expand_path('../../libui/*.rb', __dir__)].each {|f| require f}
@@ -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 horizontal box objects
28
- #
29
- # Follows the Proxy Design Pattern
30
- class HorizontalBoxProxy < 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
@@ -23,35 +23,39 @@ require 'glimmer/libui/control_proxy'
23
23
 
24
24
  module Glimmer
25
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, Glimmer::LibUI.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
+ 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
53
55
  end
54
56
  end
55
57
  end
56
58
  end
57
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
@@ -0,0 +1,118 @@
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
+ # Proxy for LibUI color button objects
28
+ #
29
+ # Follows the Proxy Design Pattern
30
+ class ColorButtonProxy < ControlProxy
31
+ def color(value = nil)
32
+ # TODO support hex color value
33
+ if value.nil?
34
+ @red ||= Fiddle::Pointer.malloc(8) # double
35
+ @green ||= Fiddle::Pointer.malloc(8) # double
36
+ @blue ||= Fiddle::Pointer.malloc(8) # double
37
+ @alpha ||= Fiddle::Pointer.malloc(8) # double
38
+ ::LibUI.color_button_color(@libui, @red, @green, @blue, @alpha)
39
+ {
40
+ r: @red[0, 8].unpack1('d') * 255.0,
41
+ g: @green[0, 8].unpack1('d') * 255.0,
42
+ b: @blue[0, 8].unpack1('d') * 255.0,
43
+ a: @alpha[0, 8].unpack1('d')
44
+ }
45
+ else
46
+ current_color = color
47
+ value = Glimmer::LibUI.interpret_color(value)
48
+ value[:r] ||= current_color[:r]
49
+ value[:g] ||= current_color[:g]
50
+ value[:b] ||= current_color[:b]
51
+ value[:a] ||= current_color[:a]
52
+ ::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
+ end
54
+ end
55
+
56
+ def red(value = nil)
57
+ if value.nil?
58
+ color[:r]
59
+ else
60
+ self.color = {r: value}
61
+ end
62
+ end
63
+ alias red= red
64
+ alias set_red red
65
+ alias r red
66
+ alias r= red
67
+ alias set_r red
68
+
69
+ def green(value = nil)
70
+ if value.nil?
71
+ color[:g]
72
+ else
73
+ self.color = {g: value}
74
+ end
75
+ end
76
+ alias green= green
77
+ alias set_green green
78
+ alias g green
79
+ alias g= green
80
+ alias set_g green
81
+
82
+ def blue(value = nil)
83
+ if value.nil?
84
+ color[:b]
85
+ else
86
+ self.color = {b: value}
87
+ end
88
+ end
89
+ alias blue= blue
90
+ alias set_blue blue
91
+ alias b blue
92
+ alias b= blue
93
+ alias set_b blue
94
+
95
+ def alpha(value = nil)
96
+ if value.nil?
97
+ color[:a]
98
+ else
99
+ self.color = {a: value}
100
+ end
101
+ end
102
+ alias alpha= alpha
103
+ alias set_alpha alpha
104
+ alias a alpha
105
+ alias a= alpha
106
+ alias set_a alpha
107
+
108
+ def destroy
109
+ Fiddle.free @red unless @red.nil?
110
+ Fiddle.free @green unless @green.nil?
111
+ Fiddle.free @blue unless @blue.nil?
112
+ Fiddle.free @alpha unless @alpha.nil?
113
+ super
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end