Class: Glimmer::LibUI::ControlProxy

Inherits:
Object
  • Object
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/triple_column.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/open_type_tag_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/open_type_features_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/column/text_color_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/column/background_color_column_proxy.rb,
lib/glimmer/libui/control_proxy/column/image_text_color_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/column/checkbox_text_color_column_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

Defined Under Namespace

Modules: Box, Column, DualColumn, EditableColumn, EnableableColumn, MessageBox, TripleColumn Classes: AreaProxy, ButtonProxy, CheckboxProxy, ColorButtonProxy, ComboboxProxy, DateTimePickerProxy, EditableComboboxProxy, EntryProxy, FontButtonProxy, FormProxy, GridProxy, GroupProxy, ImagePartProxy, ImageProxy, LabelProxy, MatrixProxy, MenuItemProxy, MenuProxy, MultilineEntryProxy, NonWrappingMultilineEntryProxy, OpenTypeFeaturesProxy, OpenTypeTagProxy, PathProxy, PreferencesMenuItemProxy, RadioButtonsProxy, TabItemProxy, TableProxy, TextProxy, WindowProxy

Constant Summary collapse

KEYWORD_ALIASES =
{
  'msg_box'       => 'message_box',
  'msg_box_error' => 'message_box_error',
}
BOOLEAN_PROPERTIES =
%w[
  padded
  checked
  enabled toplevel visible
  read_only
  margined
  borderless fullscreen
  stretchy
]
STRING_PROPERTIES =
%w[
  text
  title
]
TransformProxy =

alias

MatrixProxy

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(keyword, parent, args, &block) ⇒ ControlProxy

Returns a new instance of ControlProxy.



127
128
129
130
131
132
133
134
135
# File 'lib/glimmer/libui/control_proxy.rb', line 127

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



218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/glimmer/libui/control_proxy.rb', line 218

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

#argsObject (readonly)

libui returns the contained LibUI object



125
126
127
# File 'lib/glimmer/libui/control_proxy.rb', line 125

def args
  @args
end

#blockObject (readonly)

libui returns the contained LibUI object



125
126
127
# File 'lib/glimmer/libui/control_proxy.rb', line 125

def block
  @block
end

#keywordObject (readonly)

libui returns the contained LibUI object



125
126
127
# File 'lib/glimmer/libui/control_proxy.rb', line 125

def keyword
  @keyword
end

#libuiObject (readonly)

libui returns the contained LibUI object



125
126
127
# File 'lib/glimmer/libui/control_proxy.rb', line 125

def libui
  @libui
end

#parent_proxyObject (readonly)

libui returns the contained LibUI object



125
126
127
# File 'lib/glimmer/libui/control_proxy.rb', line 125

def parent_proxy
  @parent_proxy
end

Class Method Details

.constant_symbol(keyword) ⇒ Object



65
66
67
# File 'lib/glimmer/libui/control_proxy.rb', line 65

def constant_symbol(keyword)
  "#{keyword.camelcase(:upper)}Proxy".to_sym
end

.control_proxiesObject

autosave all controls in this array to avoid garbage collection



44
45
46
47
# File 'lib/glimmer/libui/control_proxy.rb', line 44

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_mapObject



73
74
75
# File 'lib/glimmer/libui/control_proxy.rb', line 73

def descendant_keyword_constant_map
  @descendant_keyword_constant_map ||= add_aliases_to_keyword_constant_map(map_descendant_keyword_constants_for(self))
end

.exists?(keyword) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
32
33
# File 'lib/glimmer/libui/control_proxy.rb', line 29

def exists?(keyword)
  ::LibUI.respond_to?("new_#{keyword}") or
    ::LibUI.respond_to?(keyword) or
    descendant_keyword_constant_map.keys.include?(keyword)
end

.image_proxiesObject



57
58
59
# File 'lib/glimmer/libui/control_proxy.rb', line 57

def image_proxies
  control_proxies.select {|c| c.keyword == 'image' }
end

.keyword(constant_symbol) ⇒ Object



69
70
71
# File 'lib/glimmer/libui/control_proxy.rb', line 69

def keyword(constant_symbol)
  constant_symbol.to_s.underscore.sub(/_proxy$/, '')
end

.main_window_proxyObject



49
50
51
# File 'lib/glimmer/libui/control_proxy.rb', line 49

def main_window_proxy
  control_proxies.find {|c| c.is_a?(WindowProxy)}
end

.map_descendant_keyword_constants_for(klass, accumulator: {}) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
# File 'lib/glimmer/libui/control_proxy.rb', line 82

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


53
54
55
# File 'lib/glimmer/libui/control_proxy.rb', line 53

def menu_proxies
  control_proxies.select {|c| c.keyword == 'menu' }
end

.new_control(keyword, args) ⇒ Object



61
62
63
# File 'lib/glimmer/libui/control_proxy.rb', line 61

def new_control(keyword, args)
  ::LibUI.send("new_#{keyword}", *args)
end

.reset_descendant_keyword_constant_mapObject



77
78
79
80
# File 'lib/glimmer/libui/control_proxy.rb', line 77

def reset_descendant_keyword_constant_map
  @descendant_keyword_constant_map = nil
  descendant_keyword_constant_map
end

.widget_proxy_class(keyword) ⇒ Object



39
40
41
# File 'lib/glimmer/libui/control_proxy.rb', line 39

def widget_proxy_class(keyword)
  descendant_keyword_constant_map[keyword] || ControlProxy
end

Instance Method Details

#append_propertiesObject



263
264
265
# File 'lib/glimmer/libui/control_proxy.rb', line 263

def append_properties
  @parent_proxy&.class&.constants&.include?(:APPEND_PROPERTIES) ? @parent_proxy.class::APPEND_PROPERTIES : []
end

#append_property(property, value = nil) ⇒ Object



267
268
269
270
271
272
273
274
275
276
277
# File 'lib/glimmer/libui/control_proxy.rb', line 267

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

Returns:

  • (Boolean)


155
156
157
158
159
# File 'lib/glimmer/libui/control_proxy.rb', line 155

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



332
333
334
# File 'lib/glimmer/libui/control_proxy.rb', line 332

def content(&block)
  Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::ControlExpression.new, @keyword, &block)
end

#custom_listener_aliasesObject



181
182
183
# File 'lib/glimmer/libui/control_proxy.rb', line 181

def custom_listener_aliases
  self.class.constants.include?(:LISTENER_ALIASES) ? self.class::LISTENER_ALIASES : {}
end

#custom_listenersObject



177
178
179
# File 'lib/glimmer/libui/control_proxy.rb', line 177

def custom_listeners
  self.class.constants.include?(:LISTENERS) ? self.class::LISTENERS : []
end

#default_destroyObject



295
296
297
298
# File 'lib/glimmer/libui/control_proxy.rb', line 295

def default_destroy
  send_to_libui('destroy')
  ControlProxy.control_proxies.delete(self)
end

#destroyObject



283
284
285
286
287
288
289
# File 'lib/glimmer/libui/control_proxy.rb', line 283

def destroy
  if parent_proxy.nil?
    default_destroy
  else
    parent_proxy.destroy_child(self)
  end
end

#destroy_child(child) ⇒ Object



291
292
293
# File 'lib/glimmer/libui/control_proxy.rb', line 291

def destroy_child(child)
  child.default_destroy
end

#enabled(value = nil) ⇒ Object Also known as: enabled?, set_enabled, enabled=



300
301
302
303
304
305
306
307
308
309
310
311
# File 'lib/glimmer/libui/control_proxy.rb', line 300

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



185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/glimmer/libui/control_proxy.rb', line 185

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



161
162
163
164
165
166
167
168
169
170
# File 'lib/glimmer/libui/control_proxy.rb', line 161

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

Returns:

  • (Boolean)


172
173
174
175
# File 'lib/glimmer/libui/control_proxy.rb', line 172

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_keywordObject



279
280
281
# File 'lib/glimmer/libui/control_proxy.rb', line 279

def libui_api_keyword
  @keyword
end

#post_add_contentObject

Subclasses may override to perform post add_content work (normally must call super)



138
139
140
# File 'lib/glimmer/libui/control_proxy.rb', line 138

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



143
144
145
# File 'lib/glimmer/libui/control_proxy.rb', line 143

def post_initialize_child(child)
  # No Op by default
end

#respond_to?(method_name, *args, &block) ⇒ Boolean

Returns:

  • (Boolean)


198
199
200
201
202
203
204
205
206
207
# File 'lib/glimmer/libui/control_proxy.rb', line 198

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

Returns:

  • (Boolean)


209
210
211
212
213
214
215
216
# File 'lib/glimmer/libui/control_proxy.rb', line 209

def respond_to_libui?(method_name, *args, &block)
  ::LibUI.respond_to?("control_#{method_name}") or
    (::LibUI.respond_to?("control_#{method_name.to_s.sub(/\?$/, '')}") && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, '')) ) or
    ::LibUI.respond_to?("control_set_#{method_name.to_s.sub(/=$/, '')}") or
    ::LibUI.respond_to?("#{libui_api_keyword}_#{method_name}") or
    (::LibUI.respond_to?("#{libui_api_keyword}_#{method_name.to_s.sub(/\?$/, '')}") && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, '')) ) or
    ::LibUI.respond_to?("#{libui_api_keyword}_set_#{method_name.to_s.sub(/=$/, '')}")
end

#send_to_libui(method_name, *args, &block) ⇒ Object



231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# File 'lib/glimmer/libui/control_proxy.rb', line 231

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))
    args[0] = '' if STRING_PROPERTIES.include?(property) && args.first == nil
    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))
    args[0] = '' if STRING_PROPERTIES.include?(property) && args.first == nil
    ::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=



316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/glimmer/libui/control_proxy.rb', line 316

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_proxyObject



147
148
149
150
151
152
153
# File 'lib/glimmer/libui/control_proxy.rb', line 147

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