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

265 lines
No EOL
5.9 KiB
Lua

--[[
bag.lua
A bag button object for Bagnon
--]]
local Bagnon = LibStub('AceAddon-3.0'):GetAddon('Bagnon')
local GuildTab = Bagnon.Classy:New('CheckButton')
Bagnon.GuildTab = GuildTab
--constants
local SIZE = 32
local NORMAL_TEXTURE_SIZE = 64 * (SIZE/36)
--[[ Constructor ]]--
function GuildTab:New(tabID, frameID, parent)
local tab = self:Create(tabID, parent)
tab:SetFrameID(frameID)
tab:SetScript('OnEnter', tab.OnEnter)
tab:SetScript('OnLeave', tab.OnLeave)
tab:SetScript('OnClick', tab.OnClick)
tab:SetScript('OnDragStart', tab.OnDrag)
tab:SetScript('OnReceiveDrag', tab.OnClick)
tab:SetScript('OnEvent', tab.OnEvent)
tab:SetScript('OnShow', tab.OnShow)
tab:SetScript('OnHide', tab.OnHide)
return tab
end
function GuildTab:Create(tabID, parent)
local tab = self:Bind(CreateFrame('CheckButton', 'BagnonGuildTab' .. self:GetNextID(), parent))
tab:SetWidth(SIZE)
tab:SetHeight(SIZE)
tab:SetID(tabID)
local name = tab:GetName()
local icon = tab:CreateTexture(name .. 'IconTexture', 'BORDER')
icon:SetAllPoints(tab)
local count = tab:CreateFontString(name .. 'Count', 'OVERLAY')
count:SetFontObject('NumberFontNormalSmall')
count:SetJustifyH('RIGHT')
count:SetPoint('BOTTOMRIGHT', -2, 2)
local nt = tab:CreateTexture(name .. 'NormalTexture')
nt:SetTexture([[Interface\Buttons\UI-Quickslot2]])
nt:SetWidth(NORMAL_TEXTURE_SIZE)
nt:SetHeight(NORMAL_TEXTURE_SIZE)
nt:SetPoint('CENTER', 0, -1)
tab:SetNormalTexture(nt)
local pt = tab:CreateTexture()
pt:SetTexture([[Interface\Buttons\UI-Quickslot-Depress]])
pt:SetAllPoints(tab)
tab:SetPushedTexture(pt)
local ht = tab:CreateTexture()
ht:SetTexture([[Interface\Buttons\ButtonHilight-Square]])
ht:SetAllPoints(tab)
tab:SetHighlightTexture(ht)
local ct = tab:CreateTexture()
ct:SetTexture([[Interface\Buttons\CheckButtonHilight]])
ct:SetAllPoints(tab)
ct:SetBlendMode('ADD')
tab:SetCheckedTexture(ct)
tab:RegisterForClicks('anyUp')
tab:RegisterForDrag('LeftButton')
return tab
end
do
local id = 0
function GuildTab:GetNextID()
id = id + 1
return id
end
end
--[[ Events ]]--
function GuildTab:OnEvent(event, ...)
local action = self[event]
if action then
action(self, event, ...)
end
end
function GuildTab:UpdateEvents()
self:UnregisterAllEvents()
self:UnregisterAllMessages()
if self:IsVisible() then
self:RegisterMessage('GUILD_BANK_TAB_CHANGE')
self:RegisterEvent('GUILDBANK_UPDATE_TABS')
self:RegisterEvent('GUILDBANKBAGSLOTS_CHANGED')
end
end
--[[ Messages ]]--
function GuildTab:GUILDBANK_UPDATE_TABS()
self:Update()
end
function GuildTab:GUILD_BANK_TAB_CHANGE(msg, tabID)
self:UpdateChecked()
end
function GuildTab:GUILDBANKBAGSLOTS_CHANGED()
self:UpdateCount()
end
--[[ Frame Events ]]--
function GuildTab:OnShow()
self:UpdateEverything()
end
function GuildTab:OnHide()
self:UpdateEvents()
end
function GuildTab:OnClick()
SetCurrentGuildBankTab(self:GetID())
QueryGuildBankTab(self:GetID())
self:SendMessage('GUILD_BANK_TAB_CHANGE', self:GetID())
end
function GuildTab:OnDrag()
--on drag
end
function GuildTab:OnEnter()
if self:GetRight() > (GetScreenWidth() / 2) then
GameTooltip:SetOwner(self, 'ANCHOR_LEFT')
else
GameTooltip:SetOwner(self, 'ANCHOR_RIGHT')
end
self:UpdateTooltip()
end
function GuildTab:OnLeave()
if GameTooltip:IsOwned(self) then
GameTooltip:Hide()
end
end
--[[ Actions ]]--
function GuildTab:UpdateEverything()
self:UpdateEvents()
self:Update()
self:UpdateChecked()
end
function GuildTab:Update()
local name, icon, isViewable, canDeposit, numWithdrawals, remainingWithdrawals = GetGuildBankTabInfo(self:GetID())
SetItemButtonTexture(self, icon or [[Interface\PaperDoll\UI-PaperDoll-Slot-Bag]])
self:UpdateCount(remainingWithdrawals)
--color red if the bag can be purchased
if not isViewable then
SetItemButtonTextureVertexColor(self, 1, 0.1, 0.1)
else
SetItemButtonTextureVertexColor(self, 1, 1, 1)
end
end
function GuildTab:SetCount(count)
local text = _G[self:GetName() .. 'Count']
local count = count or 0
if count > 1 then
if count > 999 then
text:SetFormattedText('%.1fk', count/1000)
else
text:SetText(count)
end
text:Show()
else
text:Hide()
end
end
function GuildTab:UpdateChecked()
self:SetChecked(self:IsCurrentTab())
end
function GuildTab:UpdateCount(count)
--hack, since the amount of withdrawls seems to only be correct when we're looking at the current tab
if not self:IsCurrentTab() then
return
end
if not count then
local name, icon, isViewable, canDeposit, numWithdrawals, remainingWithdrawals = GetGuildBankTabInfo(self:GetID())
count = remainingWithdrawals
end
self:SetCount(count)
end
function GuildTab:IsCurrentTab()
return self:GetID() == GetCurrentGuildBankTab()
end
--[[ Tooltip Methods ]]--
function GuildTab:UpdateTooltip()
local name, icon, isViewable, canDeposit, numWithdrawals, remainingWithdrawals = GetGuildBankTabInfo(self:GetID())
if name then
GameTooltip:SetText(name)
local access
if not canDeposit and numWithdrawals == 0 then
access = RED_FONT_COLOR_CODE .. "(" .. GUILDBANK_TAB_LOCKED .. ")" .. FONT_COLOR_CODE_CLOSE;
elseif not canDeposit then
access = RED_FONT_COLOR_CODE .."(" .. GUILDBANK_TAB_WITHDRAW_ONLY .. ")" .. FONT_COLOR_CODE_CLOSE;
elseif numWithdrawals == 0 then
access = RED_FONT_COLOR_CODE .."(" .. GUILDBANK_TAB_DEPOSIT_ONLY .. ")" .. FONT_COLOR_CODE_CLOSE;
else
access = GREEN_FONT_COLOR_CODE .. "(" .. GUILDBANK_TAB_FULL_ACCESS .. ")" .. FONT_COLOR_CODE_CLOSE;
end
GameTooltip:AddLine(access)
else
GameTooltip:SetText('Unavailable')
end
GameTooltip:Show()
end
--[[ Accessor Functions ]]--
--returns the bagnon frame we're attached to
function GuildTab:SetFrameID(frameID)
if self:GetFrameID() ~= frameID then
self.frameID = frameID
self:UpdateEverything()
end
end
function GuildTab:GetFrameID()
return self.frameID
end
--return the settings object associated with this frame
function GuildTab:GetSettings()
return Bagnon.FrameSettings:Get(self:GetFrameID())
end