You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
4.7 KiB
174 lines
4.7 KiB
|
2 years ago
|
-- Dropdown.lua
|
||
|
|
-- @Author : DengSir (tdaddon@163.com)
|
||
|
|
-- @Link : https://dengsir.github.io
|
||
|
|
-- @Date : 9/20/2018, 6:11:06 PM
|
||
|
|
|
||
|
|
local MAJOR, MINOR = 'Dropdown', 2
|
||
|
|
local GUI = LibStub('tdGUI-1.0')
|
||
|
|
local Dropdown, oldminor = GUI:NewClass(MAJOR, MINOR, 'Button')
|
||
|
|
if not Dropdown then return end
|
||
|
|
|
||
|
|
function Dropdown:Constructor()
|
||
|
|
local tl = self:CreateTexture(nil, 'BACKGROUND') do
|
||
|
|
tl:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
|
||
|
|
tl:SetTexCoord(0, 0.1953125, 0, 1)
|
||
|
|
tl:SetSize(25, 64)
|
||
|
|
tl:SetPoint('LEFT', -16, 0)
|
||
|
|
end
|
||
|
|
|
||
|
|
local tr = self:CreateTexture(nil, 'BACKGROUND') do
|
||
|
|
tr:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
|
||
|
|
tr:SetTexCoord(0.8046875, 1, 0, 1)
|
||
|
|
tr:SetSize(25, 64)
|
||
|
|
tr:SetPoint('RIGHT', 16, 0)
|
||
|
|
end
|
||
|
|
|
||
|
|
local tm = self:CreateTexture(nil, 'BACKGROUND') do
|
||
|
|
tm:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
|
||
|
|
tm:SetTexCoord(0.1953125, 0.8046875, 0, 1)
|
||
|
|
tm:SetPoint('TOPLEFT', tl, 'TOPRIGHT')
|
||
|
|
tm:SetPoint('BOTTOMRIGHT', tr, 'BOTTOMLEFT')
|
||
|
|
end
|
||
|
|
|
||
|
|
local MenuButton = CreateFrame('Button', nil, self) do
|
||
|
|
MenuButton:SetSize(24, 24)
|
||
|
|
MenuButton:SetPoint('RIGHT', 0, 1)
|
||
|
|
MenuButton:SetNormalTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Up]])
|
||
|
|
MenuButton:SetPushedTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Down]])
|
||
|
|
MenuButton:SetDisabledTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Disabled]])
|
||
|
|
MenuButton:SetHighlightTexture([[Interface\Buttons\UI-Common-MouseHilight]], 'ADD')
|
||
|
|
MenuButton:SetScript('OnClick', function()
|
||
|
|
self:Click()
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
local Text = self:CreateFontString(nil, 'OVERLAY', 'GameFontHighlightSmallLeft') do
|
||
|
|
Text:SetPoint('LEFT', 10, 0)
|
||
|
|
Text:SetPoint('RIGHT', MenuButton, 'LEFT')
|
||
|
|
Text:SetWordWrap(false)
|
||
|
|
end
|
||
|
|
|
||
|
|
self:SetFontString(Text)
|
||
|
|
self:SetDisabledFontObject('GameFontDisableSmallLeft')
|
||
|
|
self:SetNormalFontObject('GameFontHighlightSmallLeft')
|
||
|
|
|
||
|
|
self.MenuButton = MenuButton
|
||
|
|
|
||
|
|
self:SetScript('OnEnable', self.OnEnable)
|
||
|
|
self:SetScript('OnDisable', self.OnDisable)
|
||
|
|
self:SetScript('OnClick', self.ToggleMenu)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:OnEnable()
|
||
|
|
self.MenuButton:Enable()
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:OnDisable()
|
||
|
|
self.MenuButton:Disable()
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:OnClick()
|
||
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
||
|
|
self:ToggleMenu()
|
||
|
|
end
|
||
|
|
|
||
|
|
local function _GetItem(menuTable, value)
|
||
|
|
if type(menuTable) == 'function' then
|
||
|
|
local list = {}
|
||
|
|
menuTable = menuTable(list) or list
|
||
|
|
end
|
||
|
|
for i, v in ipairs(menuTable) do
|
||
|
|
if v.value == value then
|
||
|
|
return v
|
||
|
|
end
|
||
|
|
if v.menuTable then
|
||
|
|
local item = _GetItem(v.menuTable, value)
|
||
|
|
if item then
|
||
|
|
return item
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:SetValue(value)
|
||
|
|
value = value or self.defaultValue
|
||
|
|
|
||
|
|
if not value then
|
||
|
|
self.value = nil
|
||
|
|
self.item = nil
|
||
|
|
self:SetText(self.defaultText)
|
||
|
|
elseif self.menuTable then
|
||
|
|
local item = _GetItem(self.menuTable, value)
|
||
|
|
if item then
|
||
|
|
self:SetItem(item)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:GetValue()
|
||
|
|
return self.value or self.defaultValue
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:SetMenuTable(menuTable)
|
||
|
|
self.menuTable = menuTable
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:GetMenuTable()
|
||
|
|
return self.menuTable
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:ToggleMenu()
|
||
|
|
local menuTable = self:GetMenuTable()
|
||
|
|
if type(menuTable) == 'function' then
|
||
|
|
local list = {}
|
||
|
|
menuTable = menuTable(list) or list
|
||
|
|
end
|
||
|
|
if not menuTable or #menuTable == 0 then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if not self.DropMenu then
|
||
|
|
local DropMenu = GUI:GetClass('DropMenu'):New(UIParent)
|
||
|
|
Dropdown.DropMenu = DropMenu
|
||
|
|
end
|
||
|
|
self.DropMenu:Toggle(1, menuTable, self, self.maxItem, 'TOPLEFT', self, 'BOTTOMLEFT')
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:SetItem(item)
|
||
|
|
local noFire = self.value == item.value
|
||
|
|
|
||
|
|
self.value = item.value
|
||
|
|
self.item = item
|
||
|
|
|
||
|
|
self:SetText(item.full or item.text)
|
||
|
|
|
||
|
|
if self.DropMenu then
|
||
|
|
self.DropMenu:Close()
|
||
|
|
end
|
||
|
|
|
||
|
|
if not noFire then
|
||
|
|
self:Fire('OnSelectChanged', item)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:GetItem()
|
||
|
|
return self.item
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:SetDefaultText(text)
|
||
|
|
self.defaultText = text
|
||
|
|
self:SetText(text)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:SetDefaultValue(value)
|
||
|
|
self.defaultValue = value
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:SetMaxItem(value)
|
||
|
|
self.maxItem = value
|
||
|
|
end
|
||
|
|
|
||
|
|
function Dropdown:GetMaxItem()
|
||
|
|
return self.maxItem
|
||
|
|
end
|