Class: Fidgit::Element Abstract

Inherits:
Object show all
Includes:
Event
Defined in:
lib/fidgit/elements/element.rb

Overview

This class is abstract.

An element within the GUI environment.

Constant Summary collapse

DEFAULT_SCHEMA_FILE =
File.expand_path(File.join(__FILE__, '..', '..', '..', '..', 'config', 'default_schema.yml'))
VALID_ALIGN_H =
[:left, :center, :right, :fill]
VALID_ALIGN_V =
[:top, :center, :bottom, :fill]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Event

#events, included, #publish, #subscribe

Constructor Details

#initialize(options = {}) { ... } ⇒ Element

Returns a new instance of Element.

Yields:

  • instance_methods_eval with respect to self.

Raises:

  • (ArgumentError)


139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/fidgit/elements/element.rb', line 139

def initialize(options = {}, &block)
  options = {
    x: 0,
    y: 0,
    z: 0,
    tip: '',
    font_name: default(:font_name),
    font_size: default(:font_size),
    background_color: default(:background_color),
    border_color: default(:border_color),
    border_thickness: default(:border_thickness),
    enabled: true,
  }.merge! options

  @enabled = options[:enabled]

  @mouse_over = false

  # Alignment and min/max dimensions.
  @align_h = options[:align_h] || Array(options[:align]).last || default(:align_h)
  raise ArgumentError, "Invalid align_h: #{@align_h}" unless VALID_ALIGN_H.include? @align_h

  min_width = (options[:min_width] || options[:width] || 0)
  max_width = (options[:max_width] || options[:width] || Float::INFINITY)
  @width_range = min_width..max_width                                         

  @align_v = options[:align_v] || Array(options[:align]).first ||  default(:align_v)
  raise ArgumentError, "Invalid align_v: #{@align_v}" unless VALID_ALIGN_V.include? @align_v

  min_height = (options[:min_height] || options[:height] || 0)
  max_height = (options[:max_height] || options[:height] || Float::INFINITY)
  @height_range = min_height..max_height

  @background_color = options[:background_color].dup
  @border_color = options[:border_color].dup
  @border_thickness = options[:border_thickness]

  @padding_top = options[:padding_top]       || options[:padding_v] || options[:padding] ||  default(:padding_top)
  @padding_right = options[:padding_right]   || options[:padding_h] || options[:padding] ||  default(:padding_right)
  @padding_bottom = options[:padding_bottom] || options[:padding_v] || options[:padding] ||  default(:padding_bottom)
  @padding_left = options[:padding_left]     || options[:padding_h] || options[:padding] ||  default(:padding_left)
  self.parent = options[:parent]

  @z = options[:z]
  @tip = options[:tip].dup
  @font_name = if options[:font_name].nil? or options[:font_name] == :default
                 Gosu::default_font_name
               else
                 options[:font_name].dup
               end

  @font_size = options[:font_size]

  @rect = Chingu::Rect.new(options[:x], options[:y], options[:width] || 0, options[:height] || 0)
end

Instance Attribute Details

#align_hObject (readonly)

Returns the value of attribute align_h.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def align_h
  @align_h
end

#align_vObject (readonly)

Returns the value of attribute align_v.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def align_v
  @align_v
end

#background_colorObject

Returns the value of attribute background_color.



42
43
44
# File 'lib/fidgit/elements/element.rb', line 42

def background_color
  @background_color
end

#border_thicknessObject (readonly)

Returns the value of attribute border_thickness.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def border_thickness
  @border_thickness
end

#font_sizeObject (readonly)

Returns the value of attribute font_size.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def font_size
  @font_size
end

#padding_bottomObject (readonly)

Returns the value of attribute padding_bottom.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def padding_bottom
  @padding_bottom
end

#padding_leftObject (readonly)

Returns the value of attribute padding_left.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def padding_left
  @padding_left
end

#padding_rightObject (readonly)

Returns the value of attribute padding_right.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def padding_right
  @padding_right
end

#padding_topObject (readonly)

Returns the value of attribute padding_top.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def padding_top
  @padding_top
end

#parentObject

Returns the value of attribute parent.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def parent
  @parent
end

#tipObject (readonly)

Returns the value of attribute tip.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def tip
  @tip
end

#zObject (readonly)

Returns the value of attribute z.



40
41
42
# File 'lib/fidgit/elements/element.rb', line 40

def z
  @z
end

Class Method Details

.new(*args, &block) ⇒ Object



88
89
90
91
92
93
# File 'lib/fidgit/elements/element.rb', line 88

def new(*args, &block)
  obj = original_new(*args) # Block should be ignored.
  obj.send :post_init
  obj.send :post_init_block, &block if block_given?
  obj
end

.original_newObject



86
# File 'lib/fidgit/elements/element.rb', line 86

alias_method :original_new, :new

.schemaObject



83
# File 'lib/fidgit/elements/element.rb', line 83

def self.schema; @@schema ||= Schema.new(YAML.load(File.read(DEFAULT_SCHEMA_FILE)));; end

Instance Method Details

#default(*names) ⇒ Object

Get the default value from the schema.

Parameters:

  • names (Symbol, Array<Symbol>)


99
100
101
# File 'lib/fidgit/elements/element.rb', line 99

def default(*names)
  self.class.schema.default(self.class, names)
end

#drag?(button) ⇒ Boolean

Can the object be dragged?

Returns:

  • (Boolean)


67
# File 'lib/fidgit/elements/element.rb', line 67

def drag?(button); false; end

#drawObject

Redraw the element.



209
210
211
212
213
214
# File 'lib/fidgit/elements/element.rb', line 209

def draw
  draw_background
  draw_border
  draw_foreground
  nil
end

#draw_frame(*args) ⇒ Object



225
226
227
# File 'lib/fidgit/elements/element.rb', line 225

def draw_frame(*args)
  $window.current_game_state.draw_frame(*args)
end

#draw_rect(*args) ⇒ Object



221
222
223
# File 'lib/fidgit/elements/element.rb', line 221

def draw_rect(*args)
  $window.current_game_state.draw_rect(*args)
end

#enabled=(value) ⇒ Object



71
72
73
74
75
76
77
# File 'lib/fidgit/elements/element.rb', line 71

def enabled=(value)
  if @mouse_over and enabled? and not value
    $window.current_game_state.unset_mouse_over
  end

  @enabled = value
end

#enabled?Boolean

Returns:

  • (Boolean)


69
# File 'lib/fidgit/elements/element.rb', line 69

def enabled?; @enabled; end

#fontObject



79
# File 'lib/fidgit/elements/element.rb', line 79

def font; @font ||= Gosu::Font[@font_name, @font_size]; end

#heightObject

Height not including border.



59
# File 'lib/fidgit/elements/element.rb', line 59

def height; rect.height; end

#height=(value) ⇒ Object



60
# File 'lib/fidgit/elements/element.rb', line 60

def height=(value); rect.height = [[value, @height_range.max].min, @height_range.min].max; end

#hit?(x, y) ⇒ Boolean

Check if a point (screen coordinates) is over the element.

Returns:

  • (Boolean)


204
205
206
# File 'lib/fidgit/elements/element.rb', line 204

def hit?(x, y)
  @rect.collide_point?(x, y)
end

#max_heightObject



62
# File 'lib/fidgit/elements/element.rb', line 62

def max_height; @height_range.max; end

#max_widthObject



54
# File 'lib/fidgit/elements/element.rb', line 54

def max_width; @width_range.max; end

#min_heightObject



61
# File 'lib/fidgit/elements/element.rb', line 61

def min_height; @height_range.min; end

#min_widthObject



53
# File 'lib/fidgit/elements/element.rb', line 53

def min_width; @width_range.min; end

#outer_heightObject

Height including border thickness.



64
# File 'lib/fidgit/elements/element.rb', line 64

def outer_height; rect.height + @border_thickness * 2; end

#outer_widthObject

Width including border thickness.



56
# File 'lib/fidgit/elements/element.rb', line 56

def outer_width; rect.width + @border_thickness * 2; end

#recalcObject



195
196
197
198
199
200
201
# File 'lib/fidgit/elements/element.rb', line 195

def recalc
  old_width, old_height = width, height
  layout
  parent.recalc if parent and (width != old_width or height != old_height)

  nil
end

#updateObject

Update the element.



217
218
219
# File 'lib/fidgit/elements/element.rb', line 217

def update
  nil
end

#widthObject

Width not including border.



51
# File 'lib/fidgit/elements/element.rb', line 51

def width; rect.width; end

#width=(value) ⇒ Object



52
# File 'lib/fidgit/elements/element.rb', line 52

def width=(value); rect.width = [[value, @width_range.max].min, @width_range.min].max; end

#with(&block) ⇒ Object

Evaluate a block, just like it was a constructor block.

Raises:

  • (ArgumentError)


262
263
264
265
266
267
268
269
270
271
272
# File 'lib/fidgit/elements/element.rb', line 262

def with(&block)
  raise ArgumentError.new("Must pass a block") unless block_given?
  case block.arity
    when 1
      yield self
    when 0
      instance_methods_eval(&block)
    else
      raise "block arity must be 0 or 1"
  end
end

#xObject



44
# File 'lib/fidgit/elements/element.rb', line 44

def x; rect.x; end

#x=(value) ⇒ Object



45
# File 'lib/fidgit/elements/element.rb', line 45

def x=(value); rect.x = value; end

#yObject



47
# File 'lib/fidgit/elements/element.rb', line 47

def y; rect.y; end

#y=(value) ⇒ Object



48
# File 'lib/fidgit/elements/element.rb', line 48

def y=(value); rect.y = value; end