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