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
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")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|