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/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

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 =

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.



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

#argsObject (readonly)

libui returns the contained LibUI object



112
113
114
# File 'lib/glimmer/libui/control_proxy.rb', line 112

def args
  @args
end

#blockObject (readonly)

libui returns the contained LibUI object



112
113
114
# File 'lib/glimmer/libui/control_proxy.rb', line 112

def block
  @block
end

#keywordObject (readonly)

libui returns the contained LibUI object



112
113
114
# File 'lib/glimmer/libui/control_proxy.rb', line 112

def keyword
  @keyword
end

#libuiObject (readonly)

libui returns the contained LibUI object



112
113
114
# File 'lib/glimmer/libui/control_proxy.rb', line 112

def libui
  @libui
end

#parent_proxyObject (readonly)

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_proxiesObject

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_mapObject



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

Returns:

  • (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_proxiesObject



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_proxyObject



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 menu_proxies
  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_mapObject



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

.widget_proxy_class(keyword) ⇒ Object



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_propertiesObject



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

Returns:

  • (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



317
318
319
# File 'lib/glimmer/libui/control_proxy.rb', line 317

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

#custom_listener_aliasesObject



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_listenersObject



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_destroyObject



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

#destroyObject



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

Returns:

  • (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_keywordObject



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

def libui_api_keyword
  @keyword
end

#post_add_contentObject

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)
  # No Op by default
end

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

Returns:

  • (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

Returns:

  • (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_proxyObject



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