-- ========================================================================= --
-- 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