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