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.
109 lines
2.9 KiB
109 lines
2.9 KiB
local _, L = ...
|
|
local ScalerMixin = {}; L.ScalerMixin = ScalerMixin;
|
|
----------------------------------
|
|
-- ScalerMixin
|
|
----------------------------------
|
|
function ScalerMixin:ScaleUpdate()
|
|
local scale = self.targetScale
|
|
local current = self:GetScale()
|
|
local delta = scale > current and 0.025 or -0.025
|
|
if abs(current - scale) < 0.05 then
|
|
self:SetScale(scale)
|
|
self:SetScript('OnUpdate', self.oldScript)
|
|
if self.OnScaleFinished then
|
|
self:OnScaleFinished()
|
|
end
|
|
else
|
|
self:SetScale( current + delta )
|
|
end
|
|
end
|
|
function ScalerMixin:ScaleTo(scale)
|
|
local oldScript = self:GetScript('OnUpdate')
|
|
self.targetScale = scale
|
|
if oldScript and oldScript ~= self.ScaleUpdate then
|
|
self.oldScript = oldScript
|
|
self:HookScript('OnUpdate', self.ScaleUpdate)
|
|
else
|
|
self.oldScript = nil
|
|
self:SetScript('OnUpdate', self.ScaleUpdate)
|
|
end
|
|
end
|
|
|
|
function ScalerMixin:OnEnter()
|
|
self:ScaleTo(self.enterScale or 1.1)
|
|
if self.Hilite then
|
|
L.UIFrameFadeIn(self.Hilite, 0.2, self.Hilite:GetAlpha(), 1)
|
|
end
|
|
end
|
|
|
|
function ScalerMixin:OnLeave()
|
|
self:ScaleTo(self.normalScale or 1)
|
|
if self.Hilite then
|
|
L.UIFrameFadeOut(self.Hilite, 0.2, self.Hilite:GetAlpha(), 0)
|
|
end
|
|
end
|
|
|
|
function ScalerMixin:OnHide()
|
|
self:SetScript('OnUpdate', nil)
|
|
self:SetScale(self.normalScale or 1)
|
|
if self.Hilite then
|
|
self.Hilite:SetAlpha(0)
|
|
end
|
|
end
|
|
----------------------------------
|
|
-- AdjustMixin
|
|
----------------------------------
|
|
local AdjustMixin = {}; L.AdjustToChildren = AdjustMixin;
|
|
|
|
function AdjustMixin:IterateChildren()
|
|
local regions = {self:GetChildren()}
|
|
if not self.ignoreRegions then
|
|
for _, v in pairs({self:GetRegions()}) do
|
|
regions[#regions + 1] = v
|
|
end
|
|
end
|
|
return pairs(regions)
|
|
end
|
|
|
|
function AdjustMixin:GetAdjustableChildren()
|
|
local adjustable = {}
|
|
for _, child in self:IterateChildren() do
|
|
if child.AdjustToChildren then
|
|
adjustable[#adjustable + 1] = child
|
|
end
|
|
end
|
|
return pairs(adjustable)
|
|
end
|
|
|
|
function AdjustMixin:AdjustToChildren(xPad, yPad)
|
|
self:SetSize(1, 1)
|
|
for _, child in self:GetAdjustableChildren() do
|
|
child:AdjustToChildren()
|
|
end
|
|
local top, bottom, left, right
|
|
for _, child in self:IterateChildren() do
|
|
if child:IsShown() then
|
|
local childTop, childBottom = child:GetTop(), child:GetBottom()
|
|
local childLeft, childRight = child:GetLeft(), child:GetRight()
|
|
if (childTop) and (not top or childTop > top) then
|
|
top = childTop
|
|
end
|
|
if (childBottom) and (not bottom or childBottom < bottom) then
|
|
bottom = childBottom
|
|
end
|
|
if (childLeft) and (not left or childLeft < left) then
|
|
left = childLeft
|
|
end
|
|
if (childRight) and (not right or childRight > right) then
|
|
right = childRight
|
|
end
|
|
end
|
|
end
|
|
if top and bottom then
|
|
self:SetHeight(abs( top - bottom ) + (yPad or 0))
|
|
end
|
|
if left and right then
|
|
self:SetWidth(abs( right - left ) + (xPad or 0))
|
|
end
|
|
return self:GetSize()
|
|
end
|