Class: Glimmer::LibUI::ControlProxy
- Inherits:
-
Object
- Object
- Glimmer::LibUI::ControlProxy
show all
- Defined in:
- lib/glimmer/libui/control_proxy.rb,
lib/glimmer/libui/control_proxy/box.rb,
lib/glimmer/libui/control_proxy/column.rb,
lib/glimmer/libui/control_proxy/area_proxy.rb,
lib/glimmer/libui/control_proxy/form_proxy.rb,
lib/glimmer/libui/control_proxy/grid_proxy.rb,
lib/glimmer/libui/control_proxy/menu_proxy.rb,
lib/glimmer/libui/control_proxy/path_proxy.rb,
lib/glimmer/libui/control_proxy/text_proxy.rb,
lib/glimmer/libui/control_proxy/dual_column.rb,
lib/glimmer/libui/control_proxy/entry_proxy.rb,
lib/glimmer/libui/control_proxy/group_proxy.rb,
lib/glimmer/libui/control_proxy/image_proxy.rb,
lib/glimmer/libui/control_proxy/label_proxy.rb,
lib/glimmer/libui/control_proxy/message_box.rb,
lib/glimmer/libui/control_proxy/table_proxy.rb,
lib/glimmer/libui/control_proxy/button_proxy.rb,
lib/glimmer/libui/control_proxy/matrix_proxy.rb,
lib/glimmer/libui/control_proxy/window_proxy.rb,
lib/glimmer/libui/control_proxy/checkbox_proxy.rb,
lib/glimmer/libui/control_proxy/combobox_proxy.rb,
lib/glimmer/libui/control_proxy/tab_item_proxy.rb,
lib/glimmer/libui/control_proxy/editable_column.rb,
lib/glimmer/libui/control_proxy/menu_item_proxy.rb,
lib/glimmer/libui/control_proxy/image_part_proxy.rb,
lib/glimmer/libui/control_proxy/enableable_column.rb,
lib/glimmer/libui/control_proxy/font_button_proxy.rb,
lib/glimmer/libui/control_proxy/color_button_proxy.rb,
lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb,
lib/glimmer/libui/control_proxy/multiline_entry_proxy.rb,
lib/glimmer/libui/control_proxy/box/vertical_box_proxy.rb,
lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb,
lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb,
lib/glimmer/libui/control_proxy/box/horizontal_box_proxy.rb,
lib/glimmer/libui/control_proxy/column/text_column_proxy.rb,
lib/glimmer/libui/control_proxy/column/image_column_proxy.rb,
lib/glimmer/libui/control_proxy/message_box/msg_box_proxy.rb,
lib/glimmer/libui/control_proxy/column/button_column_proxy.rb,
lib/glimmer/libui/control_proxy/column/checkbox_column_proxy.rb,
lib/glimmer/libui/control_proxy/column/image_text_column_proxy.rb,
lib/glimmer/libui/control_proxy/entry_proxy/search_entry_proxy.rb,
lib/glimmer/libui/control_proxy/area_proxy/scrolling_area_proxy.rb,
lib/glimmer/libui/control_proxy/message_box/msg_box_error_proxy.rb,
lib/glimmer/libui/control_proxy/column/progress_bar_column_proxy.rb,
lib/glimmer/libui/control_proxy/entry_proxy/password_entry_proxy.rb,
lib/glimmer/libui/control_proxy/column/checkbox_text_column_proxy.rb,
lib/glimmer/libui/control_proxy/menu_item_proxy/quit_menu_item_proxy.rb,
lib/glimmer/libui/control_proxy/menu_item_proxy/about_menu_item_proxy.rb,
lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb,
lib/glimmer/libui/control_proxy/menu_item_proxy/radio_menu_item_proxy.rb,
lib/glimmer/libui/control_proxy/date_time_picker_proxy/date_picker_proxy.rb,
lib/glimmer/libui/control_proxy/date_time_picker_proxy/time_picker_proxy.rb,
lib/glimmer/libui/control_proxy/menu_item_proxy/separator_menu_item_proxy.rb,
lib/glimmer/libui/control_proxy/menu_item_proxy/preferences_menu_item_proxy.rb,
lib/glimmer/libui/control_proxy/multiline_entry_proxy/non_wrapping_multiline_entry_proxy.rb
Overview
Proxy for LibUI control objects
Follows the Proxy Design Pattern
Direct Known Subclasses
AreaProxy, Box::HorizontalBoxProxy, Box::VerticalBoxProxy, ButtonProxy, CheckboxProxy, ColorButtonProxy, Column::ButtonColumnProxy, Column::CheckboxColumnProxy, Column::CheckboxTextColumnProxy, Column::ImageColumnProxy, Column::ImageTextColumnProxy, Column::ProgressBarColumnProxy, Column::TextColumnProxy, ComboboxProxy, DateTimePickerProxy, EditableComboboxProxy, EntryProxy, FontButtonProxy, FormProxy, GridProxy, GroupProxy, ImagePartProxy, ImageProxy, LabelProxy, MatrixProxy, MenuItemProxy, MenuProxy, MessageBox::MsgBoxErrorProxy, MessageBox::MsgBoxProxy, MultilineEntryProxy, PathProxy, RadioButtonsProxy, TabItemProxy, TableProxy, TextProxy, WindowProxy
Defined Under Namespace
Modules: Box, Column, DualColumn, EditableColumn, EnableableColumn, MessageBox
Classes: AreaProxy, ButtonProxy, CheckboxProxy, ColorButtonProxy, ComboboxProxy, DateTimePickerProxy, EditableComboboxProxy, EntryProxy, FontButtonProxy, FormProxy, GridProxy, GroupProxy, ImagePartProxy, ImageProxy, LabelProxy, MatrixProxy, MenuItemProxy, MenuProxy, MultilineEntryProxy, NonWrappingMultilineEntryProxy, PathProxy, PreferencesMenuItemProxy, RadioButtonsProxy, TabItemProxy, TableProxy, TextProxy, WindowProxy
Constant Summary
collapse
- BOOLEAN_PROPERTIES =
%w[
padded
checked
enabled toplevel visible
read_only
margined
borderless fullscreen
stretchy
]
- STRING_PROPERTIES =
%w[
text
title
]
- TransformProxy =
MatrixProxy
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#append_properties ⇒ Object
-
#append_property(property, value = nil) ⇒ Object
-
#can_handle_listener?(listener_name) ⇒ Boolean
-
#content(&block) ⇒ Object
-
#custom_listener_aliases ⇒ Object
-
#custom_listeners ⇒ Object
-
#default_destroy ⇒ Object
-
#destroy ⇒ Object
-
#destroy_child(child) ⇒ Object
-
#enabled(value = nil) ⇒ Object
(also: #enabled?, #set_enabled, #enabled=)
-
#handle_custom_listener(listener_name, &listener) ⇒ Object
-
#handle_listener(listener_name, &listener) ⇒ Object
-
#has_custom_listener?(listener_name) ⇒ Boolean
-
#initialize(keyword, parent, args, &block) ⇒ ControlProxy
constructor
A new instance of ControlProxy.
-
#libui_api_keyword ⇒ Object
-
#method_missing(method_name, *args, &block) ⇒ Object
-
#post_add_content ⇒ Object
Subclasses may override to perform post add_content work (normally must call super).
-
#post_initialize_child(child) ⇒ Object
Subclasses may override to perform post initialization work on an added child.
-
#respond_to?(method_name, *args, &block) ⇒ Boolean
-
#respond_to_libui?(method_name, *args, &block) ⇒ Boolean
-
#send_to_libui(method_name, *args, &block) ⇒ Object
-
#visible(value = nil) ⇒ Object
(also: #visible?, #set_visible, #visible=)
-
#window_proxy ⇒ Object
Constructor Details
#initialize(keyword, parent, args, &block) ⇒ ControlProxy
Returns a new instance of ControlProxy.
114
115
116
117
118
119
120
121
122
|
# File 'lib/glimmer/libui/control_proxy.rb', line 114
def initialize(keyword, parent, args, &block)
@keyword = keyword
@parent_proxy = parent
@args = args
@block = block
@enabled = true
build_control
post_add_content if @block.nil?
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args, &block) ⇒ Object
205
206
207
208
209
210
211
212
213
214
215
216
|
# File 'lib/glimmer/libui/control_proxy.rb', line 205
def method_missing(method_name, *args, &block)
if respond_to_libui?(method_name, *args, &block)
send_to_libui(method_name, *args, &block)
elsif append_properties.include?(method_name.to_s) ||
append_properties.include?(method_name.to_s.sub(/(=|\?)$/, ''))
append_property(method_name, *args)
elsif can_handle_listener?(method_name.to_s)
handle_listener(method_name.to_s, &block)
else
super
end
end
|
Instance Attribute Details
#args ⇒ Object
libui returns the contained LibUI object
112
113
114
|
# File 'lib/glimmer/libui/control_proxy.rb', line 112
def args
@args
end
|
#block ⇒ Object
libui returns the contained LibUI object
112
113
114
|
# File 'lib/glimmer/libui/control_proxy.rb', line 112
def block
@block
end
|
#keyword ⇒ Object
libui returns the contained LibUI object
112
113
114
|
# File 'lib/glimmer/libui/control_proxy.rb', line 112
def keyword
@keyword
end
|
#libui ⇒ Object
libui returns the contained LibUI object
112
113
114
|
# File 'lib/glimmer/libui/control_proxy.rb', line 112
def libui
@libui
end
|
#parent_proxy ⇒ Object
libui returns the contained LibUI object
112
113
114
|
# File 'lib/glimmer/libui/control_proxy.rb', line 112
def parent_proxy
@parent_proxy
end
|
Class Method Details
.constant_symbol(keyword) ⇒ Object
66
67
68
|
# File 'lib/glimmer/libui/control_proxy.rb', line 66
def constant_symbol(keyword)
"#{keyword.camelcase(:upper)}Proxy".to_sym
end
|
.control_proxies ⇒ Object
autosave all controls in this array to avoid garbage collection
45
46
47
48
|
# File 'lib/glimmer/libui/control_proxy.rb', line 45
def control_proxies
@@control_proxies = [] unless defined?(@@control_proxies)
@@control_proxies
end
|
.create(keyword, parent, args, &block) ⇒ Object
35
36
37
|
# File 'lib/glimmer/libui/control_proxy.rb', line 35
def create(keyword, parent, args, &block)
widget_proxy_class(keyword).new(keyword, parent, args, &block).tap {|c| control_proxies << c}
end
|
.descendant_keyword_constant_map ⇒ Object
74
75
76
|
# File 'lib/glimmer/libui/control_proxy.rb', line 74
def descendant_keyword_constant_map
@descendant_keyword_constant_map ||= map_descendant_keyword_constants_for(self)
end
|
.exists?(keyword) ⇒ Boolean
29
30
31
32
33
|
# File 'lib/glimmer/libui/control_proxy.rb', line 29
def exists?(keyword)
::LibUI.respond_to?("new_#{keyword}") ||
::LibUI.respond_to?(keyword) ||
descendant_keyword_constant_map.keys.include?(keyword)
end
|
.image_proxies ⇒ Object
58
59
60
|
# File 'lib/glimmer/libui/control_proxy.rb', line 58
def image_proxies
control_proxies.select {|c| c.keyword == 'image' }
end
|
.keyword(constant_symbol) ⇒ Object
70
71
72
|
# File 'lib/glimmer/libui/control_proxy.rb', line 70
def keyword(constant_symbol)
constant_symbol.to_s.underscore.sub(/_proxy$/, '')
end
|
.main_window_proxy ⇒ Object
50
51
52
|
# File 'lib/glimmer/libui/control_proxy.rb', line 50
def main_window_proxy
control_proxies.find {|c| c.is_a?(WindowProxy)}
end
|
.map_descendant_keyword_constants_for(klass, accumulator: {}) ⇒ Object
83
84
85
86
87
88
89
90
91
92
93
|
# File 'lib/glimmer/libui/control_proxy.rb', line 83
def map_descendant_keyword_constants_for(klass, accumulator: {})
klass.constants.map do |constant_symbol|
[constant_symbol, klass.const_get(constant_symbol)]
end.select do |constant_symbol, constant|
constant.is_a?(Module) && !accumulator.values.include?(constant)
end.each do |constant_symbol, constant|
accumulator[keyword(constant_symbol)] = constant
map_descendant_keyword_constants_for(constant, accumulator: accumulator)
end
accumulator
end
|
54
55
56
|
# File 'lib/glimmer/libui/control_proxy.rb', line 54
def
control_proxies.select {|c| c.keyword == 'menu' }
end
|
.new_control(keyword, args) ⇒ Object
62
63
64
|
# File 'lib/glimmer/libui/control_proxy.rb', line 62
def new_control(keyword, args)
::LibUI.send("new_#{keyword}", *args)
end
|
.reset_descendant_keyword_constant_map ⇒ Object
78
79
80
81
|
# File 'lib/glimmer/libui/control_proxy.rb', line 78
def reset_descendant_keyword_constant_map
@descendant_keyword_constant_map = nil
descendant_keyword_constant_map
end
|
39
40
41
42
|
# File 'lib/glimmer/libui/control_proxy.rb', line 39
def widget_proxy_class(keyword)
class_name = constant_symbol(keyword)
descendant_keyword_constant_map[keyword] || ControlProxy
end
|
Instance Method Details
#append_properties ⇒ Object
248
249
250
|
# File 'lib/glimmer/libui/control_proxy.rb', line 248
def append_properties
@parent_proxy&.class&.constants&.include?(:APPEND_PROPERTIES) ? @parent_proxy.class::APPEND_PROPERTIES : []
end
|
#append_property(property, value = nil) ⇒ Object
252
253
254
255
256
257
258
259
260
261
262
|
# File 'lib/glimmer/libui/control_proxy.rb', line 252
def append_property(property, value = nil)
property = property.to_s.sub(/(=|\?)$/, '')
@append_property_hash ||= {}
if value.nil?
value = @append_property_hash[property]
handle_string_property(property, handle_boolean_property(property, value))
else
value = Glimmer::LibUI.boolean_to_integer(value) if BOOLEAN_PROPERTIES.include?(property) && (value.is_a?(TrueClass) || value.is_a?(FalseClass))
@append_property_hash[property] = value
end
end
|
#can_handle_listener?(listener_name) ⇒ Boolean
142
143
144
145
146
|
# File 'lib/glimmer/libui/control_proxy.rb', line 142
def can_handle_listener?(listener_name)
::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}") ||
::LibUI.respond_to?("control_#{listener_name}") ||
has_custom_listener?(listener_name)
end
|
#content(&block) ⇒ Object
#custom_listener_aliases ⇒ Object
168
169
170
|
# File 'lib/glimmer/libui/control_proxy.rb', line 168
def custom_listener_aliases
self.class.constants.include?(:LISTENER_ALIASES) ? self.class::LISTENER_ALIASES : {}
end
|
#custom_listeners ⇒ Object
164
165
166
|
# File 'lib/glimmer/libui/control_proxy.rb', line 164
def custom_listeners
self.class.constants.include?(:LISTENERS) ? self.class::LISTENERS : []
end
|
#default_destroy ⇒ Object
280
281
282
283
|
# File 'lib/glimmer/libui/control_proxy.rb', line 280
def default_destroy
send_to_libui('destroy')
ControlProxy.control_proxies.delete(self)
end
|
#destroy ⇒ Object
268
269
270
271
272
273
274
|
# File 'lib/glimmer/libui/control_proxy.rb', line 268
def destroy
if parent_proxy.nil?
default_destroy
else
parent_proxy.destroy_child(self)
end
end
|
#destroy_child(child) ⇒ Object
276
277
278
|
# File 'lib/glimmer/libui/control_proxy.rb', line 276
def destroy_child(child)
child.default_destroy
end
|
#enabled(value = nil) ⇒ Object
Also known as:
enabled?, set_enabled, enabled=
285
286
287
288
289
290
291
292
293
294
295
296
|
# File 'lib/glimmer/libui/control_proxy.rb', line 285
def enabled(value = nil)
if value.nil?
@enabled
elsif value != @enabled
@enabled = value == 1 || value
if value == 1 || value
send_to_libui('enable')
else
send_to_libui('disable')
end
end
end
|
#handle_custom_listener(listener_name, &listener) ⇒ Object
172
173
174
175
176
177
178
179
180
181
182
183
|
# File 'lib/glimmer/libui/control_proxy.rb', line 172
def handle_custom_listener(listener_name, &listener)
listener_name = listener_name.to_s
listener_name = custom_listener_aliases.stringify_keys[listener_name] || listener_name
instance_variable_name = "@#{listener_name}_procs"
instance_variable_set(instance_variable_name, []) if instance_variable_get(instance_variable_name).nil?
if listener.nil?
instance_variable_get(instance_variable_name)
else
instance_variable_get(instance_variable_name) << listener
listener
end
end
|
#handle_listener(listener_name, &listener) ⇒ Object
148
149
150
151
152
153
154
155
156
157
|
# File 'lib/glimmer/libui/control_proxy.rb', line 148
def handle_listener(listener_name, &listener)
safe_listener = Proc.new { listener.call(self) }
if ::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}")
::LibUI.send("#{libui_api_keyword}_#{listener_name}", @libui, &safe_listener)
elsif ::LibUI.respond_to?("control_#{listener_name}")
::LibUI.send("control_#{listener_name}", @libui, &safe_listener)
elsif has_custom_listener?(listener_name)
handle_custom_listener(listener_name, &listener)
end
end
|
#has_custom_listener?(listener_name) ⇒ Boolean
159
160
161
162
|
# File 'lib/glimmer/libui/control_proxy.rb', line 159
def has_custom_listener?(listener_name)
listener_name = listener_name.to_s
custom_listeners.include?(listener_name) || custom_listener_aliases.stringify_keys.keys.include?(listener_name)
end
|
#libui_api_keyword ⇒ Object
264
265
266
|
# File 'lib/glimmer/libui/control_proxy.rb', line 264
def libui_api_keyword
@keyword
end
|
#post_add_content ⇒ Object
Subclasses may override to perform post add_content work (normally must call super)
125
126
127
|
# File 'lib/glimmer/libui/control_proxy.rb', line 125
def post_add_content
@parent_proxy&.post_initialize_child(self)
end
|
#post_initialize_child(child) ⇒ Object
Subclasses may override to perform post initialization work on an added child
130
131
132
|
# File 'lib/glimmer/libui/control_proxy.rb', line 130
def post_initialize_child(child)
end
|
#respond_to?(method_name, *args, &block) ⇒ Boolean
185
186
187
188
189
190
191
192
193
194
|
# File 'lib/glimmer/libui/control_proxy.rb', line 185
def respond_to?(method_name, *args, &block)
respond_to_libui?(method_name, *args, &block) ||
(
append_properties.include?(method_name.to_s) ||
(append_properties.include?(method_name.to_s.sub(/\?$/, '')) && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, ''))) ||
append_properties.include?(method_name.to_s.sub(/=$/, ''))
) ||
can_handle_listener?(method_name.to_s) ||
super(method_name, true)
end
|
#respond_to_libui?(method_name, *args, &block) ⇒ Boolean
196
197
198
199
200
201
202
203
|
# File 'lib/glimmer/libui/control_proxy.rb', line 196
def respond_to_libui?(method_name, *args, &block)
::LibUI.respond_to?("control_#{method_name}") ||
(::LibUI.respond_to?("control_#{method_name.to_s.sub(/\?$/, '')}") && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, '')) ) ||
::LibUI.respond_to?("control_set_#{method_name.to_s.sub(/=$/, '')}") ||
::LibUI.respond_to?("#{libui_api_keyword}_#{method_name}") ||
(::LibUI.respond_to?("#{libui_api_keyword}_#{method_name.to_s.sub(/\?$/, '')}") && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, '')) ) ||
::LibUI.respond_to?("#{libui_api_keyword}_set_#{method_name.to_s.sub(/=$/, '')}")
end
|
#send_to_libui(method_name, *args, &block) ⇒ Object
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
|
# File 'lib/glimmer/libui/control_proxy.rb', line 218
def send_to_libui(method_name, *args, &block)
if ::LibUI.respond_to?("#{libui_api_keyword}_#{method_name.to_s.sub(/\?$/, '')}") && args.empty?
property = method_name.to_s.sub(/\?$/, '')
value = ::LibUI.send("#{libui_api_keyword}_#{property}", @libui, *args)
handle_string_property(property, handle_boolean_property(property, value))
elsif ::LibUI.respond_to?("#{libui_api_keyword}_set_#{method_name.to_s.sub(/=$/, '')}") && !args.empty?
property = method_name.to_s.sub(/=$/, '')
args[0] = Glimmer::LibUI.boolean_to_integer(args.first) if BOOLEAN_PROPERTIES.include?(property) && (args.first.is_a?(TrueClass) || args.first.is_a?(FalseClass))
if property.to_s == 'checked'
current_value = Glimmer::LibUI.integer_to_boolean(::LibUI.send("#{libui_api_keyword}_checked", @libui))
new_value = Glimmer::LibUI.integer_to_boolean(args[0])
::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args) if new_value != current_value
else
::LibUI.send("#{libui_api_keyword}_set_#{property}", @libui, *args)
end
elsif ::LibUI.respond_to?("#{libui_api_keyword}_#{method_name}") && !args.empty?
::LibUI.send("#{libui_api_keyword}_#{method_name}", @libui, *args)
elsif ::LibUI.respond_to?("control_#{method_name.to_s.sub(/\?$/, '')}") && args.empty?
property = method_name.to_s.sub(/\?$/, '')
value = ::LibUI.send("control_#{property}", @libui, *args)
handle_string_property(property, handle_boolean_property(property, value))
elsif ::LibUI.respond_to?("control_set_#{method_name.to_s.sub(/=$/, '')}")
property = method_name.to_s.sub(/=$/, '')
args[0] = Glimmer::LibUI.boolean_to_integer(args.first) if BOOLEAN_PROPERTIES.include?(property) && (args.first.is_a?(TrueClass) || args.first.is_a?(FalseClass))
::LibUI.send("control_set_#{method_name.to_s.sub(/=$/, '')}", @libui, *args)
elsif ::LibUI.respond_to?("control_#{method_name}") && !args.empty?
::LibUI.send("control_#{method_name}", @libui, *args)
end
end
|
#visible(value = nil) ⇒ Object
Also known as:
visible?, set_visible, visible=
301
302
303
304
305
306
307
308
309
310
311
312
|
# File 'lib/glimmer/libui/control_proxy.rb', line 301
def visible(value = nil)
current_value = send_to_libui('visible')
if value.nil?
current_value
elsif value != current_value
if value == 1 || value
send_to_libui('show')
else
send_to_libui('hide')
end
end
end
|
#window_proxy ⇒ Object
134
135
136
137
138
139
140
|
# File 'lib/glimmer/libui/control_proxy.rb', line 134
def window_proxy
found_proxy = self
until found_proxy.nil? || found_proxy.is_a?(WindowProxy)
found_proxy = found_proxy.parent_proxy
end
found_proxy
end
|