class MiniGL::Button

This class represents a button.

Attributes

state[R]

The current state of the button.

text[RW]

The text of the button.

Public Class Methods

new(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, anchor = nil, &action) click to toggle source

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.

anchor

See parameter with the same name in Panel#initialize for details.

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

Calls superclass method
# File lib/minigl/forms.rb, line 274
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, anchor = nil, &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)
    anchor = x.fetch(:anchor, nil)
    x = x[:x]
  end

  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

  @anchor_offset_x = x; @anchor_offset_y = y
  @anchor, x, y = FormUtils.check_anchor(anchor, x, y, @w, @h)

  super x, y, font, text, text_color, disabled_text_color
  @over_text_color = over_text_color
  @down_text_color = down_text_color
  @center_x = center_x
  @center_y = center_y
  @margin_x = margin_x
  @margin_y = margin_y
  set_position(x, y)

  @action = action
  @params = params

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

Public Instance Methods

click() click to toggle source

Executes the button click action.

# File lib/minigl/forms.rb, line 386
def click
  perform_action
end
draw(alpha = 0xff, z_index = 0, color = 0xffffff) click to toggle source

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.

# File lib/minigl/forms.rb, line 411
def draw(alpha = 0xff, z_index = 0, color = 0xffffff)
  @z_index = z_index
  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_text_rel @text, @text_x, @text_y, z_index, rel_x, rel_y, @scale_x, @scale_y, text_color
    else
      @font.draw_text @text, @text_x, @text_y, z_index, @scale_x, @scale_y, text_color
    end
  end
end
set_position(x, y) click to toggle source

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.

# File lib/minigl/forms.rb, line 395
def set_position(x, y)
  @text_x = @center_x ? x + @w / 2 : x
  @text_y = @center_y ? y + @h / 2 : y
  @text_x += @margin_x
  @text_y += @margin_y
  @x = x; @y = y
end
update() click to toggle source

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

# File lib/minigl/forms.rb, line 335
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
      Mouse.add_click(@z_index || 0, lambda do
        @img_index = 2
        @state = :down
      end)
    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
      enqueue_action
    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

Private Instance Methods

enqueue_action() click to toggle source
# File lib/minigl/forms.rb, line 447
def enqueue_action
  Mouse.add_click(@z_index || 0, method(:perform_action))
end
perform_action() click to toggle source
# File lib/minigl/forms.rb, line 451
def perform_action
  @action.call(@params) if @action
end