Class: Glimmer::Gtk::WidgetProxy

Inherits:
Object
  • Object
show all
Defined in:
lib/glimmer/gtk/widget_proxy.rb,
lib/glimmer/gtk/widget_proxy/box_proxy.rb,
lib/glimmer/gtk/widget_proxy/window_proxy.rb,
lib/glimmer/gtk/widget_proxy/application_proxy.rb,
lib/glimmer/gtk/widget_proxy/drawing_area_proxy.rb,
lib/glimmer/gtk/widget_proxy/message_dialog_proxy.rb

Overview

Proxy for Gtk widget objects

Follows the Proxy Design Pattern

Defined Under Namespace

Classes: ApplicationProxy, BoxProxy, DrawingAreaProxy, MessageDialogProxy, WindowProxy

Constant Summary collapse

KEYWORD_ALIASES =
{
#         'msg_box'       => 'message_box',
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of WidgetProxy.



134
135
136
137
138
139
140
141
# 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

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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



171
172
173
174
175
176
177
178
179
# 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

Instance Attribute Details

#argsObject (readonly)

gtk returns the contained Gtk object



132
133
134
# File 'lib/glimmer/gtk/widget_proxy.rb', line 132

def args
  @args
end

#blockObject (readonly)

gtk returns the contained Gtk object



132
133
134
# File 'lib/glimmer/gtk/widget_proxy.rb', line 132

def block
  @block
end

#gtkObject (readonly)

gtk returns the contained Gtk object



132
133
134
# File 'lib/glimmer/gtk/widget_proxy.rb', line 132

def gtk
  @gtk
end

#keywordObject (readonly)

gtk returns the contained Gtk object



132
133
134
# File 'lib/glimmer/gtk/widget_proxy.rb', line 132

def keyword
  @keyword
end

#parent_proxyObject (readonly)

gtk returns the contained Gtk object



132
133
134
# File 'lib/glimmer/gtk/widget_proxy.rb', line 132

def parent_proxy
  @parent_proxy
end

Class Method Details

.constant_symbol(keyword) ⇒ Object



84
85
86
# 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) ⇒ Object



76
77
78
# 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_mapObject



96
97
98
# 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) ⇒ Boolean

Returns:

  • (Boolean)


67
68
69
70
71
72
73
74
# 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) ⇒ Object



88
89
90
# File 'lib/glimmer/gtk/widget_proxy.rb', line 88

def gtk_constant_symbol(keyword)
  keyword.camelcase(:upper).to_sym
end

.keyword(constant_symbol) ⇒ Object



92
93
94
# 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: {}) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
# 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

.reset_descendant_keyword_constant_mapObject



100
101
102
103
# 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) ⇒ Object



80
81
82
# File 'lib/glimmer/gtk/widget_proxy.rb', line 80

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

Instance Method Details

#content(&block) ⇒ Object



185
186
187
# 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

#post_add_contentObject

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



144
145
146
# File 'lib/glimmer/gtk/widget_proxy.rb', line 144

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 (normally must also call super)



149
150
151
152
# 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) ⇒ Boolean

Returns:

  • (Boolean)


162
163
164
165
# 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) ⇒ Boolean

Returns:

  • (Boolean)


167
168
169
# 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) ⇒ Object



181
182
183
# 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_proxyObject



154
155
156
157
158
159
160
# 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