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.

238 lines
7.0 KiB

-- ========================================================================= --
-- SylingTracker --
-- https://www.curseforge.com/wow/addons/sylingtracker --
-- --
-- Repository: --
-- https://github.com/Skamer/SylingTracker --
-- --
-- ========================================================================= --
Syling "SylingTracker.Dungeon.ContentView" ""
-- ========================================================================= --
namespace "SLT"
-- ========================================================================= --
export {
ValidateFlags = System.Toolset.validateflags,
ResetStyles = Utils.ResetStyles,
}
-- ========================================================================= --
__Recyclable__ "SylingTracker_DungeonContentView%d"
class "DungeonContentView" (function(_ENV)
inherit "ContentView"
__Flags__()
enum "Flags" {
NONE = 0,
HAS_OBJECTIVES = 1
}
-----------------------------------------------------------------------------
-- Methods --
-----------------------------------------------------------------------------
function OnViewUpdate(self, data)
local dungeonData = data.dungeon
if not dungeonData then
return
end
-- Get the elements
local contentFrame = self:GetChild("Content")
local headerFrame = self:GetChild("Header")
local dungeonNameFS = headerFrame:GetChild("DungeonName")
local dungeonIcon = contentFrame:GetChild("DungeonIcon")
-- Determine the flags
local flags = Flags.NONE
local objectivesData = dungeonData.objectives
if objectivesData then
flags = flags + Flags.HAS_OBJECTIVES
end
if flags ~= self.Flags then
ResetStyles(self)
-- Is there objectives
if ValidateFlags(Flags.HAS_OBJECTIVES, flags) then
self:AcquireObjectives()
else
self:ReleaseObjectives()
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
local name, texture = dungeonData.name, dungeonData.icon
if objectivesData then
local objectivesFrame = self:AcquireObjectives()
objectivesFrame:UpdateView(objectivesData)
end
if texture then
Style[dungeonIcon].Icon.fileID = texture
end
if name then
Style[dungeonNameFS].text = name
end
self.Flags = flags
end
function AcquireObjectives(self)
local content = self:GetChild("Content")
local objectives = content:GetChild("Objectives")
if not objectives then
objectives = self.ObjectivesClass.Acquire()
-- We need to keep the old name when we'll release it
self.__PreviousObjectivesName = objectives:GetName()
objectives:SetParent(content)
objectives:SetName("Objectives")
objectives:InstantApplyStyle()
objectives.OnSizeChanged = objectives.OnSizeChanged + self.OnObjectivesSizeChanged
self:AdjustHeight(true)
end
return objectives
end
function ReleaseObjectives(self)
local content = self:GetChild("Content")
local objectives = content:GetChild("Objectives")
if objectives then
-- Give its old name (generated by the recycle system)
objectives:SetName(self.__PreviousObjectivesName)
self.__PreviousObjectivesName = nil
-- Unregister the events
objectives.OnSizeChanged = objectives.OnSizeChanged - self.OnObjectivesSizeChanged
-- It's better to release after events have been unregistered for avoiding
-- useless calls
objectives:Release()
self:AdjustHeight(true)
end
end
function OnRelease(self)
-- First, relase the children
self:ReleaseObjectives()
-- We call the "Parent" onRelease (see, ContentView)
super.OnRelease(self)
-- Reset the class properties
self.Flags = nil
end
-----------------------------------------------------------------------------
-- Properties --
-----------------------------------------------------------------------------
property "Flags" {
type = DungeonContentView.Flags,
default = DungeonContentView.Flags.NONE
}
property "Objectives" {
type = Table
}
property "ObjectivesClass" {
type = ClassType,
default = ObjectiveListView
}
property "FlagsStyles" {
type = Table
}
-----------------------------------------------------------------------------
-- Constructors --
-----------------------------------------------------------------------------
__Template__ {
{
Header = {
DungeonName = SLTFontString
},
Content = {
DungeonIcon = IconBadge
}
}
}
function __ctor(self)
self.OnObjectivesSizeChanged = function() self:AdjustHeight(true) end
end
end)
-- ========================================================================= --
-- Styles --
-- ========================================================================= --
Style.UpdateSkin("Default", {
[DungeonContentView] = {
Header = {
IconBadge = {
Icon = {
atlas = AtlasType("Dungeon")
}
},
Label = {
text = "Dungeon",
sharedMediaFont = FontType("PT Sans Narrow Bold", 13),
justifyV = "TOP"
},
DungeonName = {
sharedMediaFont = FontType("PT Sans Caption Bold", 13),
textColor = Color(1, 233/255, 174/255),
justifyV = "BOTTOM",
textTransform = "UPPERCASE",
location = {
Anchor("TOP"),
Anchor("LEFT", 0, 0, "IconBadge", "RIGHT"),
Anchor("RIGHT"),
Anchor("BOTTOM", 0, 2)
}
}
},
Content = {
backdrop = {
bgFile = [[Interface\AddOns\SylingTracker\Media\Textures\LinearGradient]],
},
backdropColor = { r = 35/255, g = 40/255, b = 46/255, a = 0.73},
DungeonIcon = {
width = 64,
height = 64,
location = {
Anchor("TOPLEFT", 5, -5),
},
}
},
FlagsStyles = {
[DungeonContentView.Flags.HAS_OBJECTIVES] = {
Content = {
Objectives = {
spacing = 10,
location = {
Anchor("TOP", 0, -5),
Anchor("LEFT", 5, 0, "DungeonIcon", "RIGHT"),
Anchor("RIGHT")
}
}
}
}
}
}
})