380 lines
No EOL
7.7 KiB
Lua
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 |