246 lines
7.8 KiB
Lua
246 lines
7.8 KiB
Lua
|
-- ------------------------------------------------------------------------------ --
|
||
|
-- TradeSkillMaster --
|
||
|
-- https://tradeskillmaster.com --
|
||
|
-- All Rights Reserved - Detailed license information included with addon. --
|
||
|
-- ------------------------------------------------------------------------------ --
|
||
|
|
||
|
--- Checkbox UI Element Class.
|
||
|
-- This is a simple checkbox element with an attached description text. It is a subclass of the @{Text} class.
|
||
|
-- @classmod Checkbox
|
||
|
|
||
|
local _, TSM = ...
|
||
|
local ScriptWrapper = TSM.Include("Util.ScriptWrapper")
|
||
|
local Theme = TSM.Include("Util.Theme")
|
||
|
local UIElements = TSM.Include("UI.UIElements")
|
||
|
local Checkbox = TSM.Include("LibTSMClass").DefineClass("Checkbox", TSM.UI.Text)
|
||
|
UIElements.Register(Checkbox)
|
||
|
TSM.UI.Checkbox = Checkbox
|
||
|
local private = {}
|
||
|
local THEME_TEXTURES = {
|
||
|
RADIO = {
|
||
|
checked = "iconPack.Misc/Radio/Checked",
|
||
|
unchecked = "iconPack.Misc/Radio/Unchecked",
|
||
|
},
|
||
|
CHECK = {
|
||
|
checked = "iconPack.Misc/Checkbox/Checked",
|
||
|
unchecked = "iconPack.Misc/Checkbox/Unchecked",
|
||
|
},
|
||
|
}
|
||
|
local CHECKBOX_SPACING = 4
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Public Class Methods
|
||
|
-- ============================================================================
|
||
|
|
||
|
function Checkbox.__init(self)
|
||
|
local frame = UIElements.CreateFrame(self, "Button")
|
||
|
self.__super:__init(frame)
|
||
|
ScriptWrapper.Set(frame, "OnClick", private.FrameOnClick, self)
|
||
|
|
||
|
-- create the text and check texture
|
||
|
frame.text = UIElements.CreateFontString(self, frame)
|
||
|
frame.text:SetJustifyV("MIDDLE")
|
||
|
frame.check = frame:CreateTexture()
|
||
|
|
||
|
self._position = "LEFT"
|
||
|
self._theme = "CHECK"
|
||
|
self._font = "BODY_BODY3"
|
||
|
self._disabled = false
|
||
|
self._value = false
|
||
|
self._onValueChangedHandler = nil
|
||
|
self._settingTable = nil
|
||
|
self._settingKey = nil
|
||
|
end
|
||
|
|
||
|
function Checkbox.Release(self)
|
||
|
self._position = "LEFT"
|
||
|
self._theme = "CHECK"
|
||
|
self._disabled = false
|
||
|
self._value = false
|
||
|
self._onValueChangedHandler = nil
|
||
|
self._settingTable = nil
|
||
|
self._settingKey = nil
|
||
|
self.__super:Release()
|
||
|
self._font = "BODY_BODY3"
|
||
|
end
|
||
|
|
||
|
--- Sets the position of the checkbox relative to the text.
|
||
|
-- This method can be used to set the checkbox to be either on the left or right side of the text.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @tparam string position The position of the checkbox relative to the text
|
||
|
-- @treturn Checkbox The checkbox object
|
||
|
function Checkbox.SetCheckboxPosition(self, position)
|
||
|
if position == "LEFT" or position == "RIGHT" then
|
||
|
self._position = position
|
||
|
else
|
||
|
error("Invalid checkbox position: "..tostring(position))
|
||
|
end
|
||
|
return self
|
||
|
end
|
||
|
|
||
|
--- Sets the checkbox theme
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @tparam string theme Either "RADIO" or "CHECK"
|
||
|
-- @treturn Checkbox The checkbox object
|
||
|
function Checkbox.SetTheme(self, theme)
|
||
|
assert(THEME_TEXTURES[theme])
|
||
|
self._theme = theme
|
||
|
return self
|
||
|
end
|
||
|
|
||
|
--- Sets whether or not the checkbox is disabled.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @tparam boolean disabled Whether or not the checkbox is disabled
|
||
|
-- @treturn Checkbox The checkbox object
|
||
|
function Checkbox.SetDisabled(self, disabled)
|
||
|
self._disabled = disabled
|
||
|
return self
|
||
|
end
|
||
|
|
||
|
--- Sets the text string.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @tparam string text The text string to be displayed
|
||
|
-- @treturn Checkbox The checkbox object
|
||
|
function Checkbox.SetText(self, text)
|
||
|
self._textStr = text
|
||
|
return self
|
||
|
end
|
||
|
|
||
|
--- Gets the text string.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @treturn string The text string
|
||
|
function Checkbox.GetText(self)
|
||
|
return self._textStr
|
||
|
end
|
||
|
|
||
|
--- Sets a formatted text string.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @tparam vararg ... The format string and arguments
|
||
|
-- @treturn Checkbox The checkbox object
|
||
|
function Checkbox.SetFormattedText(self, ...)
|
||
|
self._textStr = format(...)
|
||
|
return self
|
||
|
end
|
||
|
|
||
|
--- Sets whether or not the checkbox is checked.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @tparam boolean value Whether or not the checkbox is checked
|
||
|
-- @tparam[opt=false] boolean silent If true, will not trigger the `OnValueChanged` script
|
||
|
-- @treturn Checkbox The checkbox object
|
||
|
function Checkbox.SetChecked(self, value, silent)
|
||
|
self._value = value and true or false
|
||
|
if self._onValueChangedHandler and not silent then
|
||
|
self:_onValueChangedHandler(value)
|
||
|
end
|
||
|
return self
|
||
|
end
|
||
|
|
||
|
--- Sets the setting info.
|
||
|
-- This method is used to have the state of the checkbox automatically correspond with the boolean state of a field in
|
||
|
-- a table. This is useful for checkboxes which are tied directly to settings.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @tparam table tbl The table which the field to set belongs to
|
||
|
-- @tparam string key The key into the table to be set based on the checkbox state
|
||
|
-- @treturn Checkbox The checkbox object
|
||
|
function Checkbox.SetSettingInfo(self, tbl, key)
|
||
|
self._settingTable = tbl
|
||
|
self._settingKey = key
|
||
|
self:SetChecked(tbl[key])
|
||
|
return self
|
||
|
end
|
||
|
|
||
|
--- Gets the checked state.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @treturn boolean Whether or not the checkbox is checked
|
||
|
function Checkbox.IsChecked(self)
|
||
|
return self._value
|
||
|
end
|
||
|
|
||
|
--- Registers a script handler.
|
||
|
-- @tparam Checkbox self The checkbox object
|
||
|
-- @tparam string script The script to register for (supported scripts: `OnValueChanged`)
|
||
|
-- @tparam function handler The script handler which will be called with the checkbox object followed by any arguments
|
||
|
-- to the script
|
||
|
-- @treturn Checkbox The checkbox object
|
||
|
function Checkbox.SetScript(self, script, handler)
|
||
|
if script == "OnValueChanged" then
|
||
|
self._onValueChangedHandler = handler
|
||
|
elseif script == "OnEnter" or script == "OnLeave" then
|
||
|
return self.__super:SetScript(script, handler)
|
||
|
else
|
||
|
error("Unknown Checkbox script: "..tostring(script))
|
||
|
end
|
||
|
return self
|
||
|
end
|
||
|
|
||
|
function Checkbox.Draw(self)
|
||
|
self.__super:Draw()
|
||
|
local frame = self:_GetBaseFrame()
|
||
|
|
||
|
if self._disabled then
|
||
|
frame.text:SetTextColor(Theme.GetColor("TEXT_DISABLED"):GetFractionalRGBA())
|
||
|
else
|
||
|
frame.text:SetTextColor(self:_GetTextColor():GetFractionalRGBA())
|
||
|
end
|
||
|
TSM.UI.TexturePacks.SetTextureAndSize(frame.check, THEME_TEXTURES[self._theme][self._value and "checked" or "unchecked"])
|
||
|
|
||
|
frame.text:ClearAllPoints()
|
||
|
frame.check:ClearAllPoints()
|
||
|
if self._position == "LEFT" then
|
||
|
frame.check:SetPoint("LEFT")
|
||
|
frame.text:SetJustifyH("LEFT")
|
||
|
frame.text:SetPoint("LEFT", frame.check, "RIGHT", CHECKBOX_SPACING, 0)
|
||
|
frame.text:SetPoint("TOPRIGHT")
|
||
|
frame.text:SetPoint("BOTTOMRIGHT")
|
||
|
elseif self._position == "RIGHT" then
|
||
|
frame.check:SetPoint("RIGHT")
|
||
|
frame.text:SetJustifyH("RIGHT")
|
||
|
frame.text:SetPoint("BOTTOMLEFT")
|
||
|
frame.text:SetPoint("TOPLEFT")
|
||
|
frame.text:SetPoint("RIGHT", frame.check, "LEFT", -CHECKBOX_SPACING, 0)
|
||
|
else
|
||
|
error("Invalid position: "..tostring(self._position))
|
||
|
end
|
||
|
if self._disabled then
|
||
|
frame.check:SetAlpha(0.3)
|
||
|
self:_GetBaseFrame():Disable()
|
||
|
else
|
||
|
frame.check:SetAlpha(1)
|
||
|
self:_GetBaseFrame():Enable()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Private Class Methods
|
||
|
-- ============================================================================
|
||
|
|
||
|
function Checkbox._GetMinimumDimension(self, dimension)
|
||
|
if dimension == "WIDTH" and self._autoWidth then
|
||
|
local checkboxWidth = TSM.UI.TexturePacks.GetWidth(THEME_TEXTURES[self._theme].checked)
|
||
|
return self:GetStringWidth() + CHECKBOX_SPACING + checkboxWidth, nil
|
||
|
else
|
||
|
return self.__super:_GetMinimumDimension(dimension)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Local Script Handlers
|
||
|
-- ============================================================================
|
||
|
|
||
|
function private.FrameOnClick(self)
|
||
|
local value = not self._value
|
||
|
|
||
|
if self._settingTable and self._settingKey then
|
||
|
self._settingTable[self._settingKey] = value
|
||
|
end
|
||
|
|
||
|
self:SetChecked(value)
|
||
|
self:Draw()
|
||
|
end
|