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.6 KiB

5 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