class MiniGL::DropDownList

This class represents a “drop-down list” form component, here composed of a group of Button objects.

Attributes

open[R]

Whether the list of options is currently visible.

options[RW]

An array containing all the options (each of them +String+s) that can be selected in the drop-down list.

value[R]

The selected value in the drop-down list. This is one of the options.

Public Class Methods

new(x, y = nil, font = nil, img = nil, opt_img = nil, options = nil, option = 0, text_margin = 0, width = nil, height = nil, text_color = 0, disabled_text_color = 0, over_text_color = 0, down_text_color = 0, retro = nil, scale_x = 1, scale_y = 1, anchor = nil, &on_changed) click to toggle source

Creates a new drop-down list.

Parameters:

x

The x-coordinate of the object.

y

The y-coordinate of the object.

font

Font to be used by the buttons that compose the drop-down list.

img

Image of the main button, i.e., the one at the top, that toggles visibility of the other buttons (the “option” buttons).

opt_img

Image for the “option” buttons, as described above.

options

Array of available options for this control (+String+s).

option

Index of the firstly selected option.

text_margin

Left margin of the text inside the buttons (vertically, the text will always be centered).

width

Width of the control, used when no image is provided.

height

Height of the control, used when no image is provided.

text_color

Used as the text_color parameter in the constructor of the buttons.

disabled_text_color

Analogous to text_color.

over_text_color

Same as above.

down_text_color

Same as above.

retro

Whether the images 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.

on_changed

Action performed when the value of the dropdown is changed. It must be a block with two parameters, which will receive the old and the new value, respectively.

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

Calls superclass method
# File lib/minigl/forms.rb, line 1321
def initialize(x, y = nil, font = nil, img = nil, opt_img = nil, options = nil,
               option = 0, text_margin = 0, width = nil, height = nil,
               text_color = 0, disabled_text_color = 0, over_text_color = 0, down_text_color = 0,
               retro = nil, scale_x = 1, scale_y = 1, anchor = nil, &on_changed)
  if x.is_a? Hash
    y = x[:y]
    font = x[:font]
    img = x[:img]
    opt_img = x[:opt_img]
    options = x[:options]
    option = x.fetch(:option, 0)
    text_margin = x.fetch(:text_margin, 0)
    width = x.fetch(:width, nil)
    height = x.fetch(:height, nil)
    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)
    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
  @img = img
  @opt_img = opt_img
  @options = options
  @value = @options[option]
  @open = false
  @buttons = []
  @buttons.push(
    Button.new(x, y, font, @value, img, text_color, disabled_text_color, over_text_color, down_text_color,
               false, true, text_margin, 0, width, height, nil, retro, scale_x, scale_y) {
                 toggle
               }
  )

  @scale_x = scale_x
  @scale_y = scale_y
  @w = @buttons[0].w
  @h = @buttons[0].h
  @max_h = (@options.size + 1) * @h

  @anchor_offset_x = x; @anchor_offset_y = y
  @anchor, x, y = FormUtils.check_anchor(anchor, x, y, @w, @h)
  super x, y, font, options[option], text_color, disabled_text_color
  @buttons[0].set_position(x, y)

  @options.each_with_index do |o, i|
    b = Button.new(x, y + (i+1) * @h, font, o, opt_img, text_color, disabled_text_color, over_text_color, down_text_color,
                   false, true, text_margin, 0, width, height, nil, retro, scale_x, scale_y) {
                     old = @value
                     @value = @buttons[0].text = o
                     @on_changed.call(old, o) if @on_changed
                     toggle
                   }
    b.visible = false
    @buttons.push b
  end

  @on_changed = on_changed
end

Public Instance Methods

draw(alpha = 0xff, z_index = 0, color = 0xffffff, over_color = 0xcccccc) click to toggle source

Draws the drop-down list.

Parameters:

alpha

(Fixnum) The opacity with which the drop-down list will be drawn. Allowed values vary between 0 (fully transparent) and 255 (fully opaque).

z_index

(Fixnum) 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 of the buttons, if no image was provided, or color to apply a filter to the images.

over_color

Color of the buttons when the mouse is over them (when no image was provided).

# File lib/minigl/forms.rb, line 1427
def draw(alpha = 0xff, z_index = 0, color = 0xffffff, over_color = 0xcccccc)
  return unless @visible
  unless @img
    bottom = @y + (@open ? @max_h : @h) + @scale_y
    b_color = (alpha << 24)
    G.window.draw_quad @x - @scale_x, @y - @scale_y, b_color,
                       @x + @w + @scale_x, @y - @scale_y, b_color,
                       @x + @w + @scale_x, bottom, b_color,
                       @x - @scale_x, bottom, b_color, z_index
    @buttons.each do |b|
      c = (alpha << 24) | (b.state == :over ? over_color : color)
      G.window.draw_quad b.x, b.y, c,
                         b.x + b.w, b.y, c,
                         b.x + b.w, b.y + b.h, c,
                         b.x, b.y + b.h, c, z_index + 1 if b.visible
    end
  end
  @buttons[0].draw(alpha, z_index, color)
  @buttons[1..-1].each { |b| b.draw alpha, z_index + 1, color }
end
set_position(x, y) click to toggle source
# File lib/minigl/forms.rb, line 1410
def set_position(x, y)
  @x = x; @y = y
  @buttons.each_with_index { |b, i| b.set_position(x, y + i * @h) }
end
update() click to toggle source

Updates the control.

# File lib/minigl/forms.rb, line 1385
def update
  return unless @enabled and @visible
  if @open and Mouse.button_pressed? :left and not Mouse.over?(@x, @y, @w, @max_h)
    toggle
    return
  end
  @buttons.each { |b| b.update }
end
value=(val) click to toggle source

Sets the currently selected value of the drop-down list. It is ignored if it is not among the available options.

# File lib/minigl/forms.rb, line 1396
def value=(val)
  if @options.include? val
    old = @value
    @value = @buttons[0].text = val
    @on_changed.call(old, val) if @on_changed
  end
end

Private Instance Methods

toggle() click to toggle source
# File lib/minigl/forms.rb, line 1450
def toggle
  if @open
    @buttons[1..-1].each { |b| b.visible = false }
    @open = false
  else
    @buttons[1..-1].each { |b| b.visible = true }
    @open = true
  end
end