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.

140 lines
3.8 KiB

local Button, API, _, L = {}, ImmersionAPI, ...
L.ButtonMixin = Button
----------------------------------
function Button:ActiveQuest() API:SelectActiveQuest(self:GetID()) end
function Button:AvailableQuest() API:SelectAvailableQuest(self:GetID()) end
----------------------------------
function Button:Gossip() API:SelectGossipOption(self:GetID()) end
function Button:Active() API:SelectGossipActiveQuest(self:GetID()) end
function Button:Available() API:SelectGossipAvailableQuest(self:GetID()) end
----------------------------------
function Button:OnClick()
local func = self[self.type]
if func then
L.ClickedTitleCache = {text = self:GetText(); icon = self.Icon:GetTexture()}
func(self)
PlaySound(SOUNDKIT.IG_QUEST_LIST_SELECT)
end
end
function Button:OnShow()
self.Counter:SetShown(L('enablenumbers'))
local id = self.idx or 1
C_Timer.After(id * 0.025, function()
L.UIFrameFadeIn(self, 0.2, self:GetAlpha(), 1)
end)
end
function Button:OnDragStart(button)
if not L('titlelock') then
self.Container:SetClampedToScreen(true)
self.Container:StartMoving()
end
end
function Button:OnMouseWheel(delta)
self.Container:SetClampedToScreen(false)
self.Container:OnScroll(delta)
end
function Button:OnDragStop()
if not L('titlelock') then
self.Container:StopMoving()
end
end
function Button:OnHide()
self:SetAlpha(0)
end
function Button:OnScaleFinished()
-- Force a text/height update after scaling
self:SetText(self:GetText())
end
----------------------------------
function Button:SetFormattedText(...)
local __index = getmetatable(self).__index
__index.SetFormattedText(self, ...)
__index.SetHeight(self, self.Label:GetStringHeight() + 32)
end
function Button:SetText(...)
local __index = getmetatable(self).__index
__index.SetText(self, ...)
__index.SetHeight(self, self.Label:GetStringHeight() + 32)
end
function Button:SetHeight(height, force)
if force then
getmetatable(self).__index.SetHeight(self, height)
end
end
----------------------------------
function Button:SetType(type)
assert(self[type], 'Type of interaction is not defined.')
self.type = type
end
function Button:SetIcon(texture, vertex, atlas)
vertex = vertex or 1
self.Icon:SetVertexColor(vertex, vertex, vertex)
if atlas then
self.Icon:SetAtlas(texture)
else
self.Icon:SetTexture(texture)
end
end
function Button:SetGossipQuestIcon(texture, vertex)
vertex = vertex or 1
self.Icon:SetTexture(tonumber(texture) or ([[Interface\GossipFrame\%s]]):format(texture or ''))
self.Icon:SetVertexColor(vertex, vertex, vertex)
end
function Button:SetGossipIcon(texture, vertex)
vertex = vertex or 1
self.Icon:SetTexture(tonumber(texture) or ([[Interface\GossipFrame\%sGossipIcon]]):format(texture or ''))
self.Icon:SetVertexColor(vertex, vertex, vertex)
end
function Button:SetPriority(val)
self.priority = val
end
function Button:ComparePriority(otherButton)
if otherButton and (otherButton.priority or 5) < (self.priority or 5) then
return otherButton
end
return self
end
function Button:Init(id)
local parent = self:GetParent()
local set = parent.Buttons
local top = (id == 1)
self.Container = parent
self.idx = id
self.anchor = {
'TOP',
top and parent or set[id-1],
top and 'TOP' or 'BOTTOM',
0, 0,
}
----------------------------------
self:SetPoint(unpack(self.anchor))
----------------------------------
self.Counter:SetText(id < 10 and id or '')
----------------------------------
self:RegisterForDrag('LeftButton', 'RightButton')
self:OnShow()
----------------------------------
L.SetBackdrop(self.Overlay, L.Backdrops.GOSSIP_NORMAL)
L.SetBackdrop(self.Hilite, L.Backdrops.GOSSIP_HILITE)
----------------------------------
self.Init = nil
end