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.

193 lines
6.5 KiB

5 years ago
-- ========================================================================= --
-- SylingTracker --
-- https://www.curseforge.com/wow/addons/sylingtracker --
-- --
-- Repository: --
-- https://github.com/Skamer/SylingTracker --
-- --
-- ========================================================================= --
Syling "SylingTracker.UI.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
-- ========================================================================= --
ResetStyles = Utils.ResetStyles
-- ========================================================================= --
class "ContentView" (function(_ENV)
inherit "Frame" extend "IView"
-----------------------------------------------------------------------------
-- Handlers --
-----------------------------------------------------------------------------
__Async__()
function OnAdjustHeight(self, useAnimation)
Next()
-- First, we need to compute the content height
local content = self:GetChild("Content")
local contentMaxOuterBottom
for childName, child in IterateFrameChildren(content) do
local outerBottom = child:GetBottom()
if outerBottom then
if not contentMaxOuterBottom or contentMaxOuterBottom > outerBottom then
contentMaxOuterBottom = outerBottom
end
end
end
if contentMaxOuterBottom then
local computeHeight = content:GetTop() - contentMaxOuterBottom + self.ContentPaddingBottom
PixelUtil.SetHeight(content, computeHeight)
-- We need to wait the next "OnUpdate" for the "Self" frame take as
-- account the new content height has been computed.
Next()
end
local maxOuterBottom
for childName, child in IterateFrameChildren(self) do
if child then
local outerBottom = child:GetBottom()
if outerBottom then
if not maxOuterBottom or maxOuterBottom > outerBottom then
maxOuterBottom = outerBottom
end
end
end
end
if maxOuterBottom then
local computeHeight = self:GetTop() - maxOuterBottom + self.PaddingBottom
if useAnimation then
self:SetAnimatedHeight(computeHeight)
else
PixelUtil.SetHeight(self, computeHeight)
end
end
end
function OnRelease(self)
local content = self:GetChild("Content")
self:Hide()
self:ClearAllPoints()
self:SetParent()
-- "CancelAdjustHeight" and "CancelAnimatingHeight" wiil cancel the pending
-- computing stuff for height, so they not prevent "SetHeight" here doing
-- its stuff.
self:CancelAdjustHeight()
self:CancelAnimatingHeight()
self:SetHeight(1)
content:SetHeight(1)
-- Will Remove all custom styles properties, so the next time the object will
-- be used, this one will be in a clean state
ResetStyles(self)
ResetStyles(content)
end
function OnAcquire(self)
-- Important ! We need the frame is instantly styled as this may affect
-- its height.
self:InstantApplyStyle()
self:Show()
self:AdjustHeight(true)
end
-----------------------------------------------------------------------------
-- Properties --
-----------------------------------------------------------------------------
property "Expanded" {
type = Boolean,
default = true
}
property "ContentPaddingBottom" {
type = Number,
default = 10
}
property "PaddingBottom" {
type = Number,
default = 0
}
-----------------------------------------------------------------------------
-- Constructors --
-----------------------------------------------------------------------------
__Template__ {
Header = Frame,
Content = Frame,
{
Header = {
IconBadge = IconBadge,
Label = SLTFontString
}
},
}
function __ctor(self)
-- Important! As the frame ajusts its height depending of its children height
-- we need to set its height when contructed for the event "OnSizechanged" of
-- its children is triggered.
self:SetHeight(1) -- !important
self:SetClipsChildren(true)
local content = self:GetChild("Content")
content:SetHeight(1)
end
end)
-------------------------------------------------------------------------------
-- Styles --
-------------------------------------------------------------------------------
Style.UpdateSkin("Default", {
[ContentView] = {
Header = {
height = 32,
backdrop = {
bgFile = [[Interface\AddOns\SylingTracker\Media\Textures\LinearGradient]],
edgeFile = [[Interface\Buttons\WHITE8X8]],
edgeSize = 1
},
backdropColor = { r = 18/255, g = 20/255, b = 23/255, a = 0.87},
backdropBorderColor = { r = 0, g = 0, b = 0, a = 1},
location = {
Anchor("TOP"),
Anchor("LEFT"),
Anchor("RIGHT")
},
IconBadge = {
location = {
Anchor("LEFT", 6, 0)
},
},
Label = {
sharedMediaFont = FontType("PT Sans Narrow Bold", 16),
textColor = Color(0.18, 0.71, 1),
justifyH = "CENTER",
justifyV = "MIDDLE",
location = {
Anchor("TOP"),
Anchor("LEFT", 0, 0, "IconBadge", "RIGHT"),
Anchor("RIGHT"),
Anchor("BOTTOM")
}
},
},
Content = {
-- backdrop = {
-- bgFile = [[Interface\AddOns\SylingTracker\Media\Textures\LinearGradient]],
-- },
-- backdropColor = { r = 255/255, g = 0, b = 0, a = 0.87},
location = {
Anchor("TOP", 0, 0, "Header", "BOTTOM"),
Anchor("LEFT"),
Anchor("RIGHT")
}
}
}
})