Bagnon-3.3.5/Bagnon/components/brokerDisplay.lua
Richard Steininger 37d072dcc4 Initial commit
2023-10-18 20:34:32 +02:00

380 lines
No EOL
7.7 KiB
Lua

--[[
brokerDisplay.lua
A databroker display object
--]]
local Bagnon = LibStub('AceAddon-3.0'):GetAddon('Bagnon')
local BrokerDisplay = Bagnon.Classy:New('Button')
BrokerDisplay:Hide()
Bagnon.BrokerDisplay = BrokerDisplay
local ICON_SIZE = 18
--[[ Constructor ]]--
function BrokerDisplay:New(id, frameID, parent)
local obj = self:Bind(CreateFrame('Button', nil, parent))
obj:RegisterForClicks('anyUp')
obj:SetID(id)
obj.left = obj:CreateLeftButton()
obj.left:SetPoint('LEFT')
obj.right = obj:CreateRightButton()
obj.right:SetPoint('RIGHT')
obj.icon = obj:AddIcon()
obj.icon:SetPoint('LEFT', obj.left, 'RIGHT')
obj.text = obj:AddText()
obj:SetScript('OnShow', obj.OnShow)
obj:SetScript('OnHide', obj.OnHide)
obj:SetScript('OnEnter', obj.OnEnter)
obj:SetScript('OnLeave', obj.OnLeave)
obj:SetScript('OnClick', obj.OnClick)
obj:SetScript('OnMouseWheel', obj.OnMouseWheel)
obj:SetFrameID(frameID)
obj:SetHeight(13)
obj:EnableMouseWheel(true)
obj:UpdateInsets()
return obj
end
function BrokerDisplay:AddIcon()
local texture = self:CreateTexture(nil, 'OVERLAY')
texture:SetWidth(ICON_SIZE)
texture:SetHeight(ICON_SIZE)
return texture
end
function BrokerDisplay:AddText()
local text = self:CreateFontString()
text:SetFontObject('GameFontNormal')
text:SetJustifyH('LEFT')
return text
end
--[[
Broker Selection Buttons
--]]
function BrokerDisplay:CreateLeftButton()
local b = CreateFrame('Button', nil, self)
b:SetTextFontObject('GameFontNormal')
b:SetHighlightFontObject('GameFontHighlight')
b:SetText('<')
b:SetWidth(b:GetTextWidth() + 4)
b:SetHeight(b:GetTextHeight())
b:SetScript('OnClick', function(self) self:GetParent():SetPreviousObject() end)
b:SetToplevel(true)
return b
end
function BrokerDisplay:CreateRightButton()
local b = CreateFrame('Button', nil, self)
b:SetWidth(ICON_SIZE)
b:SetHeight(ICON_SIZE)
b:SetTextFontObject('GameFontNormal')
b:SetHighlightFontObject('GameFontHighlight')
b:SetText('>')
b:SetWidth(b:GetTextWidth() + 2)
b:SetHeight(b:GetTextHeight())
b:SetScript('OnClick', function(self) self:GetParent():SetNextObject() end)
b:SetToplevel(true)
return b
end
--[[ Messages ]]--
function BrokerDisplay:LibDataBroker_DataObjectCreated(msg, name, dataobj)
if self:GetObjectName() == name then
self:UpdateDisplay()
end
end
function BrokerDisplay:LibDataBroker_AttributeChanged(msg, name, attr, value, dataobj)
if self:GetObjectName() == name then
if attr == 'icon' then
self:UpdateIcon()
elseif attr == 'text' then
self:UpdateText()
end
end
end
function BrokerDisplay:DATABROKER_OBJECT_UPDATE(msg, frameID, objectName)
if self:GetFrameID() == frameID then
self:UpdateDisplay()
if GameTooltip:IsOwned(self) then
self:OnEnter()
end
end
end
--[[ Frame Events ]]--
function BrokerDisplay:OnEnter()
local dbo = self:GetObject()
if not dbo then return end
if dbo.OnEnter then
dbo.OnEnter(self)
elseif dbo.OnTooltipShow then
GameTooltip:SetOwner(self, 'ANCHOR_TOPRIGHT')
GameTooltip:ClearLines()
dbo.OnTooltipShow(GameTooltip)
GameTooltip:Show()
else
GameTooltip:SetOwner(self, 'ANCHOR_TOPRIGHT')
GameTooltip:ClearLines()
GameTooltip:SetText(self:GetObjectName())
GameTooltip:Show()
end
end
function BrokerDisplay:OnLeave()
local dbo = self:GetObject()
if not dbo then return end
if dbo.OnLeave then
dbo.OnLeave(self)
else
if GameTooltip:IsOwned(self) then
GameTooltip:Hide()
end
end
end
function BrokerDisplay:OnClick(...)
local dbo = self:GetObject()
if dbo and dbo.OnClick then
dbo.OnClick(self, ...)
end
end
function BrokerDisplay:OnShow()
self:UpdateEverything()
end
function BrokerDisplay:OnHide()
self:UpdateEvents()
end
function BrokerDisplay:OnMouseWheel(direction)
if direction > 0 then
self:SetNextObject()
else
self:SetPreviousObject()
end
end
--[[ Update Methods ]]--
function BrokerDisplay:UpdateEverything()
self:UpdateEvents()
self:UpdateDisplay()
end
function BrokerDisplay:UpdateEvents()
local LDB = LibStub:GetLibrary('LibDataBroker-1.1', true)
if LDB then
LDB.UnregisterAllCallbacks(self)
if self:IsVisible() then
LDB.RegisterCallback(self, 'LibDataBroker_DataObjectCreated')
LDB.RegisterCallback(self, 'LibDataBroker_AttributeChanged')
end
end
self:UnregisterAllMessages()
if self:IsVisible() then
self:RegisterMessage('DATABROKER_OBJECT_UPDATE')
end
end
function BrokerDisplay:UpdateDisplay()
self:UpdateIcon()
self:UpdateText()
end
function BrokerDisplay:UpdateText()
local obj = self:GetObject()
local text
if obj then
text = obj.text or ''
else
text = 'Select Databroker Plugin'
end
self.text:SetText(text)
self:Layout()
end
function BrokerDisplay:UpdateIcon()
local obj = self:GetObject()
local icon = obj and obj.icon
if icon then
self.icon:SetTexture(icon)
self.icon:Show()
else
self.icon:Hide()
end
self:Layout()
end
function BrokerDisplay:Layout()
if self.icon:IsShown() then
self.text:SetPoint('LEFT', self.icon, 'RIGHT', 2, 0)
self.text:SetPoint('RIGHT', self.right, 'LEFT', -2, 0)
else
self.text:SetPoint('LEFT', self.left, 'RIGHT', 2, 0)
self.text:SetPoint('RIGHT', self.right, 'LEFT', -2, 0)
end
self:UpdateInsets()
end
--calculate the clickable portion of the frame
function BrokerDisplay:UpdateInsets()
local realWidth = self.left:GetWidth()
if self.text:IsShown() then
realWidth = realWidth + (self.text:GetStringWidth() or 0)
end
if self.icon:IsShown() then
realWidth = realWidth + (self.icon:GetWidth() or 0)
end
self:SetHitRectInsets(0, self:GetWidth() - realWidth, 0, 0)
end
--[[ Display Object Updating ]]--
function BrokerDisplay:SetObject(objectName)
self:GetSettings():SetBrokerDisplayObject(objectName)
end
function BrokerDisplay:GetObject()
local LDB = LibStub:GetLibrary('LibDataBroker-1.1', true)
if LDB then
return LDB:GetDataObjectByName(self:GetObjectName())
end
return nil
end
function BrokerDisplay:GetObjectName()
return self:GetSettings():GetBrokerDisplayObject()
end
function BrokerDisplay:SetNextObject()
local LDB = LibStub:GetLibrary('LibDataBroker-1.1', true)
if not LDB then return end
local currObjName = self:GetObjectName()
local prevObjName = nil
for i, nextObjName in self:GetAvailableObjects() do
if currObjName == prevObjName then
self:SetObject(nextObjName)
return
end
prevObjName = nextObjName
end
for i, nextObjName in self:GetAvailableObjects() do
if currObjName == prevObjName then
self:SetObject(nextObjName)
return
end
prevObjName = nextObjName
end
self:SetObject(prevObjName)
end
function BrokerDisplay:SetPreviousObject()
local LDB = LibStub:GetLibrary('LibDataBroker-1.1', true)
if not LDB then return end
local currObjName = self:GetObjectName()
local prevObjName = nil
for i, nextObjName in self:GetAvailableObjects() do
if prevObjName and (currObjName == nextObjName) then
self:SetObject(prevObjName)
return
end
prevObjName = nextObjName
end
for i, nextObjName in self:GetAvailableObjects() do
if prevObjName and (currObjName == nextObjName) then
self:SetObject(prevObjName)
return
end
prevObjName = nextObjName
end
self:SetObject(prevObjName)
end
do
local objects = {}
function BrokerDisplay:GetAvailableObjects()
if next(objects) ~= nil then
for k, v in pairs(objects) do
objects[k] = nil
end
end
local LDB = LibStub:GetLibrary('LibDataBroker-1.1', true)
if LDB then
for name, obj in LDB:DataObjectIterator() do
table.insert(objects, name)
end
end
table.sort(objects)
return ipairs(objects)
end
end
--[[ Properties ]]--
function BrokerDisplay:SetFrameID(frameID)
if self:GetFrameID() ~= frameID then
self.frameID = frameID
self:UpdateEverything()
end
end
function BrokerDisplay:GetFrameID()
return self.frameID
end
function BrokerDisplay:GetSettings()
return Bagnon.FrameSettings:Get(self:GetFrameID())
end