initial commit
This commit is contained in:
135
Core/UI/Elements/CollapsibleContainer.lua
Normal file
135
Core/UI/Elements/CollapsibleContainer.lua
Normal file
@@ -0,0 +1,135 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster --
|
||||
-- https://tradeskillmaster.com --
|
||||
-- All Rights Reserved - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
--- Collapsible Container UI Element Class.
|
||||
-- An collapsible container is a container which can be collapsed to a single heading line. It is a subclass of the @{Frame} class.
|
||||
-- @classmod CollapsibleContainer
|
||||
|
||||
local _, TSM = ...
|
||||
local CollapsibleContainer = TSM.Include("LibTSMClass").DefineClass("CollapsibleContainer", TSM.UI.Frame)
|
||||
local UIElements = TSM.Include("UI.UIElements")
|
||||
UIElements.Register(CollapsibleContainer)
|
||||
TSM.UI.CollapsibleContainer = CollapsibleContainer
|
||||
local private = {}
|
||||
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- Public Class Methods
|
||||
-- ============================================================================
|
||||
|
||||
function CollapsibleContainer.__init(self)
|
||||
self.__super:__init()
|
||||
self._headingText = ""
|
||||
self._contextTbl = nil
|
||||
self._contextKey = nil
|
||||
end
|
||||
|
||||
function CollapsibleContainer.Acquire(self)
|
||||
self.__super:Acquire()
|
||||
self:SetBackgroundColor("PRIMARY_BG_ALT", true)
|
||||
self.__super:SetLayout("VERTICAL")
|
||||
self.__super:SetPadding(12, 12, 8, 8)
|
||||
self.__super:AddChild(UIElements.New("Frame", "heading")
|
||||
:SetLayout("HORIZONTAL")
|
||||
:SetHeight(24)
|
||||
:AddChild(UIElements.New("Button", "expander")
|
||||
:SetMargin(0, 4, 0, 0)
|
||||
:SetScript("OnClick", private.OnExpanderClick)
|
||||
)
|
||||
:AddChild(UIElements.New("Text", "text")
|
||||
:SetFont("BODY_BODY1_BOLD")
|
||||
)
|
||||
)
|
||||
self.__super:AddChild(UIElements.New("Frame", "content"))
|
||||
end
|
||||
|
||||
function CollapsibleContainer.Release(self)
|
||||
self._headingText = ""
|
||||
self._contextTbl = nil
|
||||
self._contextKey = nil
|
||||
self.__super:Release()
|
||||
end
|
||||
|
||||
--- Sets the context table and key where to store the collapsed state.
|
||||
-- @tparam CollapsibleContainer self The collapsible container object
|
||||
-- @tparam table tbl The table
|
||||
-- @tparam string key The key
|
||||
-- @treturn CollapsibleContainer The collapsible container object
|
||||
function CollapsibleContainer.SetContextTable(self, tbl, key)
|
||||
assert(type(tbl) == "table" and type(key) == "string")
|
||||
self._contextTbl = tbl
|
||||
self._contextKey = key
|
||||
if self._contextTbl[self._contextKey] then
|
||||
self:GetElement("content"):Hide()
|
||||
else
|
||||
self:GetElement("content"):Show()
|
||||
end
|
||||
return self
|
||||
end
|
||||
|
||||
--- Set the heading text.
|
||||
-- @tparam CollapsibleContainer self The collapsible container object
|
||||
-- @tparam ?string|number headingText The heading text
|
||||
-- @treturn CollapsibleContainer The collapsible container object
|
||||
function CollapsibleContainer.SetHeadingText(self, headingText)
|
||||
assert(type(headingText) == "string" or type(headingText) == "number")
|
||||
self._headingText = headingText
|
||||
return self
|
||||
end
|
||||
|
||||
function CollapsibleContainer.SetPadding(self, left, right, top, bottom)
|
||||
error("CollapsibleContainer doesn't support this method")
|
||||
end
|
||||
|
||||
function CollapsibleContainer.SetLayout(self, layout)
|
||||
self:GetElement("content"):SetLayout(layout)
|
||||
return self
|
||||
end
|
||||
|
||||
function CollapsibleContainer.AddChild(self, child)
|
||||
self:GetElement("content"):AddChild(child)
|
||||
return self
|
||||
end
|
||||
|
||||
function CollapsibleContainer.AddChildIf(self, condition, child)
|
||||
self:GetElement("content"):AddChildIf(condition, child)
|
||||
return self
|
||||
end
|
||||
|
||||
function CollapsibleContainer.AddChildrenWithFunction(self, func, ...)
|
||||
self:GetElement("content"):AddChildrenWithFunction(func, ...)
|
||||
return self
|
||||
end
|
||||
|
||||
function CollapsibleContainer.AddChildBeforeById(self, beforeId, child)
|
||||
self:GetElement("content"):AddChildBeforeById(beforeId, child)
|
||||
return self
|
||||
end
|
||||
|
||||
function CollapsibleContainer.Draw(self)
|
||||
self:GetElement("heading.text"):SetText(self._headingText)
|
||||
self:GetElement("heading.expander"):SetBackgroundAndSize(self._contextTbl[self._contextKey] and "iconPack.18x18/Caret/Right" or "iconPack.18x18/Caret/Down")
|
||||
self.__super:Draw()
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- Local Script Handlers
|
||||
-- ============================================================================
|
||||
|
||||
function private.OnExpanderClick(button)
|
||||
local self = button:GetParentElement():GetParentElement()
|
||||
self._contextTbl[self._contextKey] = not self._contextTbl[self._contextKey]
|
||||
if self._contextTbl[self._contextKey] then
|
||||
self:GetElement("content"):Hide()
|
||||
else
|
||||
self:GetElement("content"):Show()
|
||||
end
|
||||
-- TODO: is there a better way to notify the elements up the stack that our size has changed?
|
||||
self:GetBaseElement():Draw()
|
||||
end
|
||||
Reference in New Issue
Block a user