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

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