glimmer-dsl-libui 0.1.3 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +50 -0
- data/README.md +901 -104
- data/VERSION +1 -1
- data/examples/area_gallery.rb +36 -38
- data/examples/area_gallery2.rb +111 -0
- data/examples/area_gallery3.rb +52 -0
- data/examples/area_gallery4.rb +113 -0
- data/examples/basic_area2.rb +1 -1
- data/examples/basic_button.rb +2 -2
- data/examples/basic_entry.rb +2 -2
- data/examples/basic_table_progress_bar.rb +13 -3
- data/examples/basic_transform.rb +27 -0
- data/examples/control_gallery.rb +3 -3
- data/examples/dynamic_area.rb +1 -1
- data/examples/form.rb +2 -2
- data/examples/histogram.rb +118 -0
- data/examples/meta_example.rb +71 -20
- data/examples/midi_player.rb +8 -10
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/control_expression.rb +0 -2
- data/lib/glimmer/dsl/libui/file_expression.rb +5 -1
- data/lib/glimmer/dsl/libui/shape_expression.rb +2 -4
- data/lib/glimmer/dsl/libui/tab_item_expression.rb +2 -2
- data/lib/glimmer/libui/control_proxy/area_proxy.rb +117 -0
- data/lib/glimmer/libui/{menu_item_proxy.rb → control_proxy/box/horizontal_box_proxy.rb} +9 -12
- data/lib/glimmer/libui/{horizontal_box_proxy.rb → control_proxy/box/vertical_box_proxy.rb} +10 -6
- data/lib/glimmer/libui/{box.rb → control_proxy/box.rb} +31 -27
- data/lib/glimmer/libui/{button_proxy.rb → control_proxy/button_proxy.rb} +14 -12
- data/lib/glimmer/libui/{checkbox_proxy.rb → control_proxy/checkbox_proxy.rb} +14 -12
- data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +118 -0
- data/lib/glimmer/libui/control_proxy/column/button_column_proxy.rb +76 -0
- data/lib/glimmer/libui/control_proxy/column/checkbox_column_proxy.rb +46 -0
- data/lib/glimmer/libui/control_proxy/column/checkbox_text_column_proxy.rb +80 -0
- data/lib/glimmer/libui/{radio_buttons_proxy.rb → control_proxy/column/image_column_proxy.rb} +14 -13
- data/lib/glimmer/libui/control_proxy/column/image_text_column_proxy.rb +48 -0
- data/lib/glimmer/libui/control_proxy/column/progress_bar_column_proxy.rb +44 -0
- data/lib/glimmer/libui/{checkbox_column_proxy.rb → control_proxy/column/text_column_proxy.rb} +17 -13
- data/lib/glimmer/libui/control_proxy/column.rb +55 -0
- data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +45 -0
- data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/date_picker_proxy.rb +43 -0
- data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/time_picker_proxy.rb +43 -0
- data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +72 -0
- data/lib/glimmer/libui/control_proxy/dual_column.rb +40 -0
- data/lib/glimmer/libui/control_proxy/editable_column.rb +46 -0
- data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +45 -0
- data/lib/glimmer/libui/{dual_column.rb → control_proxy/enableable_column.rb} +18 -10
- data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +70 -0
- data/lib/glimmer/libui/{form_proxy.rb → control_proxy/form_proxy.rb} +26 -24
- data/lib/glimmer/libui/{grid_proxy.rb → control_proxy/grid_proxy.rb} +29 -27
- data/lib/glimmer/libui/{group_proxy.rb → control_proxy/group_proxy.rb} +24 -22
- data/lib/glimmer/libui/{image_part_proxy.rb → control_proxy/image_part_proxy.rb} +20 -18
- data/lib/glimmer/libui/{image_proxy.rb → control_proxy/image_proxy.rb} +32 -30
- data/lib/glimmer/libui/{combobox_proxy.rb → control_proxy/label_proxy.rb} +13 -13
- data/lib/glimmer/libui/control_proxy/matrix_proxy.rb +147 -0
- data/lib/glimmer/libui/{editable_column.rb → control_proxy/menu_item_proxy/about_menu_item_proxy.rb} +13 -16
- data/lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb +41 -0
- data/lib/glimmer/libui/{date_picker_proxy.rb → control_proxy/menu_item_proxy/preferences_menu_item_proxy.rb} +10 -10
- data/lib/glimmer/libui/{quit_menu_item_proxy.rb → control_proxy/menu_item_proxy/quit_menu_item_proxy.rb} +33 -29
- data/lib/glimmer/libui/control_proxy/menu_item_proxy/separator_menu_item_proxy.rb +41 -0
- data/lib/glimmer/libui/control_proxy/menu_item_proxy.rb +45 -0
- data/lib/glimmer/libui/{editable_combobox_proxy.rb → control_proxy/menu_proxy.rb} +13 -13
- data/lib/glimmer/libui/{vertical_box_proxy.rb → control_proxy/message_box/msg_box_error_proxy.rb} +9 -6
- data/lib/glimmer/libui/{multiline_entry_proxy.rb → control_proxy/message_box/msg_box_proxy.rb} +8 -6
- data/lib/glimmer/libui/{time_picker_proxy.rb → control_proxy/message_box.rb} +9 -10
- data/lib/glimmer/libui/{rectangle.rb → control_proxy/multiline_entry_proxy/non_wrapping_multiline_entry_proxy.rb} +6 -7
- data/lib/glimmer/libui/{progress_bar_column_proxy.rb → control_proxy/multiline_entry_proxy.rb} +10 -11
- data/lib/glimmer/libui/control_proxy/path_proxy.rb +190 -0
- data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +45 -0
- data/lib/glimmer/libui/{button_column_proxy.rb → control_proxy/tab_item_proxy.rb} +37 -40
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +182 -0
- data/lib/glimmer/libui/control_proxy/transformable.rb +74 -0
- data/lib/glimmer/libui/control_proxy/window_proxy.rb +128 -0
- data/lib/glimmer/libui/control_proxy.rb +39 -20
- data/lib/glimmer/libui/{enableable_column.rb → parent.rb} +7 -15
- data/lib/glimmer/libui/{arc.rb → shape/arc.rb} +13 -10
- data/lib/glimmer/libui/shape/bezier.rb +38 -0
- data/lib/glimmer/libui/{figure.rb → shape/figure.rb} +23 -20
- data/lib/glimmer/libui/{line.rb → shape/line.rb} +9 -6
- data/lib/glimmer/libui/{bezier.rb → shape/rectangle.rb} +9 -6
- data/lib/glimmer/libui/{square.rb → shape/square.rb} +9 -6
- data/lib/glimmer/libui/shape.rb +30 -14
- data/lib/glimmer/libui.rb +92 -0
- data/lib/glimmer-dsl-libui.rb +2 -0
- metadata +79 -53
- data/lib/glimmer/libui/about_menu_item_proxy.rb +0 -37
- data/lib/glimmer/libui/area_proxy.rb +0 -105
- data/lib/glimmer/libui/check_menu_item_proxy.rb +0 -37
- data/lib/glimmer/libui/checkbox_text_column_proxy.rb +0 -76
- data/lib/glimmer/libui/color_button_proxy.rb +0 -64
- data/lib/glimmer/libui/column.rb +0 -51
- data/lib/glimmer/libui/date_time_picker_proxy.rb +0 -68
- data/lib/glimmer/libui/font_button_proxy.rb +0 -68
- data/lib/glimmer/libui/image_column_proxy.rb +0 -40
- data/lib/glimmer/libui/image_text_column_proxy.rb +0 -44
- data/lib/glimmer/libui/label_proxy.rb +0 -41
- data/lib/glimmer/libui/menu_proxy.rb +0 -41
- data/lib/glimmer/libui/non_wrapping_multiline_entry_proxy.rb +0 -32
- data/lib/glimmer/libui/path_proxy.rb +0 -169
- data/lib/glimmer/libui/preferences_menu_item_proxy.rb +0 -37
- data/lib/glimmer/libui/separator_menu_item_proxy.rb +0 -37
- data/lib/glimmer/libui/tab_item_proxy.rb +0 -67
- data/lib/glimmer/libui/table_proxy.rb +0 -180
- data/lib/glimmer/libui/text_column_proxy.rb +0 -42
- data/lib/glimmer/libui/window_proxy.rb +0 -119
@@ -1,169 +0,0 @@
|
|
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
|
-
# Proxy for LibUI path objects
|
27
|
-
#
|
28
|
-
# Follows the Proxy Design Pattern
|
29
|
-
class PathProxy < ControlProxy
|
30
|
-
# TODO support mode without parent proxy
|
31
|
-
def initialize(keyword, parent, args, &block)
|
32
|
-
@keyword = keyword
|
33
|
-
@parent_proxy = parent
|
34
|
-
@args = args
|
35
|
-
@block = block
|
36
|
-
@enabled = true
|
37
|
-
post_add_content if @block.nil?
|
38
|
-
end
|
39
|
-
|
40
|
-
def post_initialize_child(child)
|
41
|
-
super
|
42
|
-
children << child
|
43
|
-
end
|
44
|
-
|
45
|
-
def post_add_content
|
46
|
-
super
|
47
|
-
if @parent_proxy.nil? && area_draw_params
|
48
|
-
draw(area_draw_params)
|
49
|
-
destroy
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def children
|
54
|
-
@children ||= []
|
55
|
-
end
|
56
|
-
|
57
|
-
def draw(area_draw_params)
|
58
|
-
build_control
|
59
|
-
children.each {|child| child.draw(area_draw_params)}
|
60
|
-
::LibUI.draw_path_end(@libui)
|
61
|
-
::LibUI.draw_fill(area_draw_params[:context], @libui, fill_draw_brush.to_ptr) unless fill.empty?
|
62
|
-
::LibUI.draw_stroke(area_draw_params[:context], @libui, stroke_draw_brush, draw_stroke_params) unless stroke.empty?
|
63
|
-
::LibUI.draw_free_path(@libui)
|
64
|
-
end
|
65
|
-
|
66
|
-
def draw_fill_mode
|
67
|
-
@args[0].is_a?(Integer) ? @args[0] : @args[0].to_s == 'alternate' ? 1 : 0
|
68
|
-
end
|
69
|
-
|
70
|
-
def fill(args = nil)
|
71
|
-
if args.nil?
|
72
|
-
@fill ||= {}
|
73
|
-
else
|
74
|
-
@fill = args
|
75
|
-
@fill[:a] = 1.0 if @fill[:a].nil?
|
76
|
-
@parent_proxy&.queue_redraw_all
|
77
|
-
end
|
78
|
-
@fill.tap do
|
79
|
-
@fill_observer ||= Glimmer::DataBinding::Observer.proc do
|
80
|
-
@parent_proxy&.queue_redraw_all
|
81
|
-
end
|
82
|
-
@fill_observer.observe(@fill)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
alias fill= fill
|
86
|
-
alias set_fill fill
|
87
|
-
|
88
|
-
def fill_draw_brush
|
89
|
-
@fill_draw_brush ||= ::LibUI::FFI::DrawBrush.malloc
|
90
|
-
init_draw_brush(@fill_draw_brush, @fill)
|
91
|
-
@fill_draw_brush
|
92
|
-
end
|
93
|
-
|
94
|
-
def stroke(args = nil)
|
95
|
-
if args.nil?
|
96
|
-
@stroke ||= {}
|
97
|
-
else
|
98
|
-
@stroke = args
|
99
|
-
@stroke[:a] = 1.0 if @stroke[:a].nil?
|
100
|
-
@parent_proxy&.queue_redraw_all
|
101
|
-
end
|
102
|
-
@stroke.tap do
|
103
|
-
@stroke_observer ||= Glimmer::DataBinding::Observer.proc do
|
104
|
-
@parent_proxy&.queue_redraw_all
|
105
|
-
end
|
106
|
-
@stroke_observer.observe(@stroke)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
alias stroke= stroke
|
110
|
-
alias set_stroke stroke
|
111
|
-
|
112
|
-
def stroke_draw_brush
|
113
|
-
@stroke_draw_brush ||= ::LibUI::FFI::DrawBrush.malloc
|
114
|
-
init_draw_brush(@stroke_draw_brush, @stroke)
|
115
|
-
@stroke_draw_brush
|
116
|
-
end
|
117
|
-
|
118
|
-
def draw_stroke_params
|
119
|
-
@draw_stroke_params ||= ::LibUI::FFI::DrawStrokeParams.malloc
|
120
|
-
@draw_stroke_params.Cap = @stroke[:cap] || 0 # flat
|
121
|
-
@draw_stroke_params.Join = @stroke[:join] || 0 # miter
|
122
|
-
@draw_stroke_params.Thickness = @stroke[:thickness] || 1
|
123
|
-
@draw_stroke_params.MiterLimit = @stroke[:miter_limit] || 10 # DEFAULT_MITER_LIMIT
|
124
|
-
@draw_stroke_params_dashes ||= Fiddle::Pointer.malloc(8)
|
125
|
-
@draw_stroke_params.Dashes = @draw_stroke_params_dashes
|
126
|
-
@draw_stroke_params.NumDashes = @stroke[:num_dashes] || 0 # TODO reimplement this line correctly (perhaps no need to pass num dashes, yet dashes themselves and use their count here)
|
127
|
-
@draw_stroke_params.DashPhase = @stroke[:dash_phase] || 0
|
128
|
-
@draw_stroke_params
|
129
|
-
end
|
130
|
-
|
131
|
-
# returns area_draw_params if built inside on_draw listener (not needed if declared outside)
|
132
|
-
def area_draw_params
|
133
|
-
@args[0] if @parent_proxy.nil?
|
134
|
-
end
|
135
|
-
|
136
|
-
def destroy
|
137
|
-
@parent_proxy.children.delete(self) unless @parent_proxy.nil?
|
138
|
-
ControlProxy.control_proxies.delete(self)
|
139
|
-
end
|
140
|
-
|
141
|
-
private
|
142
|
-
|
143
|
-
def build_control
|
144
|
-
@libui = ::LibUI.draw_new_path(draw_fill_mode)
|
145
|
-
end
|
146
|
-
|
147
|
-
def init_draw_brush(draw_brush, draw_brush_args)
|
148
|
-
case draw_brush_args[:type]
|
149
|
-
when Integer
|
150
|
-
draw_brush.Type = draw_brush_args[:type]
|
151
|
-
when :solid, 'solid'
|
152
|
-
draw_brush.Type = 0
|
153
|
-
when :linear_gradient, 'linear_gradient'
|
154
|
-
draw_brush.Type = 1
|
155
|
-
when :radial_gradient, 'radial_gradient'
|
156
|
-
draw_brush.Type = 2
|
157
|
-
when :image, 'image'
|
158
|
-
draw_brush.Type = 3
|
159
|
-
else
|
160
|
-
draw_brush.Type = 0
|
161
|
-
end
|
162
|
-
draw_brush.R = (draw_brush_args[:r] || draw_brush_args[:red]).to_f / 255.0
|
163
|
-
draw_brush.G = (draw_brush_args[:g] || draw_brush_args[:green]).to_f / 255.0
|
164
|
-
draw_brush.B = (draw_brush_args[:b] || draw_brush_args[:blue]).to_f / 255.0
|
165
|
-
draw_brush.A = (draw_brush_args[:a] || draw_brush_args[:alpha])
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
@@ -1,37 +0,0 @@
|
|
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/menu_item_proxy'
|
23
|
-
|
24
|
-
module Glimmer
|
25
|
-
module LibUI
|
26
|
-
# Proxy for LibUI preferences menu item object
|
27
|
-
#
|
28
|
-
# Follows the Proxy Design Pattern
|
29
|
-
class PreferencesMenuItemProxy < MenuItemProxy
|
30
|
-
private
|
31
|
-
|
32
|
-
def build_control
|
33
|
-
@libui = @parent_proxy.append_preferences_item(*@args)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,37 +0,0 @@
|
|
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/menu_item_proxy'
|
23
|
-
|
24
|
-
module Glimmer
|
25
|
-
module LibUI
|
26
|
-
# Proxy for LibUI separator menu item object
|
27
|
-
#
|
28
|
-
# Follows the Proxy Design Pattern
|
29
|
-
class SeparatorMenuItemProxy < MenuItemProxy
|
30
|
-
private
|
31
|
-
|
32
|
-
def build_control
|
33
|
-
@libui = @parent_proxy.append_separator(*@args)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,67 +0,0 @@
|
|
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/horizontal_box_proxy'
|
24
|
-
|
25
|
-
module Glimmer
|
26
|
-
module LibUI
|
27
|
-
# Proxy for LibUI tab item objects
|
28
|
-
#
|
29
|
-
# Follows the Proxy Design Pattern
|
30
|
-
class TabItemProxy < ControlProxy
|
31
|
-
attr_reader :index
|
32
|
-
|
33
|
-
def initialize(keyword, parent, args, &block)
|
34
|
-
@keyword = keyword
|
35
|
-
@parent_proxy = parent
|
36
|
-
@args = args
|
37
|
-
@block = block
|
38
|
-
@enabled = 1
|
39
|
-
@index = @parent_proxy.num_pages
|
40
|
-
@content = @block&.call
|
41
|
-
build_control
|
42
|
-
end
|
43
|
-
|
44
|
-
def name
|
45
|
-
@args.first
|
46
|
-
end
|
47
|
-
|
48
|
-
def margined(value = nil)
|
49
|
-
if value.nil?
|
50
|
-
@parent_proxy.margined(@index)
|
51
|
-
else
|
52
|
-
@parent_proxy.margined(@index, value)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
alias set_margined margined
|
56
|
-
alias margined= margined
|
57
|
-
alias margined? margined
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def build_control
|
62
|
-
@content = HorizontalBoxProxy.new('horizontal_box', @libui, []) if @content.nil?
|
63
|
-
@libui = @parent_proxy.append(name, @content.libui)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,180 +0,0 @@
|
|
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/data_binding/observer'
|
24
|
-
require 'glimmer/fiddle_consumer'
|
25
|
-
|
26
|
-
using ArrayIncludeMethods
|
27
|
-
|
28
|
-
module Glimmer
|
29
|
-
module LibUI
|
30
|
-
# Proxy for LibUI table objects
|
31
|
-
#
|
32
|
-
# Follows the Proxy Design Pattern
|
33
|
-
class TableProxy < ControlProxy
|
34
|
-
include Glimmer::FiddleConsumer
|
35
|
-
|
36
|
-
attr_reader :model_handler, :model, :table_params, :columns
|
37
|
-
|
38
|
-
def initialize(keyword, parent, args, &block)
|
39
|
-
@keyword = keyword
|
40
|
-
@parent_proxy = parent
|
41
|
-
@args = args
|
42
|
-
@block = block
|
43
|
-
@enabled = true
|
44
|
-
@columns = []
|
45
|
-
@cell_rows = []
|
46
|
-
window_proxy.on_destroy do
|
47
|
-
# the following unless condition is an exceptional condition stumbled upon that fails freeing the table model
|
48
|
-
::LibUI.free_table_model(@model) unless @destroyed && parent_proxy.is_a?(Glimmer::LibUI::Box)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def post_add_content
|
53
|
-
build_control
|
54
|
-
super
|
55
|
-
end
|
56
|
-
|
57
|
-
def post_initialize_child(child)
|
58
|
-
@columns << child
|
59
|
-
# add an extra complementary nil column if it is a dual column (i.e. ImageTextColumnProxy or CheckboxTextColumnProxy
|
60
|
-
@columns << nil if child.is_a?(DualColumn)
|
61
|
-
end
|
62
|
-
|
63
|
-
def destroy
|
64
|
-
super
|
65
|
-
@destroyed = true
|
66
|
-
end
|
67
|
-
|
68
|
-
def cell_rows(rows = nil)
|
69
|
-
if rows.nil?
|
70
|
-
@cell_rows
|
71
|
-
else
|
72
|
-
@cell_rows = rows
|
73
|
-
@cell_rows.tap do
|
74
|
-
@last_cell_rows = @cell_rows.clone
|
75
|
-
Glimmer::DataBinding::Observer.proc do
|
76
|
-
if @cell_rows.size < @last_cell_rows.size && @last_cell_rows.include_all?(*@cell_rows)
|
77
|
-
@last_cell_rows.array_diff_indexes(@cell_rows).reverse.each do |row|
|
78
|
-
::LibUI.table_model_row_deleted(model, row)
|
79
|
-
end
|
80
|
-
elsif @cell_rows.size > @last_cell_rows.size && @cell_rows.include_all?(*@last_cell_rows)
|
81
|
-
@cell_rows.array_diff_indexes(@last_cell_rows).each do |row|
|
82
|
-
::LibUI.table_model_row_inserted(model, row)
|
83
|
-
end
|
84
|
-
else
|
85
|
-
@cell_rows.each_with_index do |new_row_data, row|
|
86
|
-
::LibUI.table_model_row_changed(model, row) if new_row_data != @last_cell_rows[row]
|
87
|
-
end
|
88
|
-
end
|
89
|
-
@last_cell_rows = @cell_rows.clone
|
90
|
-
end.observe(self, :cell_rows)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
alias cell_rows= cell_rows
|
95
|
-
alias set_cell_rows cell_rows
|
96
|
-
|
97
|
-
def expanded_cell_rows
|
98
|
-
cell_rows.map do |row|
|
99
|
-
row.flatten(1)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def editable(value = nil)
|
104
|
-
if value.nil?
|
105
|
-
@editable
|
106
|
-
else
|
107
|
-
@editable = !!value
|
108
|
-
end
|
109
|
-
end
|
110
|
-
alias editable= editable
|
111
|
-
alias set_editable editable
|
112
|
-
alias editable? editable
|
113
|
-
|
114
|
-
private
|
115
|
-
|
116
|
-
def build_control
|
117
|
-
@model_handler = ::LibUI::FFI::TableModelHandler.malloc
|
118
|
-
@model_handler.NumColumns = fiddle_closure_block_caller(4) { @columns.map {|c| c.is_a?(DualColumn) ? 2 : 1}.sum }
|
119
|
-
@model_handler.ColumnType = fiddle_closure_block_caller(4, [1, 1, 4]) do |_, _, column|
|
120
|
-
case @columns[column]
|
121
|
-
when TextColumnProxy, ButtonColumnProxy, NilClass
|
122
|
-
0
|
123
|
-
when ImageColumnProxy, ImageTextColumnProxy
|
124
|
-
1
|
125
|
-
when CheckboxColumnProxy, CheckboxTextColumnProxy, ProgressBarColumnProxy
|
126
|
-
2
|
127
|
-
end
|
128
|
-
end
|
129
|
-
@model_handler.NumRows = fiddle_closure_block_caller(4) { cell_rows.count }
|
130
|
-
@model_handler.CellValue = fiddle_closure_block_caller(1, [1, 1, 4, 4]) do |_, _, row, column|
|
131
|
-
the_cell_rows = expanded_cell_rows
|
132
|
-
case @columns[column]
|
133
|
-
when TextColumnProxy, ButtonColumnProxy, NilClass
|
134
|
-
::LibUI.new_table_value_string((expanded_cell_rows[row] && expanded_cell_rows[row][column]).to_s)
|
135
|
-
when ImageColumnProxy, ImageTextColumnProxy
|
136
|
-
::LibUI.new_table_value_image((expanded_cell_rows[row] && (expanded_cell_rows[row][column].respond_to?(:libui) ? expanded_cell_rows[row][column].libui : expanded_cell_rows[row][column])))
|
137
|
-
when CheckboxColumnProxy, CheckboxTextColumnProxy
|
138
|
-
::LibUI.new_table_value_int((expanded_cell_rows[row] && (expanded_cell_rows[row][column] == 1 || expanded_cell_rows[row][column].to_s.strip.downcase == 'true' ? 1 : 0)))
|
139
|
-
when ProgressBarColumnProxy
|
140
|
-
::LibUI.new_table_value_int((expanded_cell_rows[row] && (expanded_cell_rows[row][column].to_i)))
|
141
|
-
end
|
142
|
-
end
|
143
|
-
@model_handler.SetCellValue = fiddle_closure_block_caller(0, [1, 1, 4, 4, 1]) do |_, _, row, column, val|
|
144
|
-
case @columns[column]
|
145
|
-
when TextColumnProxy
|
146
|
-
column = @columns[column].index
|
147
|
-
@cell_rows[row] ||= []
|
148
|
-
@cell_rows[row][column] = ::LibUI.table_value_string(val).to_s
|
149
|
-
when NilClass
|
150
|
-
column = @columns[column - 1].index
|
151
|
-
@cell_rows[row][column][1] = ::LibUI.table_value_string(val).to_s
|
152
|
-
when ButtonColumnProxy
|
153
|
-
@columns[column].notify_listeners(:on_clicked, row)
|
154
|
-
when CheckboxColumnProxy, CheckboxTextColumnProxy
|
155
|
-
column = @columns[column].index
|
156
|
-
@cell_rows[row] ||= []
|
157
|
-
@cell_rows[row][column] = ::LibUI.table_value_int(val).to_i == 1
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
@model = ::LibUI.new_table_model(@model_handler)
|
162
|
-
|
163
|
-
@table_params = ::LibUI::FFI::TableParams.malloc
|
164
|
-
@table_params.Model = @model
|
165
|
-
@table_params.RowBackgroundColorModelColumn = -1
|
166
|
-
|
167
|
-
@libui = ControlProxy.new_control(@keyword, [@table_params])
|
168
|
-
@libui.tap do
|
169
|
-
@columns.each {|column| column&.send(:build_control) }
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def next_column_index
|
174
|
-
@next_column_index ||= -1
|
175
|
-
@next_column_index += 1
|
176
|
-
end
|
177
|
-
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
@@ -1,42 +0,0 @@
|
|
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/column'
|
24
|
-
require 'glimmer/libui/editable_column'
|
25
|
-
|
26
|
-
module Glimmer
|
27
|
-
module LibUI
|
28
|
-
# Proxy for LibUI text column objects
|
29
|
-
#
|
30
|
-
# Follows the Proxy Design Pattern
|
31
|
-
class TextColumnProxy < ControlProxy
|
32
|
-
include Column
|
33
|
-
include EditableColumn
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def build_control
|
38
|
-
@parent_proxy.append_text_column(name, column_index, editable_value)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,119 +0,0 @@
|
|
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
|
-
# Proxy for LibUI window objects
|
27
|
-
#
|
28
|
-
# Follows the Proxy Design Pattern
|
29
|
-
class WindowProxy < ControlProxy
|
30
|
-
DEFAULT_TITLE = ''
|
31
|
-
DEFAULT_WIDTH = 150
|
32
|
-
DEFAULT_HEIGHT = 150
|
33
|
-
DEFAULT_HAS_MENUBAR = 1
|
34
|
-
|
35
|
-
def post_initialize_child(child)
|
36
|
-
::LibUI.window_set_child(@libui, child.libui)
|
37
|
-
end
|
38
|
-
|
39
|
-
def destroy_child(child)
|
40
|
-
::LibUI.send("window_set_child", @libui, nil)
|
41
|
-
super
|
42
|
-
end
|
43
|
-
|
44
|
-
def destroy
|
45
|
-
super
|
46
|
-
ControlProxy.image_proxies.each { |image_proxy| ::LibUI.free_image(image_proxy.libui) }
|
47
|
-
@on_destroy_procs&.each { |on_destroy_proc| on_destroy_proc.call(self)}
|
48
|
-
end
|
49
|
-
|
50
|
-
def on_destroy(&block)
|
51
|
-
# TODO look into a way to generalize this logic for multiple listeners
|
52
|
-
@on_destroy_procs ||= []
|
53
|
-
if block.nil?
|
54
|
-
@on_destroy_procs
|
55
|
-
else
|
56
|
-
@on_destroy_procs << block
|
57
|
-
block
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def show
|
62
|
-
super
|
63
|
-
unless @shown_at_least_once
|
64
|
-
@shown_at_least_once = true
|
65
|
-
::LibUI.main
|
66
|
-
::LibUI.quit
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def can_handle_listener?(listener_name)
|
71
|
-
listener_name == 'on_destroy' || super
|
72
|
-
end
|
73
|
-
|
74
|
-
def handle_listener(listener_name, &listener)
|
75
|
-
case listener_name
|
76
|
-
when 'on_destroy'
|
77
|
-
on_destroy(&listener)
|
78
|
-
else
|
79
|
-
if listener_name == 'on_closing'
|
80
|
-
default_behavior_listener = Proc.new do
|
81
|
-
return_value = listener.call(self)
|
82
|
-
if return_value.is_a?(Numeric)
|
83
|
-
return_value
|
84
|
-
else
|
85
|
-
destroy
|
86
|
-
::LibUI.quit
|
87
|
-
0
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
super(listener_name, &default_behavior_listener)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
private
|
96
|
-
|
97
|
-
def build_control
|
98
|
-
if OS.mac? && ControlProxy.menu_proxies.empty?
|
99
|
-
menu_proxy = ControlProxy.create('menu', nil, [''])
|
100
|
-
quit_menu_item_proxy = ControlProxy.create('quit_menu_item', menu_proxy, [])
|
101
|
-
end
|
102
|
-
construction_args = @args.dup
|
103
|
-
construction_args[0] = DEFAULT_TITLE if construction_args.size == 0
|
104
|
-
construction_args[1] = DEFAULT_WIDTH if construction_args.size == 1
|
105
|
-
construction_args[2] = DEFAULT_HEIGHT if construction_args.size == 2
|
106
|
-
construction_args[3] = DEFAULT_HAS_MENUBAR if construction_args.size == 3
|
107
|
-
construction_args[3] = ControlProxy.boolean_to_integer(construction_args[3]) if construction_args.size == 4 && (construction_args[3].is_a?(TrueClass) || construction_args[3].is_a?(FalseClass))
|
108
|
-
@libui = ControlProxy.new_control(@keyword, construction_args)
|
109
|
-
@libui.tap do
|
110
|
-
handle_listener('on_closing') do
|
111
|
-
destroy
|
112
|
-
::LibUI.quit
|
113
|
-
0
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|