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.

259 lines
7.5 KiB

local _G, type, pairs, unpack, table, tinsert, tremove, string = _G, type, pairs, unpack, table, tinsert, tremove, string
local MovAny = _G.MovAny
local m = {
var = "pos",
orgVar = "orgPos",
IsValidObject = function(self, o)
return (o.SetPoint)
end,
Enable = function(self)
if self.lSafeRelatives then
table.wipe(self.lSafeRelatives)
else
self.lSafeRelatives = {}
end
end,
Disable = function()
end,
Apply = function(self, e, f, opt)
opt = opt or e.userData or MovAny:GetUserData(e.name)
if not opt or e.noMove then
return
end
if opt.pos then
local relTo = opt.pos[2]
if not relTo then
return true
else
if not self.lSafeRelatives[relTo] then
if type(relTo) == "table" and relTo.GetName then
relTo = relTo:GetName()
end
if _G[relTo] then
self.lSafeRelatives[relTo] = true
else
return true
end
end
end
local fn = f:GetName()
if opt.orgPos == nil and not MovAny:IsContainer(f:GetName()) and string.match("BagFrame", f:GetName()) ~= nil then
self:StoreOrgPoints(f, opt)
end
if UIPARENT_MANAGED_FRAME_POSITIONS[fn] then
f.ignoreFramePositionManager = true
end
MovAny:UnlockPoint(f)
f:ClearAllPoints()
if f.MASetPoint then
f:MASetPoint(unpack(opt.pos))
else
f:SetPoint(unpack(opt.pos))
end
MovAny:LockPoint(f, opt)
if f.OnMAPosition then
f.OnMAPosition(f)
end
if e.onPosition then
e.onPosition(f)
end
if f.attachedChildren then
for i, v in pairs(f.attachedChildren) do
if not v.ignoreFramePositionManager and v.GetName and UIPARENT_MANAGED_FRAME_POSITIONS[v:GetName()] and not v.ignoreFramePositionManager and not MovAny:IsModified(v) and v.GetName and UIPARENT_MANAGED_FRAME_POSITIONS[v:GetName()] then
v.UMFP = true
v.ignoreFramePositionManager = true
end
end
end
if UIPanelWindows[fn] and f ~= GameMenuFrame then
local left = GetUIPanel("left")
local center = GetUIPanel("center")
if f == left then
UIParent.left = nil
if center then
UIParent.center = nil
UIParent.left = center
end
elseif f == center then
UIParent.center = nil
end
local wasShown = f:IsShown()
if f ~= TaxiFrame and f ~= MerchantFrame and f ~= BankFrame and f ~= QuestFrame and f ~= ClassTrainerFrame and (not MovAny:IsProtected(f) or not InCombatLockdown()) then
--[[if MovAny.rendered then
--HideUIPanel(f)
else]]
--[[local sfx = GetCVar("Sound_EnableSFX")
if sfx then
SetCVar("Sound_EnableSFX", 0)
end]]
if not MovAny.rendered and wasShown then
ShowUIPanel(f)
end
HideUIPanel(f)
--[[if sfx then
SetCVar("Sound_EnableSFX", 1)
end]]
--end
end
if opt then
opt.UIPanelWindows = UIPanelWindows[fn]
end
UIPanelWindows[fn] = nil
f:SetAttribute("UIPanelLayout-enabled", false)
tinsert(UISpecialFrames, f:GetName())
if wasShown and f ~= TaxiFrame and f ~= MerchantFrame and f ~= BankFrame and f ~= QuestFrame and f ~= ClassTrainerFrame and (not MovAny:IsProtected(f) or not InCombatLockdown()) then
f:Show()
end
end
end
end,
Reset = function(self, e, f, readOnly, opt)
opt = opt or e.userData or MovAny:GetUserData(e.name)
if not opt or e.noMove then
return
end
MovAny:UnlockPoint(f)
local umfp = nil
if f.ignoreFramePositionManager then
umfp = true
f.ignoreFramePositionManager = nil
end
if opt.orgPos then
self:RestoreOrgPoints(f, opt, readOnly)
else
--f:ClearAllPoints()
return
end
--[[if not readOnly and f.MAUnanchoredRelatives then
--dbg(f:GetName().." got unanchored relatives")
for i, v in pairs(f.MAUnanchoredRelatives) do
if not MovAny:IsModified(v) then
--dbg(" restoring anchor to "..v:GetName().." ")
MovAny:UnlockPoint(v)
if v.MAOrgPoint then
v:SetPoint(unpack(v.MAOrgPoint))
v.MAOrgPoint = nil
end
--else
--dbg("skipping hooked relative: "..v:GetName())
end
end
f.MAUnanchoredRelatives = nil
end]]
if e.positionReset then
e:positionReset(f, opt, readOnly)
end
if f.OnMAPositionReset then
f.OnMAPositionReset(f, opt, readOnly)
end
if not readOnly then
opt.pos = nil
end
if f.attachedChildren then
for i, v in pairs(f.attachedChildren) do
if v and not MovAny:IsModified(v) and v.GetName and v.UMFP then
v.UMFP = nil
v.ignoreFramePositionManager = nil
umfp = true
end
end
end
if opt.UIPanelWindows and not readOnly then
for i, v in pairs(UISpecialFrames) do
if v == e.name then
tremove(UISpecialFrames, i)
break
end
end
if not readOnly then
UIPanelWindows[ f:GetName() ] = opt.UIPanelWindows
opt.UIPanelWindows = nil
end
if not readOnly and f:IsShown() and f ~= MerchantFrame and f ~= BankFrame and f ~= QuestFrame and f ~= ClassTrainerFrame and (not MovAny:IsProtected(f) or not InCombatLockdown()) then
f:SetAttribute("UIPanelLayout-enabled", true)
ShowUIPanel(f)
else
f:SetAttribute("UIPanelLayout-enabled", true)
end
end
if umfp and not InCombatLockdown() then
UIParent_ManageFramePositions()
end
f.MAOrgParent = nil
end,
StoreOrgPoints = function(self, f, opt)
local np = f:GetNumPoints()
if np == 1 then
opt.orgPos = MovAny:GetSerializedPoint(f)
elseif np > 1 then
opt.orgPos = {}
for i = 1, np, 1 do
opt.orgPos[i] = MovAny:GetSerializedPoint(f, i)
end
end
if not opt.orgPos then
if f == TargetFrameSpellBar then
opt.orgPos = {"BOTTOM", "TargetFrame", "BOTTOM", -15, 10}
elseif f == FocusFrameSpellBar then
opt.orgPos = {"BOTTOM", "FocusFrame", "BOTTOM", 0, 0}
elseif f == VehicleMenuBarHealthBar then
opt.orgPos = {"BOTTOMLEFT", "VehicleMenuBarArtFrame", "BOTTOMLEFT", 119, 3}
elseif f == VehicleMenuBarPowerBar then
opt.orgPos = {"BOTTOMRIGHT", "VehicleMenuBarArtFrame", "BOTTOMRIGHT", -119, 3}
elseif f == VehicleMenuBarLeaveButton then
opt.orgPos = {"BOTTOMRIGHT", "VehicleMenuBar", "BOTTOMRIGHT", 177, 15}
--[[elseif f == LFDDungeonReadyDialog then
opt.orgPos = {"TOP", "UIParent", "TOP", 0, -135}
elseif f == LFDDungeonReadyPopup then
opt.orgPos = {"TOP", "UIParent", "TOP", 0, -135}
elseif f == LFDDungeonReadyStatus then]]
else
--dbg("Unable to generate restore point for "..f:GetName()..". OrgPos set to default")
opt.orgPos = {"TOP", "UIParent", "TOP", 0, -135}
end
end
end,
RestoreOrgPoints = function(self, f, opt, readOnly)
f:ClearAllPoints()
if opt then -- and not opt.UIPanelWindows
if type(opt.orgPos) == "table" then
if type(opt.orgPos[1]) == "table" then
for i, v in pairs(opt.orgPos) do
f:ClearAllPoints()
if f.MASetPoint then
f:MASetPoint(unpack(v))
else
f:SetPoint(unpack(v))
end
end
else
f:ClearAllPoints()
if f.MASetPoint then
f:MASetPoint(unpack(opt.orgPos))
else
f:SetPoint(unpack(opt.orgPos))
end
end
end
if not readOnly then
opt.orgPos = nil
end
end
end,
GetFirstOrgPoint = function(self, opt)
if opt then -- and not opt.UIPanelWindows
if type(opt.orgPos) == "table" then
if type(opt.orgPos[1]) == "table" then
return opt.orgPos[1]
else
return opt.orgPos
end
end
end
end
}
MovAny:AddModule("Position", m)