mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
75 lines
2.9 KiB
Ruby
75 lines
2.9 KiB
Ruby
#===============================================================================
|
|
# NOTE: Strictly speaking, this is a toggle switch and not a checkbox.
|
|
#===============================================================================
|
|
class UIControls::Checkbox < UIControls::BaseControl
|
|
CHECKBOX_X = 2
|
|
CHECKBOX_WIDTH = 40
|
|
CHECKBOX_HEIGHT = 24
|
|
CHECKBOX_FILL_SIZE = CHECKBOX_HEIGHT - 4
|
|
|
|
UNCHECKED_COLOR = Color.gray
|
|
CHECKED_COLOR = Color.new(64, 255, 64) # Green
|
|
|
|
def initialize(width, height, viewport, value = false)
|
|
super(width, height, viewport)
|
|
@value = value
|
|
end
|
|
|
|
def value=(new_value)
|
|
return if @value == new_value
|
|
@value = new_value
|
|
invalidate
|
|
end
|
|
|
|
def set_interactive_rects
|
|
@checkbox_rect = Rect.new(CHECKBOX_X, (height - CHECKBOX_HEIGHT) / 2,
|
|
CHECKBOX_WIDTH, CHECKBOX_HEIGHT)
|
|
@interactions = {
|
|
:checkbox => @checkbox_rect
|
|
}
|
|
end
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
def refresh
|
|
super
|
|
# Draw disabled colour
|
|
if disabled?
|
|
self.bitmap.fill_rect(@checkbox_rect.x, @checkbox_rect.y,
|
|
@checkbox_rect.width, @checkbox_rect.height,
|
|
DISABLED_COLOR)
|
|
end
|
|
# Draw checkbox outline
|
|
self.bitmap.outline_rect(@checkbox_rect.x, @checkbox_rect.y,
|
|
@checkbox_rect.width, @checkbox_rect.height,
|
|
self.bitmap.font.color)
|
|
# Draw checkbox fill
|
|
if @value # If checked
|
|
self.bitmap.fill_rect(@checkbox_rect.x + @checkbox_rect.width - CHECKBOX_FILL_SIZE - 2, @checkbox_rect.y + 2,
|
|
CHECKBOX_FILL_SIZE, CHECKBOX_FILL_SIZE, (disabled?) ? DISABLED_COLOR_DARK : CHECKED_COLOR)
|
|
self.bitmap.outline_rect(@checkbox_rect.x + @checkbox_rect.width - CHECKBOX_FILL_SIZE - 2, @checkbox_rect.y + 2,
|
|
CHECKBOX_FILL_SIZE, CHECKBOX_FILL_SIZE, self.bitmap.font.color)
|
|
else
|
|
self.bitmap.fill_rect(@checkbox_rect.x + 2, @checkbox_rect.y + 2,
|
|
CHECKBOX_FILL_SIZE, CHECKBOX_FILL_SIZE, (disabled?) ? DISABLED_COLOR_DARK : UNCHECKED_COLOR)
|
|
self.bitmap.outline_rect(@checkbox_rect.x + 2, @checkbox_rect.y + 2,
|
|
CHECKBOX_FILL_SIZE, CHECKBOX_FILL_SIZE, self.bitmap.font.color)
|
|
end
|
|
end
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
def on_mouse_release
|
|
return if !@captured_area # Wasn't captured to begin with
|
|
# Change this control's value
|
|
if @captured_area == :checkbox
|
|
mouse_x, mouse_y = mouse_pos
|
|
if mouse_x && mouse_y && @interactions[@captured_area].contains?(mouse_x, mouse_y)
|
|
@value = !@value # The actual change of this control's value
|
|
set_changed
|
|
end
|
|
end
|
|
super # Make this control not busy again
|
|
end
|
|
end
|