class Glimmer::Gtk::WidgetProxy

Proxy for Gtk widget objects

Follows the Proxy Design Pattern

Constants

KEYWORD_ALIASES

Attributes

args[R]

gtk returns the contained Gtk object

block[R]

gtk returns the contained Gtk object

gtk[R]

gtk returns the contained Gtk object

keyword[R]

gtk returns the contained Gtk object

parent_proxy[R]

gtk returns the contained Gtk object

Public Class Methods

constant_symbol(keyword) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 84
def constant_symbol(keyword)
  "#{keyword.camelcase(:upper)}Proxy".to_sym
end
create(keyword, parent, args, &block) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 76
def create(keyword, parent, args, &block)
  widget_proxy_class(keyword).new(keyword, parent, args, &block)
end
descendant_keyword_constant_map() click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 96
def descendant_keyword_constant_map
  @descendant_keyword_constant_map ||= add_aliases_to_keyword_constant_map(map_descendant_keyword_constants_for(self))
end
exist?(keyword) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 67
def exist?(keyword)
  ::Gtk.const_get(gtk_constant_symbol(keyword)) ||
    widget_proxy_class(keyword)
rescue => e
  Glimmer::Config.logger.debug {"No widget exists for keyword: #{keyword}"}
  Glimmer::Config.logger.debug {e.full_message}
  false
end
gtk_constant_symbol(keyword) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 88
def gtk_constant_symbol(keyword)
  keyword.camelcase(:upper).to_sym
end
keyword(constant_symbol) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 92
def keyword(constant_symbol)
  constant_symbol.to_s.underscore.sub(/_proxy$/, '')
end
map_descendant_keyword_constants_for(klass, accumulator: {}) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 105
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
new(keyword, parent, args, &block) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 134
def initialize(keyword, parent, args, &block)
  @keyword = keyword
  @parent_proxy = parent
  @args = args
  @block = block
  build_widget
  post_add_content if @block.nil?
end
reset_descendant_keyword_constant_map() click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 100
def reset_descendant_keyword_constant_map
  @descendant_keyword_constant_map = nil
  descendant_keyword_constant_map
end
widget_proxy_class(keyword) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 80
def widget_proxy_class(keyword)
  descendant_keyword_constant_map[keyword] || WidgetProxy
end

Private Class Methods

add_aliases_to_keyword_constant_map(keyword_constant_map) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 119
def add_aliases_to_keyword_constant_map(keyword_constant_map)
  KEYWORD_ALIASES.each do |keyword, alias_keyword|
    keyword_constant_map[alias_keyword] = keyword_constant_map[keyword]
  end
  keyword_constant_map
end

Public Instance Methods

content(&block) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 185
def content(&block)
  Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Gtk::WidgetExpression.new, @keyword, &block)
end
method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/glimmer/gtk/widget_proxy.rb, line 171
def method_missing(method_name, *args, &block)
  if @gtk.respond_to?("set_#{method_name}", true) && !args.empty?
    send_to_gtk("set_#{method_name}", *args, &block)
  elsif @gtk.respond_to?(method_name, true)
    send_to_gtk(method_name, *args, &block)
  else
    super
  end
end
post_add_content() click to toggle source

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

# File lib/glimmer/gtk/widget_proxy.rb, line 144
def post_add_content
  @parent_proxy&.post_initialize_child(self)
end
post_initialize_child(child) click to toggle source

Subclasses may override to perform post initialization work on an added child (normally must also call super)

# File lib/glimmer/gtk/widget_proxy.rb, line 149
def post_initialize_child(child)
  @gtk.add(child.gtk) if @gtk.respond_to?(:add) # && child.keyword != 'menu' # TODO consider moving this code to a MenuProxy
  child.gtk&.show if child.gtk&.respond_to?(:show)
end
respond_to?(method_name, include_private = false, &block) click to toggle source
Calls superclass method
# File lib/glimmer/gtk/widget_proxy.rb, line 162
def respond_to?(method_name, include_private = false, &block)
  respond_to_gtk?(method_name, include_private, &block) ||
    super(method_name, include_private)
end
respond_to_gtk?(method_name, include_private = false, &block) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 167
def respond_to_gtk?(method_name, include_private = false, &block)
  @gtk.respond_to?(method_name, include_private) || @gtk.respond_to?("set_#{method_name}", include_private)
end
send_to_gtk(method_name, *args, &block) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 181
def send_to_gtk(method_name, *args, &block)
  @gtk.send(method_name, *args, &block)
end
window_proxy() click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 154
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

Private Instance Methods

build_widget() click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 191
def build_widget
  @gtk = ::Gtk.const_get(WidgetProxy.gtk_constant_symbol(@keyword)).new(*normalize_args(@args))
end
normalize_args(args) click to toggle source
# File lib/glimmer/gtk/widget_proxy.rb, line 195
def normalize_args(args)
  if args.size == 1 && args.first.is_a?(Hash)
    hash_arg = args.first
    hash_arg = Hash[hash_arg.map do |key, value|
      normalized_value = value.respond_to?(:gtk) ? value.gtk : value
      [key, normalized_value]
    end]
    args[0] = hash_arg
    args
  elsif args.is_a?(Array)
    args.map do |arg|
      arg.is_a?(WidgetProxy) ? arg.gtk : arg
    end
  else
    args
  end
end