glimmer-dsl-libui 0.0.5 → 0.0.9
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -0
- data/README.md +259 -106
- data/VERSION +1 -1
- data/examples/basic_button.rb +1 -1
- data/examples/basic_entry.rb +3 -3
- data/examples/basic_window.rb +1 -1
- data/examples/basic_window2.rb +14 -0
- data/examples/control_gallery.rb +37 -53
- data/examples/meta_example.rb +57 -0
- data/examples/midi_player.rb +2 -2
- data/examples/simple_notepad.rb +1 -1
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/tab_item_expression.rb +1 -1
- data/lib/glimmer/libui/box.rb +12 -2
- data/lib/glimmer/libui/combobox_proxy.rb +3 -2
- data/lib/glimmer/libui/control_proxy.rb +96 -26
- data/lib/glimmer/libui/date_picker_proxy.rb +32 -0
- data/lib/glimmer/libui/date_time_picker_proxy.rb +35 -0
- data/lib/glimmer/libui/editable_combobox_proxy.rb +3 -2
- data/lib/glimmer/libui/group_proxy.rb +8 -0
- data/lib/glimmer/libui/multiline_entry_proxy.rb +35 -0
- data/lib/glimmer/libui/non_wrapping_multiline_entry_proxy.rb +32 -0
- data/lib/glimmer/libui/quit_menu_item_proxy.rb +4 -4
- data/lib/glimmer/libui/radio_buttons_proxy.rb +3 -2
- data/lib/glimmer/libui/tab_item_proxy.rb +4 -1
- data/lib/glimmer/libui/time_picker_proxy.rb +32 -0
- data/lib/glimmer/libui/window_proxy.rb +14 -2
- metadata +12 -5
data/examples/basic_entry.rb
CHANGED
@@ -4,10 +4,10 @@ require 'glimmer-dsl-libui'
|
|
4
4
|
|
5
5
|
include Glimmer
|
6
6
|
|
7
|
-
window('Basic Entry', 300, 50
|
7
|
+
window('Basic Entry', 300, 50) { |w|
|
8
8
|
horizontal_box {
|
9
9
|
e = entry {
|
10
|
-
# stretchy
|
10
|
+
# stretchy true # Smart default option for appending to horizontal_box
|
11
11
|
|
12
12
|
on_changed do
|
13
13
|
puts e.text
|
@@ -16,7 +16,7 @@ window('Basic Entry', 300, 50, 1) { |w|
|
|
16
16
|
}
|
17
17
|
|
18
18
|
button('Button') {
|
19
|
-
stretchy
|
19
|
+
stretchy false
|
20
20
|
|
21
21
|
on_clicked do
|
22
22
|
text = e.text
|
data/examples/basic_window.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'glimmer-dsl-libui'
|
4
|
+
|
5
|
+
include Glimmer
|
6
|
+
|
7
|
+
window { # first 3 args can be set via properties with 4th arg has_menubar=true by default
|
8
|
+
title 'hello world'
|
9
|
+
content_size 300, 200
|
10
|
+
|
11
|
+
on_closing do
|
12
|
+
puts 'Bye Bye'
|
13
|
+
end
|
14
|
+
}.show
|
data/examples/control_gallery.rb
CHANGED
@@ -31,8 +31,8 @@ menu('File') {
|
|
31
31
|
menu('Edit') {
|
32
32
|
check_menu_item('Checkable Item_')
|
33
33
|
separator_menu_item
|
34
|
-
menu_item('Disabled Item_') {
|
35
|
-
enabled
|
34
|
+
menu_item('Disabled Item_') {
|
35
|
+
enabled false
|
36
36
|
}
|
37
37
|
}
|
38
38
|
|
@@ -42,115 +42,99 @@ menu('Help') {
|
|
42
42
|
about_menu_item # Can optionally contain an on_clicked listener
|
43
43
|
}
|
44
44
|
|
45
|
-
MAIN_WINDOW = window('Control Gallery', 600, 500
|
46
|
-
margined
|
45
|
+
MAIN_WINDOW = window('Control Gallery', 600, 500) {
|
46
|
+
margined true
|
47
47
|
|
48
48
|
on_closing do
|
49
49
|
puts 'Bye Bye'
|
50
50
|
end
|
51
51
|
|
52
|
-
vertical_box {
|
53
|
-
padded 1
|
54
|
-
|
52
|
+
vertical_box {
|
55
53
|
horizontal_box {
|
56
|
-
padded 1
|
57
|
-
|
58
54
|
group('Basic Controls') {
|
59
|
-
margined 1
|
60
|
-
|
61
55
|
vertical_box {
|
62
|
-
padded 1
|
63
|
-
|
64
56
|
button('Button') {
|
65
|
-
stretchy
|
57
|
+
stretchy false
|
66
58
|
|
67
59
|
on_clicked do
|
68
60
|
msg_box(MAIN_WINDOW, 'Information', 'You clicked the button')
|
69
61
|
end
|
70
62
|
}
|
71
63
|
|
72
|
-
checkbox('Checkbox') {
|
73
|
-
stretchy
|
64
|
+
checkbox('Checkbox') {
|
65
|
+
stretchy false
|
74
66
|
|
75
|
-
on_toggled do
|
76
|
-
checked = c.checked
|
67
|
+
on_toggled do |c|
|
68
|
+
checked = c.checked?
|
77
69
|
MAIN_WINDOW.title = "Checkbox is #{checked}"
|
78
70
|
c.text = "I am the checkbox (#{checked})"
|
79
71
|
end
|
80
72
|
}
|
81
73
|
|
82
|
-
label('Label') { stretchy
|
74
|
+
label('Label') { stretchy false }
|
83
75
|
|
84
|
-
horizontal_separator { stretchy
|
76
|
+
horizontal_separator { stretchy false }
|
85
77
|
|
86
|
-
date_picker { stretchy
|
78
|
+
date_picker { stretchy false }
|
87
79
|
|
88
|
-
time_picker { stretchy
|
80
|
+
time_picker { stretchy false }
|
89
81
|
|
90
|
-
date_time_picker { stretchy
|
82
|
+
date_time_picker { stretchy false }
|
91
83
|
|
92
|
-
font_button { stretchy
|
84
|
+
font_button { stretchy false }
|
93
85
|
|
94
|
-
color_button { stretchy
|
86
|
+
color_button { stretchy false }
|
95
87
|
}
|
96
88
|
}
|
97
89
|
|
98
90
|
vertical_box {
|
99
|
-
padded 1
|
100
|
-
|
101
91
|
group('Numbers') {
|
102
|
-
stretchy
|
103
|
-
margined 1
|
92
|
+
stretchy false
|
104
93
|
|
105
94
|
vertical_box {
|
106
|
-
|
107
|
-
|
108
|
-
spinbox(0, 100) { |s|
|
109
|
-
stretchy 0
|
95
|
+
spinbox(0, 100) {
|
96
|
+
stretchy false
|
110
97
|
value 42
|
111
98
|
|
112
|
-
on_changed do
|
99
|
+
on_changed do |s|
|
113
100
|
puts "New Spinbox value: #{s.value}"
|
114
101
|
end
|
115
102
|
}
|
116
103
|
|
117
|
-
slider(0, 100) {
|
118
|
-
stretchy
|
104
|
+
slider(0, 100) {
|
105
|
+
stretchy false
|
119
106
|
|
120
|
-
on_changed do
|
107
|
+
on_changed do |s|
|
121
108
|
v = s.value
|
122
109
|
puts "New Slider value: #{v}"
|
123
110
|
@progress_bar.value = v
|
124
111
|
end
|
125
112
|
}
|
126
113
|
|
127
|
-
@progress_bar = progress_bar { stretchy
|
114
|
+
@progress_bar = progress_bar { stretchy false }
|
128
115
|
}
|
129
116
|
}
|
130
117
|
|
131
118
|
group('Lists') {
|
132
|
-
stretchy
|
133
|
-
margined 1
|
119
|
+
stretchy false
|
134
120
|
|
135
121
|
vertical_box {
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
stretchy 0
|
140
|
-
items ['combobox Item 1', 'combobox Item 2', 'combobox Item 3']
|
122
|
+
combobox {
|
123
|
+
stretchy false
|
124
|
+
items 'combobox Item 1', 'combobox Item 2', 'combobox Item 3' # also accepts a single array argument
|
141
125
|
|
142
|
-
on_selected do
|
126
|
+
on_selected do |c|
|
143
127
|
puts "New combobox selection: #{c.selected}"
|
144
128
|
end
|
145
129
|
}
|
146
130
|
|
147
131
|
editable_combobox {
|
148
|
-
stretchy
|
149
|
-
items
|
132
|
+
stretchy false
|
133
|
+
items 'Editable Item 1', 'Editable Item 2', 'Editable Item 3' # also accepts a single array argument
|
150
134
|
}
|
151
135
|
|
152
136
|
radio_buttons {
|
153
|
-
items
|
137
|
+
items 'Radio Button 1', 'Radio Button 2', 'Radio Button 3' # also accepts a single array argument
|
154
138
|
}
|
155
139
|
}
|
156
140
|
}
|
@@ -158,20 +142,20 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
|
|
158
142
|
tab {
|
159
143
|
tab_item('Page 1') {
|
160
144
|
horizontal_box {
|
161
|
-
entry {
|
145
|
+
entry {
|
162
146
|
text 'Please enter your feelings'
|
163
147
|
|
164
|
-
on_changed do
|
148
|
+
on_changed do |e|
|
165
149
|
puts "Current textbox data: '#{e.text}'"
|
166
150
|
end
|
167
151
|
}
|
168
152
|
}
|
169
153
|
}
|
170
|
-
|
154
|
+
|
171
155
|
tab_item('Page 2') {
|
172
156
|
horizontal_box
|
173
157
|
}
|
174
|
-
|
158
|
+
|
175
159
|
tab_item('Page 3') {
|
176
160
|
horizontal_box
|
177
161
|
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'glimmer-dsl-libui'
|
4
|
+
require 'facets'
|
5
|
+
|
6
|
+
class MetaExample
|
7
|
+
include Glimmer
|
8
|
+
|
9
|
+
def examples
|
10
|
+
if @examples.nil?
|
11
|
+
example_files = Dir.glob(File.join(File.expand_path('.', __dir__), '**', '*.rb'))
|
12
|
+
example_file_names = example_files.map { |f| File.basename(f, '.rb') }
|
13
|
+
example_file_names = example_file_names.reject { |f| f == 'meta_example' }
|
14
|
+
@examples = example_file_names.map { |f| f.underscore.titlecase }
|
15
|
+
end
|
16
|
+
@examples
|
17
|
+
end
|
18
|
+
|
19
|
+
def file_path_for(example)
|
20
|
+
File.join(File.expand_path('.', __dir__), "#{example.underscore}.rb")
|
21
|
+
end
|
22
|
+
|
23
|
+
def launch
|
24
|
+
window('Meta-Example', 700, 500) { |w|
|
25
|
+
margined true
|
26
|
+
|
27
|
+
horizontal_box {
|
28
|
+
vertical_box {
|
29
|
+
@rbs = radio_buttons {
|
30
|
+
stretchy false
|
31
|
+
items examples
|
32
|
+
selected 0
|
33
|
+
|
34
|
+
on_selected do
|
35
|
+
@nwme.text = File.read(file_path_for(@examples[@rbs.selected]))
|
36
|
+
end
|
37
|
+
}
|
38
|
+
button('Launch') {
|
39
|
+
stretchy false
|
40
|
+
|
41
|
+
on_clicked do
|
42
|
+
system "ruby -r puts_debuggerer -r #{File.expand_path('../lib/glimmer-dsl-libui', __dir__)} #{file_path_for(@examples[@rbs.selected])}"
|
43
|
+
end
|
44
|
+
}
|
45
|
+
}
|
46
|
+
vertical_box {
|
47
|
+
@nwme = non_wrapping_multiline_entry {
|
48
|
+
read_only true
|
49
|
+
text File.read(file_path_for(@examples[@rbs.selected]))
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}.show
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
MetaExample.new.launch
|
data/examples/midi_player.rb
CHANGED
@@ -56,10 +56,10 @@ class TinyMidiPlayer
|
|
56
56
|
end
|
57
57
|
}
|
58
58
|
}
|
59
|
-
@main_window = window('Tiny Midi Player', 200, 50
|
59
|
+
@main_window = window('Tiny Midi Player', 200, 50) {
|
60
60
|
horizontal_box {
|
61
61
|
vertical_box {
|
62
|
-
stretchy
|
62
|
+
stretchy false
|
63
63
|
|
64
64
|
button('▶') {
|
65
65
|
on_clicked do
|
data/examples/simple_notepad.rb
CHANGED
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|
@@ -27,7 +27,7 @@ module Glimmer
|
|
27
27
|
module Libui
|
28
28
|
class TabItemExpression < StaticExpression
|
29
29
|
def interpret(parent, keyword, *args, &block)
|
30
|
-
Glimmer::LibUI::TabItemProxy.
|
30
|
+
Glimmer::LibUI::TabItemProxy.create(keyword, parent, args, &block)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
data/lib/glimmer/libui/box.rb
CHANGED
@@ -19,19 +19,29 @@
|
|
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 LibUI
|
24
26
|
module Box
|
25
27
|
APPEND_PROPERTIES = %w[stretchy]
|
26
28
|
|
27
29
|
def post_initialize_child(child)
|
28
|
-
child.stretchy =
|
29
|
-
::LibUI.box_append(@libui, child.libui, child.stretchy)
|
30
|
+
child.stretchy = true if child.stretchy.nil?
|
31
|
+
::LibUI.box_append(@libui, child.libui, ControlProxy.boolean_to_integer(child.stretchy))
|
30
32
|
end
|
31
33
|
|
32
34
|
def libui_api_keyword
|
33
35
|
'box'
|
34
36
|
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def build_control
|
41
|
+
super.tap do
|
42
|
+
self.padded = true
|
43
|
+
end
|
44
|
+
end
|
35
45
|
end
|
36
46
|
end
|
37
47
|
end
|
@@ -27,8 +27,9 @@ module Glimmer
|
|
27
27
|
#
|
28
28
|
# Follows the Proxy Design Pattern
|
29
29
|
class ComboboxProxy < ControlProxy
|
30
|
-
def items(values
|
31
|
-
if values.
|
30
|
+
def items(*values)
|
31
|
+
values = values.first if values.first.is_a?(Array)
|
32
|
+
if values.empty?
|
32
33
|
@values
|
33
34
|
else
|
34
35
|
@values = values
|
@@ -33,7 +33,7 @@ module Glimmer
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def create(keyword, parent, args, &block)
|
36
|
-
widget_proxy_class(keyword).new(keyword, parent, args, &block)
|
36
|
+
widget_proxy_class(keyword).new(keyword, parent, args, &block).tap {|c| all_control_proxies << c}
|
37
37
|
end
|
38
38
|
|
39
39
|
def widget_proxy_class(keyword)
|
@@ -44,8 +44,41 @@ module Glimmer
|
|
44
44
|
Glimmer::LibUI::ControlProxy
|
45
45
|
end
|
46
46
|
end
|
47
|
+
|
48
|
+
# autosave all controls in this array to avoid garbage collection
|
49
|
+
def all_control_proxies
|
50
|
+
@@all_control_proxies = [] unless defined?(@@all_control_proxies)
|
51
|
+
@@all_control_proxies
|
52
|
+
end
|
53
|
+
|
54
|
+
def main_window_proxy
|
55
|
+
all_control_proxies.find {|c| c.is_a?(WindowProxy)}
|
56
|
+
end
|
57
|
+
|
58
|
+
def integer_to_boolean(int)
|
59
|
+
int.nil? ? nil : int == 1
|
60
|
+
end
|
61
|
+
|
62
|
+
def boolean_to_integer(bool)
|
63
|
+
bool.nil? ? nil : (bool ? 1 : 0)
|
64
|
+
end
|
47
65
|
end
|
48
66
|
|
67
|
+
BOOLEAN_PROPERTIES = %w[
|
68
|
+
padded
|
69
|
+
checked
|
70
|
+
enabled toplevel visible
|
71
|
+
read_only
|
72
|
+
margined
|
73
|
+
borderless fullscreen
|
74
|
+
stretchy
|
75
|
+
]
|
76
|
+
|
77
|
+
STRING_PROPERTIES = %w[
|
78
|
+
text
|
79
|
+
title
|
80
|
+
]
|
81
|
+
|
49
82
|
# libui returns the contained LibUI object
|
50
83
|
attr_reader :parent_proxy, :libui, :args, :keyword
|
51
84
|
|
@@ -54,11 +87,8 @@ module Glimmer
|
|
54
87
|
@parent_proxy = parent
|
55
88
|
@args = args
|
56
89
|
@block = block
|
57
|
-
@enabled =
|
90
|
+
@enabled = true
|
58
91
|
build_control
|
59
|
-
if @parent_proxy.class.constants.include?(:APPEND_PROPERTIES)
|
60
|
-
@parent_proxy.class::APPEND_PROPERTIES
|
61
|
-
end
|
62
92
|
post_add_content if @block.nil?
|
63
93
|
end
|
64
94
|
|
@@ -71,36 +101,53 @@ module Glimmer
|
|
71
101
|
def post_initialize_child(child)
|
72
102
|
# No Op by default
|
73
103
|
end
|
104
|
+
|
105
|
+
def window_proxy
|
106
|
+
found_proxy = self
|
107
|
+
until found_proxy.nil? || found_proxy.is_a?(WindowProxy)
|
108
|
+
found_proxy = found_proxy.parent_proxy
|
109
|
+
end
|
110
|
+
found_proxy
|
111
|
+
end
|
74
112
|
|
75
113
|
def can_handle_listener?(listener_name)
|
76
|
-
::LibUI.respond_to?("
|
114
|
+
::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}") ||
|
115
|
+
::LibUI.respond_to?("control_#{listener_name}")
|
77
116
|
end
|
78
117
|
|
79
118
|
def handle_listener(listener_name, &listener)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
119
|
+
safe_listener = Proc.new { listener.call(self) }
|
120
|
+
if ::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}")
|
121
|
+
::LibUI.send("#{libui_api_keyword}_#{listener_name}", @libui, &safe_listener)
|
122
|
+
elsif ::LibUI.respond_to?("control_#{listener_name}")
|
123
|
+
::LibUI.send("control_#{listener_name}", @libui, &safe_listener)
|
84
124
|
end
|
85
125
|
end
|
86
126
|
|
87
127
|
def respond_to?(method_name, *args, &block)
|
88
128
|
respond_to_libui?(method_name, *args, &block) ||
|
89
|
-
(
|
90
|
-
|
129
|
+
(
|
130
|
+
append_properties.include?(method_name.to_s) ||
|
131
|
+
(append_properties.include?(method_name.to_s.sub(/\?$/, '')) && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, ''))) ||
|
132
|
+
append_properties.include?(method_name.to_s.sub(/=$/, ''))
|
133
|
+
) ||
|
134
|
+
super(method_name, true)
|
91
135
|
end
|
92
136
|
|
93
137
|
def respond_to_libui?(method_name, *args, &block)
|
94
138
|
::LibUI.respond_to?("control_#{method_name}") ||
|
139
|
+
(::LibUI.respond_to?("control_#{method_name.to_s.sub(/\?$/, '')}") && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, '')) ) ||
|
140
|
+
::LibUI.respond_to?("control_set_#{method_name.to_s.sub(/=$/, '')}") ||
|
95
141
|
::LibUI.respond_to?("#{libui_api_keyword}_#{method_name}") ||
|
96
|
-
::LibUI.respond_to?("#{libui_api_keyword}
|
142
|
+
(::LibUI.respond_to?("#{libui_api_keyword}_#{method_name.to_s.sub(/\?$/, '')}") && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, '')) ) ||
|
97
143
|
::LibUI.respond_to?("#{libui_api_keyword}_set_#{method_name.to_s.sub(/=$/, '')}")
|
98
144
|
end
|
99
145
|
|
100
146
|
def method_missing(method_name, *args, &block)
|
101
147
|
if respond_to_libui?(method_name, *args, &block)
|
102
148
|
send_to_libui(method_name, *args, &block)
|
103
|
-
elsif
|
149
|
+
elsif append_properties.include?(method_name.to_s) ||
|
150
|
+
append_properties.include?(method_name.to_s.sub(/(=|\?)$/, ''))
|
104
151
|
append_property(method_name, *args)
|
105
152
|
else
|
106
153
|
super
|
@@ -108,17 +155,25 @@ module Glimmer
|
|
108
155
|
end
|
109
156
|
|
110
157
|
def send_to_libui(method_name, *args, &block)
|
111
|
-
if ::LibUI.respond_to?("#{libui_api_keyword}_#{method_name}") && args.empty?
|
112
|
-
|
113
|
-
|
114
|
-
|
158
|
+
if ::LibUI.respond_to?("#{libui_api_keyword}_#{method_name.to_s.sub(/\?$/, '')}") && args.empty?
|
159
|
+
property = method_name.to_s.sub(/\?$/, '')
|
160
|
+
value = ::LibUI.send("#{libui_api_keyword}_#{property}", @libui, *args)
|
161
|
+
handle_string_property(property, handle_boolean_property(property, value))
|
115
162
|
elsif ::LibUI.respond_to?("#{libui_api_keyword}_set_#{method_name.to_s.sub(/=$/, '')}") && !args.empty?
|
116
|
-
|
117
|
-
|
118
|
-
::LibUI.send("#{libui_api_keyword}
|
163
|
+
property = method_name.to_s.sub(/=$/, '')
|
164
|
+
args[0] = ControlProxy.boolean_to_integer(args.first) if BOOLEAN_PROPERTIES.include?(property) && (args.first.is_a?(TrueClass) || args.first.is_a?(FalseClass))
|
165
|
+
::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args)
|
119
166
|
elsif ::LibUI.respond_to?("#{libui_api_keyword}_#{method_name}") && !args.empty?
|
120
167
|
::LibUI.send("#{libui_api_keyword}_#{method_name}", @libui, *args)
|
121
|
-
elsif ::LibUI.respond_to?("control_#{method_name}")
|
168
|
+
elsif ::LibUI.respond_to?("control_#{method_name.to_s.sub(/\?$/, '')}") && args.empty?
|
169
|
+
property = method_name.to_s.sub(/\?$/, '')
|
170
|
+
value = ::LibUI.send("control_#{method_name.to_s.sub(/\?$/, '')}", @libui, *args)
|
171
|
+
handle_string_property(property, handle_boolean_property(property, value))
|
172
|
+
elsif ::LibUI.respond_to?("control_set_#{method_name.to_s.sub(/=$/, '')}")
|
173
|
+
property = method_name.to_s.sub(/=$/, '')
|
174
|
+
args[0] = ControlProxy.boolean_to_integer(args.first) if BOOLEAN_PROPERTIES.include?(property) && (args.first.is_a?(TrueClass) || args.first.is_a?(FalseClass))
|
175
|
+
::LibUI.send("control_set_#{method_name.to_s.sub(/=$/, '')}", @libui, *args)
|
176
|
+
elsif ::LibUI.respond_to?("control_#{method_name}") && !args.empty?
|
122
177
|
::LibUI.send("control_#{method_name}", @libui, *args)
|
123
178
|
end
|
124
179
|
end
|
@@ -128,11 +183,13 @@ module Glimmer
|
|
128
183
|
end
|
129
184
|
|
130
185
|
def append_property(property, value = nil)
|
131
|
-
property = property.to_s.sub(
|
186
|
+
property = property.to_s.sub(/(=|\?)$/, '')
|
132
187
|
@append_property_hash ||= {}
|
133
188
|
if value.nil?
|
134
|
-
@append_property_hash[property]
|
189
|
+
value = @append_property_hash[property]
|
190
|
+
handle_string_property(property, handle_boolean_property(property, value))
|
135
191
|
else
|
192
|
+
value = ControlProxy.boolean_to_integer(value) if BOOLEAN_PROPERTIES.include?(property) && (value.is_a?(TrueClass) || value.is_a?(FalseClass))
|
136
193
|
@append_property_hash[property] = value
|
137
194
|
end
|
138
195
|
end
|
@@ -145,7 +202,7 @@ module Glimmer
|
|
145
202
|
if value.nil?
|
146
203
|
@enabled
|
147
204
|
elsif value != @enabled
|
148
|
-
if value == 1
|
205
|
+
if value == 1 || value
|
149
206
|
send_to_libui('enable')
|
150
207
|
else
|
151
208
|
send_to_libui('disable')
|
@@ -161,7 +218,7 @@ module Glimmer
|
|
161
218
|
if value.nil?
|
162
219
|
current_value
|
163
220
|
elsif value != current_value
|
164
|
-
if value == 1
|
221
|
+
if value == 1 || value
|
165
222
|
send_to_libui('show')
|
166
223
|
else
|
167
224
|
send_to_libui('hide')
|
@@ -172,6 +229,11 @@ module Glimmer
|
|
172
229
|
alias set_visible visible
|
173
230
|
alias visible= visible
|
174
231
|
|
232
|
+
def destroy
|
233
|
+
send_to_libui('destroy')
|
234
|
+
self.class.all_control_proxies.delete(self)
|
235
|
+
end
|
236
|
+
|
175
237
|
private
|
176
238
|
|
177
239
|
def build_control
|
@@ -182,6 +244,14 @@ module Glimmer
|
|
182
244
|
::LibUI.send(@keyword, *@args)
|
183
245
|
end
|
184
246
|
end
|
247
|
+
|
248
|
+
def handle_boolean_property(property, value)
|
249
|
+
BOOLEAN_PROPERTIES.include?(property) ? ControlProxy.integer_to_boolean(value) : value
|
250
|
+
end
|
251
|
+
|
252
|
+
def handle_string_property(property, value)
|
253
|
+
STRING_PROPERTIES.include?(property) ? value.to_s : value
|
254
|
+
end
|
185
255
|
end
|
186
256
|
end
|
187
257
|
end
|
@@ -0,0 +1,32 @@
|
|
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/date_time_picker_proxy'
|
23
|
+
|
24
|
+
module Glimmer
|
25
|
+
module LibUI
|
26
|
+
# Proxy for LibUI date picker objects
|
27
|
+
#
|
28
|
+
# Follows the Proxy Design Pattern
|
29
|
+
class DatePickerProxy < DateTimePickerProxy
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
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 date time picker objects
|
27
|
+
#
|
28
|
+
# Follows the Proxy Design Pattern
|
29
|
+
class DateTimePickerProxy < ControlProxy
|
30
|
+
def libui_api_keyword
|
31
|
+
'date_time_picker'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -27,8 +27,9 @@ module Glimmer
|
|
27
27
|
#
|
28
28
|
# Follows the Proxy Design Pattern
|
29
29
|
class EditableComboboxProxy < ControlProxy
|
30
|
-
def items(values
|
31
|
-
if values.
|
30
|
+
def items(*values)
|
31
|
+
values = values.first if values.first.is_a?(Array)
|
32
|
+
if values.empty?
|
32
33
|
@values
|
33
34
|
else
|
34
35
|
@values = values
|