initial commit
This commit is contained in:
195
Core/UI/Elements/DropdownList.lua
Normal file
195
Core/UI/Elements/DropdownList.lua
Normal file
@@ -0,0 +1,195 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster --
|
||||
-- https://tradeskillmaster.com --
|
||||
-- All Rights Reserved - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
local _, TSM = ...
|
||||
local Color = TSM.Include("Util.Color")
|
||||
local Theme = TSM.Include("Util.Theme")
|
||||
local UIElements = TSM.Include("UI.UIElements")
|
||||
local DropdownList = TSM.Include("LibTSMClass").DefineClass("DropdownList", TSM.UI.ScrollingTable)
|
||||
UIElements.Register(DropdownList)
|
||||
TSM.UI.DropdownList = DropdownList
|
||||
local private = {}
|
||||
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- Public Class Methods
|
||||
-- ============================================================================
|
||||
|
||||
function DropdownList.__init(self)
|
||||
self.__super:__init()
|
||||
self._selectedItems = {}
|
||||
self._multiselect = false
|
||||
self._onSelectionChangedHandler = nil
|
||||
end
|
||||
|
||||
function DropdownList.Acquire(self)
|
||||
self._backgroundColor = "ACTIVE_BG"
|
||||
self._headerHidden = true
|
||||
self.__super:Acquire()
|
||||
self:SetSelectionDisabled(true)
|
||||
self:GetScrollingTableInfo()
|
||||
:NewColumn("text")
|
||||
:SetFont("BODY_BODY3")
|
||||
:SetJustifyH("LEFT")
|
||||
:SetTextFunction(private.GetText)
|
||||
:SetIconSize(12)
|
||||
:SetIconFunction(private.GetIcon)
|
||||
:DisableHiding()
|
||||
:Commit()
|
||||
:Commit()
|
||||
end
|
||||
|
||||
function DropdownList.Release(self)
|
||||
wipe(self._selectedItems)
|
||||
self._multiselect = false
|
||||
self._onSelectionChangedHandler = nil
|
||||
self.__super:Release()
|
||||
end
|
||||
|
||||
function DropdownList.SetMultiselect(self, multiselect)
|
||||
self._multiselect = multiselect
|
||||
return self
|
||||
end
|
||||
|
||||
function DropdownList.SetItems(self, items, selection, redraw)
|
||||
wipe(self._data)
|
||||
for _, item in ipairs(items) do
|
||||
tinsert(self._data, item)
|
||||
end
|
||||
self:_SetSelectionHelper(selection)
|
||||
|
||||
if redraw then
|
||||
self:Draw()
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function DropdownList.ItemIterator(self)
|
||||
return private.ItemIterator, self, 0
|
||||
end
|
||||
|
||||
function DropdownList.SetSelection(self, selection)
|
||||
self:_SetSelectionHelper(selection)
|
||||
if self._onSelectionChangedHandler then
|
||||
self:_onSelectionChangedHandler(self._multiselect and self._selectedItems or selection)
|
||||
end
|
||||
return self
|
||||
end
|
||||
|
||||
function DropdownList.GetSelection(self)
|
||||
if self._multiselect then
|
||||
return self._selectedItems
|
||||
else
|
||||
local selectedItem = next(self._selectedItems)
|
||||
return selectedItem
|
||||
end
|
||||
end
|
||||
|
||||
function DropdownList.SelectAll(self)
|
||||
assert(self._multiselect)
|
||||
for _, data in ipairs(self._data) do
|
||||
self._selectedItems[data] = true
|
||||
end
|
||||
if self._onSelectionChangedHandler then
|
||||
self:_onSelectionChangedHandler(self._selectedItems)
|
||||
end
|
||||
self:Draw()
|
||||
end
|
||||
|
||||
function DropdownList.DeselectAll(self)
|
||||
assert(self._multiselect)
|
||||
wipe(self._selectedItems)
|
||||
if self._onSelectionChangedHandler then
|
||||
self:_onSelectionChangedHandler(self._selectedItems)
|
||||
end
|
||||
self:Draw()
|
||||
end
|
||||
|
||||
function DropdownList.SetScript(self, script, handler)
|
||||
if script == "OnSelectionChanged" then
|
||||
self._onSelectionChangedHandler = handler
|
||||
else
|
||||
error("Invalid DropdownList script: "..tostring(script))
|
||||
end
|
||||
return self
|
||||
end
|
||||
|
||||
function DropdownList.Draw(self)
|
||||
self.__super:Draw()
|
||||
|
||||
local textColor = nil
|
||||
|
||||
local color = Theme.GetColor(self._backgroundColor)
|
||||
-- the text color should have maximum contrast with the background color, so set it to white/black based on the background color
|
||||
if color:IsLight() then
|
||||
-- the background is light, so set the text to black
|
||||
textColor = Color.GetFullBlack()
|
||||
else
|
||||
-- the background is dark, so set the text to white
|
||||
textColor = Color.GetFullWhite()
|
||||
end
|
||||
for _, row in ipairs(self._rows) do
|
||||
row:SetTextColor(textColor)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- Private Class Methods
|
||||
-- ============================================================================
|
||||
|
||||
function DropdownList._SetSelectionHelper(self, selection)
|
||||
wipe(self._selectedItems)
|
||||
if selection then
|
||||
if self._multiselect then
|
||||
assert(type(selection) == "table")
|
||||
for item, selected in pairs(selection) do
|
||||
self._selectedItems[item] = selected
|
||||
end
|
||||
else
|
||||
assert(type(selection) == "string" or type(selection) == "number")
|
||||
self._selectedItems[selection] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function DropdownList._HandleRowClick(self, data)
|
||||
if self._multiselect then
|
||||
self._selectedItems[data] = not self._selectedItems[data] or nil
|
||||
if self._onSelectionChangedHandler then
|
||||
self:_onSelectionChangedHandler(self._selectedItems)
|
||||
end
|
||||
self:Draw()
|
||||
else
|
||||
self:SetSelection(data)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- Local Script Handlers
|
||||
-- ============================================================================
|
||||
|
||||
function private.GetText(self, data)
|
||||
return data
|
||||
end
|
||||
|
||||
function private.GetIcon(self, data)
|
||||
return self._multiselect and self._selectedItems[data] and "iconPack.12x12/Checkmark/Default" or ""
|
||||
end
|
||||
|
||||
function private.ItemIterator(self, index)
|
||||
index = index + 1
|
||||
local item = self._data[index]
|
||||
if not item then
|
||||
return
|
||||
end
|
||||
return index, item, self._selectedItems[item]
|
||||
end
|
||||
Reference in New Issue
Block a user