Class: MiniGL::Button

Inherits:
Component show all
Defined in:
lib/minigl/forms.rb

Overview

This class represents a button.

Direct Known Subclasses

ToggleButton

Instance Attribute Summary collapse

Attributes inherited from Component

#enabled, #h, #params, #visible, #w, #x, #y

Instance Method Summary collapse

Constructor Details

#initialize(x, y = nil, font = nil, text = nil, img = nil, text_color = 0, disabled_text_color = 0, over_text_color = 0, down_text_color = 0, center_x = true, center_y = true, margin_x = 0, margin_y = 0, width = nil, height = nil, params = nil, retro = nil, scale_x = 1, scale_y = 1, &action) ⇒ Button

Creates a button.

Parameters:

x

The x-coordinate where the button will be drawn in the screen.

y

The y-coordinate where the button will be drawn in the screen.

font

The Gosu::Font object that will be used to draw the button text.

text

The button text. Can be nil or empty.

img

A spritesheet containing four images in a column, representing, from top to bottom, the default state, the hover state (when the mouse is over the button), the pressed state (when the mouse button is down and the cursor is over the button) and the disabled state. If nil, the width and height parameters must be provided.

text_color

Color of the button text, in hexadecimal RRGGBB format.

disabled_text_color

Color of the button text, when it’s disabled, in hexadecimal RRGGBB format.

over_text_color

Color of the button text, when the cursor is over it (hexadecimal RRGGBB).

down_text_color

Color of the button text, when it is pressed (hexadecimal RRGGBB).

center_x

Whether the button text should be horizontally centered in its area (the area is defined by the image size, if an image is given, or by the width and height parameters, otherwise).

center_y

Whether the button text should be vertically centered in its area (the area is defined by the image size, if an image is given, or by the width and height parameters, otherwise).

margin_x

The x offset, from the button x-coordinate, to draw the text. This parameter is used only if center is false.

margin_y

The y offset, from the button y-coordinate, to draw the text. This parameter is used only if center is false.

width

Width of the button clickable area. This parameter is used only if img is nil.

height

Height of the button clickable area. This parameter is used only if img is nil.

params

An object containing any parameters you want passed to the action block. When the button is clicked, the following is called:

@action.call @params

Note that this doesn’t force you to declare a block that takes parameters.

retro

Whether the image should be loaded with the ‘retro’ option set (see Gosu::Image for details). If the value is omitted, the Res.retro_images value will be used.

scale_x

Horizontal scale to draw the component with.

scale_y

Vertical scale to draw the component with.

action

The block of code executed when the button is clicked (or by calling the click method).

Obs.: This method accepts named parameters, but x and y are mandatory (also, img is mandatory when width and height are not provided, and vice-versa).



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/minigl/forms.rb', line 103

def initialize(x, y = nil, font = nil, text = nil, img = nil,
               text_color = 0, disabled_text_color = 0, over_text_color = 0, down_text_color = 0,
               center_x = true, center_y = true, margin_x = 0, margin_y = 0, width = nil, height = nil,
               params = nil, retro = nil, scale_x = 1, scale_y = 1, &action)
  if x.is_a? Hash
    y = x[:y]
    font = x[:font]
    text = x[:text]
    img = x[:img]
    text_color = x.fetch(:text_color, 0)
    disabled_text_color = x.fetch(:disabled_text_color, 0)
    over_text_color = x.fetch(:over_text_color, 0)
    down_text_color = x.fetch(:down_text_color, 0)
    center_x = x.fetch(:center_x, true)
    center_y = x.fetch(:center_y, true)
    margin_x = x.fetch(:margin_x, 0)
    margin_y = x.fetch(:margin_y, 0)
    width = x.fetch(:width, nil)
    height = x.fetch(:height, nil)
    params = x.fetch(:params, nil)
    retro = x.fetch(:retro, nil)
    scale_x = x.fetch(:scale_x, 1)
    scale_y = x.fetch(:scale_y, 1)
    x = x[:x]
  end

  super x, y, font, text, text_color, disabled_text_color
  @over_text_color = over_text_color
  @down_text_color = down_text_color
  retro = Res.retro_images if retro.nil?
  @scale_x = scale_x
  @scale_y = scale_y
  @img =
    if img; Res.imgs img, 1, 4, true, '.png', retro
    else; nil; end
  @w =
    if img; @img[0].width * @scale_x
    else; width * @scale_x; end
  @h =
    if img; @img[0].height * @scale_y
    else; height * @scale_y; end
  if center_x; @text_x = x + @w / 2 if @w
  else; @text_x = x + margin_x * @scale_x; end
  if center_y; @text_y = y + @h / 2 if @h
  else; @text_y = y + margin_y * @scale_y; end
  @center_x = center_x
  @center_y = center_y
  @action = action
  @params = params

  @state = :up
  @img_index = @enabled ? 0 : 3
end

Instance Attribute Details

#stateObject (readonly)

The current state of the button.



46
47
48
# File 'lib/minigl/forms.rb', line 46

def state
  @state
end

#textObject

The text of the button.



49
50
51
# File 'lib/minigl/forms.rb', line 49

def text
  @text
end

Instance Method Details

#clickObject

Executes the button click action.



208
209
210
# File 'lib/minigl/forms.rb', line 208

def click
  @action.call @params
end

#draw(alpha = 0xff, z_index = 0, color = 0xffffff) ⇒ Object

Draws the button in the screen.

Parameters:

alpha

The opacity with which the button will be drawn. Allowed values vary between 0 (fully transparent) and 255 (fully opaque).

z_index

The z-order to draw the object. Objects with larger z-orders will be drawn on top of the ones with smaller z-orders.

color

Color to apply a filter to the image.



233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
# File 'lib/minigl/forms.rb', line 233

def draw(alpha = 0xff, z_index = 0, color = 0xffffff)
  return unless @visible

  color = (alpha << 24) | color
  text_color =
    if @enabled
      if @state == :down
        @down_text_color
      else
        @state == :over ? @over_text_color : @text_color
      end
    else
      @disabled_text_color
    end
  text_color = (alpha << 24) | text_color
  @img[@img_index].draw @x, @y, z_index, @scale_x, @scale_y, color if @img
  if @text
    if @center_x or @center_y
      rel_x = @center_x ? 0.5 : 0
      rel_y = @center_y ? 0.5 : 0
      @font.draw_rel @text, @text_x, @text_y, z_index, rel_x, rel_y, @scale_x, @scale_y, text_color
    else
      @font.draw @text, @text_x, @text_y, z_index, @scale_x, @scale_y, text_color
    end
  end
end

#enabled=(value) ⇒ Object

:nodoc:



260
261
262
263
264
# File 'lib/minigl/forms.rb', line 260

def enabled=(value) # :nodoc:
  @enabled = value
  @state = :up
  @img_index = 3
end

#set_position(x, y) ⇒ Object

Sets the position of the button in the screen.

Parameters:

x

The new x-coordinate for the button.

y

The new y-coordinate for the button.



217
218
219
220
221
222
223
# File 'lib/minigl/forms.rb', line 217

def set_position(x, y)
  if @center_x; @text_x = x + @w / 2
  else; @text_x += x - @x; end
  if @center_y; @text_y = y + @h / 2
  else; @text_y += y - @y; end
  @x = x; @y = y
end

#updateObject

Updates the button, checking the mouse movement and buttons to define the button state.



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
199
200
201
202
203
204
205
# File 'lib/minigl/forms.rb', line 159

def update
  return unless @enabled and @visible

  mouse_over = Mouse.over? @x, @y, @w, @h
  mouse_press = Mouse.button_pressed? :left
  mouse_rel = Mouse.button_released? :left

  if @state == :up
    if mouse_over
      @img_index = 1
      @state = :over
    else
      @img_index = 0
    end
  elsif @state == :over
    if not mouse_over
      @img_index = 0
      @state = :up
    elsif mouse_press
      @img_index = 2
      @state = :down
    else
      @img_index = 1
    end
  elsif @state == :down
    if not mouse_over
      @img_index = 0
      @state = :down_out
    elsif mouse_rel
      @img_index = 1
      @state = :over
      click
    else
      @img_index = 2
    end
  else # :down_out
    if mouse_over
      @img_index = 2
      @state = :down
    elsif mouse_rel
      @img_index = 0
      @state = :up
    else
      @img_index = 0
    end
  end
end