Class: Glimmer::LibUI::Shape

Inherits:
Object
  • Object
show all
Includes:
Parent
Defined in:
lib/glimmer/libui/shape.rb,
lib/glimmer/libui/shape/arc.rb,
lib/glimmer/libui/shape/line.rb,
lib/glimmer/libui/shape/bezier.rb,
lib/glimmer/libui/shape/circle.rb,
lib/glimmer/libui/shape/figure.rb,
lib/glimmer/libui/shape/square.rb,
lib/glimmer/libui/shape/polygon.rb,
lib/glimmer/libui/shape/polyline.rb,
lib/glimmer/libui/shape/rectangle.rb,
lib/glimmer/libui/shape/polybezier.rb

Overview

Represents LibUI lightweight shape objects nested under path (e.g. line, rectangle, arc, bezier)

Direct Known Subclasses

Arc, Bezier, Circle, Figure, Line, Polybezier, Polygon, Polyline, Rectangle, Square

Defined Under Namespace

Classes: Arc, Bezier, Circle, Figure, Line, Polybezier, Polygon, Polyline, Rectangle, Square

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Parent

#children

Constructor Details

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

Returns a new instance of Shape.



70
71
72
73
74
75
76
77
78
# File 'lib/glimmer/libui/shape.rb', line 70

def initialize(keyword, parent, args, &block)
  @keyword = keyword
  @parent = parent
  @args = args
  @block = block
  set_parameter_defaults
  build_control if implicit_path?
  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



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/glimmer/libui/shape.rb', line 147

def method_missing(method_name, *args, &block)
  method_name_parameter = method_name.to_s.sub(/=$/, '').sub(/^set_/, '').to_sym
  if self.class.parameters.include?(method_name_parameter)
    method_name = method_name.to_s
    parameter_index = self.class.parameters.index(method_name_parameter)
    if method_name.start_with?('set_') || method_name.end_with?('=') || !args.empty?
      args = [args] if args.size > 1
      if args.first != @args[parameter_index]
        @args[parameter_index] = args.first
        request_auto_redraw
      end
    else
      @args[parameter_index]
    end
  else # TODO consider if there is a need to redirect anything to path proxy or delete this TODO
    super
  end
end

Instance Attribute Details

#argsObject (readonly)

Returns the value of attribute args.



68
69
70
# File 'lib/glimmer/libui/shape.rb', line 68

def args
  @args
end

#blockObject (readonly)

Returns the value of attribute block.



68
69
70
# File 'lib/glimmer/libui/shape.rb', line 68

def block
  @block
end

#keywordObject (readonly)

Returns the value of attribute keyword.



68
69
70
# File 'lib/glimmer/libui/shape.rb', line 68

def keyword
  @keyword
end

#parentObject (readonly)

Returns the value of attribute parent.



68
69
70
# File 'lib/glimmer/libui/shape.rb', line 68

def parent
  @parent
end

Class Method Details

.constant_symbol(keyword) ⇒ Object



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

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

.create(keyword, parent, args, &block) ⇒ Object



37
38
39
# File 'lib/glimmer/libui/shape.rb', line 37

def create(keyword, parent, args, &block)
  shape_class(keyword).new(keyword, parent, args, &block)
end

.exists?(keyword) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
34
35
# File 'lib/glimmer/libui/shape.rb', line 31

def exists?(keyword)
  Shape.constants.include?(constant_symbol(keyword)) and
    shape_class(keyword).respond_to?(:ancestors) and
    shape_class(keyword).ancestors.include?(Shape)
end

.parameter_defaults(*defaults) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/glimmer/libui/shape.rb', line 53

def parameter_defaults(*defaults)
  if defaults.empty?
    @parameter_defaults
  else
    @parameter_defaults = defaults
  end
end

.parameters(*params) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/glimmer/libui/shape.rb', line 45

def parameters(*params)
  if params.empty?
    @parameters
  else
    @parameters = params
  end
end

.shape_class(keyword) ⇒ Object



41
42
43
# File 'lib/glimmer/libui/shape.rb', line 41

def shape_class(keyword)
  Shape.const_get(constant_symbol(keyword))
end

Instance Method Details

#area_proxyObject



116
117
118
# File 'lib/glimmer/libui/shape.rb', line 116

def area_proxy
  find_parent_in_ancestors { |parent| parent.nil? || parent.is_a?(ControlProxy::AreaProxy) }
end

#content(&block) ⇒ Object



94
95
96
97
# File 'lib/glimmer/libui/shape.rb', line 94

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

#destroyObject



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

def destroy
  @parent.children.delete(self)
end

#draw(area_draw_params) ⇒ Object

Subclasses must override to perform draw work and call super afterwards to ensure calling destroy when semi-declarative in an on_draw method



100
101
102
# File 'lib/glimmer/libui/shape.rb', line 100

def draw(area_draw_params)
  destroy if area_proxy.nil?
end

#fill(*args) ⇒ Object Also known as: fill=, set_fill



124
125
126
# File 'lib/glimmer/libui/shape.rb', line 124

def fill(*args)
  path_proxy.fill(*args)
end

#path_proxyObject



120
121
122
# File 'lib/glimmer/libui/shape.rb', line 120

def path_proxy
  find_parent_in_ancestors { |parent| parent.nil? || parent.is_a?(ControlProxy::PathProxy) }
end

#post_add_contentObject

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



81
82
83
84
# File 'lib/glimmer/libui/shape.rb', line 81

def post_add_content
  @parent&.post_initialize_child(self)
  @parent.post_add_content if implicit_path? && dynamic?
end

#post_initialize_child(child, add_child: true) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/glimmer/libui/shape.rb', line 86

def post_initialize_child(child, add_child: true)
  if child.is_a?(ControlProxy::MatrixProxy)
    path_proxy.post_initialize_child(child, add_child: add_child)
  else
    super(child, add_child: add_child)
  end
end

#redrawObject



104
105
106
# File 'lib/glimmer/libui/shape.rb', line 104

def redraw
  area_proxy&.redraw
end

#request_auto_redrawObject



108
109
110
# File 'lib/glimmer/libui/shape.rb', line 108

def request_auto_redraw
  area_proxy&.request_auto_redraw
end

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

Returns:

  • (Boolean)


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

def respond_to?(method_name, *args, &block)
  self.class.parameters.include?(method_name.to_s.sub(/=$/, '').sub(/^set_/, '').to_sym) or
    super(method_name, true)
end

#stroke(*args) ⇒ Object Also known as: stroke=, set_stroke



130
131
132
# File 'lib/glimmer/libui/shape.rb', line 130

def stroke(*args)
  path_proxy.stroke(*args)
end

#transform(matrix = nil) ⇒ Object Also known as: transform=, set_transform



136
137
138
# File 'lib/glimmer/libui/shape.rb', line 136

def transform(matrix = nil)
  path_proxy.transform(matrix)
end