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.

163 lines
5.5 KiB

-- ========================================================================= --
-- EskaTracker 2 --
-- https://www.curseforge.com/wow/addons/eskatracker-2 --
-- --
-- Repository: --
-- https://github.com/Skamer/EskaTracker2 --
-- --
-- ========================================================================= --
Syling "SylingTracker.WorldQuests.WorldQuestView" ""
-- ========================================================================= --
namespace "SLT"
-- ========================================================================= --
export {
-- Iterator helper for ignoring the children are used for backdrop, and avoiding
-- they are taken as account for their parent height
IterateFrameChildren = Utils.IterateFrameChildren
}
-- ========================================================================= --
__Recyclable__ "SylingTracker_WorldQuestView%d"
class "WorldQuestView" { TaskView }
-- ========================================================================= --
__Recyclable__ "SylingTracker_WorldQuestListView%d"
class "WorldQuestListView" (function(_ENV)
inherit "Frame" extend "IView"
-----------------------------------------------------------------------------
-- Methods --
-----------------------------------------------------------------------------
function OnViewUpdate(self, data, updater)
local questIndex = 0
wipe(self.questsID)
local previousQuest
for _, questData in pairs(data) do
questIndex = questIndex + 1
local questID = questData.questID
local quest = self:AcquireQuest(questID)
if questIndex > 1 then
quest:SetPoint("TOP", previousQuest, "BOTTOM", 0, -self.WorldQuestsSpacing)
elseif questIndex == 1 then
quest:SetPoint("TOP")
end
quest:Show()
quest:UpdateView(questData, updater)
previousQuest = quest
self.questsID[questID] = true
end
self:ReleaseUnusedQuests()
end
function AcquireQuest(self, id)
local quest = self.questsCache[id]
if not quest then
quest = WorldQuestView.Acquire()
quest:SetParent(self)
quest:SetPoint("LEFT")
quest:SetPoint("RIGHT")
quest.OnSizeChanged = quest.OnSizeChanged + self.OnWorldQuestSizeChanged
self:AdjustHeight()
self.questsCache[id] = quest
end
return quest
end
function ReleaseUnusedQuests(self)
for questID, quest in pairs(self.questsCache) do
if not self.questsID[questID] then
self.questsCache[questID] = nil
quest.OnSizeChanged = quest.OnSizeChanged - self.OnWorldQuestSizeChanged
quest:Release()
self:AdjustHeight()
end
end
end
function OnAdjustHeight(self, useAnimation)
local height = 0
local count = 0
for _, child in IterateFrameChildren(self) do
height = height + child:GetHeight()
count = count + 1
end
height = height + self.WorldQuestsSpacing * math.max(0, count-1)
if useAnimation then
self:SetAnimatedHeight(height)
else
self:SetHeight(height)
end
end
function OnRelease(self)
wipe(self.questsID)
self:ReleaseUnusedQuests()
self:Hide()
self:ClearAllPoints()
self:SetParent()
self:CancelAdjustHeight()
self:CancelAnimatingHeight()
self:SetHeight(1)
end
function OnAcquire(self)
self:Show()
-- Important ! We need the frame is instantly styled as this may affect
-- its height.
self:InstantApplyStyle()
self:AdjustHeight()
end
-----------------------------------------------------------------------------
-- Properties --
-----------------------------------------------------------------------------
property "WorldQuestsSpacing" {
type = Number,
default = 5
}
-----------------------------------------------------------------------------
-- Constructors --
-----------------------------------------------------------------------------
function __ctor(self)
-- Important! As the frame ajusts its height depending of its children height
-- we need to set its height when contructed for the event "OnSizechanged" of
-- its children is triggered.
self:SetHeight(1) -- !important
-- Keep in the cache the bonus quest, to be reused.
-- use: self.questsCache[questID] = questObject
self.questsCache = setmetatable({}, { __mode = "v"})
-- Get the current bonus quest id's list. Used internally to release the
-- unused bonus quests
-- use: self.questsID[questID] = true or nil
self.questsID = {}
self.OnWorldQuestSizeChanged = function() self:AdjustHeight() end
self:SetClipsChildren(true)
end
end)
-- ========================================================================= --
-- Styles --
-- ========================================================================= --
Style.UpdateSkin("Default", {
[WorldQuestView] = {
contextMenuID = "world-quest"
}
})