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.
364 lines
10 KiB
364 lines
10 KiB
-- ========================================================================= --
|
|
-- SylingTracker --
|
|
-- https://www.curseforge.com/wow/addons/sylingtracker --
|
|
-- --
|
|
-- Repository: --
|
|
-- https://github.com/Skamer/SylingTracker --
|
|
-- --
|
|
-- ========================================================================= --
|
|
Syling "SylingTracker.Quests.QuestsContentView" ""
|
|
-- ========================================================================= --
|
|
namespace "SLT"
|
|
-- ========================================================================= --
|
|
export {
|
|
ResetStyles = Utils.ResetStyles,
|
|
ValidateFlags = System.Toolset.validateflags
|
|
}
|
|
-- ========================================================================= --
|
|
local SHOW_CATEGORIES = true
|
|
-- ========================================================================= --
|
|
__Recyclable__ "SylingTracker_QuestsContentView%d"
|
|
class "QuestsContentView" (function(_ENV)
|
|
inherit "ContentView"
|
|
|
|
__Flags__()
|
|
enum "Flags" {
|
|
NONE = 0,
|
|
HAS_QUESTS = 1,
|
|
HAS_CATEGORIES = 2,
|
|
}
|
|
-----------------------------------------------------------------------------
|
|
-- Methods --
|
|
-----------------------------------------------------------------------------
|
|
function HookData(self, data)
|
|
if data.quests then
|
|
local newData = {}
|
|
local hasQuests = false
|
|
for questID, questData in pairs(data.quests) do
|
|
if not questData.campaignID or questData.campaignID == 0 then
|
|
if not newData.quests then
|
|
newData.quests = {}
|
|
end
|
|
|
|
newData.quests[questID] = questData
|
|
hasQuests = true
|
|
end
|
|
end
|
|
|
|
self.ShouldBeDisplayed = hasQuests
|
|
|
|
return newData
|
|
end
|
|
|
|
return data
|
|
end
|
|
|
|
function OnViewUpdate(self, data)
|
|
local questsData = data.quests
|
|
|
|
local showCategories
|
|
if self.IgnoreOptions then
|
|
showCategories = self.ShowCategories
|
|
else
|
|
showCategories = SHOW_CATEGORIES
|
|
end
|
|
|
|
-- Determines the flags
|
|
local flags = Flags.NONE
|
|
if questsData then
|
|
if showCategories then
|
|
flags = Flags.HAS_CATEGORIES
|
|
else
|
|
flags = Flags.HAS_QUESTS
|
|
end
|
|
end
|
|
|
|
if flags ~= self.Flags then
|
|
ResetStyles(self)
|
|
|
|
-- are there quests
|
|
if ValidateFlags(Flags.HAS_QUESTS, flags) then
|
|
self:AcquireQuests()
|
|
else
|
|
self:ReleaseQuests()
|
|
end
|
|
|
|
-- are there categories
|
|
if ValidateFlags(Flags.HAS_CATEGORIES, flags) then
|
|
self:AcquireCategories()
|
|
else
|
|
self:ReleaseCategories()
|
|
end
|
|
|
|
-- Styling stuff
|
|
if flags ~= Flags.NONE then
|
|
local styles = self.FlagsStyles and self.FlagsStyles[flags]
|
|
if styles then
|
|
Style[self] = styles
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
if questsData then
|
|
if showCategories then
|
|
local categories = self:AcquireCategories()
|
|
categories:UpdateView(questsData)
|
|
else
|
|
local quests = self:AcquireQuests()
|
|
quests:UpdateView(questsData)
|
|
end
|
|
end
|
|
|
|
self.Flags = flags
|
|
end
|
|
|
|
function AcquireQuests(self)
|
|
local content = self:GetChild("Content")
|
|
local quests = content:GetChild("Quests")
|
|
if not quests then
|
|
quests = QuestListView.Acquire()
|
|
|
|
-- We need to keep the old name when we'll release it
|
|
self.__PreviousQuestsName = quests:GetName()
|
|
|
|
quests:SetParent(content)
|
|
quests:SetName("Quests")
|
|
quests:InstantApplyStyle()
|
|
|
|
-- Register the events
|
|
quests.OnSizeChanged = quests.OnSizeChanged + self.OnChildrenSizeChanged
|
|
|
|
self:AdjustHeight(true)
|
|
end
|
|
|
|
return quests
|
|
end
|
|
|
|
function ReleaseQuests(self)
|
|
local content = self:GetChild("Content")
|
|
local quests = content:GetChild("Quests")
|
|
if quests then
|
|
-- Give its old name (generated by the recycle system)
|
|
quests:SetName(self.__PreviousQuestsName)
|
|
self.__PreviousQuestsName = nil
|
|
|
|
-- Unregister the events
|
|
quests.OnSizeChanged = quests.OnSizeChanged - self.OnChildrenSizeChanged
|
|
|
|
-- It's better to release it after the event has been unregistered for avoiding
|
|
-- useless call
|
|
quests:Release()
|
|
|
|
self:AdjustHeight(true)
|
|
end
|
|
end
|
|
|
|
function AcquireCategories(self)
|
|
local content = self:GetChild("Content")
|
|
local categories = content:GetChild("Categories")
|
|
if not categories then
|
|
categories = QuestCategoryListView.Acquire()
|
|
|
|
-- We need to keep the old name when we'll release it
|
|
self.__PreviousCategoriesName = categories:GetName()
|
|
|
|
categories:SetParent(content)
|
|
categories:SetName("Categories")
|
|
categories:InstantApplyStyle()
|
|
|
|
-- -- It's important to only style it once we have set its parent and its new
|
|
-- -- name
|
|
-- if self.Quests then
|
|
-- Style[quests] = self.Quests
|
|
-- end
|
|
|
|
-- Register the events
|
|
categories.OnSizeChanged = categories.OnSizeChanged + self.OnChildrenSizeChanged
|
|
|
|
self:AdjustHeight(true)
|
|
end
|
|
|
|
return categories
|
|
end
|
|
|
|
function ReleaseCategories(self)
|
|
local content = self:GetChild("Content")
|
|
local categories = content:GetChild("Categories")
|
|
|
|
if categories then
|
|
-- Give its old name (generated by the recycle system)
|
|
categories:SetName(self.__PreviousCategoriesName)
|
|
self.__PreviousCategoriesName = nil
|
|
|
|
-- Unregister the events
|
|
categories.OnSizeChanged = categories.OnSizeChanged - self.OnChildrenSizeChanged
|
|
|
|
-- It's better to release it after the event has been unregistered for avoiding
|
|
-- useless call
|
|
categories:Release()
|
|
|
|
self:AdjustHeight(true)
|
|
end
|
|
end
|
|
|
|
function OnRelease(self)
|
|
-- First, release the children
|
|
self:ReleaseQuests()
|
|
self:ReleaseCategories()
|
|
|
|
-- We call the "Parent" OnRelease (see, ContentView)
|
|
super.OnRelease(self)
|
|
|
|
self.Flags = nil
|
|
end
|
|
-----------------------------------------------------------------------------
|
|
-- Properties --
|
|
-----------------------------------------------------------------------------
|
|
property "FlagsStyles" {
|
|
type = Table
|
|
}
|
|
|
|
property "Flags" {
|
|
type = QuestsContentView.Flags,
|
|
default = QuestsContentView.Flags.NONE
|
|
}
|
|
|
|
-- Currently, this isn't used but will be in the future when the skin system
|
|
-- is ready.
|
|
-- The displaying of categories is determined by SHOW_CATEGORIES instead
|
|
property "ShowCategories" {
|
|
type = Boolean,
|
|
default = true
|
|
}
|
|
|
|
-- @HACK: Prevent the options to be applied
|
|
-- e.g, to be sure the categories are not displayed for campaign
|
|
property "IgnoreOptions" {
|
|
type = Boolean,
|
|
default = false
|
|
}
|
|
-----------------------------------------------------------------------------
|
|
-- Constructors --
|
|
-----------------------------------------------------------------------------
|
|
__Template__{}
|
|
function __ctor(self)
|
|
self.OnChildrenSizeChanged = function() self:AdjustHeight(true) end
|
|
end
|
|
end)
|
|
-- ========================================================================= --
|
|
__Recyclable__ "SylingTracker_CampaignContentView%d"
|
|
class "CampaignContentView" (function(_ENV)
|
|
inherit "QuestsContentView"
|
|
|
|
function HookData(self, data)
|
|
if data.quests then
|
|
local newData = {}
|
|
local hasCampaign = false
|
|
for questID, questData in pairs(data.quests) do
|
|
if questData.campaignID and questData.campaignID ~= 0 then
|
|
if not newData.quests then
|
|
newData.quests = {}
|
|
end
|
|
|
|
newData.quests[questID] = questData
|
|
hasCampaign = true
|
|
end
|
|
end
|
|
|
|
self.ShouldBeDisplayed = hasCampaign
|
|
|
|
return newData
|
|
end
|
|
|
|
return data
|
|
end
|
|
end)
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Styles --
|
|
-------------------------------------------------------------------------------
|
|
Style.UpdateSkin("Default", {
|
|
[QuestsContentView] = {
|
|
Header = {
|
|
IconBadge = {
|
|
backdropColor = { r = 0, g = 0, b = 0, a = 0},
|
|
Icon = {
|
|
atlas = AtlasType("QuestNormal")
|
|
}
|
|
},
|
|
|
|
Label = {
|
|
text = "Quests"
|
|
}
|
|
},
|
|
Content = {
|
|
backdropColor = { r = 1, g = 0, b = 0, a = 1},
|
|
location = {
|
|
Anchor("TOP", 0, -5, "Header", "BOTTOM"),
|
|
Anchor("LEFT", 5, 0),
|
|
Anchor("RIGHT", -5, 0)
|
|
}
|
|
},
|
|
|
|
FlagsStyles = {
|
|
[QuestsContentView.Flags.HAS_QUESTS] = {
|
|
Content = {
|
|
Quests = {
|
|
location = {
|
|
Anchor("TOP"),
|
|
Anchor("LEFT"),
|
|
Anchor("RIGHT")
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
[QuestsContentView.Flags.HAS_CATEGORIES] = {
|
|
Content = {
|
|
Categories = {
|
|
location = {
|
|
Anchor("TOP"),
|
|
Anchor("LEFT"),
|
|
Anchor("RIGHT")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
[CampaignContentView] = {
|
|
IgnoreOptions = true,
|
|
ShowCategories = false,
|
|
Header = {
|
|
IconBadge = {
|
|
Icon = {
|
|
atlas = AtlasType("quest-campaign-available")
|
|
}
|
|
},
|
|
Label = {
|
|
text = "Campaign"
|
|
}
|
|
}
|
|
}
|
|
})
|
|
-- ========================================================================= --
|
|
function OnLoad(self)
|
|
Settings.Register("quests-enable-categories", true)
|
|
end
|
|
|
|
function OnEnable(self)
|
|
SHOW_CATEGORIES = Settings.Get("quests-enable-categories")
|
|
end
|
|
|
|
__SystemEvent__()
|
|
function SLT_TOGGLE_QUEST_CATEGORIES_COMMAND()
|
|
local showCategories = Settings.Get("quests-enable-categories")
|
|
Settings.Set("quests-enable-categories", not showCategories)
|
|
|
|
SHOW_CATEGORIES = not showCategories
|
|
|
|
Warn("The displaying of categories has been set to |cff00ffff%s|r. |cffff6a00The change will take effect on the next data update or after a reload ui.|r",
|
|
SHOW_CATEGORIES and "true" or "false"
|
|
)
|
|
end
|
|
|