87 lines
2.8 KiB
Lua
87 lines
2.8 KiB
Lua
--- Implements a checkbox widget with a binary tick selection
|
|
--
|
|
-- @classmod yui.Checkbox
|
|
-- @copyright 2022, The DoubleFourteen Code Forge
|
|
-- @author Lorenzo Cogotti, Andrea Pasquini
|
|
--
|
|
--- Checkbox widget receives the following callbacks: @{yui.Widget.WidgetCallbacks|onEnter}(), @{yui.Widget.WidgetCallbacks|onChange}(), @{yui.Widget.WidgetCallbacks|onLeave}().
|
|
|
|
local BASE = (...):gsub('checkbox$', '')
|
|
|
|
local Widget = require(BASE..'widget')
|
|
local core = require(BASE..'core')
|
|
|
|
local shadowtext = require 'lib.gear.shadowtext'
|
|
local T = require('lib.moonspeak').translate
|
|
|
|
local Checkbox = setmetatable({}, Widget)
|
|
Checkbox.__index = Checkbox
|
|
|
|
|
|
--- Attributes accepted by the @{Checkbox} widget beyond the standard @{yui.Widget.WidgetAttributes|attributes}
|
|
-- and @{yui.Widget.WidgetCallbacks|callbacks}.
|
|
--
|
|
-- @field checked (boolean) to set it checked by default
|
|
-- @field text (string) text displayed inside the Checkbox
|
|
-- @field[opt='center'] valign (string) vertical alignment 'top', 'bottom', 'center'
|
|
-- @field[opt='center'] align (string) horizontal alignment, 'left', 'center', 'right'
|
|
-- @field cornerRadius (number) radius for rounded corners
|
|
-- @field notranslate (boolean) don't translate text
|
|
-- @table CheckboxAttributes
|
|
|
|
|
|
--- Checkbox constructor
|
|
-- @param args (@{CheckboxAttributes}) widget attributes
|
|
function Checkbox.new(args)
|
|
local self = setmetatable(args, Checkbox)
|
|
|
|
self.text = self.text or ""
|
|
self.text = self.notranslate and self.text or T(self.text)
|
|
self.align = self.align or 'left'
|
|
self.valign = self.valign or 'center'
|
|
self.color = self.color or core.theme.color
|
|
self.cornerRadius = self.cornerRadius or core.theme.cornerRadius
|
|
self.checked = self.checked or false
|
|
return self
|
|
end
|
|
|
|
function Checkbox:onPointerInput(px,py, clicked)
|
|
self:grabFocus()
|
|
if clicked then
|
|
self.checked = not self.checked
|
|
self:onChange(self.checked)
|
|
end
|
|
end
|
|
|
|
function Checkbox:onActionInput(action)
|
|
if action.confirm then
|
|
self.checked = not self.checked
|
|
self:onChange(self.checked)
|
|
end
|
|
end
|
|
|
|
function Checkbox:draw()
|
|
local x,y,w,h = self.x,self.y,self.w,self.h
|
|
local c = self:colorForState()
|
|
local font = self.font or love.graphics.getFont()
|
|
|
|
-- Draw checkbox
|
|
core.drawBox(x+h/10,y+h/10,h*.8,h*.8, c, self.cornerRadius)
|
|
love.graphics.setColor(c.fg)
|
|
if self.checked then
|
|
love.graphics.setLineStyle('smooth')
|
|
love.graphics.setLineWidth(5)
|
|
love.graphics.setLineJoin('bevel')
|
|
love.graphics.line(x+h*.2,y+h*.55, x+h*.45,y+h*.75, x+h*.8,y+h*.2)
|
|
end
|
|
|
|
-- Most of the times checkboxes have no text, so test for performance
|
|
if self.text ~= "" then
|
|
love.graphics.setFont(font)
|
|
y = y + core.verticalOffsetForAlign(self.valign, font, self.h)
|
|
shadowtext.printf(self.text, x + h, y, w - h, self.align)
|
|
end
|
|
end
|
|
|
|
return Checkbox
|