class MiniGL::DropDownList
This class represents a “drop-down list” form component, here composed of a group of Button
objects.
Attributes
Whether the list of options is currently visible.
An array containing all the options (each of them +String+s) that can be selected in the drop-down list.
The selected value in the drop-down list. This is one of the options
.
Public Class Methods
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, theRes.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).
# 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
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
# 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
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
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
# 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