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.

401 lines
13 KiB

5 years ago
-- ========================================================================= --
-- SylingTracker --
-- https://www.curseforge.com/wow/addons/sylingtracker --
-- --
-- Repository: --
-- https://github.com/Skamer/SylingTracker --
-- --
-- ========================================================================= --
Syling "SylingTracker.Scenario.ContentView" ""
-- ========================================================================= --
namespace "SLT"
-- ========================================================================= --
-- Iterator helper for ignoring the children are used for backdrop, and avoiding
-- they are taken as account for their parent height
IterateFrameChildren = Utils.IterateFrameChildren
-- ========================================================================= --
ValidateFlags = System.Toolset.validateflags
ResetStyles = Utils.ResetStyles
-- ========================================================================= --
__Recyclable__ "SylingTracker_ScenarioContentView%d"
class "ScenarioContentView" (function(_ENV)
inherit "ContentView"
__Flags__()
enum "Flags" {
NONE = 0,
HAS_OBJECTIVES = 1,
HAS_BONUS_OBJECTIVES = 2,
}
-----------------------------------------------------------------------------
-- Methods --
-----------------------------------------------------------------------------
function OnViewUpdate(self, data)
local scenarioData = data.scenario
if not scenarioData then
return
end
local name = scenarioData.name
if name then
local nameFrame = self:GetChild("Header"):GetChild("ScenarioName")
Style[nameFrame].text = name
end
-- Stage Part
local contentFrame = self:GetChild("Content")
local stageFrame = contentFrame:GetChild("Stage")
local currentStage, numStages = scenarioData.currentStage, scenarioData.numStages
if currentStage and numStages then
local stageCounter = stageFrame:GetChild("Counter")
Style[stageCounter].text = string.format("%i/%i", currentStage, numStages)
end
local stageName = scenarioData.stageName
if stageName then
local stageNameFrame = stageFrame:GetChild("Name")
Style[stageNameFrame].text = stageName
end
-- Determine the flags
local flags = Flags.NONE
if scenarioData.objectives then
flags = flags + Flags.HAS_OBJECTIVES
end
if scenarioData.bonusObjectives then
flags = flags + Flags.HAS_BONUS_OBJECTIVES
end
if flags ~= self.Flags then
ResetStyles(self)
-- REVIEW: Probably need adding the header
-- Is the scenario has objectives
if ValidateFlags(Flags.HAS_OBJECTIVES, flags) then
self:AcquireObjectives()
else
self:ReleaseObjectives()
end
-- Is the scenario has bonus objectives
if ValidateFlags(Flags.HAS_BONUS_OBJECTIVES, flags) then
objectivesView = self:AcquireBonusObjectives()
else
self:ReleaseBonusObjectives()
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
-- Update the conditional children if exists
if scenarioData.objectives then
local objectivesView = self:AcquireObjectives()
objectivesView:UpdateView(scenarioData.objectives)
end
if scenarioData.bonusObjectives then
local bonusObjectivesView = self:AcquireBonusObjectives()
bonusObjectivesView:UpdateView(scenarioData.bonusObjectives)
end
-- Don't forget to set the new flag for avoiding "Flashy" behaviors
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.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 un registered for avoiding
-- useless calls
objectives:Release()
self:AdjustHeight(true)
end
end
function AcquireBonusObjectives(self)
local bonusObjectives = self.__bonusObjectives
if not bonusObjectives then
local content = self:GetChild("Content")
bonusObjectives = self.BonusObjectivesClass.Acquire()
local bonusObjectivesText = SLTFontString.Acquire()
local bonusObjectivesIcon = IconBadge.Acquire()
self.__bonusObjectives = bonusObjectives
self.__bonusObjectivesText = bonusObjectivesText
self.__bonusObjectivesIcon = bonusObjectivesIcon
-- We need to keep the old name when we'll release it
self.__previousBonusObjectivesName = bonusObjectives:GetName()
self.__previousBonusObjectivesTextName = bonusObjectivesText:GetName()
self.__previousBonusObjectivesIconName = bonusObjectivesIcon:GetName()
bonusObjectives:SetParent(content)
bonusObjectivesText:SetParent(content)
bonusObjectivesIcon:SetParent(content)
bonusObjectives:SetName("BonusObjectives")
bonusObjectivesText:SetName("BonusObjectivesText")
bonusObjectivesIcon:SetName("BonusObjectivesIcon")
bonusObjectives.OnSizeChanged = bonusObjectives.OnSizeChanged + self.OnObjectivesSizeChanged
self:AdjustHeight(true)
end
return bonusObjectives
end
function ReleaseBonusObjectives(self)
local bonusObjectives = self.__bonusObjectives
if bonusObjectives then
local bonusObjectivesText = self.__bonusObjectivesText
local bonusObjectivesIcon = self.__bonusObjectivesIcon
self.__bonusObjectives = nil
self.__bonusObjectivesIcon = nil
self.__bonusObjectivesText = nil
-- Give its old name (generated by the recycle system)
bonusObjectives:SetName(self.__previousBonusObjectivesName)
bonusObjectivesText:SetName(self.__previousBonusObjectivesTextName)
bonusObjectivesIcon:SetName(self.__previousBonusObjectivesIconName)
self.__previousBonusObjectivesName = nil
self.__previousBonusObjectivesTextName = nil
self.__previousBonusObjectivesIconName = nil
-- Unregister the events
bonusObjectives.OnSizeChanged = bonusObjectives.OnSizeChanged - self.OnObjectivesSizeChanged
-- It's better to release after events have been un registered for avoiding
-- useless calls
bonusObjectives:Release()
bonusObjectivesText:Release()
BonusObjectivesIcon:Release()
self:AdjustHeight(true)
end
end
function OnRelease(self)
-- First, release 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 = ScenarioContentView.Flags,
default = ScenarioContentView.Flags.NONE
}
property "ObjectivesClass" {
type = ClassType,
default = ObjectiveListView
}
property "BonusObjectivesClass" {
type = ClassType,
default = ObjectiveListView
}
property "FlagsStyles" {
type = Table
}
-----------------------------------------------------------------------------
-- Constructors --
-----------------------------------------------------------------------------
__Template__ {
{
Header = {
ScenarioName = SLTFontString
},
Content = {
Stage = Frame,
{
Stage = {
Counter = SLTFontString,
Name = SLTFontString
}
}
}
}
}
function __ctor(self)
self.OnObjectivesSizeChanged = function() self:AdjustHeight(true) end
end
end)
-------------------------------------------------------------------------------
-- Styles --
-------------------------------------------------------------------------------
Style.UpdateSkin("Default", {
[ScenarioContentView] = {
Header = {
backdropBorderColor = { r = 0, g = 0, b = 0, a = 0 },
IconBadge = {
backdropColor = { r = 0, g = 0, b = 0, a = 0},
Icon = {
atlas = AtlasType("ScenariosIcon")
}
},
Label = {
text = "Scenario",
sharedMediaFont = FontType("PT Sans Narrow Bold", 14),
justifyV = "TOP"
},
ScenarioName = {
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},
Stage = {
height = 20,
location = {
Anchor("TOP"),
Anchor("LEFT"),
Anchor("RIGHT")
},
Counter = {
sharedMediaFont = FontType("PT Sans Narrow Bold", 13),
textColor = Color(1, 1, 1),
location = {
Anchor("TOP", 0, -4),
Anchor("LEFT", 4, 0),
Anchor("BOTTOM", 0, 4)
}
},
Name = {
sharedMediaFont = FontType("PT Sans Narrow Bold", 13),
textColor = Color(1, 1, 0),
justifyH = "LEFT",
location = {
Anchor("TOP", 0, -4),
Anchor("LEFT", 10, 0, "Counter", "RIGHT"),
Anchor("BOTTOM", 0, 4),
Anchor("RIGHT")
}
}
}
},
FlagsStyles = {
[ScenarioContentView.Flags.HAS_OBJECTIVES] = {
Content = {
Objectives = {
spacing = 5,
location = {
Anchor("TOP", 0, -4, "Stage", "BOTTOM"),
Anchor("LEFT"),
Anchor("RIGHT")
}
}
}
},
[ScenarioContentView.Flags.HAS_OBJECTIVES + ScenarioContentView.Flags.HAS_BONUS_OBJECTIVES] = {
Content = {
Objectives = {
spacing = 5,
location = {
Anchor("TOP", 0, -4, "Stage", "BOTTOM"),
Anchor("LEFT"),
Anchor("RIGHT")
}
},
BonusObjectivesText = {
text = TRACKER_HEADER_BONUS_OBJECTIVES,
height = 16,
sharedMediaFont = FontType("PT Sans Narrow Bold", 13),
location = {
Anchor("TOP", 0, -8, "Objectives", "BOTTOM"),
}
},
BonusObjectivesIcon = {
width = 16,
height = 16,
Icon = {
atlas = AtlasType("VignetteEventElite")
},
location = {
Anchor("RIGHT", 0, 0, "BonusObjectivesText", "LEFT")
}
},
BonusObjectives = {
location = {
Anchor("TOP", 0, -4, "BonusObjectivesText", "BOTTOM"),
Anchor("LEFT"),
Anchor("RIGHT")
}
}
}
}
}
}
})