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, new_event_handlers, #publish, #subscribe, #unsubscribe

Constructor Details

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

Returns a new instance of Element.

Yields:

  • instance_methods_eval with respect to self.

Raises:

  • (ArgumentError)


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
194
195
196
197
198
# File 'lib/fidgit/elements/element.rb', line 144

def initialize(options = {}, &block)
  options = {
    x: 0,
    y: 0,
    z: 0,
    tip: '',
    font_name: default(:font_name),
    font_height: default(:font_height),
    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 = options[:font] || Gosu::Font[font_name, options[:font_height]]

  @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.



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

def align_h
  @align_h
end

#align_vObject (readonly)

Returns the value of attribute align_v.



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

def align_v
  @align_v
end

#background_colorObject

Returns the value of attribute background_color.



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

def background_color
  @background_color
end

#border_thicknessObject (readonly)

Returns the value of attribute border_thickness.



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

def border_thickness
  @border_thickness
end

#fontObject

Returns the value of attribute font.



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

def font
  @font
end

#padding_bottomObject (readonly)

Returns the value of attribute padding_bottom.



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

def padding_bottom
  @padding_bottom
end

#padding_leftObject (readonly)

Returns the value of attribute padding_left.



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

def padding_left
  @padding_left
end

#padding_rightObject (readonly)

Returns the value of attribute padding_right.



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

def padding_right
  @padding_right
end

#padding_topObject (readonly)

Returns the value of attribute padding_top.



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

def padding_top
  @padding_top
end

#parentObject

Returns the value of attribute parent.



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

def parent
  @parent
end

#tipObject (readonly)

Returns the value of attribute tip.



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

def tip
  @tip
end

#zObject (readonly)

Returns the value of attribute z.



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

def z
  @z
end

Class Method Details

.new(*args, &block) ⇒ Object



92
93
94
95
96
97
# File 'lib/fidgit/elements/element.rb', line 92

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



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

alias_method :original_new, :new

.schemaObject



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

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


103
104
105
# File 'lib/fidgit/elements/element.rb', line 103

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

#drag?(button) ⇒ Boolean

Can the object be dragged?

Returns:

  • (Boolean)


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

def drag?(button); false; end

#drawObject

Redraw the element.



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

def draw
  draw_background
  draw_border
  draw_foreground
  nil
end

#draw_frame(*args) ⇒ Object



237
238
239
# File 'lib/fidgit/elements/element.rb', line 237

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

#draw_rect(*args) ⇒ Object



233
234
235
# File 'lib/fidgit/elements/element.rb', line 233

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

#enabled=(value) ⇒ Object



77
78
79
80
81
82
83
# File 'lib/fidgit/elements/element.rb', line 77

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)


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

def enabled?; @enabled; end

#heightObject

Height not including border.



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

def height; rect.height; end

#height=(value) ⇒ Object



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

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)


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

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

#max_heightObject



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

def max_height; @height_range.max; end

#max_widthObject



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

def max_width; @width_range.max; end

#min_heightObject



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

def min_height; @height_range.min; end

#min_widthObject



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

def min_width; @width_range.min; end

#outer_heightObject

Height including border thickness.



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

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

#outer_widthObject

Width including border thickness.



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

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

#recalcObject



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

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

  nil
end

#to_sObject



293
294
295
# File 'lib/fidgit/elements/element.rb', line 293

def to_s
  "#{self.class} (#{x}, #{y}) #{width}x#{height}"
end

#updateObject

Update the element.



229
230
231
# File 'lib/fidgit/elements/element.rb', line 229

def update
  nil
end

#widthObject

Width not including border.



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

def width; rect.width; end

#width=(value) ⇒ Object



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

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)


274
275
276
277
278
279
280
281
282
283
284
# File 'lib/fidgit/elements/element.rb', line 274

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



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

def x; rect.x; end

#x=(value) ⇒ Object



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

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

#yObject



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

def y; rect.y; end

#y=(value) ⇒ Object



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

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