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.

6487 lines
171 KiB

--[[
MoveAnything by Wagthaa @ Earthen Ring EU
MoP version: Resike
FanUpdate by Alea @ Gordynni EU
Vanilla & TBC versions by: Skrag, Jason, Vincent
]]
local _G = _G
local format = format
local getmetatable = getmetatable
local hooksecurefunc = hooksecurefunc
local ipairs = ipairs
local math = math
local pairs = pairs
local print = print
local select = select
local setmetatable = setmetatable
local string = string
local table = table
local time = time
local tinsert = tinsert
local tonumber = tonumber
local tostring = tostring
local tremove = tremove
local type = type
local unpack = unpack
local xpcall = xpcall
local CreateFrame = CreateFrame
local GetAddOnMetadata = GetAddOnMetadata
local GetCVar = GetCVar
local GetMouseFocus = GetMouseFocus
local GetRealmName = GetRealmName
local GetScreenHeight = GetScreenHeight
local GetScreenWidth = GetScreenWidth
local InCombatLockdown = InCombatLockdown
local IsAddOnLoaded = IsAddOnLoaded
local IsAltKeyDown = IsAltKeyDown
local IsInInstance = IsInInstance
local IsShiftKeyDown = IsShiftKeyDown
local PlaySound = PlaySound
local RegisterStateDriver = RegisterStateDriver
local UnitName = UnitName
local CONTAINER_WIDTH = 192
local VISIBLE_CONTAINER_SPACING = 3
local CONTAINER_SCALE = 0.75
local CONTAINER_SPACING = 0
local UIParent = UIParent
local MOVANY = _G.MOVANY
local MAOptions
function MA_tdeepcopy(object)
local lookup_table = { }
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = { }
lookup_table[object] = new_table
for index, value in pairs(object) do
new_table[_copy(index)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end
function MA_tcopy(object)
if type(object) ~= "table" then
return object
end
local new_table = { }
for index, value in pairs(object) do
new_table[index] = value
end
return setmetatable(new_table, getmetatable(object))
end
local function tlen(t)
local i = 0
if t ~= nil then
for k in pairs(t) do
i = i + 1
end
end
return i
end
local API
MADB = {
tooltips = true,
characters = { },
profiles = { },
}
local MovAny = {
fVoid = function() end,
guiLines = - 1,
resetConfirm = "",
bagFrames = { },
cats = { },
collapsed = true,
defFrames = { },
frames = { },
framesCount = 0,
framesIdx = { },
initRun = nil,
lastFrameName = nil,
lSafeRelatives = { },
lAllowedTypes = {
["Frame"] = true,
["FontString"] = true,
["Texture"] = true,
["Button"] = true,
["CheckButton"] = true,
["StatusBar"] = true,
["GameTooltip"] = true,
["MessageFrame"] = true,
["PlayerModel"] = true,
["ColorSelect"] = true,
["EditBox"] = true,
["ScrollingMessageFrame"] = true,
["Slider"] = true,
["Minimap"] = true
},
lDisallowedFrames = {
["UIParent"] = true,
["WorldFrame"] = true,
["CinematicFrame"] = true,
["ArenaPrepFrames"] = true,
--["ArenaEnemyFrames"] = true,
["PetBattleFrame"] = true,
["ExtraActionBarFrame"] = true,
["ZoneAbilityFrame"] = true,
["StoreFrame"] = true
},
lCreateVMs = {
"BagFrame1",
"BagFrame2",
"BagFrame3",
"BagFrame4",
"BagFrame5",
},
lForceProtected = {
["ArenaPrepFrames"] = true,
["ArenaEnemyFrames"] = true,
["WorldStateAlwaysUpFrame"] = true,
["AlwaysUpFrame1"] = true,
["AlwaysUpFrame2"] = true,
["AlwaysUpFrame3"] = true,
["CompactRaidFrameManager"] = true,
},
lForceForbidden = {
["NamePlateTooltip"] = true,
},
lForcedLock = {
["Boss1TargetFrame"] = true,
["Boss2TargetFrame"] = true,
["Boss3TargetFrame"] = true,
["Boss4TargetFrame"] = true,
["Boss5TargetFrame"] = true,
["ActionButton1"] = true,
--[[["ArenaEnemyFrame1"] = true,
["ArenaEnemyFrame2"] = true,
["ArenaEnemyFrame3"] = true,
["ArenaEnemyFrame4"] = true,
["ArenaEnemyFrame5"] = true,
["ArenaPrepFrame1"] = true,
["ArenaPrepFrame2"] = true,
["ArenaPrepFrame3"] = true,
["ArenaPrepFrame4"] = true,
["ArenaPrepFrame5"] = true,
["ArenaPrepFrames"] = true,
["ArenaEnemyFrames"] = true,
["ArenaEnemyFrame1PetFrame"] = true,
["ArenaEnemyFrame2PetFrame"] = true,
["ArenaEnemyFrame3PetFrame"] = true,
["ArenaEnemyFrame4PetFrame"] = true,
["ArenaEnemyFrame5PetFrame"] = true,--]]
["PetFrame"] = true,
--["BuffFrame"] = true,
["MinimapCluster"] = true,
["WorldStateAlwaysUpFrame"] = true,
["AlwaysUpFrame1"] = true,
["AlwaysUpFrame2"] = true,
["AlwaysUpFrame3"] = true,
["TargetBuffsMover"] = true,
["TargetDebuffsMover"] = true,
["TargetFrameToTDebuffsMover"] = true,
["FocusBuffsMover"] = true,
["FocusDebuffsMover"] = true,
["FocusFrameToTDebuffsMover"] = true,
--["TargetFrameBuff1"] = true,
--["TargetFrameDebuff1"] = true,
},
lEnableMouse = {
ObjectiveTrackerFrameMover,
ObjectiveTrackerFrameScaleMover,
DurabilityFrame,
CastingBarFrame,
WorldStateScoreFrame,
WorldStateAlwaysUpFrame,
AlwaysUpFrame1,
AlwaysUpFrame2,
AlwaysUpFrame3,
WorldStateCaptureBar1,
VehicleMenuBar,
TargetFrameSpellBar,
FocusFrameSpellBar,
MirrorTimer1,
MiniMapInstanceDifficulty,
VoidStorageFrame,
ComboPointPlayerFrame,
RuneFrame,
MageArcaneChargesFrame,
PaladinPowerBarFrame,
WarlockPowerFrame,
MonkHarmonyBarFrame,
MonkStaggerBar,
},
lTranslate = {
minimap = "MinimapCluster",
tooltip = "TooltipMover",
player = "PlayerFrame",
target = "TargetFrame",
tot = "TargetFrameToT",
targetoftarget = "TargetFrameToT",
pet = "PetFrame",
focus = "FocusFrame",
bags = "BagButtonsMover",
--keyring = "KeyRingFrame",
castbar = "CastingBarFrame",
buffs = "PlayerBuffsMover",
debuffs = "PlayerDebuffsMover",
GameTooltip = "TooltipMover",
StanceBarFrame = "StanceButtonsMover",
TemporaryEnchantFrame = "PlayerBuffsMover",
TempEnchant1 = "PlayerBuffsMover",
ConsolidatedBuffs = "PlayerBuffsMover",
BuffFrame = "PlayerBuffsMover",
Minimap = "MinimapCluster",
Boss = "PlayerPowerBarAltMover",
},
lTranslateSec = {
BuffFrame = "PlayerBuffsMover",
ConsolidatedBuffFrame = "PlayerBuffsMover",
--[[ChatFrame1EditBox = "ChatEditBoxesMover",
ChatFrame2EditBox = "ChatEditBoxesMover",
ChatFrame3EditBox = "ChatEditBoxesMover",
ChatFrame4EditBox = "ChatEditBoxesMover",
ChatFrame5EditBox = "ChatEditBoxesMover",
ChatFrame6EditBox = "ChatEditBoxesMover",
ChatFrame7EditBox = "ChatEditBoxesMover",
ChatFrame8EditBox = "ChatEditBoxesMover",
ChatFrame9EditBox = "ChatEditBoxesMover",
ChatFrame10EditBox = "ChatEditBoxesMover",]]
},
lTransContainerToBag = {
ContainerFrame1 = "BagFrame1",
ContainerFrame2 = "BagFrame2",
ContainerFrame3 = "BagFrame3",
ContainerFrame4 = "BagFrame4",
ContainerFrame5 = "BagFrame5",
ContainerFrame6 = "BankBagFrame1",
ContainerFrame7 = "BankBagFrame2",
ContainerFrame8 = "BankBagFrame3",
ContainerFrame9 = "BankBagFrame4",
ContainerFrame10 = "BankBagFrame5",
ContainerFrame11 = "BankBagFrame6",
ContainerFrame12 = "BankBagFrame7",
--ContainerFrame13 = "KeyRingFrame",
},
lFrameNameRewrites = {
--CompactRaidFrameContainer = "RaidUnitFramesMover",
--CompactRaidFrameManager = "RaidUnitFramesManagerMover",
TargetOfFocusDebuffsMover = "FocusFrameToTDebuffsMover",
},
lDeleteFrameNames = {
BuffFrame = "BuffFrame",
ConsolidatedBuffFrame = "ConsolidatedBuffFrame",
TemporaryEnchantFrame = "TemporaryEnchantFrame",
ExtraActionBarFrame = "ExtraActionBarFrame",
ZoneAbilityFrame = "ZoneAbilityFrame",
},
rendered = nil,
nextFrameIdx = 1,
pendingActions = { },
pendingFrames = { },
pendingMovers = { },
minimizedMovers = { },
SCROLL_HEIGHT = 24,
currentMover = nil,
moverPrefix = "MAMover",
moverNextId = 1,
movers = { },
frameEditors = { },
DDMPointList = {
{"Top Left", "TOPLEFT"},
{"Top", "TOP"},
{"Top Right", "TOPRIGHT"},
{"Left", "LEFT"},
{"Center", "CENTER"},
{"Right", "RIGHT"},
{"Bottom Left", "BOTTOMLEFT"},
{"Bottom", "BOTTOM"},
{"Bottom Right", "BOTTOMRIGHT"},
},
DDMStrataList = {
{"Background", "BACKGROUND"},
{"Low", "LOW"},
{"Medium", "MEDIUM"},
{"High", "HIGH"},
{"Dialog", "DIALOG"},
{"Fullscreen", "FULLSCREEN"},
{"Fullscreen Dialog", "FULLSCREEN_DIALOG"},
{"Tooltip", "TOOLTIP"},
},
DetachFromParent = {
--MainMenuBarPerformanceBarFrame = "UIParent",
TargetofFocusFrame = "UIParent",
PetFrame = "UIParent",
PartyMemberFrame1PetFrame = "UIParent",
PartyMemberFrame2PetFrame = "UIParent",
PartyMemberFrame3PetFrame = "UIParent",
PartyMemberFrame4PetFrame = "UIParent",
DebuffButton1 = "UIParent",
ReputationWatchBar = "UIParent",
--MainMenuExpBar = "UIParent",
TimeManagerClockButton = "UIParent",
OverrideMenuBarHealthBar = "UIParent",
OverrideMenuBarLeaveButton = "UIParent",
OverrideMenuBarPowerBar = "UIParent",
MultiCastActionBarFrame = "UIParent",
--MainMenuBarRightEndCap = "UIParent",
--MainMenuBarMaxLevelBar = "UIParent",
TargetFrameSpellBar = "UIParent",
FocusFrameSpellBar = "UIParent",
MultiBarBottomLeft = "UIParent",
MANudger = "UIParent",
MultiBarBottomRight = "UIParent",
MultiBarBottomLeft = "UIParent",
PlayerDebuffsMover = "UIParent",
TotemFrame = "UIParent",
Boss1TargetFrame = "UIParent",
Boss2TargetFrame = "UIParent",
Boss3TargetFrame = "UIParent",
Boss4TargetFrame = "UIParent",
Boss5TargetFrame = "UIParent",
RuneFrame = "UIParent",
--ArenaEnemyFrame1 = "UIParent",
},
NoReparent = {
TargetFrameSpellBar = "TargetFrameSpellBar",
FocusFrameSpellBar = "FocusFrameSpellBar",
OverrideMenuBarHealthBar = "OverrideMenuBarHealthBar",
OverrideMenuBarLeaveButton = "OverrideMenuBarLeaveButton",
OverrideMenuBarPowerBar = "OverrideMenuBarPowerBar",
ArenaPrepFrames = "ArenaPrepFrames",
--ArenaEnemyFrames = "ArenaEnemyFrames",
MinimapCluster = "MinimapCluster",
ObjectiveTrackerFrameMover = "ObjectiveTrackerFrameMover",
ObjectiveTrackerFrameScaleMover = "ObjectiveTrackerFrameScaleMover",
},
NoUnanchoring = {
BuffFrame = "BuffFrame",
RuneFrame = "RuneFrame",
TotemFrame = "TotemFrame",
ComboFrame = "ComboFrame",
MANudger = "MANudger",
TimeManagerClockButton = "TimeManagerClockButton",
PartyMember1DebuffsMover = "PartyMember1DebuffsMover",
PartyMember2DebuffsMover = "PartyMember2DebuffsMover",
PartyMember3DebuffsMover = "PartyMember3DebuffsMover",
PartyMember4DebuffsMover = "PartyMember4DebuffsMover",
PetDebuffsMover = "PetDebuffsMover",
TargetBuffsMover = "TargetBuffsMover",
TargetDebuffsMover = "TargetDebuffsMover",
FocusBuffsMover = "FocusBuffsMover",
FocusDebuffsMover = "FocusDebuffsMover",
TargetFrameToTDebuffsMover = "TargetFrameToTDebuffsMover",
FocusFrameToTDebuffsMover = "FocusFrameToTDebuffsMover",
TemporaryEnchantFrame = "TemporaryEnchantFrame",
AuctionDressUpFrame = "AuctionDressUpFrame",
MinimapCluster = "MinimapCluster",
--[[ArenaEnemyFrame1PetFrame = "ArenaEnemyFrame1PetFrame",
ArenaEnemyFrame2PetFrame = "ArenaEnemyFrame2PetFrame",
ArenaEnemyFrame3PetFrame = "ArenaEnemyFrame3PetFrame",
ArenaEnemyFrame4PetFrame = "ArenaEnemyFrame4PetFrame",
ArenaEnemyFrame5PetFrame = "ArenaEnemyFrame5PetFrame",
ArenaEnemyFrame1CastingBar = "ArenaEnemyFrame1CastingBar",
ArenaEnemyFrame2CastingBar = "ArenaEnemyFrame2CastingBar",
ArenaEnemyFrame3CastingBar = "ArenaEnemyFrame3CastingBar",
ArenaEnemyFrame4CastingBar = "ArenaEnemyFrame4CastingBar",
ArenaEnemyFrame5CastingBar = "ArenaEnemyFrame5CastingBar",--]]
},
lAllowedMAFrames = {
MAOptions = "MAOptions",
MANudger = "MANudger",
MAPortDialog = "MAPortDialog",
GameMenuButtonMoveAnything = "GameMenuButtonMoveAnything",
--MACompactRaidFrameManagerToggleButton = "MACompactRaidFrameManagerToggleButton",
--MA_FEMover = "MA_FEMover",
},
CONTAINER_FRAME_TABLE = {
[0] = {"Interface\\ContainerFrame\\UI-BackpackBackground", 256, 256, 239},
[1] = {"Interface\\ContainerFrame\\UI-Bag-1x4", 256, 128, 96},
[2] = {"Interface\\ContainerFrame\\UI-Bag-1x4", 256, 128, 96},
[3] = {"Interface\\ContainerFrame\\UI-Bag-1x4", 256, 128, 96},
[4] = {"Interface\\ContainerFrame\\UI-Bag-1x4", 256, 128, 96},
[5] = {"Interface\\ContainerFrame\\UI-Bag-1x4+2", 256, 128, 116},
[6] = {"Interface\\ContainerFrame\\UI-Bag-1x4+2", 256, 128, 116},
[7] = {"Interface\\ContainerFrame\\UI-Bag-1x4+2", 256, 128, 116},
[8] = {"Interface\\ContainerFrame\\UI-Bag-2x4", 256, 256, 137},
[9] = {"Interface\\ContainerFrame\\UI-Bag-2x4+2", 256, 256, 157},
[10] = {"Interface\\ContainerFrame\\UI-Bag-2x4+2", 256, 256, 157},
[11] = {"Interface\\ContainerFrame\\UI-Bag-2x4+2", 256, 256, 157},
[12] = {"Interface\\ContainerFrame\\UI-Bag-3x4", 256, 256, 178},
[13] = {"Interface\\ContainerFrame\\UI-Bag-3x4+2", 256, 256, 198},
[14] = {"Interface\\ContainerFrame\\UI-Bag-3x4+2", 256, 256, 198},
[15] = {"Interface\\ContainerFrame\\UI-Bag-3x4+2", 256, 256, 198},
[16] = {"Interface\\ContainerFrame\\UI-Bag-4x4", 256, 256, 219},
[18] = {"Interface\\ContainerFrame\\UI-Bag-4x4+2", 256, 256, 239},
[20] = {"Interface\\ContainerFrame\\UI-Bag-5x4", 256, 256, 259},
[22] = {"Interface\\ContainerFrame\\UI-Bag-5x4+2", 256, 256, 279},
[24] = {"Interface\\ContainerFrame\\UI-Bag-5x5", 256, 256, 299},
[26] = {"Interface\\ContainerFrame\\UI-Bag-5x5+2", 256, 256, 319},
[28] = {"Interface\\ContainerFrame\\UI-Bag-5x6", 256, 256, 339},
[30] = {"Interface\\ContainerFrame\\UI-Bag-5x6+2", 256, 256, 359},
[32] = {"Interface\\ContainerFrame\\UI-Bag-5x7", 256, 256, 379},
[34] = {"Interface\\ContainerFrame\\UI-Bag-5x7+2", 256, 256, 399},
[36] = {"Interface\\ContainerFrame\\UI-Bag-5x8", 256, 256, 419},
[38] = {"Interface\\ContainerFrame\\UI-Bag-5x8+2", 256, 256, 439},
[40] = {"Interface\\ContainerFrame\\UI-Bag-5x9", 256, 256, 459},
},
-- X: hook replacements
ContainerFrame_GenerateFrame = function(frame, size, id)
MovAny:GrabContainerFrame(frame, MovAny:GetBag(id))
end,
hCreateFrame = function(frameType, name, parent, inherit, dontHook)
if name and not MovAny.lForceProtected[name] then
if dontHook == "MADontHook" then
return
end
API:SyncElement(name)
end
end,
hBlizzard_TalentUI = function(self)
if PlayerTalentFrame_Toggle then
hooksecurefunc("PlayerTalentFrame_Toggle", function()
API:SyncElement("PlayerTalentFrame", true)
end)
MovAny.hBlizzard_TalentUI = nil
end
end,
hReputationWatchBar_Update = function()
API:SyncElement("ReputationWatchBar")
end,
--[[hChatFrame_OnUpdate = function(arg1)
local b = arg1
if MovAny:IsModified(b) then
b:SetWidth(200)
b:SetPoint("TOPLEFT", ChatEditBoxesMover, "TOPLEFT", 0, 0)
b:SetPoint("BOTTOMRIGHT", ChatEditBoxesMover, "BOTTOMRIGHT", 0, 0)
end
end,]]
--[[hCaptureBar_Create = function(id)
local f = MovAny.oCaptureBar_Create(id)
local e = API:GetElement("WorldStateCaptureBar1")
if e then
e:Sync()
if not e.userData or not e.userData.pos then
f:ClearAllPoints()
f:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, -175)
end
end
return f
end,]]
hAchievementAlertFrame_OnLoad = function(f)
f.RegisterForClicks = MovAny.fVoid
MovAny.oAchievementAlertFrame_OnLoad(f)
API:SyncElement(f:GetName())
end,
hAchievementAlertFrame_GetAlertFrame = function()
local f = MovAny.oAchievementAlertFrame_GetAlertFrame()
if not f then
return
end
API:SyncElement(f:GetName())
return f
end,
hStanceBar_Update = function()
API:SyncElement("StanceButtonsMover")
API:SyncElement("StanceButtonsVerticalMover")
end,
hStanceBar_UpdateState = function()
API:SyncElement("StanceButtonsMover")
API:SyncElement("StanceButtonsVerticalMover")
end,
--[[hookArenaEnemyFrames = function()
if ArenaPrepFrames and not ArenaPrepFrames.hooked_ma then
ArenaPrepFrames.hooked_ma = true
ArenaPrepFrames.Hide = function()end
ArenaPrepFrames:Show()
ArenaPrepFrames.Show = function()end
ArenaPrepFrames.clear_all_points = ArenaPrepFrames.ClearAllPoints
ArenaPrepFrames.ClearAllPoints = function(self)
if not InCombatLockdown() then
self:clear_all_points()
end
end
ArenaPrepFrames.set_points = ArenaPrepFrames.SetPoint
ArenaPrepFrames.SetPoint = function(self, ...)
if not InCombatLockdown() then
self:set_points(...)
end
end
end
if ArenaEnemyFrames and not ArenaEnemyFrames.hooked_ma then
ArenaEnemyFrames.hooked_ma = true
ArenaEnemyFrames.Hide = function()end
ArenaEnemyFrames:Show()
ArenaEnemyFrames.Show = function()end
ArenaEnemyFrames.clear_all_points = ArenaEnemyFrames.ClearAllPoints
ArenaEnemyFrames.ClearAllPoints = function(self)
if not InCombatLockdown() then
self:clear_all_points()
end
end
ArenaEnemyFrames.set_points = ArenaEnemyFrames.SetPoint
ArenaEnemyFrames.SetPoint = function(self, ...)
if not InCombatLockdown() then
self:set_points(...)
end
end
end
end,--]]
--arenaframes15hooked = false,
--[[hookArenaEnemyFrames15 = function(self)
if InCombatLockdown() then
return
end
if not MovAny:IsModified("ArenaEnemyFrame1") then
ArenaEnemyFrame1:SetPoint("TOP", UIParent, "TOP", 600, - 300)
ArenaEnemyFrame1:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaEnemyFrame2:SetPoint("TOP", ArenaEnemyFrame1, "BOTTOM", 0, - 20)
ArenaEnemyFrame2:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaEnemyFrame3:SetPoint("TOP", ArenaEnemyFrame2, "BOTTOM", 0, - 20)
ArenaEnemyFrame3:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaEnemyFrame4:SetPoint("TOP", ArenaEnemyFrame3, "BOTTOM", 0, - 20)
ArenaEnemyFrame4:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaEnemyFrame5:SetPoint("TOP", ArenaEnemyFrame4, "BOTTOM", 0, - 20)
ArenaEnemyFrame5:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
end
if not MovAny:IsModified("ArenaPrepFrame1") then
ArenaPrepFrame1:SetPoint("TOP", UIParent, "TOP", 600, - 300)
ArenaPrepFrame1:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaPrepFrame2:SetPoint("TOP", ArenaPrepFrame1, "BOTTOM", 0, - 20)
ArenaPrepFrame2:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaPrepFrame3:SetPoint("TOP", ArenaPrepFrame2, "BOTTOM", 0, - 20)
ArenaPrepFrame3:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaPrepFrame4:SetPoint("TOP", ArenaPrepFrame3, "BOTTOM", 0, - 20)
ArenaPrepFrame4:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaPrepFrame5:SetPoint("TOP", ArenaPrepFrame4, "BOTTOM", 0, - 20)
ArenaPrepFrame5:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
end
end,
hookArenaEnemyPets15 = function() end,
hArenaEnemyFrames_Enable = function()
ArenaPrepFrames:ma_Show()
ArenaEnemyFrames:ma_Show()
end,
hArenaEnemyFrames_Disable = function()
ArenaPrepFrames:ma_Hide()
ArenaEnemyFrames:ma_Hide()
end,--]]
--[[hWatchFrameExpand = function()
if ArenaEnemyFrames then
local _, instanceType = IsInInstance()
if not WatchFrame:IsUserPlaced() then
if ArenaEnemyFrames:IsShown() then
if WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests) then
ArenaEnemyFrames.hidWatchedQuests = true
end
elseif instanceType == "arena" or instanceType == "pvp" then
if WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests) then
ArenaEnemyFrames.hidWatchedQuests = true
end
else
if ArenaEnemyFrames.hidWatchedQuests then
WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
ArenaEnemyFrames.hidWatchedQuests = false
end
end
elseif ArenaEnemyFrames.hidWatchedQuests then
WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
ArenaEnemyFrames.hidWatchedQuests = false
end
elseif ArenaPrepFrames then
local _, instanceType = IsInInstance()
if not WatchFrame:IsUserPlaced() then
if ArenaPrepFrames:IsShown() then
if WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests) then
ArenaPrepFrames.hidWatchedQuests = true
end
elseif instanceType == "arena" or instanceType == "pvp" then
if WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests) then
ArenaPrepFrames.hidWatchedQuests = true
end
else
if ArenaPrepFrames.hidWatchedQuests then
WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
ArenaPrepFrames.hidWatchedQuests = false
end
end
elseif ArenaPrepFrames.hidWatchedQuests then
WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
ArenaPrepFrames.hidWatchedQuests = false
end
end
end,]]
hFocusFrame_Update = function()
if MovAny:IsModified(FocusFrame) then
RegisterStateDriver("FocusFrame", "visibility", "hide")
else
RegisterStateDriver("FocusFrame", "visibility", "show")
end
end,
--[[hPetActionBarFrame_OnUpdate = function()
if MovAny:IsModified(PetActionButtonsMover) or MovAny:IsModified(PetActionButtonsVerticalMover) then
API:SyncElement("PetActionButtonsMover")
API:SyncElement("PetActionButtonsVerticalMover")
end
end,]]
hAddFrameLock = function()
MultiBarBottomLeft:Hide()
MultiBarBottomRight:Hide()
end,
hRemoveFrameLock = function()
if SHOW_MULTI_ACTIONBAR_1 then
MultiBarBottomLeft:Show()
elseif (MovAny:IsModified(MultiBarBottomLeft) and not MovAny:IsModified(MultiBarBottomLeft)) then
MultiBarBottomLeft:Show()
end
if SHOW_MULTI_ACTIONBAR_2 then
MultiBarBottomRight:Show()
elseif (MovAny:IsModified(MultiBarBottomRight) and not MovAny:IsModified(MultiBarBottomRight)) then
MultiBarBottomRight:Show()
end
end
}
if ChatEdit_ActivateChat then
hooksecurefunc("ChatEdit_ActivateChat", function(self)
if MovAny:IsModified("ChatEditBoxesMover") then
MovAny.API:SyncElement("ChatEditBoxesMover")
end
end)
end
if InterfaceOptionsFrame then
InterfaceOptionsFrame:HookScript("OnShow", function(self)
MovAny_OptionsOnShow()
end)
end
if CompactRaidFrameManager_Expand then
hooksecurefunc("CompactRaidFrameManager_Expand", function(self)
if InCombatLockdown() then
return
end
if MovAny:IsModified(self) then
MovAny:UnlockPoint(self)
local point, relativeTo, relativePoint, xOfs, yOfs = self:GetPoint(1)
self:ClearAllPoints()
self:SetPoint("TOPLEFT", UIParent, "TOPLEFT", xOfs + 175, yOfs)
MovAny:LockPoint(self)
end
end)
end
if CompactRaidFrameManager_Collapse then
hooksecurefunc("CompactRaidFrameManager_Collapse", function(self)
if InCombatLockdown() then
return
end
if MovAny:IsModified(self) then
MovAny:UnlockPoint(self)
local point, relativeTo, relativePoint, xOfs, yOfs = self:GetPoint(1)
self:ClearAllPoints()
self:SetPoint("TOPLEFT", UIParent, "TOPLEFT", xOfs - 175, yOfs)
MovAny:LockPoint(self)
end
end)
end
if WorldMap_ToggleSizeDown then
hooksecurefunc("WorldMap_ToggleSizeDown", function()
if MovAny:IsModified(WorldMapFrame) then
MovAny.API:SyncElement("WorldMapFrame")
end
end)
end
--[[OverrideActionBar:HookScript("OnShow", function(self)
if not MovAny:IsModified(MicroButtonsMover) and not MovAny:IsModified(MicroButtonsSplitMover) and not MovAny:IsModified(MicroButtonsVerticalMover) then
return
end
local children = {
CharacterMicroButton,
SpellbookMicroButton,
TalentMicroButton,
AchievementMicroButton,
QuestLogMicroButton,
GuildMicroButton,
--PVPMicroButton,
LFDMicroButton,
CollectionsMicroButton,
EJMicroButton,
StoreMicroButton,
MainMenuMicroButton
}
for i = 1, #children, 1 do
MovAny:UnlockPoint(children[i])
MovAny:UnlockScale(children[i])
children[i]:ClearAllPoints()
children[i]:SetScale(1)
if i == 1 then
children[i]:SetPoint("LEFT", OverrideActionBarLeaveFrame, "LEFT", - 165, 20)
elseif children[i] == LFDMicroButton then
children[i]:SetPoint("LEFT", CharacterMicroButton, "LEFT", 0, - 34)
else
children[i]:SetPoint("LEFT", children[i - 1], "RIGHT", - 2, 0)
end
MovAny:LockPoint(children[i])
MovAny:LockScale(children[i])
end
end)
OverrideActionBar:HookScript("OnHide", function(self)
if not MovAny:IsModified(MicroButtonsMover) and not MovAny:IsModified(MicroButtonsSplitMover) and not MovAny:IsModified(MicroButtonsVerticalMover) then
return
end
if MovAny:IsModified(MicroButtonsMover) then
MovAny.API:SyncElement("MicroButtonsMover")
elseif MovAny:IsModified(MicroButtonsSplitMover) then
MovAny.API:SyncElement("MicroButtonsSplitMover")
elseif MovAny:IsModified(MicroButtonsVerticalMover) then
MovAny.API:SyncElement("MicroButtonsVerticalMover")
end
end)--]]
_G.MovAny = MovAny
BINDING_HEADER_MOVEANYTHING = "MoveAnything"
StaticPopupDialogs["MOVEANYTHING_RESET_ALL_CONFIRM"] = {
preferredIndex = 3,
text = MOVANY.RESET_ALL_CONFIRM,
button1 = YES,
button2 = NO,
OnAccept = function()
MovAny:CompleteReset()
end,
timeout = 0,
exclusive = 0,
showAlert = 1,
whileDead = 1,
hideOnEscape = 1
}
function MovAny:Load()
if self.inited then
return
end
MAOptions = _G["MAOptions"]
if not MADB.noMMMW and Minimap:GetScript("OnMouseWheel") == nil then
Minimap:SetScript("OnMouseWheel", function(self, dir)
if dir < 0 then
Minimap_ZoomOut()
else
Minimap_ZoomIn()
end
end)
Minimap:EnableMouseWheel(true)
end
local MADB_Defaults = {
frameListRows = 18,
}
for i, v in pairs(MADB_Defaults) do
if MADB[i] == nil then
MADB[i] = v
end
end
if tlen(MADB.profiles) == 0 then
MADB.autoShowNext = true
end
self:VerifyData()
if MADB.squareMM then
Minimap:SetMaskTexture("Interface\\AddOns\\MoveAnything\\Textures\\MinimapMaskSquare")
end
self:SetNumRows(MADB.frameListRows, false)
if MADB.closeGUIOnEscape then
tinsert(UISpecialFrames, "MAOptions")
end
MAOptionsMoveHeader:SetText(MOVANY.LIST_HEADING_MOVER)
MAOptionsHideHeader:SetText(MOVANY.LIST_HEADING_HIDE)
MAOptionsToggleFrameEditors:SetChecked(true)
self.userData = MADB.profiles[self:GetProfileName()].frames
for i, m in pairs(self.core) do
if m.Init then
m:Init()
end
end
for i, m in pairs(self.core) do
if m.Enable then
m:Enable()
end
end
for i, m in pairs(self.modules) do
if m.Enable then
m:Enable()
end
end
API = self.API
local ar = { }
local e
for n, v in pairs(self.userData) do
e = API:GetElement(n)
if not e then
tinsert(ar, n)
else
e:SetUserData(v)
end
end
table.sort(ar, function(o1, o2)
return o1:lower() < o2:lower()
end)
for _, fn in ipairs(ar) do
e = API:AddElement({name = fn})
e:SetUserData(self.userData[fn])
end
if self.lVirtualMovers then
if type(self.lCreateVMs) == "table" then
if not MADB.noBags then
for _, name in pairs(self.lCreateVMs) do
if not _G[name] then
self:CreateVM(name)
end
end
end
self.lCreateVMs = nil
end
local vmClosure = function(name)
return function()
if not _G[name] then
MovAny:CreateVM(name)
end
end
end
local el, vm
for name, data in pairs(self.lVirtualMovers) do
vm = _G[name]
if not vm then
el = API:GetElement(name)
if el then
el.runOnce = vmClosure(name)
end
end
if not data.notMAParent then
if type(data.count) == "number" then
for i = 1, data.count, 1 do
local child = _G[data.prefix..i..(data.postfix or "")]
if child then
if not self:IsModified(child:GetName()) then
child.MAParent = vm or name
end
else
break
end
end
end
if type(data.children) == "table" then
for i, v in pairs(data.children) do
local child = v
if type(v) == "string" then
child = _G[v]
end
if child then
if not self:IsModified(child:GetName()) then
child.MAParent = name
end
else
break
end
end
end
end
end
end
if not MADB.noBags then
MAOptions:RegisterEvent("BANKFRAME_OPENED")
MAOptions:RegisterEvent("BANKFRAME_CLOSED")
end
MAOptions:RegisterUnitEvent("UNIT_AURA", "player")
MAOptions:RegisterEvent("BAG_UPDATE")
--MAOptions:RegisterEvent("PET_BATTLE_OPENING_START")
--MAOptions:RegisterEvent("PET_BATTLE_CLOSE")
end
function MovAny:Boot()
if self.inited then
return
end
if not MADB.dontHookCreateFrame and CreateFrame then
hooksecurefunc("CreateFrame", self.hCreateFrame)
end
--[[if ContainerFrame_GenerateFrame then
hooksecurefunc("ContainerFrame_GenerateFrame", self.ContainerFrame_GenerateFrame)
end]]
if ShowUIPanel then
hooksecurefunc("ShowUIPanel", self.SyncUIPanels)
end
if HideUIPanel then
hooksecurefunc("HideUIPanel", self.SyncUIPanels)
end
if UpdateUIPanelPositions then
hooksecurefunc("UpdateUIPanelPositions", self.SyncUIPanels)
end
if GameTooltip_SetDefaultAnchor then
hooksecurefunc("GameTooltip_SetDefaultAnchor", self.hGameTooltip_SetDefaultAnchor)
end
if StanceBar_Update then
hooksecurefunc("StanceBar_Update", self.hStanceBar_Update)
end
if StanceBar_UpdateState then
hooksecurefunc("StanceBar_UpdateState", self.hStanceBar_UpdateState)
end
--[[if false then
hooksecurefunc("PetActionBar_Update", self.hPetActionBar_Update)
end]]
if GameTooltip and GameTooltip.SetBagItem then
hooksecurefunc(GameTooltip, "SetBagItem", self.hGameTooltip_SetBagItem)
end
if GameTooltip and GameTooltip.SetGuildBankItem then
hooksecurefunc(GameTooltip, "SetGuildBankItem", self.hGameTooltip_SetGuildBankItem)
end
if ContainerFrameItemButton_CalculateItemTooltipAnchors then
hooksecurefunc("ContainerFrameItemButton_CalculateItemTooltipAnchors", self.hGameTooltip_SetBagItem)
end
if AddFrameLock then
hooksecurefunc("AddFrameLock", self.hAddFrameLock)
end
if RemoveFrameLock then
hooksecurefunc("RemoveFrameLock", self.hRemoveFrameLock)
end
if UpdateContainerFrameAnchors then
hooksecurefunc("UpdateContainerFrameAnchors", self.hUpdateContainerFrameAnchors)
end
if SpellBookFrame_Update and SpellBookFrame and SpellBookPage1 then
hooksecurefunc("SpellBookFrame_Update", function()
SpellBookPage1:SetPoint("LEFT", SpellBookFrame)
end)
end
--[[if WatchFrame_Update then
hooksecurefunc("WatchFrame_Update", self.hWatchFrameExpand)
end]]
--setfenv(WorldMapFrame_OnShow, setmetatable({UpdateMicroButtons = function() end }, { __index = _G}))
--[[hooksecurefunc("PetActionBar_UpdatePositionValues", function()
if MovAny:IsModified(PetActionButtonsVerticalMover) or MovAny:IsModified(PetActionButtonsMover) then
--print("PetActionBar_UpdatePositionValues()", MovAny:IsModified(PetActionButtonsVerticalMover), MovAny:IsModified(PetActionButtonsMover))
PetActionBarFrame:SetPoint("TOPLEFT", PetActionBarFrame:GetParent(), "BOTTOMLEFT", 500, 0)
end
end)
hooksecurefunc("ShowPetActionBar", function()
if MovAny:IsModified(PetActionButtonsVerticalMover) or MovAny:IsModified(PetActionButtonsMover) then
--print("ShowPetActionBar()", MovAny:IsModified(PetActionButtonsVerticalMover), MovAny:IsModified(PetActionButtonsMover))
PetActionBarFrame:SetPoint("TOPLEFT", PetActionBarFrame:GetParent(), "BOTTOMLEFT", 500, 0)
end
end)]]
--[[hooksecurefunc("ChatEdit_UpdateHeader",function(arg1, arg2)
local b = arg1
if MovAny:IsModified(b) then
b:SetWidth(ChatFrame1:GetWidth())
b:SetPoint("TOPLEFT", ChatEditBoxesMover, "TOPLEFT", 0, 0)
b:SetPoint("BOTTOMRIGHT", ChatEditBoxesMover, "BOTTOMRIGHT", 0, 0)
end
end)]]
--[[if ExtendedUI and ExtendedUI.CAPTUREPOINT then
self.oCaptureBar_Create = ExtendedUI.CAPTUREPOINT.create
ExtendedUI.CAPTUREPOINT.create = self.hCaptureBar_Create
end]]
if AchievementAlertFrame_OnLoad then
self.oAchievementAlertFrame_OnLoad = AchievementAlertFrame_OnLoad
AchievementAlertFrame_OnLoad = self.hAchievementAlertFrame_OnLoad
end
if AchievementAlertFrame_GetAlertFrame then
self.oAchievementAlertFrame_GetAlertFrame = AchievementAlertFrame_GetAlertFrame
AchievementAlertFrame_GetAlertFrame = self.hAchievementAlertFrame_GetAlertFrame
end
--[[if LootWonAlertFrame_SetUp then
hooksecurefunc("LootWonAlertFrame_SetUp", function(self, arg1, ...)
--print("TestDone", self, arg1, select(1, ...), select(2, ...), select(3, ...), select(4, ...), select(5, ...))
if self == LOOT_WON_ALERT_FRAMES[1] and MovAny:IsModified(LootWonAlertMover1) then
print("LootWonAlert1 - Find")
LOOT_WON_ALERT_FRAMES[1]:SetPoint("BOTTOMLEFT", LootWonAlertMover1, "BOTTOMLEFT", 0, 0)
end
if self == LOOT_WON_ALERT_FRAMES[2] and MovAny:IsModified(LootWonAlertMover2) then
print("LootWonAlert2 - Find")
LOOT_WON_ALERT_FRAMES[2]:SetPoint("BOTTOMLEFT", LootWonAlertMover2, "BOTTOMLEFT", 0, 0)
end
if self == LOOT_WON_ALERT_FRAMES[3] and MovAny:IsModified(LootWonAlertMover3) then
print("LootWonAlert3 - Find")
LOOT_WON_ALERT_FRAMES[3]:SetPoint("BOTTOMLEFT", LootWonAlertMover3, "BOTTOMLEFT", 0, 0)
end
if self == LOOT_WON_ALERT_FRAMES[4] and MovAny:IsModified(LootWonAlertMover4) then
print("LootWonAlert4 - Find")
LOOT_WON_ALERT_FRAMES[4]:SetPoint("BOTTOMLEFT", LootWonAlertMover4, "BOTTOMLEFT", 0, 0)
end
if self == LOOT_WON_ALERT_FRAMES[5] and MovAny:IsModified(LootWonAlertMover5) then
print("LootWonAlert5 - Find")
LOOT_WON_ALERT_FRAMES[5]:SetPoint("BOTTOMLEFT", LootWonAlertMover5, "BOTTOMLEFT", 0, 0)
end
end)
end]]
--[[if GroupLootContainer_AddFrame then
hooksecurefunc("GroupLootContainer_AddFrame", function(self, ...)
--print(self, select(1, ...), select(2, ...))
if MovAny:IsModified(GroupLootFrameMover1) then
GroupLootFrame1:SetPoint("BOTTOMLEFT", GroupLootFrameMover1, "BOTTOMLEFT", 0, 0)
end
if MovAny:IsModified(GroupLootFrameMover2) then
GroupLootFrame2:SetPoint("BOTTOMLEFT", GroupLootFrameMover2, "BOTTOMLEFT", 0, 0)
end
if MovAny:IsModified(GroupLootFrameMover3) then
GroupLootFrame1:SetPoint("BOTTOMLEFT", GroupLootFrameMover3, "BOTTOMLEFT", 0, 0)
end
if MovAny:IsModified(GroupLootFrameMover4) then
GroupLootFrame4:SetPoint("BOTTOMLEFT", GroupLootFrameMover4, "BOTTOMLEFT", 0, 0)
end
end)
end]]
self.inited = true
if IsAddOnLoaded("Blizzard_TalentUI") and self.hBlizzard_TalentUI then
self:hBlizzard_TalentUI()
end
end
function MovAny:OnPlayerLogout()
if not MAOptions then
return
end
if MAOptions:IsShown() then
MADB.autoShowNext = true
end
if type(self.movers) == "table" then
for i, v in ipairs(MA_tcopy(self.movers)) do
self:StopMoving(v.tagged:GetName())
end
end
--[[if type(MADB.profiles) == "table" then
for i, v in pairs(MADB.profiles) do
MovAny:CleanProfile(i)
end
end]]
end
function MovAny:VerifyData()
if MoveAnything_CharacterSettings then
MADB.profiles = { }
for i, v in pairs(MoveAnything_CharacterSettings) do
if type(v) == "table" then
MADB.profiles[i] = {name = i, frames = v}
end
end
MoveAnything_CharacterSettings = nil
MADB.characters = { }
if MoveAnything_UseCharacterSettings then
for i, _ in pairs(MADB.profiles) do
MADB.characters[i] = {profile = i}
end
end
end
if type(MADB) ~= "table" then
MADB = { }
end
if type(MADB.profiles) ~= "table" then
MADB.profiles = { }
end
if type(MADB.characters) ~= "table" then
MADB.characters = { }
end
if MADB.profiles["default"] == nil then
self:AddProfile("default", true, true)
end
if MADB.profiles[self:GetProfileName()] == nil then
local char = MADB.characters[self:GetCharacterIndex()]
if char then
char.profile = nil
end
end
local remList = { }
local addList = { }
local rewriteName
for pi, profile in pairs(MADB.profiles) do
table.wipe(remList)
table.wipe(addList)
if type(profile.frames) ~= "table" then
profile.frames = { }
end
for fn, opt in pairs(profile.frames) do
if type(fn) ~= "string" or type(opt) ~= "table" or self.lDeleteFrameNames[fn] then
tinsert(remList, fn)
else
rewriteName = nil
if self.lFrameNameRewrites[fn] then
rewriteName = fn
fn = self.lFrameNameRewrites[fn]
end
opt.cat = nil
if opt.name ~= fn then
opt.name = fn
end
opt.originalLeft = nil
opt.originalBottom = nil
opt.originalWidth = nil
opt.orgWidth = nil
opt.originalHeight = nil
opt.orgHeight = nil
opt.orgPos = nil
opt.originalScale = nil
opt.orgScale = nil
opt.originalAlpha = nil
opt.origAlpha = nil
opt.MANAGED_FRAME = nil
opt.UIPanelWindows = nil
if type(opt.scale) == "number" then
if opt.scale > 0.991 and opt.scale < 1.009 then
opt.scale = 1
end
else
opt.scale = nil
end
if opt.x ~= nil and opt.y ~= nil then
local f = _G[fn]
local fRel = self:ForcedDetachFromParent(fn, opt)
local p
if not fRel then
p = f and f.GetParent and f:GetParent() ~= nil and f:GetParent():GetName() or "UIParent"
end
opt.pos = {"BOTTOMLEFT", p, "BOTTOMLEFT", opt.x, opt.y}
opt.x = nil
opt.y = nil
else
opt.x = nil
opt.y = nil
end
if type(opt.pos) == "table" then
local relTo = opt.pos[2]
if type(relTo) == "table" and relTo.GetName and relTo:GetName() then
opt.pos[2] = relTo:GetName()
end
end
--[[if opt.width and opt.orgWidth and opt.width == opt.orgWidth then
opt.width = nil
end
if opt.height and opt.orgHeight and opt.height == opt.orgHeight then
opt.height = nil
end]]
if rewriteName then
if not self:IsModified(fn, nil, opt) then
tinsert(remList, rewriteName)
else
tinsert(remList, rewriteName)
addList[fn] = opt
end
elseif not self:IsModified(fn, nil, opt) then
tinsert(remList, fn)
end
end
end
for i, v in ipairs(remList) do
MADB.profiles[pi].frames[v] = nil
end
for i, opt in pairs(addList) do
MADB.profiles[pi].frames[i] = opt
end
end
self.lFrameNameRewrites = nil
self.lDeleteFrameNames = nil
end
function MovAny:VerifyFrameData(fn)
local e = API:GetElement(fn)
if e.userData and not e:IsModified() then
e:SetUserData(nil)
MovAny.userData[fn] = nil
end
end
function MovAny:ForcedDetachFromParent(fn, opt)
if self.DetachFromParent[fn] then
return self.DetachFromParent[fn]
end
if UIPanelWindows[fn] then
return "UIParent"
end
opt = opt or self.userData[fn]
if not opt or opt.UIPanelWindows then
return "UIParent"
end
end
function MovAny:ErrorNotInCombat(f, quiet)
if f and self:IsProtected(f) and InCombatLockdown() then
if not quiet then
maPrint(string.format(MOVANY.FRAME_PROTECTED_DURING_COMBAT, f:GetName()))
end
return true
end
end
function MovAny:IsValidObject(f, silent)
if type(f) == "string" then
f = _G[f]
end
if not f then
return
end
if type(f) ~= "table" then
if not silent then
maPrint(string.format(MOVANY.UNSUPPORTED_TYPE, type(f)))
end
return
end
if self.lDisallowedFrames[f:GetName()] then
if not silent then
maPrint(string.format(MOVANY.UNSUPPORTED_FRAME, f:GetName()))
end
return
end
if not self.lAllowedTypes[f:GetObjectType()] then
if not silent then
maPrint(string.format(MOVANY.UNSUPPORTED_TYPE, f:GetObjectType()))
end
return
end
if MovAny:IsMAFrame(f:GetName()) then
if MovAny.lAllowedMAFrames[f:GetName()] or string.sub(f:GetName(), 1, 5) == "MA_FE" then
return true
end
return
end
return true
end
function MovAny:SyncAllFrames(dontReset)
if not self.rendered then
dontReset = true
end
table.wipe(self.pendingFrames)
if type(self.userData) == "table" then
for i, v in pairs(self.userData) do
if i ~= "ArenaPrepFrames" or i ~= "ArenaEnemyFrames" then
self.pendingFrames[i] = API:GetElement(i)
end
end
end
self:SyncFrames(dontReset)
end
function MovAny:SyncFrames(dontReset)
if not self.inited or self.syncingFrames then
return
end
local i = 0
for k in pairs(self.pendingFrames) do
i = i + 1
break
end
if i == 0 then
return
end
self.syncingFrames = true
local f, parent, handled
local skippedFrames = { }
if dontReset then
for fn, e in pairs(self.pendingFrames) do
f = _G[fn]
if f and not e.noMove then
self:UnanchorRelatives(e, f, e.userData)
end
end
end
for fn, e in pairs(self.pendingFrames) do
if not self:GetMoverByFrame(fn) then
self.curSync = e
local _, ret = xpcall(function()
return e:Sync()
end, self.SyncErrorHandler, self)
if not ret or self.syncError then
skippedFrames[fn] = e
end
self.curSync = nil
self.syncError = nil
end
end
self.pendingFrames = skippedFrames
local postponed = { }
for k, f in pairs(self.pendingActions) do
if f() then
tinsert(postponed, f)
end
end
self.pendingActions = postponed
self:SyncUIPanels()
self.rendered = true
self.syncingFrames = nil
if MADB.autoShowNext then
MAOptions:Show()
end
end
function MovAny.SyncErrorHandler(msg, frame, stack, ...)
if MADB.disableErrorMessages then
return
end
local e = MovAny.curSync
if e then
MovAny.syncError = 1
stack = stack or debugstack(2, 20, 20)
local funcs = ""
for m in string.gmatch(stack, "function (%b`')") do
if m ~= "xpcall" then
if funcs == "" then
funcs = m
else
funcs = funcs..", "..m
end
end
end
maPrint(string.format(MOVANY.ERROR_FRAME_FAILED, e.name, e.name, GetAddOnMetadata("MoveAnything", "Version"), msg, funcs))
end
local errorHandler = geterrorhandler()
if type(errorHandler) == "function" and errorHandler ~= _ERRORMESSAGE then
errorHandler(msg, frame, stack, ...)
end
end
function MovAny:IsProtected(f)
if not f then
return
end
local isProtected = f:IsProtected()
if isProtected or f.MAProtected or MovAny.lForceProtected[f:GetName()] then
return true
else
return nil
end
end
function MovAny:IsForbidden(f)
if not f then
return
end
local isForbidden = f:IsForbidden()
if isForbidden or MovAny.lForceForbidden[f:GetName()] then
return true
else
return nil
end
end
function MovAny:GetCharacterIndex()
return GetRealmName().." "..UnitName("player")
end
function MovAny:ClearUserData(fn)
self.userData[fn] = nil
API:RemoveCustomElement(fn)
end
function MovAny:GetUserData(fn, noSymLink, create)
if self.userData == nil then
return nil
end
if not noSymLink and not self.userData[fn] and self.lTranslateSec[fn] then
fn = self.lTranslateSec[fn]
end
if create and self.userData[fn] == nil then
local ud = {name = fn}
local e = API:AddElementIfNew(fn)
MovAny.userData[fn] = ud
e:SetUserData(ud)
return ud
else
return MovAny.userData[fn]
end
end
function MovAny.hShow(f, ...)
if not f then
return
end
if f.MAHidden then
if MovAny:IsProtected(f) and InCombatLockdown() then
local e = API:GetElement(f:GetName())
if e ~= nil and e.userData then
MovAny.pendingFrames[f:GetName()] = e
end
else
f.MAHidden = nil
f:Hide()
f.MAHidden = true
end
end
end
--[[local hider = CreateFrame("Frame")
hider:Hide()]]
function MovAny:LockVisibility(f, dontHide)
if not f then
return
end
if f.MAHidden then
return
end
f.MAHidden = true
if not f.MAShowHook then
hooksecurefunc(f, "Show", MovAny.hShow)
f.MAShowHook = true
end
f.MAWasShown = f:IsShown()
if not dontHide and f.MAWasShown then
f:Hide()
--f.my_real_parent = f:GetParent()
--f:SetParent(hider)
end
end
function MovAny:UnlockVisibility(f)
if not f then
return
end
if not f.MAHidden then
return
end
f.MAHidden = nil
if f.MAWasShown then
f.MAWasShown = nil
--[[if f.my_real_parent then
f:SetParent(f.my_real_parent)
end]]
f:Show()
end
end
function MovAny.hSetPoint(f, ...)
if not f then
return
end
--[[if MovAny.lForceProtected[f:GetName()] then
print(f:GetName())
return
end]]
if f.MAPoint then
local fn = f:GetName()
if fn and string.match(fn, "^ContainerFrame[1-9][0-9]*$") then
local bag = MovAny:GetBagInContainerFrame(f)
if not bag then
return
end
fn = bag:GetName()
end
if InCombatLockdown() and MovAny:IsProtected(f) then
local closure = function(f)
return function()
local p = f.MAPoint
f.MAPoint = nil
f:ClearAllPoints()
if p then
f:ClearAllPoints()
f:SetPoint(unpack(p))
f.MAPoint = p
end
p = nil
end
end
MovAny.pendingActions[fn..":SetPoint"] = closure(f)
else
local p = f.MAPoint
f.MAPoint = nil
f:ClearAllPoints()
f:SetPoint(unpack(p))
f.MAPoint = p
p = nil
end
end
end
function MovAny:LockPoint(f, opt)
if not f then
return
end
if not f.MAPoint then
if f:GetName() and (MovAny.lForcedLock[f:GetName()] or (opt and opt.forcedLock)) then
if not f.MASetPoint then
f.MASetPoint = f.SetPoint
f.SetPoint = MovAny.fVoid
end
else
if not f.MALockPointHook then
hooksecurefunc(f, "SetPoint", MovAny.hSetPoint)
f.MALockPointHook = true
end
f.MAPoint = {f:GetPoint(1)}
end
end
end
function MovAny:UnlockPoint(f)
if not f then
return
end
f.MAPoint = nil
end
function MovAny:LockParent(f)
if not f then
return
end
if not f.MAParented and not f.MAParentHook then
hooksecurefunc(f, "SetParent", MovAny.hSetParent)
f.MAParentHook = true
end
f.MAParented = f:GetParent()
end
function MovAny:UnlockParent(f)
if not f then
return
end
f.MAParented = nil
end
function MovAny.hSetParent(f, ...)
if not f then
return
end
if f.MAParented then
if InCombatLockdown() and MovAny:IsProtected(f) then
MovAny.pendingFrames[f:GetName()] = API:GetElement(f:GetName())
else
local p = f.MAParented
MovAny:UnlockParent(f)
f:SetParent(p)
MovAny:LockParent(f)
end
end
end
--[[function MovAny.hSetWidth(f, ...)
if f.MAScaled then
local fn = f:GetName()
if string.match(fn, "^ContainerFrame[0-9]+$") then
local bag = MovAny:GetBagInContainerFrame(f)
fn = bag:GetName()
end
MovAny.pendingFrames[fn] = API:GetElement(fn)
if not MovAny:IsProtected(f) or not InCombatLockdown() then
MovAny:SyncFrames()
end
end
end
function MovAny.hSetHeight(f, ...)
if f.MAScaled then
local fn = f:GetName()
if string.match(fn, "^ContainerFrame[0-9]+$") then
local bag = MovAny:GetBagInContainerFrame(f)
fn = bag:GetName()
end
MovAny.pendingFrames[fn] = API:GetElement(fn)
if not MovAny:IsProtected(f) or not InCombatLockdown() then
MovAny:SyncFrames()
end
end
end
function MovAny.hSetScale(f, ...)
if f.MAScaled then
local fn = f:GetName()
if string.match(fn, "^ContainerFrame[0-9]+$") then
local bag = MovAny:GetBagInContainerFrame(f)
fn = bag:GetName()
end
MovAny.pendingFrames[fn] = API:GetElement(fn)
if not MovAny:IsProtected(f) or not InCombatLockdown() then
MovAny:SyncFrames()
end
end
end
function MovAny:LockScale(f)
if f.SetScale and not f.MAScaleLocked then
if not f.MAScaleHook then
-- the following doesnt work. it needs to be hooked through the metatable somehow, these hooksecurefunc's never fires
if f.SetWidth then
hooksecurefunc(f, "SetWidth", MovAny.hSetWidth)
end
if f.SetHeight then
hooksecurefunc(f, "SetHeight", MovAny.hSetHeight)
end
if f.SetScale then
hooksecurefunc(f, "SetScale", MovAny.hSetScale)
end
f.MAScaleHook = true
end
end
end
function MovAny:UnlockScale(f)
f.MAScaleLocked = nil
end]]
function MovAny.hSetScale(f)
if not f then
return
end
if f.MAScaled then
local fn = f:GetName()
if string.match(fn, "^ContainerFrame[1-9][0-9]*$") then
local bag = MovAny:GetBagInContainerFrame(f)
if not bag then
if MovAny:IsProtected(f) and InCombatLockdown() then
MovAny.pendingActions[f:GetName()..":SetScale"] = function()
if MovAny:IsProtected(f) and InCombatLockdown() then
return true
end
MovAny:Rescale(f, f.MAScaled)
end
else
MovAny:Rescale(f, f.MAScaled)
end
return
end
fn = bag:GetName()
if MovAny:IsProtected(f) and InCombatLockdown() then
MovAny.pendingFrames[fn] = API:GetElement(fn)
else
MovAny:Rescale(f, f.MAScaled)
end
else
if MovAny:IsProtected(f) and InCombatLockdown() then
MovAny.pendingFrames[fn] = API:GetElement(fn)
else
MovAny:Rescale(f, f.MAScaled)
end
end
end
end
function MovAny:LockScale(f)
if not f then
return
end
if f.SetScale and not f.MAScaled then
local meta = getmetatable(f).__index
if not meta.MAScaleHook then
if meta.SetScale then
hooksecurefunc(meta, "SetScale", MovAny.hSetScale)
end
meta.MAScaleHook = true
end
f.MAScaled = f:GetScale()
end
end
function MovAny:UnlockScale(f)
if not f then
return
end
f.MAScaled = nil
end
function MovAny:Rescale(f, scale)
if not f then
return
end
MovAny:UnlockScale(f)
f:SetScale(scale)
MovAny:LockScale(f)
end
function MovAny.hSyncIfScaled(self, f)
if not f then
return
end
if f.MAScaled and f:GetName() ~= nil then
API:SyncElement(f:GetName())
end
end
function MovAny:LockWH(f)
if not f then
return
end
if f.SetScale and not f.MAScaled then
if not f.MAScaleHook then
if f.SetWidth then
hooksecurefunc(f, "SetWidth", MovAny.hSyncIfScaled)
end
if f.SetHeight then
hooksecurefunc(f, "SetHeight", MovAny.hSyncIfScaled)
end
f.MAScaleHook = true
end
f.MAScaled = f:GetScale()
end
end
function MovAny:HookFrame(e, f, dontUnanchor, runBeforeInteract)
if not f then
f = e.f
if not f then
return
end
end
if InCombatLockdown() and MovAny:IsProtected(f) then
return
end
if not self:IsValidObject(f) then
return
end
if not runBeforeInteract and e and e.runBeforeInteract and e.runBeforeInteract() then
return
end
local fn = f:GetName()
local opt = self:GetUserData(fn, nil, true)
if opt.name == nil then
opt.name = fn
end
if opt.disabled then
return
end
if f.MAOrgScale then
self:UnlockScale(f)
f:SetScale(f.MAOrgScale)
f.MAOrgScale = nil
end
if f.MAOrgAlpha then
f:SetAlpha(f.MAOrgAlpha)
f.MAOrgAlpha = nil
end
if fn == "FocusFrame" then
f.orgScale = f:GetScale()
f.scale = f:GetScale()
end
if f.SetMovable and e and not e.noMove then
if f:IsUserPlaced() then
f.MAWasUserPlaced = true
end
if f:IsMovable() then
f.MAWasMovable = true
end
if f:IsResizable() then
f.MAWasResizable = true
end
f:SetMovable(true)
if f ~= MainMenuBar then
f:SetUserPlaced(true)
end
end
f.MAE = e
if not opt.orgPos and e and not e.noMove then
self.Position:StoreOrgPoints(f, opt)
end
if not f.MAHooked then
if f.OnMAHook and f:OnMAHook() ~= nil then
return
end
f.MAHooked = true
end
if not dontUnanchor and e and not e.noUnanchorRelatives and not e.noMove then
self:UnanchorRelatives(e, f, opt)
end
if self.DetachFromParent[fn] and not self.NoReparent[fn] and not f.MAOrgParent then
f.MAOrgParent = f:GetParent()
f:SetParent(_G[ self.DetachFromParent[fn] ])
--self:LockParent(f)
end
if f.OnMAPostHook and f.OnMAPostHook(f) ~= nil then
return
end
return opt
end
function MovAny:IsModified(fn, var, opt)
if fn == nil then
return
end
if type(fn) == "table" then
fn = fn:GetName()
end
opt = opt or self:GetUserData(fn)
if opt then
if var then
if opt[var] then
return true
end
elseif opt.pos or opt.hidden or opt.scale ~= nil or opt.alpha ~= nil or opt.frameStrata ~= nil or opt.disableLayerArtwork ~= nil or opt.disableLayerBackground ~= nil or opt.disableLayerBorder ~= nil or opt.disableLayerHighlight ~= nil or opt.disableLayerOverlay ~= nil or opt.unregisterAllEvents ~= nil or opt.groups ~= nil or opt.forcedLock ~= nil then
return true
end
else
if MovAny:GetMoverByFrameName(fn) then
return true
end
end
return false
end
function MovAny:AttachMover(fn, displayName)
local f = _G[fn]
if self:ErrorNotInCombat(f) then
return
end
local e = API:AddElementIfNew(fn)
if e.unsupported then
string.format(MOVANY.UNSUPPORTED_FRAME, fn)
return
end
if e.noMove and e.noScale and e.noAlpha then
maPrint(string.format(MOVANY.FRAME_VISIBILITY_ONLY, fn))
return
end
if e.onlyOnceCreated and (f == nil or not f:IsShown()) then
maPrint(string.format(MOVANY.ONLY_ONCE_CREATED, fn))
return
end
if e and e.refuseSync then
if type(e.refuseSync) == "string" then
maPrint(string.format(e.refuseSync, fn))
end
return
end
if f and type(f) ~= "table" then
maPrint(string.format(MOVANY.ERROR_NOT_A_TABLE, fn))
return
end
if not self:GetMoverByFrame(f) then
if e then
if e.runOnce then
if not e:runOnce() then
e.runOnce = nil
else
return
end
end
if e.runBeforeInteract and e:runBeforeInteract() then
return
end
end
local created = nil
local handled = nil
if e then
if e.create and _G[fn] == nil then
f = CreateFrame("Frame", fn, UIParent, e.create)
created = true
else
f = _G[fn]
end
end
if f and fn ~= f:GetName() then
fn = f:GetName()
f = _G[fn]
e = API:GetElement(fn)
end
self.lastFrameName = fn
if self:IsValidObject(f) then
local mover = self:GetAvailableMover()
mover.tagged = f
if f.OnMAAttach then
f.OnMAAttach(f, mover)
end
API:AddElementIfNew(fn, displayName)
if self:HookFrame(e, f) then
if self:AttachMoverToFrame(mover, f) then
handled = true
mover.createdTagged = created
if f.OnMAPostAttach then
f.OnMAPostAttach(f, mover)
end
self:UpdateGUIIfShown()
end
end
end
if e and e.runAfterInteract then
e:runAfterInteract(handled)
end
return true
end
end
function MovAny:GetAvailableMover()
local f
for id = 1, 1000000, 1 do
f = _G[self.moverPrefix..id]
if not f then
f = CreateFrame("Frame", self.moverPrefix..id, UIParent, "MAMoverTemplate")
f:SetID(id)
break
end
if not f.tagged then
break
end
end
if f then
tinsert(self.movers, f)
return f
end
end
function MovAny:GetDefaultFrameParent(f)
local c = f
while c and c ~= UIParent and c ~= nil do
if c.GetName and c:GetName() ~= nil and c:GetName() ~= "" then
local m = string.match(c:GetName(),"^ContainerFrame[1-9][0-9]*$")
if m then
local bag = self:GetBagInContainerFrame(_G[ m ])
if bag and self:IsModified(bag:GetName()) then
return _G[bag:GetName()]
end
end
local maParent = c.MAParent
if maParent then
if type(maParent) == "string" then
maParent = self:CreateVM(maParent)
end
return maParent
end
local transName = self:Translate(c:GetName(),true,true)
if self:IsModified(transName) then
return _G[ transName ]
else
local frame = API:GetElement(transName)
if frame then
return _G[frame.name]
end
end
end
c = c:GetParent()
end
return nil
end
function MovAny:GetTopFrameParent(f)
local c = f
local l = nil
local ln
local n
while c and c ~= UIParent do
if c:IsToplevel() then
n = c:GetName()
if n ~= nil and n ~= "" then
return c
elseif ln ~= nil then
return ln
else
maPrint(MOVANY.NO_NAMED_FRAMES_FOUND)
return nil
end
end
l = c
n = c:GetName()
if n ~= nil and n ~= "" then
ln = c
end
c = c:GetParent()
end
if c == UIParent then
return l
end
return nil
end
function MovAny:ToggleMove(fn)
local ret = nil
if self:GetMoverByFrame(fn) then
ret = self:StopMoving(fn)
else
ret = self:AttachMover(fn)
end
self.lastFrameName = fn
self:UpdateGUIIfShown(true)
return ret
end
function MovAny:ToggleHide(fn)
local ret = nil
local f = _G[fn]
if f and type(f) ~= "table" then
maPrint(string.format(MOVANY.ERROR_NOT_A_TABLE, fn))
return
end
if f and fn ~= f:GetName() then
fn = f:GetName()
end
self:AttachMover(fn)
local opt = self:GetUserData(fn, nil, true)
if not f or not opt.hidden then
ret = self:HideFrame(fn)
else
ret = self:ShowFrame(fn)
end
self.lastFrameName = fn
self:UpdateGUIIfShown(true)
return ret
end
-- X: bindings
function MovAny:SafeMoveFrameAtCursor()
local obj = GetMouseFocus()
while true and obj do
while true and obj do
if self:IsMAFrame(obj:GetName()) then
if self:IsMover(obj:GetName()) then
if obj.tagged then
obj = obj.tagged
else
return
end
elseif not self:IsValidObject(obj, true) then
obj = obj:GetParent()
if not obj or obj == UIParent then
return
end
else
break
end
else
break
end
end
local transName = self:Translate(obj:GetName(), 1)
if transName ~= obj:GetName() then
self:ToggleMove(transName)
break
end
local p = obj:GetParent()
-- check for minimap button
if (p == MinimapBackdrop or p == Minimap or p == MinimapCluster) and obj ~= Minimap then
self:ToggleMove(obj:GetName())
break
end
local objTest = self:GetDefaultFrameParent(obj)
if objTest then
self:ToggleMove(objTest:GetName())
break
end
objTest = self:GetTopFrameParent(obj)
if objTest then
self:ToggleMove(objTest:GetName())
break
end
if obj and obj ~= WorldFrame and obj ~= UIParent and obj.GetName then
self:ToggleMove(obj:GetName())
end
break
end
self:UpdateGUIIfShown(true)
end
function MovAny:MoveFrameAtCursor()
local obj = GetMouseFocus()
if self:IsMAFrame(obj:GetName()) then
if self:IsMover(obj:GetName()) and obj.tagged then
obj = obj.tagged
elseif not self:IsValidObject(obj) then
return
end
end
if not self:IsModified(obj:GetName()) and obj.MAParent then
self:ToggleMove(type(obj.MAParent== "string") and obj.MAParent or obj.MAParent:GetName())
else
local transName = self:Translate(obj:GetName(), true, true)
if transName ~= obj:GetName() then
self:ToggleMove(transName)
elseif obj and obj ~= WorldFrame and obj ~= UIParent and obj:GetName() then
self:ToggleMove(obj:GetName())
end
end
self:UpdateGUIIfShown(true)
end
function MovAny:SafeHideFrameAtCursor()
local obj = GetMouseFocus()
while true do
if self:IsMAFrame(obj:GetName()) then
if self:IsMover(obj:GetName()) and obj.tagged then
obj = obj.tagged
elseif not self:IsValidObject(obj, true) then
obj = obj:GetParent()
end
end
local transName = self:Translate(obj:GetName(), 1)
if transName ~= obj:GetName() then
self:ToggleHide(transName)
break
end
local objTest = self:GetDefaultFrameParent(obj)
if objTest then
self:ToggleHide(objTest:GetName())
break
end
objTest = self:GetTopFrameParent(obj)
if objTest then
API:AddElementIfNew(objTest:GetName())
self:ToggleHide(objTest:GetName())
break
end
if obj and obj ~= WorldFrame and obj ~= UIParent then
API:AddElementIfNew(obj:GetName())
self:ToggleHide(obj:GetName())
break
end
break
end
self:UpdateGUIIfShown(true)
end
function MovAny:HideFrameAtCursor()
local obj = GetMouseFocus()
if self:IsMAFrame(obj:GetName()) then
if self:IsMover(obj:GetName()) and obj.tagged then
obj = obj.tagged
else
return
end
end
if not self:IsModified(obj:GetName()) and obj.MAParent then
self:ToggleHide(type(obj.MAParent== "string") and obj.MAParent or obj.MAParent:GetName())
else
local transName = self:Translate(obj:GetName(), true, true)
if transName ~= obj:GetName() then
self:ToggleHide(transName)
elseif obj and obj ~= WorldFrame and obj ~= UIParent and obj:GetName() then
self:ToggleHide(obj:GetName())
end
end
self:UpdateGUIIfShown(true)
end
function MovAny:SafeResetFrameAtCursor()
local obj = GetMouseFocus()
local fn = obj:GetName()
while true do
if fn and self.userData[fn] then
self:ResetFrameConfirm(fn)
break
end
if self:IsMAFrame(fn) then
if self:IsMover(fn) and obj.tagged then
obj = obj.tagged
self:ResetFrameConfirm(obj:GetName())
break
elseif not self:IsValidObject(obj, true) then
obj = obj:GetParent()
end
fn = obj:GetName()
end
local transName = self:Translate(fn, 1)
if transName ~= fn and self.userData[fn] then
self:ResetFrameConfirm(fn)
break
end
local objTest = self:GetDefaultFrameParent(obj)
if objTest and self.userData[ objTest:GetName() ] then
self:ResetFrameConfirm(objTest:GetName())
break
end
objTest = self:GetTopFrameParent(obj)
if objTest and self.userData[ objTest:GetName() ] then
self:ResetFrameConfirm(objTest:GetName())
break
end
if obj and obj ~= WorldFrame and obj ~= UIParent and self.userData[fn] then
self:ResetFrameConfirm(fn)
break
end
break
end
end
function MovAny:ResetFrameAtCursor()
local obj = GetMouseFocus()
if self:IsMAFrame(obj:GetName()) then
if self:IsMover(obj:GetName()) and obj.tagged then
obj = obj.tagged
else
return
end
end
if InCombatLockdown() and MovAny:IsProtected(obj) then
self:ErrorNotInCombat(obj)
return
end
local fn
if not self:IsModified(obj:GetName()) and obj.MAParent then
fn = type(obj.MAParent == "string") and obj.MAParent or obj.MAParent:GetName()
else
fn = self:Translate(obj:GetName(), true, true)
if transName ~= obj:GetName() then
fn = transName
elseif obj and obj ~= WorldFrame and obj ~= UIParent and obj:GetName() then
fn = obj:GetName()
end
end
if fn and self.userData[fn] then
self:ResetFrameConfirm(fn)
end
end
function MovAny:SafeMAFEFrameAtCursor()
local obj = GetMouseFocus()
while true and obj do
while true and obj do
if self:IsMAFrame(obj:GetName()) then
if self:IsMover(obj:GetName()) then
if obj.tagged then
obj = obj.tagged
else
return
end
elseif not self:IsValidObject(obj, true) then
obj = obj:GetParent()
if not obj or obj == UIParent then
return
end
else
break
end
else
break
end
end
local transName = self:Translate(obj:GetName(), 1)
if transName ~= obj:GetName() then
self:FrameEditor(transName)
break
end
local p = obj:GetParent()
-- check for minimap button
if (p == MinimapBackdrop or p == Minimap or p == MinimapCluster) and obj ~= Minimap then
self:FrameEditor(obj:GetName())
break
end
local objTest = self:GetDefaultFrameParent(obj)
if objTest then
self:FrameEditor(objTest:GetName())
break
end
objTest = self:GetTopFrameParent(obj)
if objTest then
self:FrameEditor(objTest:GetName())
break
end
if obj and obj ~= WorldFrame and obj ~= UIParent and obj.GetName then
self:FrameEditor(obj:GetName())
end
break
end
self:UpdateGUIIfShown(true)
end
function MovAny:MAFEFrameAtCursor()
local obj = GetMouseFocus()
if self:IsMAFrame(obj:GetName()) then
if self:IsMover(obj:GetName()) and obj.tagged then
obj = obj.tagged
elseif not self:IsValidObject(obj) then
return
end
end
if not self:IsModified(obj:GetName()) and obj.MAParent then
self:FrameEditor(type(obj.MAParent== "string") and obj.MAParent or obj.MAParent:GetName())
else
local transName = self:Translate(obj:GetName(), true, true)
if transName ~= obj:GetName() then
self:FrameEditor(transName)
elseif obj and obj ~= WorldFrame and obj ~= UIParent and obj:GetName() then
self:FrameEditor(obj:GetName())
end
end
self:UpdateGUIIfShown(true)
end
function MovAny:IsMover(fn)
if fn ~= nil and string.match(fn, "^"..self.moverPrefix.."[0-9]+$") ~= nil then
return true
end
end
function MovAny:IsMAFrame(fn)
if fn ~= nil and (string.match(fn, "^MoveAnything") ~= nil or string.match(fn, "^MA") ~= nil) then
return true
end
end
function MovAny:IsContainer(fn)
if type(fn) == "string" and string.match(fn, "^ContainerFrame[1-9][0-9]*$") then
return true
end
end
function MovAny:Translate(f, secondary, nofirst)
if not nofirst and self.lTranslate[f] then
return self.lTranslate[f]
end
if secondary and self.lTranslateSec[f] then
return self.lTranslateSec[f]
end
if f == "last" then
return MovAny.lastFrameName
else
return f
end
end
function MovAny:ToggleMovers()
if _G.MAOptionsToggleMovers:GetChecked() then
local protected = { }
for i, v in ipairs(self.minimizedMovers) do
if InCombatLockdown() and self:IsProtected(v) then
tinsert(protected, v)
else
self:AttachMover(v:GetName())
end
end
table.wipe(self.minimizedMovers)
self.minimizedMovers = protected
else
for i, v in ipairs(MA_tcopy(self.movers)) do
tinsert(self.minimizedMovers, v.tagged)
self:StopMoving(v.tagged:GetName())
end
end
end
function MovAny:GetMoverByFrame(f)
if not f then
return
end
if type(f) == "string" then
f = _G[f]
end
for i, m in ipairs(self.movers) do
if type(m) == "table" and m:IsShown() and m.tagged == f then
return m
end
end
return nil
end
function MovAny:GetMoverByFrameName(fn)
if not fn then
return
end
if type(fn) == "table" then
fn = fn:GetName()
end
for i, m in ipairs(self.movers) do
if type(m) == "table" and m:IsShown() and m.tagged and m.tagged:GetName() == fn then
return m
end
end
return nil
end
function MovAny:AttachMoverToFrame(mover, f)
if f.MAHidden == true then
return
end
self:UnlockPoint(f)
local e = f.MAE
if not e then
self:DetachMover(mover)
return
end
mover.MAE = e
--[[if not string.find(e.name, "Mover") then
self:ShowFrame(f)
end]]
local opt = e.userData or MovAny:GetUserData(e.name, nil, true)
mover.displayName = e.displayName or f:GetName()
f.MAMover = mover
if f.OnMAMoving then
if not f:OnMAMoving() then
self:DetachMover(mover)
return
end
end
local x, y = 0, 0
if f:GetLeft() == nil and not f:IsShown() then
f:Show()
f:Hide()
end
mover.attaching = true
mover.dontUpdate = nil
if f.IsClampedToScreen then
mover:SetClampedToScreen(f:IsClampedToScreen())
end
opt.disabled = nil
mover:ClearAllPoints()
mover:SetPoint("CENTER", f, "CENTER")
mover:SetWidth(f:GetWidth() * MAGetScale(f))
mover:SetHeight(f:GetHeight() * MAGetScale(f))
if f.GetFrameLevel then
mover:SetFrameLevel(f:GetFrameLevel() + 1)
end
if not e.noMove then
if not opt.pos then
opt.pos = self:GetRelativePoint(self.Position:GetFirstOrgPoint(opt), f)
end
local p = self:GetRelativePoint({"BOTTOMLEFT", UIParent, "BOTTOMLEFT"}, mover)
mover:ClearAllPoints()
mover:SetPoint(unpack(p))
mover.MAStartPoint = self:GetRelativePoint({"BOTTOMLEFT", UIParent, "BOTTOMLEFT"}, f)
if f.GetScale then
mover.MAStartScale = f:GetScale()
end
f:ClearAllPoints()
if f.MASetPoint then
f:MASetPoint("BOTTOMLEFT", mover, "BOTTOMLEFT", 0, 0)
else
f:SetPoint("BOTTOMLEFT", mover, "BOTTOMLEFT", 0, 0)
end
f.orgX = x
f.orgY = y
end
mover.tagged = f
local label = _G[ mover:GetName().."BackdropInfoLabel"]
label:Hide()
label:ClearAllPoints()
label:SetPoint("CENTER", label:GetParent(), "CENTER", 0, 0)
mover:Show()
mover.attaching = nil
return true
end
function MovAny:DetachMover(mover)
mover.detaching = true
local f = mover.tagged
if mover.tagged and not mover.attaching and not f.MAHidden then
if mover.MAE and not mover.MAE.noMove and not mover.dontUpdate then
if mover.MAStartPoint then
self:MoverUpdatePosition(mover)
end
self.Position:Apply(mover.MAE, f)
end
if mover.createdTagged then
mover.tagged:Hide()
end
if f.OnMADetach then
f.OnMADetach(f, mover)
end
end
mover:Hide()
mover.tagged = nil
mover.attaching = nil
mover.infoShown = nil
mover.MAE = nil
mover.MAStartPoint = nil
mover.MAStartScale = nil
mover.dontUpdate = nil
if mover.tagged then
mover.tagged.MAMover = nil
end
for i, m in ipairs(self.movers) do
if m == mover then
tremove(self.movers, i)
end
end
if self.currentMover == mover then
self:NudgerChangeMover(1)
else
self:NudgerFrameRefresh()
end
mover.detaching = nil
end
function MovAny:StopMoving(fn)
local mover = self:GetMoverByFrame(fn)
if mover and not self:ErrorNotInCombat(_G[fn]) then
self:DetachMover(mover)
self:UpdateGUIIfShown()
end
end
function MovAny:ResetFrameConfirm(fn)
local f = _G[fn]
if InCombatLockdown() and self:IsProtected(f) then
self:ErrorNotInCombat(f)
return
end
if self.resetConfirm == fn and self.resetConfirmTime + 5 >= time() then
self.resetConfirm = nil
maPrint(string.format(MOVANY.RESETTING_FRAME, fn))
self:ResetFrame(fn)
return true
else
self.resetConfirm = fn
self.resetConfirmTime = time()
maPrint(string.format(MOVANY.RESET_FRAME_CONFIRM, fn))
end
end
function MovAny:ResetFrame(f, dontUpdate, readOnly)
if not f then
return
end
local fn
if type(f) == "string" then
fn = f
f = _G[fn]
elseif f and f.GetName then
fn = f:GetName()
end
if not fn then
return
end
if self:ErrorNotInCombat(f) or (InCombatLockdown() and f.UMFP) then
return
end
if not readOnly then
self:ShowFrame(f)
else
self:ShowFrame(f, true, true)
end
self:StopMoving(fn)
self.lastFrameName = fn
if not f then
if not readOnly then
self:ClearUserData(fn)
end
if not dontUpdate then
self:UpdateGUIIfShown(true)
end
return
end
local e = API:GetElement(fn)
local opt = e.userData or self:GetUserData(fn)
if opt == nil then
opt = { }
end
if f.MAHooked then
e:Reset(f, readOnly, opt)
end
if UIPanelWindows[fn] and (not self:IsProtected(f) or not InCombatLockdown()) then
self:SyncUIPanels()
end
if not readOnly then
e:SetUserData(nil)
self:ClearUserData(fn)
end
if f.attachedChildren then
table.wipe(f.attachedChildren)
end
if not dontUpdate then
if f:GetObjectType() ~= "Texture" and f:GetObjectType() ~= "FontString" then
f:SetMovable(true)
f:SetUserPlaced(false)
f:SetMovable(false)
end
self:UpdateGUIIfShown(true)
end
end
function MovAny:ToggleGUI()
if MAOptions:IsShown() then
MAOptions:Hide()
else
MAOptions:Show()
end
end
function MovAny:OnMoveCheck(button)
local fn = API:GetItem(button:GetParent().idx).name
if not self:ToggleMove(fn) then
local f = _G[fn]
if self:IsProtected(f) and not InCombatLockdown() then
button:SetChecked(nil)
end
end
end
function MovAny:OnHideCheck(button)
local fn = API:GetItem(button:GetParent().idx).name
if not self:ToggleHide(fn) then
local f = _G[fn]
if self:IsProtected(f) and not InCombatLockdown() then
button:SetChecked(nil)
end
end
end
function MovAny:OnResetCheck(button)
local fn = API:GetItem(button:GetParent().idx).name
local f = _G[fn]
if f then
if fn ~= f:GetName() then
fn = f:GetName()
f = _G[fn]
end
if MovAny:ErrorNotInCombat(f) then
return
end
end
MovAny:ResetFrame(f or fn)
end
function MovAny:HideFrame(f, readOnly)
if not self:IsModified(f) then
return
end
local fn
if type(f) == "string" then
fn = f
f = _G[fn]
end
if self:ErrorNotInCombat(f) then
return
end
if not f then
if self.lVirtualMovers[fn] then
f = self:CreateVM(fn)
else
return
end
end
if not fn then
fn = f:GetName()
end
API:AddElementIfNew(fn)
if fn == "PaladinPowerBarFrame" then
f:UnregisterAllEvents()
elseif fn == "CompactRaidFrameManager" then
f:UnregisterAllEvents()
CompactRaidFrameContainer:SetParent(UIParent)
elseif fn == "Boss1TargetFrame" or fn == "Boss2TargetFrame" or fn == "Boss3TargetFrame" or fn == "Boss4TargetFrame" or fn == "Boss5TargetFrame" then
f:UnregisterAllEvents()
f:Hide()
f.oldShow = f.Show
f.Show = function()
-- empty
end
elseif fn == "MicroButtonsMover" or fn == "MicroButtonsSplitMover" or fn == "MicroButtonsVerticalMover" or fn == "AchievementMicroButton" then
AchievementMicroButton.IsShown = function(self)
local opt = MovAny:GetUserData(fn)
if opt and opt.hidden then
return true
else
if self:IsShown() then
return true
else
return false
end
end
end
end
local e = API:GetElement(fn)
local mover = self:GetMoverByFrame(f)
if mover then
self:DetachMover(mover)
end
local opt
if readOnly then
opt = { }
else
opt = self:GetUserData(fn, nil, true)
opt.hidden = true
end
if not f then
return true
end
if not self:IsValidObject(f) or not self:HookFrame(e, f) or self:ErrorNotInCombat(f) then
return
end
f.MAWasShown = f:IsShown()
if f.GetAttribute then
opt.unit = f:GetAttribute("unit")
if opt.unit then
f:SetAttribute("unit", nil)
end
end
if e and e.hideList then
for hIndex, hideEntry in pairs(e.hideList) do
local val = _G[hideEntry[1]]
local hideType
for i = 2, table.getn(hideEntry) do
hideType = hideEntry[ i ]
if type(hideType) == "function" then
hideType(nil)
elseif hideType == "DISABLEMOUSE" then
val:EnableMouse(nil)
elseif hideType == "FRAME" then
self:LockVisibility(val)
elseif hideType == "WH" then
self:StopMoving(fn)
val:SetWidth(1)
val:SetHeight(1)
else
val:DisableDrawLayer(hideType)
end
end
end
elseif e and e.hideUsingWH then
self:StopMoving(fn)
f:SetWidth(1)
f:SetHeight(1)
self:LockVisibility(f)
else
self:LockVisibility(f)
end
if f.OnMAHide then
f.OnMAHide(f, true)
end
return true
end
function MovAny:ShowFrame(f, readOnly, dontHook)
local fn
if type(f) == "string" then
fn = f
f = _G[f]
end
if self:ErrorNotInCombat(f) then
return
end
if not f then
if self.lVirtualMovers[fn] then
f = self:CreateVM(fn)
else
return
end
end
if not fn then
fn = f:GetName()
end
API:AddElementIfNew(fn)
if fn == "PaladinPowerBarFrame" then
PaladinPowerBar.OnLoad(f)
elseif fn == "CompactRaidFrameManager" then
f:RegisterEvent("DISPLAY_SIZE_CHANGED")
f:RegisterEvent("UI_SCALE_CHANGED")
f:RegisterEvent("GROUP_ROSTER_UPDATE")
f:RegisterEvent("UNIT_FLAGS")
f:RegisterEvent("PLAYER_FLAGS_CHANGED")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:RegisterEvent("PARTY_LEADER_CHANGED")
f:RegisterEvent("RAID_TARGET_UPDATE")
f:RegisterEvent("PLAYER_TARGET_CHANGED")
CompactRaidFrameContainer:ClearAllPoints()
CompactRaidFrameContainer:SetParent(f)
MovAny:UnlockPoint(CompactRaidFrameContainer)
CompactRaidFrameContainer:SetPoint("TOPLEFT", CompactRaidFrameManagerContainerResizeFrame, "TOPLEFT", 4, - 7)
elseif fn == "Boss1TargetFrame" or fn == "Boss2TargetFrame" or fn == "Boss3TargetFrame" or fn == "Boss4TargetFrame" or fn == "Boss5TargetFrame" then
f.Show = f.oldShow
f.oldShow = nil
end
--[[local mover = self:GetMoverByFrame(f)
if mover then
if not string.find(e.name, "Mover") then
self:AttachMoverToFrame(mover, f)
end
end]]
local e = API:GetElement(fn)
local opt = self:GetUserData(fn, nil, true)
--[[if e and e.userData then
opt = e.userData
end]]
if not readOnly and opt then
opt.hidden = nil
opt.unit = nil
end
if not f then
self:VerifyFrameData(fn)
return true
end
if not self:IsValidObject(f) or (not dontHook and not self:HookFrame(e, f)) or self:ErrorNotInCombat(f) then
return
end
if opt ~= nil and opt.unit and f.SetAttribute then
f:SetAttribute("unit", opt.unit)
end
if e and e.hideList then
for hIndex, hideEntry in pairs(e.hideList) do
local val = _G[hideEntry[1]]
for i = 2, table.getn(hideEntry) do
local hideType = hideEntry[i]
if type(hideType) == "function" then
hideType(true)
elseif hideType == "DISABLEMOUSE" then
val:EnableMouse(true)
elseif hideType == "FRAME" then
self:UnlockVisibility(val)
elseif hideType == "WH" then
if type(opt.orgWidth) == "number" then
val:SetWidth(opt.orgWidth)
end
if type(opt.orgHeight) == "number" then
val:SetHeight(opt.orgHeight)
end
else
val:EnableDrawLayer(hideType)
end
end
end
self.Layers:Apply(e, f)
elseif e and e.hideUsingWH then
if type(opt.orgWidth) == "number" then
f:SetWidth(opt.orgWidth)
end
if type(opt.orgHeight) == "number" then
f:SetHeight(opt.orgHeight)
end
self:UnlockVisibility(f)
else
self:UnlockVisibility(f)
end
if f.OnMAHide then
f.OnMAHide(f, nil)
end
self:VerifyFrameData(fn)
return true
end
function MovAny:OnCheckToggleCategories(button)
local state = button:GetChecked()
if state then
self.collapsed = true
else
self.collapsed = nil
end
for i, v in pairs(API.cats) do
v.collapsed = state
end
self:UpdateGUIIfShown(true)
end
function MovAny:OnCheckToggleModifiedFramesOnly(button)
local state = button:GetChecked()
if state then
MADB.modifiedFramesOnly = true
else
MADB.modifiedFramesOnly = nil
end
self:UpdateGUIIfShown(true)
end
function MovAny:GroupMove(sender, groups, x, y)
local f, e, mover
for g in pairs(groups) do
for fn, opt in pairs(self.userData) do
if fn ~= sender.name and type(opt.groups) == "table" and opt.groups[g] and type(opt.pos) == "table" then
f = _G[fn]
if f then
mover = self:GetMoverByFrame(f)
if mover then
mover.attaching = true
self:DetachMover(mover)
end
e = API:GetElement(fn)
if e and e:IsModified("pos") then
opt.pos[4] = opt.pos[4] + (x / f:GetScale())
opt.pos[5] = opt.pos[5] + (y / f:GetScale())
self.Position:Apply(e, f)
end
if mover then
self:AttachMover(fn)
end
end
end
end
end
end
function MovAny:GroupScale(sender, groups, scaleMod, scale, dir)
local f, e, mover
for g in pairs(groups) do
for fn, opt in pairs(self.userData) do
if fn ~= sender.name and type(opt.groups) == "table" and opt.groups[g] then
f = _G[fn]
if f then
mover = self:GetMoverByFrame(f)
if mover then
self:DetachMover(mover)
end
end
e = API:GetElement(fn)
local orgScale = opt.scale or (f and f:GetScale() or 1)
if not e.scaleWH then
if opt.pos then
opt.pos[4] = opt.pos[4] * orgScale
opt.pos[5] = opt.pos[5] * orgScale
end
opt.scale = orgScale + scaleMod
if opt.pos then
opt.pos[4] = opt.pos[4] / opt.scale
opt.pos[5] = opt.pos[5] / opt.scale
end
else
if f then
if type(opt.orgWidth) ~= "number" then
opt.orgWidth = f:GetWidth()
end
if type(opt.orgHeight) ~= "number" then
opt.orgHeight = f:GetHeight()
end
end
if dir == 0 then
if type(opt.width) ~= "number" then
opt.width = opt.orgWidth
end
if type(opt.width) == "number" then
opt.width = opt.width * (1 + scaleMod)
end
elseif dir == 1 then
if type(opt.height) ~= "number" then
opt.height = opt.orgHeight
end
if type(opt.height) == "number" then
opt.height = opt.height * (1 + scaleMod)
end
end
end
if f then
self.Scale:Apply(e, f)
if opt.pos then
self.Position:Apply(e, f)
end
if mover then
self:AttachMover(fn)
end
end
end
end
end
end
function MovAny:GroupAlpha(sender, groups, alphaMod, alpha)
local f, e, fAlpha, mover
for g in pairs(groups) do
for fn, opt in pairs(self.userData) do
if fn ~= sender.name and type(opt.groups) == "table" and opt.groups[g] then
f = _G[fn]
if f then
mover = self:GetMoverByFrame(f)
if mover then
self:DetachMover(mover)
end
end
e = API:GetElement(fn)
if not opt.alpha then
fAlpha = (f and (f.GetAlpha and f:GetAlpha() or 1) + alphaMod) or alpha
else
fAlpha = opt.alpha + alphaMod
end
if fAlpha < 0 then
fAlpha = 0
elseif fAlpha > 1 then
fAlpha = 1
end
opt.alpha = fAlpha
self.Alpha:Apply(e, f)
if mover then
self:AttachMover(fn)
end
end
end
end
end
function MovAny:GroupBackdropAlpha(sender, groups, alphaMod, alpha)
local f, e, fAlpha, mover
for g in pairs(groups) do
for fn, opt in pairs(self.userData) do
if fn ~= sender.name and type(opt.groups) == "table" and opt.groups[g] then
f = _G[fn]
if f then
mover = self:GetMoverByFrame(f)
if mover then
self:DetachMover(mover)
end
end
e = API:GetElement(fn)
if not opt.backdropAlpha then
local _
_, _, _, fAlpha = f:GetBackdropColor()
fAlpha = fAlpha or alpha
else
fAlpha = opt.backdropAlpha + alphaMod
end
if fAlpha < 0 then
fAlpha = 0
elseif fAlpha > 1 then
fAlpha = 1
end
opt.backdropAlpha = fAlpha
self.Alpha:Apply(e, f)
if mover then
self:AttachMover(fn)
end
end
end
end
end
function MovAny:GroupLayers(sender, groups, layer, opt)
local f, e
for g in pairs(groups) do
for fn, fOpt in pairs(self.userData) do
if fn ~= sender.name and fOpt.groups and fOpt.groups[g] then
f = _G[fn]
if f then
e = API:GetElement(fn)
self.Layers:Reset(e, f, true, fOpt)
end
fOpt[layer] = opt[layer]
if f then
self.Layers:Apply(e, f, fOpt)
end
end
end
end
end
function MovAny:MoverUpdatePosition(mover)
if mover.attaching then
return
end
if mover.tagged then
if not mover.MAE or mover.MAE.noMove then
return
end
local f = mover.tagged
local opt = mover.MAE.userData
local p = self:GetRelativePoint({"BOTTOMLEFT", "UIParent", "BOTTOMLEFT"}, f)
if mover.MAStartPoint and (mover.MAStartPoint[1] == p[1] and mover.MAStartPoint[2] == p[2] and mover.MAStartPoint[3] == p[3] and (mover.MAStartPoint[4] * (mover.MAStartScale or 1)) == p[4] and (mover.MAStartPoint[5] * (mover.MAStartScale or 1)) == p[5]) then
return
end
p = self:GetRelativePoint(opt.pos or self.Position:GetFirstOrgPoint(opt) or {"BOTTOMLEFT", "UIParent", "BOTTOMLEFT"}, f)
if not skipGroups and opt.groups and not IsShiftKeyDown() then
local _, _, _, x, y = unpack(self:GetRelativePoint(p, f, true))
x = x - opt.pos[4]
y = y - opt.pos[5]
if not mover.MAE.scaleWH then
x = x * (opt.scale or (f.GetScale and f:GetScale()) or 1)
y = y * (opt.scale or (f.GetScale and f:GetScale()) or 1)
end
MovAny:GroupMove(mover.MAE, opt.groups, x, y)
end
opt.pos = p
table.wipe(mover.MAStartPoint)
for i = 1, 5, 1 do
mover.MAStartPoint[i] = p[i]
end
if f.OnMAPosition then
f:OnMAPosition()
end
self:UpdateGUIIfShown()
end
end
function MovAny:MoverOnSizeChanged(mover)
if mover.attaching or mover.detaching then
return
end
if mover.tagged then
local s, w, h, f, opt
f = mover.tagged
local opt = mover.MAE.userData
if mover.MAE.scaleWH then
if opt.width ~= mover:GetWidth() or opt.height ~= mover:GetHeight() then
if not mover.skipGroups and opt.groups and not IsShiftKeyDown() then
local dir = mover:GetHeight() ~= opt.height and 1 or 0
if dir == 0 then
s = mover:GetWidth() / f:GetWidth()
s = s / MAGetScale(f:GetParent(), 1 ) * UIParent:GetScale()
else
s = mover:GetHeight() / f:GetHeight()
s = s / MAGetScale(f:GetParent(), 1 ) * UIParent:GetScale()
end
self:GroupScale(mover.MAE, opt.groups, s - 1, s, dir)
end
opt.width = mover:GetWidth()
opt.height = mover:GetHeight()
self.Scale:Apply(mover.MAE, f, opt)
mover.skipGroups = true
self:MoverUpdatePosition(mover)
mover.skipGroups = nil
end
else
if mover.MASizingAnchor == "LEFT" or mover.MASizingAnchor == "RIGHT" then
w = mover:GetWidth()
h = w * (f:GetHeight() / f:GetWidth())
if h < 8 then
h = 8
w = h * (f:GetWidth() / f:GetHeight())
end
else
h = mover:GetHeight()
w = h * (f:GetWidth() / f:GetHeight())
if w < 8 then
w = 8
h = w * (f:GetHeight() / f:GetWidth())
end
end
s = mover:GetWidth() / f:GetWidth()
s = s / MAGetScale(f:GetParent(), 1) * UIParent:GetScale()
if s > 0.991 and s < 1 then
s = 1
end
if f.GetScale and s ~= f:GetScale() then
if not mover.skipGroups and opt.groups and not IsShiftKeyDown() then
self:GroupScale(mover.MAE, opt.groups, s - (opt.scale or f:GetScale()), s)
end
opt.scale = s
self.Scale:Apply(mover.MAE, f)
--self:MoverUpdatePosition(mover)
mover.skipGroups = true
self:MoverUpdatePosition(mover)
mover.skipGroups = nil
end
mover:SetWidth(w)
mover:SetHeight(h)
local label = _G[ mover:GetName().."BackdropInfoLabel"]
label:SetWidth(w + 100)
label:SetHeight(h)
end
local label = _G[ mover:GetName().."BackdropInfoLabel"]
label:ClearAllPoints()
label:SetPoint("TOP", label:GetParent(), "TOP", 0, 0)
local brief, long
if MovAny.Scale:CanBeScaled(f) then
if mover.MAE.scaleWH then
brief = "W: "..MANumFor(f:GetWidth()).." H:"..MANumFor(f:GetHeight())
long = brief
else
brief = MANumFor(f:GetScale())
long = "Scale: "..brief
end
label:Show()
label:SetText(brief)
if mover == self.currentMover then
_G[ "MANudgerInfoLabel"]:Show()
_G[ "MANudgerInfoLabel"]:SetText(long)
end
end
label = _G[ mover:GetName().."BackdropMovingFrameName" ]
label:ClearAllPoints()
label:SetPoint("TOP", label:GetParent(), "TOP", 0, 20)
self:UpdateGUIIfShown(true)
end
end
function MovAny:MoverOnMouseWheel(mover, arg1)
if not mover.tagged or mover.MAE.noAlpha then
return
end
local alpha
if IsAltKeyDown() then
local r, g, b
r, g, b, alpha = mover.tagged:GetBackdropColor()
alpha = alpha or 1
else
alpha = mover.tagged:GetAlpha()
end
if type(alpha) ~= "number" then
return
end
local alphaMod
if arg1 > 0 then
alphaMod = 0.05
else
alphaMod = - 0.05
end
alpha = alpha + alphaMod
if alpha < 0 then
alpha = 0
mover.tagged.alphaAttempts = nil
elseif alpha > 0.99 then
alpha = 1
mover.tagged.alphaAttempts = nil
elseif alpha > 0.92 then
if not mover.tagged.alphaAttempts then
mover.tagged.alphaAttempts = 1
elseif mover.tagged.alphaAttempts > 2 then
alpha = 1
mover.tagged.alphaAttempts = nil
else
mover.tagged.alphaAttempts = mover.tagged.alphaAttempts + 1
end
else
mover.tagged.alphaAttempts = nil
end
alpha = tonumber(MANumFor(alpha))
local opt = mover.MAE.userData
if IsAltKeyDown() then
if not mover.skipGroups and opt.groups and not IsShiftKeyDown() then
self:GroupBackdropAlpha(mover.MAE, opt.groups, alphaMod, alpha)
end
opt.backdropAlpha = alpha
if opt.backdropAlpha == opt.orgBackdropAlpha then
opt.backdropAlpha = nil
opt.orgBackdropAlpha = nil
end
else
if not mover.skipGroups and opt.groups and not IsShiftKeyDown() then
self:GroupAlpha(mover.MAE, opt.groups, alphaMod, alpha)
end
opt.alpha = alpha
if opt.alpha == opt.orgAlpha then
opt.alpha = nil
opt.orgAlpha = nil
end
end
self.Alpha:Apply(mover.tagged.MAE, mover.tagged)
local label = _G[ mover:GetName().."BackdropInfoLabel"]
label:Show()
label:SetText(MANumFor(alpha * 100).."%")
if mover == self.currentMover then
_G["MANudgerInfoLabel"]:Show()
_G["MANudgerInfoLabel"]:SetText("Alpha:"..MANumFor(alpha * 100).."%")
end
self:UpdateGUIIfShown(true)
end
function MovAny:CompleteReset()
for i, v in pairs(self.userData) do
self:ResetFrame(v.name, true, true)
end
self:ReanchorRelatives()
if MADB.squareMM then
Minimap:SetMaskTexture("Textures\\MinimapMask")
end
MADB = {
collapsed = true,
frameListRows = 18,
tooltips = true,
}
MADB.profiles = { }
MADB.characters = { }
self.userData = { }
MADB.profiles[self:GetProfileName()] = {frames = self.userData}
MAOptionsToggleCategories:SetChecked(true)
MovAny:OnCheckToggleCategories(MAOptionsToggleCategories)
MovAny_OptionsOnShow()
self:UpdateGUIIfShown(true)
end
function MovAny:OnShow()
if MADB.playSound then
PlaySound(850)
end
MADB.autoShowNext = true
MANudger:Show()
self:NudgerFrameRefresh()
self:UpdateGUI()
for i, v in pairs(self.lEnableMouse) do
if v and v.EnableMouse and (not MovAny:IsProtected(v) or not InCombatLockdown()) then
v:EnableMouse(true)
end
end
end
function MovAny:OnHide()
if MADB.playSound then
PlaySound(851)
end
MADB.autoShowNext = nil
if not self.currentMover then
MANudger:Hide()
end
for i, v in pairs(self.lEnableMouse) do
if v and v.EnableMouse and (not MovAny:IsProtected(v) or not InCombatLockdown()) then
v:EnableMouse(nil)
end
end
end
function MovAny:RowTitleClicked(title)
local o = API:GetItem(MAGetParent(title).idx)
if o.elems then
if o.collapsed then
o.collapsed = nil
else
o.collapsed = true
end
self:UpdateGUI(1)
else
if self.FrameEditor then
self:FrameEditor(o.name)
end
end
end
local uiDisplayedFrameNames = { }
function MovAny:CountGUIItems()
if API.compile then
API:CompileList()
end
local items = 0
local curCatItems = 0
local curCat = nil
if self.searchWord and self.searchWord ~= "" then
local uiDisplayedFrameNames = { }
for i, o in pairs(API.all) do
if not o.elems and not uiDisplayedFrameNames[o.name] then
if (not MADB.dontSearchFrameNames and string.match(string.lower(tostring(o.name)), self.searchWord)) or (o.displayName and string.match(string.lower(tostring(o.displayName)), self.searchWord)) then
if MADB.modifiedFramesOnly then
if MovAny:IsModified(o.name) then
uiDisplayedFrameNames[o.name] = 1
items = items + 1
end
else
uiDisplayedFrameNames[o.name] = 1
items = items + 1
end
end
end
end
else
for i, o in pairs(API.all) do
if o.elems then
if curCat then
curCat.items = curCatItems
curCatItems = 0
end
curCat = o
elseif not o.hidden then
if MADB.modifiedFramesOnly then
if MovAny:IsModified(o.name) then
curCatItems = curCatItems + 1
end
else
curCatItems = curCatItems + 1
end
end
end
if curCat then
curCat.items = curCatItems
end
for i, o in pairs(API.all) do
if o.elems then
if not MADB.modifiedFramesOnly then
if o.collapsed then
items = items + 1
else
items = items + o.items + 1
end
else
if o.items > 0 then
if o.collapsed then
items = items + 1
else
items = items + o.items + 1
end
end
end
end
end
end
self.guiLines = items
end
function MovAny:UpdateGUI(recount)
if recount or MovAny.guiLines == - 1 then
MovAny:CountGUIItems()
end
FauxScrollFrame_Update(MAScrollFrame, MovAny.guiLines, MADB.frameListRows, MovAny.SCROLL_HEIGHT)
local topOffset = FauxScrollFrame_GetOffset(MAScrollFrame)
local displayList = { }
local lastCat = nil
local uiDisplayedFrameNames = { }
if MovAny.searchWord and MovAny.searchWord ~= "" then
local results = { }
local skip = topOffset
for i, o in pairs(API.all) do
if not o.elems and not uiDisplayedFrameNames[o.name] then
if (not MADB.dontSearchFrameNames and string.match(string.lower(o.name), MovAny.searchWord)) or (o.displayName and string.match(string.lower(o.displayName), MovAny.searchWord)) then
if MADB.modifiedFramesOnly then
if o:IsModified() then
uiDisplayedFrameNames[o.name] = 1
tinsert(results, o)
end
else
uiDisplayedFrameNames[o.name] = 1
tinsert(results, o)
end
end
end
end
table.sort(results, function(o1,o2)
return o1.displayName:lower() < o2.displayName:lower()
end)
for i, o in pairs(results) do
if skip > 0 then
skip = skip - 1
else
tinsert(displayList, o)
end
end
results = nil
else
local startOffset = 0
local hidden = 0
local shown = 0
for i, o in pairs(API.all) do
if startOffset == 0 and shown >= topOffset then
startOffset = topOffset + hidden
break
end
if o.elems then
lastCat = o
if o.items == 0 then
hidden = hidden + 1
else
shown = shown + 1
end
else
if lastCat and lastCat.collapsed then
else
if lastCat.items > 0 then
shown = shown + 1
else
hidden = hidden + 1
end
end
end
end
if startOffset ~= 0 then
-- X: fix off by one
if startOffset > 0 then
startOffset = startOffset + 1
end
end
local sepOffset, wtfOffset
sepOffset = 0
wtfOffset = 0
local skip = topOffset
for i = 1, MADB.frameListRows, 1 do
local index = i + sepOffset + wtfOffset
local o
-- forward to next shown element
while true do
if index > API.allCount then
o = nil
break
end
o = API.all[ index ]
if o.elems then
lastCat = o
if o.items > 0 then
if skip > 0 then
index = index + 1
wtfOffset = wtfOffset + 1
skip = skip -1
else
if o.elems and o.collapsed then
sepOffset = sepOffset + o.items
end
break
end
else
index = index + 1
wtfOffset = wtfOffset + 1
end
else
local c = lastCat or o:GetCategory()
if c.collapsed then
index = index + 1
wtfOffset = wtfOffset + 1
else
if MADB.modifiedFramesOnly then
if MovAny:IsModified(o.name) then
if skip > 0 then
index = index + 1
wtfOffset = wtfOffset + 1
skip = skip -1
else
break
end
else
index = index + 1
wtfOffset = wtfOffset + 1
end
else
if skip > 0 then
index = index + 1
wtfOffset = wtfOffset + 1
skip = skip -1
else
break
end
end
end
end
end
if o then
tinsert(displayList, o)
else
break
end
end
end
local prefix, move, backdrop, hide
prefix = "MAMove"
move = "Move"
hide = "Hide"
local skip = topOffset
for i = 1, MADB.frameListRows, 1 do
local o = displayList[i]
local row = _G[ prefix..i ]
if not o then
row:Hide()
else
local fn = o.name
local opts = o.userData
local moveCheck = _G[ prefix..i..move ]
local hideCheck = _G[ prefix..i..hide ]
local text, frameNameLabel
local idx = o:GetAllIndex()
frameNameLabel = _G[ prefix..i.."FrameName" ]
if not frameNameLabel then
break
end
frameNameLabel.idx = idx
row.idx = idx
row.name = o.name
row:Show()
if o.elems then
text = _G[ prefix..i.."FrameNameText" ]
text:Hide()
text = _G[ prefix..i.."FrameNameHighlight" ]
text:Show()
if o.collapsed and o.items > 0 then
text:SetText("+ "..o.name)
else
text:SetText(" "..o.name)
end
frameNameLabel.tooltipLines = nil
else
text = _G[ prefix..i.."FrameNameHighlight" ]
text:Hide()
text = _G[ prefix..i.."FrameNameText" ]
text:Show()
text:SetText((opts and opts.disabled and "*" or "")..o.displayName)
end
if not o.unsupported and not o.elems and fn then
_G[ prefix..i.."Backdrop" ]:Show()
if o.noMove and o.noScale and o.noAlpha then
moveCheck:Hide()
else
moveCheck:SetChecked(MovAny:GetMoverByFrame(fn) and 1 or nil)
moveCheck:Show()
end
if o.noHide then
hideCheck:Hide()
else
hideCheck:SetChecked(opts and opts.hidden or nil)
hideCheck:Show()
end
if MovAny:IsModified(fn) then
_G[ prefix..i.."Reset" ]:Show()
else
_G[ prefix..i.."Reset" ]:Hide()
end
else
_G[ prefix..i.."Backdrop" ]:Hide()
moveCheck:Hide()
hideCheck:Hide()
_G[ prefix..i.."Reset" ]:Hide()
end
end
end
MAOptionsToggleCategories:SetChecked(MovAny.collapsed)
MAOptionsToggleModifiedFramesOnly:SetChecked(MADB.modifiedFramesOnly)
if MovAny.searchWord and MovAny.searchWord ~= "" then
MAOptionsFrameNameHeader:SetText(string.format(MOVANY.LIST_HEADING_SEARCH_RESULTS, MovAny.guiLines))
else
MAOptionsFrameNameHeader:SetText(MOVANY.LIST_HEADING_CATEGORY_AND_FRAMES)
end
MovAny:TooltipHide()
end
function MovAny:UpdateGUIIfShown(recount, dontUpdateEditors)
if recount then
self.guiLines = - 1
end
if MAOptions and MAOptions:IsShown() then
self:UpdateGUI()
end
if not dontUpdateEditors then
for fn, fe in pairs(self.frameEditors) do
if fe:IsShown() and not fe.updating then
fe:UpdateEditor()
end
end
end
if self.portDlg and self.portDlg:IsShown() then
self.portDlg:Reload()
end
end
function MovAny:NudgerChangeMover(dir)
local p
local first, sel
local cur = self.currentMover
local matchNext = false
for i, m in ipairs(self.movers) do
if not first then
first = m
end
if matchNext then
self.currentMover = m
matchNext = nil
break
end
if m == cur then
if dir < 0 then
if first == m then
for i2, m2 in ipairs(self.movers) do
sel = m2
end
self.currentMover = sel
else
self.currentMover = p
end
break
else
matchNext = true
end
end
p = m
end
if matchNext then
self.currentMover = first
end
self:NudgerFrameRefresh()
end
function MovAny:GetFirstMover()
for i, m in ipairs(self.movers) do
if m and m.IsShown and m:IsShown() then
return m
end
end
return nil
end
function MovAny:MoverOnShow(mover)
local mn = mover:GetName()
MANudger:Show()
self.currentMover = mover
self:NudgerFrameRefresh()
mover.startAlpha = mover.tagged:GetAlpha()
_G[mn.."Backdrop"]:Show()
_G[mn.."BackdropMovingFrameName"]:SetText(mover.displayName)
if not mover.tagged or not MovAny.Scale:CanBeScaled(mover.tagged) then
_G[mn.."Resize_TOP"]:Hide()
_G[mn.."Resize_LEFT"]:Hide()
_G[mn.."Resize_BOTTOM"]:Hide()
_G[mn.."Resize_RIGHT"]:Hide()
else
_G[mn.."Resize_TOP"]:Show()
_G[mn.."Resize_LEFT"]:Show()
_G[mn.."Resize_BOTTOM"]:Show()
_G[mn.."Resize_RIGHT"]:Show()
end
_G[ mn.."BackdropInfoLabel"]:SetText("")
if mover == self.currentMover then
_G[ "MANudgerInfoLabel"]:SetText("")
end
end
function MovAny:MoverOnHide()
local firstMover = self:GetFirstMover()
if not MADB.alwaysShowNudger and firstMover == nil then
MANudger:Hide()
else
self.currentMover = firstMover
self:NudgerFrameRefresh()
end
end
function MovAny:NudgerOnShow()
if not MADB.alwaysShowNudger then
local firstMover = self:GetFirstMover()
if firstMover == nil then
MANudger:Hide()
return
end
end
self:NudgerFrameRefresh()
end
function MovAny:NudgerFrameRefresh()
local labelText = ""
if self.currentMover ~= nil then
local cur = 0
for i, m in ipairs(self.movers) do
cur = cur + 1
if m == self.currentMover then
break
end
end
local f = self.currentMover.tagged
if f then
labelText = cur.." / "..#self.movers
local fn = f:GetName()
if fn then
labelText = labelText.."\n"..fn
MANudger.idx = API:GetElement(fn).idx
if self.currentMover.MAE and self.currentMover.MAE.noHide then
MANudger_Hide:Hide()
else
MANudger_Hide:Show()
end
end
end
end
local moverCount = #self.movers
if moverCount > 0 then
MANudger_CenterH:Show()
MANudger_CenterV:Show()
MANudger_NudgeLeft:Show()
MANudger_NudgeUp:Show()
MANudger_NudgeDown:Show()
MANudger_NudgeRight:Show()
MANudger_CenterMe:Show()
MANudger_Detach:Show()
MANudger_Hide:Show()
MANudgerMouseOver:ClearAllPoints()
MANudgerMouseOver:SetPoint("BOTTOM", MANudger, "BOTTOM", 0, 6)
MANudgerInfoLabel:Show()
if #self.movers > 1 then
MANudger_MoverMinus:Show()
MANudger_MoverPlus:Show()
else
MANudger_MoverMinus:Hide()
MANudger_MoverPlus:Hide()
end
else
MANudger_CenterH:Hide()
MANudger_CenterV:Hide()
MANudger_NudgeLeft:Hide()
MANudger_NudgeUp:Hide()
MANudger_NudgeDown:Hide()
MANudger_NudgeRight:Hide()
MANudger_CenterMe:Hide()
MANudger_Detach:Hide()
MANudger_Hide:Hide()
MANudgerMouseOver:ClearAllPoints()
MANudgerMouseOver:SetPoint("CENTER", MANudger, "CENTER", 0, 0)
MANudgerInfoLabel:Hide()
MANudgerInfoLabel:SetText("")
MANudger_MoverMinus:Hide()
MANudger_MoverPlus:Hide()
end
MANudgerTitle:SetText(labelText)
end
function MovAny:NudgerOnUpdate()
local obj = GetMouseFocus()
local text = ""
local text2 = ""
local label = MANudgerMouseOver
local labelSafe = MANudgerMouseOver
local name
if obj and obj ~= WorldFrame and obj:GetName() then
local objTest = self:GetDefaultFrameParent(obj)
if objTest then
name = objTest:GetName()
if name then
text = text.."Safe: "..name
end
else
objTest = self:GetTopFrameParent(obj)
if objTest then
name = objTest:GetName()
if name then
text = text.."Safe: "..objTest:GetName()
end
end
end
end
if obj and obj ~= WorldFrame and obj:GetName() then
name = obj:GetName()
if name then
text2 = "Mouseover: "..text2..name
end
if obj:GetParent() and obj:GetParent() ~= WorldFrame and obj:GetParent():GetName() then
name = obj:GetParent():GetName()
if name then
text2 = text2.."\nParent: "..name
end
if obj:GetParent():GetParent() and obj:GetParent():GetParent() ~= WorldFrame and obj:GetParent():GetParent():GetName() then
name = obj:GetParent():GetParent():GetName()
if name then
text2 = text2.."\nParent's Parent: "..name
end
end
end
end
if not string.find(text2, "MANudger") then
label:SetText(text2.."\n"..text)
else
label:SetText(text)
end
end
function MovAny:Center(lock)
local mover = self.currentMover
local x, y
if lock == 0 then
-- Both
mover:ClearAllPoints()
mover:SetPoint("CENTER", 0, 0)
x = mover:GetLeft()
y = mover:GetBottom()
mover:SetPoint("BOTTOMLEFT", x, y)
else
x = mover:GetLeft()
y = mover:GetBottom()
mover:ClearAllPoints()
if lock == 1 then
-- Horizontal
mover:SetPoint("CENTER", 0, 0)
x = mover:GetLeft()
mover:SetPoint("BOTTOMLEFT", x, y)
elseif lock == 2 then
-- Vertical
mover:SetPoint("CENTER", 0, 0)
y = mover:GetBottom()
mover:SetPoint("BOTTOMLEFT", x, y)
end
end
mover.skipGroups = true
self:MoverUpdatePosition(mover)
mover.skipGroups = nil
end
function MovAny:Nudge(dir, button)
local x, y, offsetX, offsetY, parent, mover, offsetAmount
mover = self.currentMover
if not mover:IsShown() then
return
end
x = mover:GetLeft()
y = mover:GetBottom()
if button == "RightButton" then
if IsShiftKeyDown() then
offsetAmount = 250
else
offsetAmount = 50
end
else
if IsShiftKeyDown() then
offsetAmount = 10
elseif IsAltKeyDown() then
offsetAmount = 0.1
else
offsetAmount = 1
end
end
if dir == 1 then
offsetX = 0
offsetY = offsetAmount
elseif dir == 2 then
offsetX = 0
offsetY = - offsetAmount
elseif dir == 3 then
offsetX = - offsetAmount
offsetY = 0
elseif dir == 4 then
offsetX = offsetAmount
offsetY = 0
end
mover:ClearAllPoints()
mover:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", x + offsetX, y + offsetY)
self:MoverUpdatePosition(mover)
end
function MovAny:SizingAnchor(button)
local s, e = string.find(button:GetName(), "Resize_")
local anchorto = string.sub(button:GetName(), e + 1)
local anchor
if anchorto == "LEFT" then
anchor = "LEFT"
elseif anchorto == "RIGHT" then
anchor = "RIGHT"
elseif anchorto == "TOP" then
anchor = "TOP"
elseif anchorto == "BOTTOM" then
anchor = "BOTTOM"
end
return anchorto, anchor
end
function MovAny:SyncUIPanel(mn, f)
local mover = _G[mn]
if f and (f ~= LootFrame or GetCVar("lootUnderMouse") ~= "1") and not MovAny:IsModified(f) and not MovAny:GetMoverByFrame(f) then
if self:IsModified(mn) then
if MovAny:IsProtected(f) and InCombatLockdown() then
local closure = function(f)
return function()
if MovAny:IsProtected(f) and InCombatLockdown() then
return true
end
MovAny:UnlockPoint(f)
f:ClearAllPoints()
local UIPOpt = UIPanelWindows[f:GetName()]
local x = 0
local y = 0
if not UIPOpt or not UIPOpt.xoffset then
x = 16
y = -12
end
f:SetPoint("TOPLEFT", mn, "TOPLEFT", x, y)
if not f.MAOrgScale then
f.MAOrgScale = f:GetScale()
end
f:SetScale(mover:GetScale())
if not f.MAOrgAlpha then
f.MAOrgAlpha = f:GetAlpha()
end
f:SetAlpha(mover:GetAlpha())
end
end
MovAny.pendingActions[f:GetName()..":UIPanel"] = closure(f)
else
MovAny:UnlockPoint(f)
f:ClearAllPoints()
local UIPOpt = UIPanelWindows[f:GetName()]
local x = 0
local y = 0
if not UIPOpt or not UIPOpt.xoffset then
x = 16
y = -12
end
f:SetPoint("TOPLEFT", mn, "TOPLEFT", x, y)
if not f.MAOrgScale then
f.MAOrgScale = f:GetScale()
end
f:SetScale(mover:GetScale())
if not f.MAOrgAlpha then
f.MAOrgAlpha = f:GetAlpha()
end
f:SetAlpha(mover:GetAlpha())
end
elseif f.MAOrgScale or f.MAOrgAlpha then
if MovAny:IsProtected(f) and InCombatLockdown() then
local closure = function(f)
return function()
if MovAny:IsProtected(f) and InCombatLockdown() then
return true
end
if f.MAOrgScale then
f:SetScale(f.MAOrgScale)
f.MAOrgScale = nil
end
if f.MAOrgAlpha then
f:SetAlpha(f.MAOrgAlpha)
f.MAOrgAlpha = nil
end
end
end
MovAny.pendingActions[f:GetName()..":UIPanel"] = closure(f)
else
if f.MAOrgScale then
f:SetScale(f.MAOrgScale)
f.MAOrgScale = nil
end
if f.MAOrgAlpha then
f:SetAlpha(f.MAOrgAlpha)
f.MAOrgAlpha = nil
end
end
end
end
end
function MovAny:SyncUIPanels()
local self = MovAny
local f = GetUIPanel("left")
if f then
self:SyncUIPanel("UIPanelMover1", f)
f = GetUIPanel("center")
if f then
self:SyncUIPanel("UIPanelMover2", f)
f = GetUIPanel("right")
if f then
self:SyncUIPanel("UIPanelMover3", f)
end
end
else
f = GetUIPanel("doublewide")
if f then
self:SyncUIPanel("UIPanelMover1", f)
f = GetUIPanel("right")
if f then
self:SyncUIPanel("UIPanelMover3", f)
end
end
end
end
function MovAny:GetContainerFrame(id)
local i = 1
local container
while true do
container = _G["ContainerFrame"..i]
if not container then
break
end
if container:IsShown() and container:GetID() == id then
return container
end
i = i + 1
end
return nil
end
function MovAny:GetBagInContainerFrame(f)
return self:GetBag(f:GetID())
end
function MovAny:GetBag(id)
return self.bagFrames[id]
end
function MovAny:SetBag(id, bag)
self.bagFrames[id] = bag
end
function MovAny:GrabContainerFrame(container, movableBag)
if movableBag and MovAny:IsModified(movableBag) then
movableBag:Show()
MovAny:UnlockScale(container)
container:SetScale(MAGetScale(movableBag))
MovAny:LockScale(container)
MovAny:UnlockPoint(container)
container:ClearAllPoints()
container:SetPoint("CENTER", movableBag, "CENTER", 0, 0)
MovAny:LockPoint(container)
movableBag.attachedChildren = { }
tinsert(movableBag.attachedChildren, container)
container:SetAlpha(movableBag:GetAlpha())
end
end
function MovAny:UnanchorRelatives(e, f, opt)
if f.GetName and f:GetName() ~= nil and e.noUnanchorRelatives then
return
end
if not f.GetParent then
return
end
local p = f:GetParent()
if not p then
return
end
opt = opt or self:GetUserData(f:GetName())
local named = { }
self:_AddNamedChildren(named, f)
local relatives = MA_tcopy(named)
relatives[f] = f
if p.GetRegions then
local children = {p:GetRegions()}
if children ~= nil then
for i, v in ipairs(children) do
self:_AddDependents(relatives, v)
end
end
end
--local num = p:GetNumChildren()
--assert((num < 8000), "Too much childrens stuck in owerflow")
if p.GetChildren then
local children = {p:GetChildren()}
if children ~= nil then
for i, v in ipairs(children) do
if not self:IsForbidden(v) and not self:IsProtected(v) and v.GetPoint then
self:_AddDependents(relatives, v)
end
end
end
end
relatives[f] = nil
relatives[GameTooltip] = nil
for i, v in pairs(named) do
relatives[v] = nil
end
-- local fRel = self:ForcedDetachFromParent(f:GetName())
local fRel = (select(2, opt.orgPos))
if fRel == nil then
fRel = (select(2, f:GetPoint(1)))
end
local size = tlen(relatives)
if size > 0 then
local unanchored = { }
local x, y, i
for i, v in pairs(relatives) do
if v:GetName() ~= nil and not self:IsContainer(v:GetName()) and not string.match(v:GetName(), "BagFrame[1-9][0-9]*") and not self.NoUnanchoring[v:GetName()] and not v.MAPoint then
-- alternatively use not self:GetUserData(v:GetName()) instead of v.MAPoint
if v:GetRight() ~= nil and v:GetTop() ~= nil then
local p = {v:GetPoint(1)}
p[2] = fRel
p = MovAny:GetRelativePoint(p, v, true)
if MovAny:IsProtected(v) and InCombatLockdown() then
MovAny:AddPendingPoint(v, p)
else
v.MAOrgPoint = {v:GetPoint(1)}
MovAny:UnlockPoint(v)
v:ClearAllPoints()
v:SetPoint(unpack(p))
MovAny:LockPoint(v)
end
unanchored[ i ] = v
end
end
end
if i ~= nil then
f.MAUnanchoredRelatives = unanchored
end
end
end
function MovAny:_AddDependents(l, f)
if (MovAny:IsProtected(f) and InCombatLockdown()) or not f.GetPoint then
return
end
local error = false
xpcall(function() return f:GetPoint(1) end,
function() error = true end)
if error then
return
end
local _, relativeTo = f:GetPoint(1)
if relativeTo and l[relativeTo] then
l[f] = f
end
end
function MovAny:_AddNamedChildren(l, f)
if f.GetChildren then
local children = {f:GetChildren()}
if children ~= nil then
for i, v in pairs(children) do
self:_AddNamedChildren(l, v)
if v.GetName then
local n = v:GetName()
if n then
l[v] = v
end
end
end
end
end
if f.attachedChildren then
local children = f.attachedChildren
if children ~= nil then
for i, v in pairs(children) do
self:_AddNamedChildren(l, v)
if v.GetName then
local n = v:GetName()
if n then
l[v] = v
end
end
end
end
end
end
function MovAny:ReanchorRelatives()
for i, v in pairs(self.userData) do
local f = _G[v.name]
if f and f.MAUnanchoredRelatives then
for k, r in pairs(f.MAUnanchoredRelatives) do
if not MovAny:IsModified(r) then
MovAny:UnlockPoint(r)
if r.MAOrgPoint then
r:SetPoint(unpack(r.MAOrgPoint))
r.MAOrgPoint = nil
end
end
end
f.MAUnanchoredRelatives = nil
end
end
end
function MovAny:AddPendingPoint(f, p)
local closure = function(f, p)
return function()
if MovAny:IsProtected(f) and InCombatLockdown() then
return true
end
if not f.MAOrgPoint then
f.MAOrgPoint = {f:GetPoint(1)}
end
MovAny:UnlockPoint(f)
f:ClearAllPoints()
--MovAny:SetPoint(f, p)
if f.MASetPoint then
f:MASetPoint(unpack(p))
else
f:SetPoint(unpack(p))
end
MovAny:LockPoint(f)
end
end
local fn = f:GetName()
MovAny.pendingActions[fn..":Point"] = closure(f, p)
end
function MovAny:GetSerializedPoint(f, num)
num = num or 1
local point, rel, relPoint, x, y = f:GetPoint(num)
if point then
if rel and rel.GetName and rel:GetName() ~= "" then
rel = rel:GetName()
else
rel = "UIParent"
end
return {point, rel, relPoint, x, y}
end
return nil
end
function MovAny:GetRelativePoint(o, f, lockRel)
if not o then
o = {"BOTTOMLEFT", UIParent, "BOTTOMLEFT"}
end
local rel = o[2]
if rel == nil then
rel = UIParent
end
if type(rel) == "string" then
rel = _G[rel]
end
if not rel then
return
end
local point = o[1]
local relPoint = o[3]
if not lockRel then
local newRel = self:ForcedDetachFromParent(f:GetName())
if newRel then
rel = _G[newRel]
point = "BOTTOMLEFT"
relPoint = "BOTTOMLEFT"
end
if not rel then
return
end
end
local rX, rY, pX, pY
if rel:GetLeft() ~= nil then
if relPoint == "TOPRIGHT" then
rY = rel:GetTop()
rX = rel:GetRight()
elseif relPoint == "TOPLEFT" then
rY = rel:GetTop()
rX = rel:GetLeft()
elseif relPoint == "TOP" then
rY = rel:GetTop()
rX = (rel:GetRight() + rel:GetLeft()) / 2
elseif relPoint == "BOTTOMRIGHT" then
rY = rel:GetBottom()
rX = rel:GetRight()
elseif relPoint == "BOTTOMLEFT" then
rY = rel:GetBottom()
rX = rel:GetLeft()
elseif relPoint == "BOTTOM" then
rY = rel:GetBottom()
rX = (rel:GetRight() + rel:GetLeft()) / 2
elseif relPoint == "CENTER" then
rY = (rel:GetTop() + rel:GetBottom()) / 2
rX = (rel:GetRight() + rel:GetLeft()) / 2
elseif relPoint == "LEFT" then
rY = (rel:GetTop() + rel:GetBottom()) / 2
rX = rel:GetLeft()
elseif relPoint == "RIGHT" then
rY = (rel:GetTop() + rel:GetBottom()) / 2
rX = rel:GetRight()
else
return
end
if rel.GetEffectiveScale then
rY = rY * rel:GetEffectiveScale()
rX = rX * rel:GetEffectiveScale()
else
rY = rY * UIParent:GetEffectiveScale()
rX = rX * UIParent:GetEffectiveScale()
end
end
if f:GetLeft() ~= nil then
if point == "TOPRIGHT" then
pY = f:GetTop()
pX = f:GetRight()
elseif point == "TOPLEFT" then
pY = f:GetTop()
pX = f:GetLeft()
elseif point == "TOP" then
pY = f:GetTop()
pX = (f:GetRight() + f:GetLeft()) / 2
elseif point == "BOTTOMRIGHT" then
pY = f:GetBottom()
pX = f:GetRight()
elseif point == "BOTTOMLEFT" then
pY = f:GetBottom()
pX = f:GetLeft()
elseif point == "BOTTOM" then
pY = f:GetBottom()
pX = (f:GetRight() + f:GetLeft()) / 2
elseif point == "CENTER" then
pY = (f:GetTop() + f:GetBottom()) / 2
pX = (f:GetRight() + f:GetLeft()) / 2
elseif point == "LEFT" then
pY = (f:GetTop() + f:GetBottom()) / 2
pX = f:GetLeft()
elseif point == "RIGHT" then
pY = (f:GetTop() + f:GetBottom()) / 2
pX = f:GetRight()
else
return
end
if f.GetEffectiveScale then
pY = pY * f:GetEffectiveScale()
pX = pX * f:GetEffectiveScale()
else
pY = pY * UIParent:GetEffectiveScale()
pX = pX * UIParent:GetEffectiveScale()
end
end
if rY ~= nil and rX ~= nil and pY ~= nil and pX ~= nil then
rX = pX - rX
rY = pY - rY
if f.GetEffectiveScale then
rY = rY / f:GetEffectiveScale()
rX = rX / f:GetEffectiveScale()
else
rY = rY / UIParent:GetEffectiveScale()
rX = rX / UIParent:GetEffectiveScale()
end
else
rX = 0
rY = 0
end
return {point, rel:GetName(), relPoint, rX, rY}
end
-- modfied version of blizzards updateContainerFrameAnchors
local MARefBlizzBags = { }
function MovAny:hUpdateContainerFrameAnchors()
if MADB.noBags then
return
end
local bagsMover = _G.BagsMover
local bagsHooked = bagsMover and bagsMover.MAHooked or nil
local xRemaining, yRemaining, column, frame, frameHeight, visibleSpacing, bag, xOffset, yOffset, containerScale, xAvail, yAvail
local highestFrame = 0
if bagsHooked then
containerScale = BagsMover:GetScale()
xOffset, yOffset = math.abs(BagsMover:GetRight() * containerScale - GetScreenWidth()), BagsMover:GetBottom() * containerScale
else
containerScale = 1
xOffset, yOffset = CONTAINER_OFFSET_X , CONTAINER_OFFSET_Y --/ containerScale
end
while containerScale > 0.02 do
xAvail, yAvail = (GetScreenWidth() - xOffset) / containerScale, (GetScreenHeight() - yOffset) / containerScale
if BankFrame:IsShown() and not BankFrame.MAHooked then
xAvail = xAvail + (20 / containerScale) - (BankFrame:GetRight() * BankFrame:GetScale()) / containerScale
end
yRemaining = yAvail
column = 1
highestFrame = 0
--visibleSpacing = VISIBLE_CONTAINER_SPACING * containerScale
for index, frameName in ipairs(ContainerFrame1.bags) do
frame = MARefBlizzBags[frameName]
if frame == nil then
frame = _G[frameName]
MARefBlizzBags[frameName] = frame
end
bag = MovAny:GetBagInContainerFrame(frame)
if not bag or (bag and not MovAny:IsModified(bag, "pos") and not MovAny:GetMoverByFrame(bag)) then
frameHeight = frame:GetHeight() --* containerScale
if yRemaining < frameHeight + VISIBLE_CONTAINER_SPACING then
column = column + 1
yRemaining = yAvail
end
if frameHeight > highestFrame then
highestFrame = frameHeight
end
yRemaining = yRemaining - frameHeight - VISIBLE_CONTAINER_SPACING
end
end
if highestFrame > yAvail or column * ((CONTAINER_WIDTH --[[* containerScale]]) + VISIBLE_CONTAINER_SPACING) > xAvail then
containerScale = containerScale - .01
else
break
end
end
if not bagsHooked and containerScale < CONTAINER_SCALE then
containerScale = CONTAINER_SCALE
end
column = 0
yRemaining = yAvail
local lastFrame, firstFrame, skippedFrame = nil, nil, nil
for i = 1, 13, 1 do
frame = _G["ContainerFrame"..i]
bag = MovAny:GetBagInContainerFrame(frame)
if not bag or (bag and not MovAny:IsModified(bag, "pos") and not MovAny:GetMoverByFrame(bag)) then
MovAny:UnlockPoint(frame)
--MovAny:UnlockScale(frame)
frame:ClearAllPoints()
frame:SetScale(containerScale)
frame:SetAlpha(1)
frameHeight = frame:GetHeight() --* containerScale
if firstFrame == nil then
firstFrame = frame
if bagsHooked then
frame:SetPoint("BOTTOMRIGHT", BagsMover, "BOTTOMRIGHT", 0, 0)
else
frame:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -xOffset, yOffset )
end
elseif yRemaining < frameHeight then
yRemaining = yAvail
frame:SetPoint("BOTTOMRIGHT", firstFrame, "BOTTOMLEFT", -(column * CONTAINER_WIDTH), 0)
column = column + 1
else
frame:SetPoint("BOTTOMRIGHT", lastFrame, "TOPRIGHT", 0, -CONTAINER_SPACING)
end
yRemaining = yRemaining - frameHeight - VISIBLE_CONTAINER_SPACING
lastFrame = frame
end
end
end
-- X: slash commands
SLASH_MAMOVE1 = "/move"
SlashCmdList["MAMOVE"] = function(msg)
if msg == nil or string.len(msg) == 0 then
MovAny:ToggleGUI()
else
MovAny:ToggleMove(MovAny:Translate(msg))
end
end
SLASH_MAUNMOVE1= "/unmove"
SlashCmdList["MAUNMOVE"] = function(msg)
if msg then
if MovAny.userData[ msg ] then
MovAny:ResetFrame(msg)
elseif MovAny.userData[ MovAny:Translate(msg) ] then
MovAny:ResetFrame(MovAny:Translate(msg))
end
else
maPrint(MOVANY.CMD_SYNTAX_UNMOVE)
end
end
SLASH_MAHIDE1 = "/hide"
SlashCmdList["MAHIDE"] = function(msg)
if msg == nil or string.len(msg) == 0 then
maPrint(MOVANY.CMD_SYNTAX_HIDE)
return
end
MovAny:ToggleHide(MovAny:Translate(msg))
end
SLASH_MAIMPORT1 = "/moveimport"
SlashCmdList["MAIMPORT"] = function(msg)
if msg == nil or string.len(msg) == 0 then
maPrint(MOVANY.CMD_SYNTAX_IMPORT)
return
end
if InCombatLockdown() then
maPrint(MOVANY.DISABLED_DURING_COMBAT)
return
end
if MADB.profiles[msg] == nil then
maPrint(string.format(MOVANY.PROFILE_UNKNOWN, msg))
return
end
MovAny:CopyProfile(msg, MovAny:GetProfileName())
MovAny:UpdateProfile()
maPrint(string.format(MOVANY.PROFILE_IMPORTED, msg, MovAny:GetProfileName()))
end
SLASH_MAEXPORT1 = "/moveexport"
SlashCmdList["MAEXPORT"] = function(msg)
if msg == nil or string.len(msg) == 0 then
maPrint(MOVANY.CMD_SYNTAX_EXPORT)
return
end
MovAny:CopyProfile(MovAny:GetProfileName(), msg)
maPrint(string.format(MOVANY.PROFILE_EXPORTED, MovAny:GetProfileName(), msg))
end
SLASH_MALIST1 = "/movelist"
SlashCmdList["MALIST"] = function(msg)
maPrint(MOVANY.PROFILES..":")
for i, val in pairs(MADB.profiles) do
local str = " \""..i.."\""
if val == MovAny.userData then
str = str.." <- "..MOVANY.PROFILE_CURRENT
end
maPrint(str)
end
end
SLASH_MADELETE1 = "/movedelete"
SLASH_MADELETE2 = "/movedel"
SlashCmdList["MADELETE"] = function(msg)
if msg == nil or string.len(msg) == 0 then
maPrint(MOVANY.CMD_SYNTAX_DELETE)
return
end
if MADB.profiles[msg] == nil then
maPrint(string.format(MOVANY.PROFILE_UNKNOWN, msg))
return
end
if msg == MovAny:GetProfileName() and InCombatLockdown() then
maPrint(MOVANY.PROFILE_CANT_DELETE_CURRENT_IN_COMBAT)
return
end
if MovAny:DeleteProfile(msg) then
maPrint(string.format(MOVANY.PROFILE_DELETED, msg))
end
end
SLASH_MAMAFE1 = "/mafe"
SlashCmdList["MAMAFE"] = function(msg)
if string.len(msg) > 0 then
MovAny:FrameEditor(MovAny:Translate(msg))
else
maPrint(MOVANY.CMD_SYNTAX_MAFE)
end
end
SLASH_MAINFO1 = "/info"
SlashCmdList["MAINFO"] = function(msg)
GetParentInfoFromCursor()
end
-- X: global functions
function MANumFor(n, decimals)
if n == nil then
return "nil"
end
n = string.format("%."..(decimals or 2).."f", n)
if decimals == nil then
decimals = 2
end
while decimals > 0 do
if string.sub(n, - 1) == "0" then
n = string.sub(n, 1, - 2)
end
decimals = decimals - 1
end
if string.sub(n, - 1) == "." then
n = string.sub(n, 1, - 2)
end
return n
end
function MAGetParent(f)
if not f or not f.GetParent then
return
end
local p = f:GetParent()
if p == nil then
return UIParent
end
return p
end
function MAGetScale(f, effective)
if not f or not f.GetScale then
return 1
elseif f.MAE and f.MAE.noScale then
return f:GetScale()
else
if not f.GetScale or f:GetScale() == nil then
return 1
end
if effective then
return f:GetEffectiveScale()
else
return f:GetScale()
end
end
end
function maPrint(msgKey, msgHighlight, msgAdditional, r, g, b, frame)
local msgOutput
if frame then
msgOutput = frame
else
msgOutput = DEFAULT_CHAT_FRAME
end
if msgKey == "" then
return
end
if msgKey == nil then
msgKey = "<nomsg>"
end
if msgHighlight == nil or msgHighlight == "" then
msgHighlight = " "
end
if msgAdditional == nil or msgAdditional == "" then
msgAdditional = " "
end
if msgOutput then
msgOutput:AddMessage("|caaff0000MoveAnything|r|caaffff00>|r "..msgKey.." |caaaaddff"..msgHighlight.."|r"..msgAdditional, r, g, b)
end
end
function MovAny:ToggleEnableFrame(fn, opt)
local f = _G[fn]
if f and fn ~= f:GetName() then
fn = f:GetName()
end
local opt = opt or MovAny:GetUserData(fn, nil, true)
if opt.disabled then
self:EnableFrame(fn)
else
self:DisableFrame(fn)
end
MovAny:UpdateGUIIfShown()
end
function MovAny:EnableFrame(fn)
local f = _G[fn]
if not fn then
return
end
if not f then
return
end
local opt = self:GetUserData(f:GetName())
if not opt then
return
end
opt.disabled = nil
local e = API:GetElement(fn)
e:Sync(f)
if f.MAOnEnable then
f:MAOnEnable()
end
end
function MovAny:DisableFrame(fn)
if fn == nil then
return
end
self:StopMoving(fn)
local opt = self:GetUserData(fn, nil, true)
if not opt then
return
end
local f = _G[fn]
if f then
self:ResetFrame(f, nil, true)
end
opt.disabled = true
end
function MovAny:UnhookTooltip()
local tooltip = _G.GameTooltip
if tooltip.MAMover then
local e = tooltip.MAMover.MAE
local opt = e.userData
if type(opt) == "table" then
if opt.hidden then
tooltip.MAHidden = nil
end
MovAny.Alpha:Reset(e, tooltip, true)
MovAny.Scale:Reset(e, tooltip, true)
MovAny.Misc:Reset(e, tooltip, true)
end
tooltip.MAMover = nil
end
end
function MovAny:HookTooltip(mover)
if not mover then
return
end
local l, r, t, b, anchor
local tooltip = _G.GameTooltip
self:UnhookTooltip()
--[[local opt = MovAny:GetUserData(mover:GetName())
opt = mover.MAE.userData
if type(opt) ~= "table" then
return
end]]
tooltip.MAMover = mover
l = mover:GetLeft() * mover:GetEffectiveScale()
r = mover:GetRight() * mover:GetEffectiveScale()
t = mover:GetTop() * mover:GetEffectiveScale()
b = mover:GetBottom() * mover:GetEffectiveScale()
anchor = "CENTER"
if ((b + t) / 2) < ((UIParent:GetTop() * UIParent:GetScale()) / 2) - 25 then
anchor = "BOTTOM"
elseif ((b + t) / 2) > ((UIParent:GetTop() * UIParent:GetScale()) / 2) + 25 then
anchor = "TOP"
end
if anchor ~= "CENTER" then
if ((l + r) / 2) > ((UIParent:GetRight() * UIParent:GetScale()) / 2) + 25 then
anchor = anchor.."RIGHT"
elseif ((l + r) / 2) < ((UIParent:GetRight() * UIParent:GetScale()) / 2) - 25 then
anchor = anchor.."LEFT"
end
end
--MovAny:UnlockPoint(tooltip)
tooltip:ClearAllPoints()
tooltip:SetPoint(anchor, mover, anchor, 0, 0)
--MovAny:LockPoint(tooltip)
local opt = MovAny:GetUserData(mover:GetName())
if opt and opt.hidden then
self:LockVisibility(tooltip)
end
MovAny.Alpha:Apply(mover.MAE, tooltip)
MovAny.Scale:Apply(mover.MAE, tooltip)
MovAny.Misc:Apply(mover.MAE, tooltip)
end
function MovAny:hGameTooltip_SetDefaultAnchor(relative)
local tooltip = _G.GameTooltip
if tooltip.MASkip then
return
end
if MovAny:IsModified("TooltipMover") then
MovAny:HookTooltip(_G["TooltipMover"])
elseif MovAny:IsModified("BagItemTooltipMover") then
MovAny:UnlockPoint(tooltip)
end
end
function MovAny:hGameTooltip_SetBagItem(container, slot)
if MovAny:IsModified("BagItemTooltipMover") then
MovAny:HookTooltip(_G["BagItemTooltipMover"])
end
end
function MovAny:hGameTooltip_SetGuildBankItem(container, slot)
if MovAny:IsModified("GuildBankItemTooltipMover") then
MovAny:HookTooltip(_G["GuildBankItemTooltipMover"])
end
end
-- X: MA tooltip funcs
function MovAny:TooltipShow(self)
if not self.tooltipText then
return
end
if self.alwaysShowTooltip or (MADB.tooltips and not IsShiftKeyDown() and not self.neverShowTooltip) or (not MADB.tooltips and IsShiftKeyDown()) or (self.neverShowTooltip and IsShiftKeyDown()) then
GameTooltip:SetOwner(self, "ANCHOR_CURSOR")
GameTooltip:ClearLines()
GameTooltip:AddLine(self.tooltipText)
GameTooltip:Show()
end
end
function MovAny:TooltipHide()
GameTooltip:Hide()
end
function MovAny:TooltipShowMultiline(self)
local tooltipLines = self.tooltipLines
if tooltipLines == nil then
local el = API:GetItem(self.idx)
if el.elems then
return
end
tooltipLines = MovAny:GetFrameTooltipLines(el.name)
end
if tooltipLines == nil then
return
end
local g = 0
for k in pairs(tooltipLines) do
g = 1
break
end
if g == 0 then
return
end
if self.alwaysShowTooltip or (self.neverShowTooltip and IsShiftKeyDown()) or (MADB.tooltips and not IsShiftKeyDown() and not self.neverShowTooltip) or (not MADB.tooltips and IsShiftKeyDown()) then
GameTooltip:SetOwner(self, "ANCHOR_CURSOR")
GameTooltip:ClearLines()
for i,v in ipairs(tooltipLines) do
GameTooltip:AddLine(v)
end
GameTooltip:Show()
end
end
function MovAny:GetFrameTooltipLines(fn)
if not fn then
return
end
local o = API:GetElement(fn)
if not o then
return
end
local opts = o.userData
local msgs = { }
local enough = nil
local added = nil
tinsert(msgs, o.displayName or fn)
if opts then
if opts.hidden then
if o.hideList then
tinsert(msgs, "Specially hidden")
else
tinsert(msgs, "Hidden")
end
enough = true
end
end
if o and o.displayName and o.displayName ~= fn and fn ~= nil then
tinsert(msgs, " ")
tinsert(msgs, "Frame: "..fn)
end
if opts then
if opts.pos then
if not added then
tinsert(msgs, " ")
end
tinsert(msgs, "Position: "..MANumFor(opts.pos[4])..", "..MANumFor(opts.pos[5]))
enough = true
added = true
end
if opts.scale then
if not added then
tinsert(msgs, " ")
end
tinsert(msgs, "Scale: "..MANumFor(opts.scale))
enough = true
added = true
end
if opts.alpha then
if not added then
tinsert(msgs, " ")
end
tinsert(msgs, "Alpha: "..MANumFor(opts.alpha))
enough = true
added = true
end
added = nil
if opts.scale then
if not added then
tinsert(msgs, " ")
end
tinsert(msgs, "Original Scale: "..MANumFor(opts.orgScale or 1))
enough = true
added = true
end
if opts.alpha and opts.orgAlpha and opts.alpha ~= opts.orgAlpha then
if not added then
tinsert(msgs, " ")
end
tinsert(msgs, "Original Alpha: "..MANumFor(opts.orgAlpha))
enough = true
added = true
end
end
-- enable this to only show tooltips if actual modifications have been made to the frame
--[[if not enough then
table.wipe(msgs)
end]]
return msgs
end
-- X: debugging code
function echo(...)
local msg = ""
for k, v in pairs({...}) do
msg = msg..k.."=["..tostring(v) .."] "
end
DEFAULT_CHAT_FRAME:AddMessage(msg)
end
function decho(ar, limit)
local msg = ""
for k, v in pairs(ar) do
if type(v) == "table" then
msg = msg..k.."=["..dechoSub(v, 1, limit) .."] \n"
else
msg = msg..k.."=["..tostring(v) .."] \n"
end
end
DEFAULT_CHAT_FRAME:AddMessage(msg)
end
function dechoSub(t, d, limit)
local msg = ""
if d > 10 or (type(limit) == "number" and d <= limit) then
return msg
end
for k, v in pairs(t) do
if type(v) == "table" then
msg = msg..k.."=["..dechoSub(v, d + 1) .."] \n"
else
msg = msg..k.."=["..tostring(v) .."] \n"
end
end
return msg
end
function necho(...)
local msg = ""
for k,v in pairs({...}) do
if type(v) == "table" then
for k2,v2 in pairs(v) do
msg = msg..k2.."=("..type(v2) ..") "
end
end
end
DEFAULT_CHAT_FRAME:AddMessage(msg)
end
function MovAny:DebugFrameAtCursor()
local o = GetMouseFocus()
if o then
if self:IsMAFrame(o:GetName()) then
if self:IsMover(o:GetName()) and o.tagged then
o = o.tagged
end
end
if o ~= WorldFrame and o ~= UIParent then
MovAny:Dump(o)
end
end
end
function MovAny:Dump(o)
if type(o) ~= "table" then
maPrint(string.format(MOVANY.UNSUPPORTED_TYPE, type(o)))
return
end
local s = " Name: "..o:GetName()
if o.GetObjectType then
s = s.." Type: "..o:GetObjectType()
end
local p = o:GetParent()
if p == nil then
p = UIParent
end
if o ~= p then
s = s.." Parent: "..(p:GetName() or "unnamed")
end
if o.MAParent then
s = s.." MA Parent: "..((type(o.MAParent) == "table" and o.MAParent:GetName()) or (type(o.MAParent) == "string" and o.MAParent) or "unnamed")
end
if s ~= "" then
maPrint(s)
end
if o.IsProtected and o:IsProtected() then
maPrint(" Protected: true")
elseif o.MAProtected then
maPrint(" Virtually protected: true")
end
s = ""
if o.IsShown then
if o:IsShown() then
s = s.." Shown: true"
else
s = s.." Shown: false"
end
if o.IsVisible then
if o:IsVisible() then
s = s.." Visible: true"
else
s = s.." Visible: false"
end
end
end
if o.IsTopLevel and o:IsToplevel() then
s = s.." Top Level: true"
end
if o.GetFrameLevel then
s = s.." Level: "..o:GetFrameLevel()
end
if o.GetFrameStrata then
s = s.." Strata: "..o:GetFrameStrata()
end
if s ~= "" then
maPrint(s)
end
local point = {o:GetPoint()}
if point and point[1] and point[2] and point[3] and point[4] and point[5] then
if not point[2] then
point[2] = UIParent
end
maPrint(" Point: "..point[1]..", "..point[2]:GetName()..", "..point[3]..", "..point[4]..", "..point[5])
end
s = ""
if o:GetTop() then
s = " Top: "..o:GetTop()
end
if o:GetRight() then
s = s.." Right: "..o:GetRight()
end
if o:GetBottom() then
s = s.." Bottom: "..o:GetBottom()
end
if o:GetLeft() then
s = s.." Left: "..o:GetLeft()
end
if s ~= "" then
maPrint(s)
end
s = ""
if o:GetHeight() then
s = " Height: "..o:GetHeight()
end
if o:GetWidth() then
s = s.." Width: "..o:GetWidth()
end
if s ~= "" then
maPrint(s)
end
s = ""
if o.GetScale then
s = s.." Scale: "..o:GetScale()
end
if o.GetEffectiveScale then
s = s.." Effective: "..o:GetEffectiveScale()
end
if s ~= "" then
maPrint(s)
end
s = ""
if o.GetAlpha then
s = s.." Alpha: "..o:GetAlpha()
end
if o.GetEffectiveAlpha then
s = s.." Effective: "..o:GetEffectiveAlpha()
end
if s ~= "" then
maPrint(s)
end
s = ""
if o.IsUserPlaced then
if o:IsUserPlaced() then
s = s.." UserPlaced: true"
else
s = s.." UserPlaced: false"
end
end
if o.IsMovable then
if o:IsMovable() then
s = s.." Movable: true"
else
s = s.." Movable: false"
end
end
if o.IsResizable then
if o:IsResizable() then
s = s.." Resizable: true"
else
s = s.." Resizable: false"
end
end
if s ~= "" then
maPrint(s)
end
s = ""
if o.IsKeyboardEnabled then
if o:IsKeyboardEnabled() then
s = s.." KeyboardEnabled: true"
else
s = s.." KeyboardEnabled: false"
end
end
if o.IsMouseEnabled then
if o:IsMouseEnabled() then
s = s.." MouseEnabled: true"
else
s = s.." MouseEnabled: false"
end
end
if o.IsMouseWheelEnabled then
if o:IsMouseWheelEnabled() then
s = s.." MouseWheelEnabled: true"
else
s = s.." MouseWheelEnabled: false"
end
end
if s ~= "" then
maPrint(s)
end
local opts = self:GetUserData(o:GetName())
if opts ~= nil then
maPrint(" MA stored variables:")
for i, v in pairs(opts) do
if i ~= "cat" and i ~= "name" then
if v == nil then
maPrint(" "..i..": nil")
elseif v == true then
maPrint(" "..i..": true")
elseif v == false then
maPrint(" "..i..": false")
elseif type(v) == "string" then
maPrint(" "..i..": "..v)
elseif type(v) == "number" then
maPrint(" "..i..": "..MANumFor(v))
elseif type(v) == "table" then
s = ""
for i2, v2 in pairs(v) do
if type(v2) == "table" then
s = s.." "..i2..": "
for i3, v3 in pairs(v2) do
s = s.." "..v3
end
else
s = s.." "..v2
end
end
maPrint(" "..i..":"..s)
else
maPrint(" "..i.." is a "..type(v).."")
end
end
end
end
end
SLASH_MADBG1 = "/madbg"
SlashCmdList["MADBG"] = function(msg)
if msg == nil or msg == "" then
return
end
local f = _G[msg]
if f == nil then
local tr = MovAny:Translate(msg)
if tr then
f = _G[tr]
end
end
if f == nil then
maPrint(string.format(MOVANY.ELEMENT_NOT_FOUND_NAMED, msg))
else
MovAny:Dump(f)
end
end
MovAny.dbg = dbg
-- X: Blizzard Interface Options functions
function MovAny:OptionCheckboxChecked(button, var)
if var == "squareMM" then
if button:GetChecked() then
Minimap:SetMaskTexture("Interface\\AddOns\\MoveAnything\\Textures\\MinimapMaskSquare")
else
Minimap:SetMaskTexture("Textures\\MinimapMask")
end
elseif var =="closeGUIOnEscape" then
if button:GetChecked() then
tinsert(UISpecialFrames, "MAOptions")
else
for i, v in pairs(UISpecialFrames) do
if v == "MAOptions" then
tremove(UISpecialFrames, i)
break
end
end
end
end
MADB[var] = button:GetChecked()
MovAny:UpdateGUIIfShown()
end
function MovAny:SetOptions()
MADB.alwaysShowNudger = MAOptAlwaysShowNudger:GetChecked()
MADB.noBags = MAOptNoBags:GetChecked()
MADB.noMMMW = MAOptNoMMMW:GetChecked()
MADB.playSound = MAOptPlaySound:GetChecked()
MADB.tooltips = MAOptShowTooltips:GetChecked()
if MAOptCloseGUIOnEscape:GetChecked() then
MADB.closeGUIOnEscape = true
else
MADB.closeGUIOnEscape = false
end
MADB.squareMM = MAOptsSquareMM:GetChecked()
MADB.dontHookCreateFrame = MAOptDontHookCreateFrame:GetChecked()
MADB.dontSyncWhenLeavingCombat = MAOptDontSyncWhenLeavingCombat:GetChecked()
MADB.dontSearchFrameNames = MAOptDontSearchFrameNames:GetChecked()
MADB.disableErrorMessages = MAOptDisableErrorMessages:GetChecked()
MADB.frameListRows = MAOptRowsSlider:GetValue()
if MADB.closeGUIOnEscape then
tinsert(UISpecialFrames, "MAOptions")
else
for i, v in pairs(UISpecialFrames) do
if v == "MAOptions" then
tremove(UISpecialFrames, i)
break
end
end
end
end
function MovAny:SetDefaultOptions()
if MADB.squareMM then
Minimap:SetMaskTexture("Textures\\MinimapMask")
end
if MADB.closeGUIOnEscape then
for i, v in pairs(UISpecialFrames) do
if v == "MAOptions" then
tremove(UISpecialFrames, i)
break
end
end
end
MADB.alwaysShowNudger = nil
MADB.noBags = nil
MADB.noMMMW = nil
MADB.playSound = nil
MADB.tooltips = true
MADB.closeGUIOnEscape = nil
MADB.squareMM = nil
MADB.dontHookCreateFrame = nil
MADB.dontSyncWhenLeavingCombat = nil
MADB.dontSearchFrameNames = nil
MADB.frameListRows = 18
MovAny_OptionsOnShow()
MovAny:UpdateGUIIfShown()
end
function MovAny_OptionsOnLoad(f)
f.name = GetAddOnMetadata("MoveAnything", "Title")
f.okay = MovAny.SetOptions
f.default = MovAny.SetDefaultOptions
InterfaceOptions_AddCategory(f)
end
function MovAny_OptionsOnShow()
MAOptVersion:SetText("Version: |cffeeeeee"..GetAddOnMetadata("MoveAnything", "Version").."|r")
MAOptAlwaysShowNudger:SetChecked(MADB.alwaysShowNudger)
MAOptNoBags:SetChecked(MADB.noBags)
MAOptPlaySound:SetChecked(MADB.playSound)
MAOptShowTooltips:SetChecked(MADB.tooltips)
MAOptCloseGUIOnEscape:SetChecked(MADB.closeGUIOnEscape)
MAOptSquareMM:SetChecked(MADB.squareMM)
MAOptNoMMMW:SetChecked(MADB.noMMMW)
MAOptDontHookCreateFrame:SetChecked(MADB.dontHookCreateFrame)
MAOptDontSyncWhenLeavingCombat:SetChecked(MADB.dontSyncWhenLeavingCombat)
MAOptDontSearchFrameNames:SetChecked(MADB.dontSearchFrameNames)
MAOptDisableErrorMessages:SetChecked(MADB.disableErrorMessages)
if MADB.frameListRows then
MAOptRowsSlider:SetValue(MADB.frameListRows)
end
if type(MADB.characters) == "table" then
local profile = MovAny:GetProfileName()
if MAOptProfileFrame_DropDown then
MSA_DropDownMenu_Initialize(MAOptProfileFrame_DropDown, MovAny.ProfileDropDownInit)
MSA_DropDownMenu_SetSelectedName(MAOptProfileFrame_DropDown, profile)
end
if "default" == profile then
MAOptProfileRename:Disable()
MAOptProfileDelete:Disable()
else
MAOptProfileRename:Enable()
MAOptProfileDelete:Enable()
end
end
end
--[[function MovAny:ProfileRenameClicked(b)
MoveAny_ProfileRename:Show()
MoveAny_ProfileRename.editBox:SetText(MovAny:GetProfileName())
end
function MovAny:ProfileSaveAsClicked(b)
MoveAny_SaveAs:Show()
end
function MovAny:ProfileAddClicked(b)
MoveAny_ProfileAdd:Show()
end
function MovAny:ProfileDeleteClicked(b)
StaticPopup_Show("MOVEANYTHING_PROFILE_DELETE", MovAny:GetProfileName())
MoveAny_ProfileDelete:Show()
end
function MovAny.ProfileDropDownClicked(b)
MovAny:ChangeProfile(b.value)
MovAny_OptionsOnShow()
end]]
function MovAny:ProfileRenameClicked(b)
local dlg = StaticPopup_Show("MOVEANYTHING_PROFILE_RENAME", MovAny:GetProfileName())
if dlg then
dlg.editBox:SetText(MovAny:GetProfileName())
end
end
function MovAny:ProfileSaveAsClicked(b)
StaticPopup_Show("MOVEANYTHING_PROFILE_SAVE_AS")
end
function MovAny:ProfileAddClicked(b)
StaticPopup_Show("MOVEANYTHING_PROFILE_ADD")
end
function MovAny:ProfileDeleteClicked(b)
StaticPopup_Show("MOVEANYTHING_PROFILE_DELETE", MovAny:GetProfileName())
end
function MovAny:ProfileDropdownOnLoad(frame)
local dropdown = MSA_DropDownMenu_Create(frame:GetName().."_DropDown", frame)
dropdown:SetAllPoints(frame)
MSA_DropDownMenu_Initialize(dropdown, MovAny.ProfileDropDownInit)
MSA_DropDownMenu_SetWidth(dropdown, 200)
end
function MovAny.ProfileDropDownClicked(b)
MovAny:ChangeProfile(b.value)
MovAny_OptionsOnShow()
end
function MovAny.ProfileDropDownInit()
local sel = MovAny:GetProfileName()
local info
info = MSA_DropDownMenu_CreateInfo()
info.text = "default"
info.value = "default"
info.func = MovAny.ProfileDropDownClicked
if "default" == sel then
info.checked = true
end
MSA_DropDownMenu_AddButton(info)
local names = { }
for name, _ in pairs(MADB.profiles) do
tinsert(names, name)
end
table.sort(names, function(o1, o2)
return o1:lower() < o2:lower()
end)
for _, name in pairs(names) do
if "default" ~= name then
info = MSA_DropDownMenu_CreateInfo()
info.text = name
info.value = name
info.func = MovAny.ProfileDropDownClicked
if name == sel then
info.checked = true
end
MSA_DropDownMenu_AddButton(info)
end
end
end
function MovAny:SetNumRows(num, dontUpdate)
if not MAOptions then
return
end
num = tonumber(format("%.0f", tostring(num)))
MADB.frameListRows = num
local base = 0
local h = 24
MAOptions:SetHeight(base + 81 + (num * h))
MAScrollFrame:SetHeight(base + 11 + (num * h))
MAScrollBorder:SetHeight(base - 22 + (num * h))
for i = 1, 100, 1 do
local row = _G["MAMove"..i]
if num >= i then
if not row then
row = CreateFrame("Frame", "MAMove"..i, MAOptions, "MAListRowTemplate")
if i == 1 then
row:SetPoint("TOPLEFT", "MAOptionsFrameNameHeader", "BOTTOMLEFT", -8, -4)
else
row:SetPoint("TOPLEFT", "MAMove"..(i - 1), "BOTTOMLEFT")
end
local label = _G[ "MAMove"..i.."FrameName" ]
label:SetScript("OnEnter", MovAny_TooltipShowMultiline)
label:SetScript("OnLeave", MovAny_TooltipHide)
end
else
if row then
row:Hide()
end
end
end
_G["MAOptRowsSliderText"]:SetText(num)
if not dontUpdate then
self:UpdateGUIIfShown(true)
end
end
function MovAny_TooltipShow(a, b, c, d, e)
MovAny:TooltipShow(a,b,c,d,e)
end
function MovAny_TooltipHide(a, b, c, d, e)
MovAny:TooltipHide(a,b,c,d,e)
end
function MovAny_TooltipShowMultiline(a, b, c, d, e)
MovAny:TooltipShowMultiline(a,b,c,d,e)
end
local stateMonitor = CreateFrame("Frame", nil, nil, "SecureHandlerBaseTemplate")
function MovAny:Search(searchWord)
if searchWord ~= MOVANY.SEARCH_TEXT then
searchWord = string.gsub(string.gsub(string.lower(searchWord), "([%(%)%%%.%[%]%+%-%?])", "%%%1"), "%*", "[%%w %%c]*")
if self.searchWord ~= searchWord then
-- searchWord ~= MOVANY.SEARCH_TEXT
self.searchWord = searchWord
self:UpdateGUIIfShown(true)
end
else
self.searchWord = nil
self:UpdateGUIIfShown()
end
end
function MovAny_OnEvent(self, event, arg1)
if event == "PLAYER_REGEN_DISABLED" then
if #MovAny.movers > 0 then
for i, v in ipairs(MA_tcopy(MovAny.movers)) do
if MovAny:IsProtected(v.tagged) then
tinsert(MovAny.pendingMovers, v.tagged)
MovAny:StopMoving(v.tagged:GetName())
end
end
end
elseif event == "PLAYER_REGEN_ENABLED" then
if #MovAny.pendingMovers > 0 then
for i, v in ipairs(MovAny.pendingMovers) do
if _G.MAOptionsToggleMovers:GetChecked() then
MovAny:AttachMover(v:GetName())
else
tinsert(MovAny.minimizedMovers, v)
end
end
table.wipe(MovAny.pendingMovers)
end
if not MADB.dontSyncWhenLeavingCombat then
MovAny:SyncFrames()
end
elseif event == "ADDON_LOADED" then
if arg1 == "MoveAnything" then
if MovAny.Load ~= nil then
MovAny:Load()
MovAny.Load = nil
if MovAny:IsModified(LFRParentFrame) then
MovAny:ResetFrame(LFRParentFrame)
end
if MovAny:IsModified(QuestLogFrame) then
MovAny:ResetFrame(QuestLogFrame)
end
if MovAny:IsModified(QuestLogDetailFrame) then
MovAny:ResetFrame(QuestLogDetailFrame)
end
if MovAny:IsModified(PlayerPowerBarAltCounterBar) then
MovAny:ResetFrame(PlayerPowerBarAltCounterBar)
end
for k, v in pairs(MADB.profiles) do
if v.frames["PaladinPowerBar"] then
v.frames["PaladinPowerBar"] = nil
end
for i = 1, 10 do
if v.frames["LootWonAlertMover"..i] then
v.frames["LootWonAlertMover"..i] = nil
end
end
for i = 1, 5 do
if v.frames["MoneyWonAlertMover"..i] then
v.frames["MoneyWonAlertMover"..i] = nil
end
end
end
end
elseif arg1 == "Blizzard_TalentUI" and MovAny.hBlizzard_TalentUI then
MovAny:hBlizzard_TalentUI()
--[[elseif arg1 == "Blizzard_AchievementUI" then
setfenv(AchievementFrame_OnShow, setmetatable({UpdateMicroButtons = function()
if (AchievementFrame and AchievementFrame:IsShown()) then
AchievementMicroButton:SetButtonState("PUSHED", 1)
end
end }, { __index = _G}))
elseif arg1 == "Blizzard_PetJournal" then
setfenv(PetJournalParent_OnShow, setmetatable({UpdateMicroButtons = function()
if (PetJournalParent and PetJournalParent:IsShown()) then
CollectionsMicroButton:Enable()
CollectionsMicroButton:SetButtonState("PUSHED", 1)
end
end }, { __index = _G}))]]
--[=[elseif arg1 == "Blizzard_ArenaUI" then
ArenaEnemyFrame_UpdatePet = function() end
ArenaEnemyFrames_UpdateWatchFrame = function()
local _, instanceType = IsInInstance()
if not WatchFrame:IsUserPlaced() then
if ArenaEnemyFrames:IsShown() then
if WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests) then
ArenaEnemyFrames.hidWatchedQuests = true
end
elseif instanceType == "arena" or instanceType == "pvp" then
if WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests) then
ArenaEnemyFrames.hidWatchedQuests = true
end
else
if ArenaEnemyFrames.hidWatchedQuests then
WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
ArenaEnemyFrames.hidWatchedQuests = false
end
end
WatchFrame_ClearDisplay()
WatchFrame_Update()
elseif ArenaEnemyFrames.hidWatchedQuests then
WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
ArenaEnemyFrames.hidWatchedQuests = false
WatchFrame_ClearDisplay()
WatchFrame_Update()
end
end
ArenaPrepFrames_UpdateWatchFrame = function()
local _, instanceType = IsInInstance()
if not WatchFrame:IsUserPlaced() then
if ArenaPrepFrames:IsShown() then
if WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests) then
ArenaPrepFrames.hidWatchedQuests = true
end
elseif instanceType == "arena" or instanceType == "pvp" then
if WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests) then
ArenaPrepFrames.hidWatchedQuests = true
end
else
if ArenaPrepFrames.hidWatchedQuests then
WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
ArenaPrepFrames.hidWatchedQuests = false
end
end
WatchFrame_ClearDisplay()
WatchFrame_Update()
elseif ArenaPrepFrames.hidWatchedQuests then
WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
ArenaPrepFrames.hidWatchedQuests = false
WatchFrame_ClearDisplay()
WatchFrame_Update()
end
end
hooksecurefunc("ArenaEnemyFrame_UpdatePlayer", MovAny.hookArenaEnemyFrames15)
hooksecurefunc("UpdatePrepFrames", MovAny.hookArenaEnemyFrames15)
hooksecurefunc("ArenaEnemyFrames_UpdateVisible", MovAny.hookArenaEnemyFrames15)
hooksecurefunc("ArenaEnemyFrames_Enable", MovAny.hArenaEnemyFrames_Enable)
hooksecurefunc("ArenaEnemyFrames_Disable", MovAny.hArenaEnemyFrames_Disable)
--hooksecurefunc("ArenaEnemyFrames_UpdateWatchFrame", MovAny.hWatchFrameExpand)
if ArenaPrepFrames and not ArenaPrepFrames.hooked_ma then
ArenaPrepFrames.hooked_ma = true
ArenaPrepFrames.ma_Show = ArenaPrepFrames.Show
--[[ArenaPrepFrames.Show = function(self)
if not InCombatLockdown() then
self:ma_Show()
end
end]]
ArenaPrepFrames.Hide = function()
ArenaPrepFrames.ma_isshown = false
ArenaPrepFrames_UpdateWatchFrame()
end
ArenaPrepFrames.IsShown = function()
local _, instanceType = IsInInstance()
if instanceType == "arena" or instanceType == "pvp" then
return true
else
if ArenaPrepFrame1:IsShown() then
return true
end
if ArenaPrepFrame2:IsShown() then
return true
end
if ArenaPrepFrame3:IsShown() then
return true
end
if ArenaPrepFrame4:IsShown() then
return true
end
if ArenaPrepFrame5:IsShown() then
return true
end
end
return false
end
if GetCVarBool("showArenaEnemyFrames") then
ArenaPrepFrames:Show()
else
ArenaPrepFrames:Hide()
end
ArenaPrepFrames.Show = function()
ArenaPrepFrames.ma_isshown = true
ArenaPrepFrames_UpdateWatchFrame()
end
ArenaPrepFrames.ma_Hide = ArenaPrepFrames.Hide
--[[ArenaPrepFrames.Hide = function(self)
if not InCombatLockdown() then
self:ma_Hide()
end
end]]
ArenaPrepFrames.clear_all_points = ArenaPrepFrames.ClearAllPoints
ArenaPrepFrames.ClearAllPoints = function(self)
if not InCombatLockdown() then
self:clear_all_points()
end
end
ArenaPrepFrames.set_points = ArenaPrepFrames.SetPoint
ArenaPrepFrames.SetPoint = function(self, ...)
if not InCombatLockdown() then
self:set_points(...)
end
end
end
if ArenaEnemyFrames and not ArenaEnemyFrames.hooked_ma then
ArenaEnemyFrames.hooked_ma = true
ArenaEnemyFrames.ma_Show = ArenaEnemyFrames.Show
--[[ArenaEnemyFrames.Show = function(self)
if not InCombatLockdown() then
self:ma_Show()
end
end]]
ArenaEnemyFrames.IsShown = function()
local _, instanceType = IsInInstance()
if instanceType == "arena" or instanceType == "pvp" then
return true
else
if ArenaEnemyFrame1:IsShown() then
return true
end
if ArenaEnemyFrame2:IsShown() then
return true
end
if ArenaEnemyFrame3:IsShown() then
return true
end
if ArenaEnemyFrame4:IsShown() then
return true
end
if ArenaEnemyFrame5:IsShown() then
return true
end
end
return false
end
ArenaEnemyFrames.ma_Hide = ArenaEnemyFrames.Hide
--[[ArenaEnemyFrames.Hide = function(self)
if not InCombatLockdown() then
self:ma_Hide()
end
end]]
ArenaEnemyFrames.Hide = function()
ArenaEnemyFrames.ma_isshown = false
ArenaEnemyFrames_UpdateWatchFrame()
end
if GetCVarBool("showArenaEnemyFrames") then
ArenaEnemyFrames:Show()
else
ArenaEnemyFrames:Hide()
end
ArenaEnemyFrames.Show = function()
ArenaEnemyFrames.ma_isshown = true
ArenaEnemyFrames_UpdateWatchFrame()
end
ArenaEnemyFrames.clear_all_points = ArenaEnemyFrames.ClearAllPoints
ArenaEnemyFrames.ClearAllPoints = function(self)
if not InCombatLockdown() then
self:clear_all_points()
end
end
ArenaEnemyFrames.set_points = ArenaEnemyFrames.SetPoint
ArenaEnemyFrames.SetPoint = function(self, ...)
if not InCombatLockdown() then
self:set_points(...)
end
end
end
--ArenaEnemyFrame1:ClearAllPoints()
ArenaEnemyFrame1:SetPoint("TOP", UIParent, "TOP", 600, - 300)
ArenaEnemyFrame1:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaEnemyFrame2:SetPoint("TOP", ArenaEnemyFrame1, "BOTTOM", 0, - 20)
ArenaEnemyFrame2:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaEnemyFrame3:SetPoint("TOP", ArenaEnemyFrame2, "BOTTOM", 0, - 20)
ArenaEnemyFrame3:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaEnemyFrame4:SetPoint("TOP", ArenaEnemyFrame3, "BOTTOM", 0, - 20)
ArenaEnemyFrame4:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
ArenaEnemyFrame5:SetPoint("TOP", ArenaEnemyFrame4, "BOTTOM", 0, - 20)
ArenaEnemyFrame5:SetPoint("RIGHT", ArenaEnemyFrames, "RIGHT", - 18, 0)
for i = 1, 5 do
local frame = "ArenaEnemyFrame"..i
if _G[frame] and not _G[frame].hooked_ma then
_G[frame].hooked_ma = true
_G[frame].clear_all_points = _G[frame].ClearAllPoints
_G[frame].ClearAllPoints = function(self)
if InCombatLockdown() then
return
end
self:clear_all_points()
end
_G[frame].set_point = _G[frame].SetPoint
_G[frame].SetPoint = function(self, ...)
if InCombatLockdown() then
return
end
self:set_point(...)
end
end
MovAny.API:SyncElement(frame)
local frame = "ArenaEnemyFrame"..i.."PetFrame"
if _G[frame] and not _G[frame].hooked_ma then
_G[frame].hooked_ma = true
_G[frame]:SetAttribute("unit", "arenapet"..i)
stateMonitor:WrapScript(_G[frame], "OnAttributeChanged", [[
if name == "state-unitexists" then
if UnitExists(self:GetAttribute("unit")) then
self:Show()
else
self:Hide()
end
end
]])
RegisterUnitWatch(_G[frame], true)
--RegisterStateDriver(_G[frame], "visibility", "[@arenapet"..i", exists] show hide")
end
MovAny.API:SyncElement(frame)
end]=]
end
MovAny:SyncFrames()
elseif event == "GROUP_ROSTER_UPDATE" then
if not MovAny:IsModified(RaidUnitFramesMover) then
return
end
if InCombatLockdown() then
return
end
--[[local f = _G["CompactRaidFrameManager"]
if f then
f.MAParent = "RaidUnitFramesManagerMover"
end]]
local f = _G["CompactRaidFrameContainer"]
if f then
f.MAParent = "RaidUnitFramesMover"
end
--MovAny.API:SyncElement("RaidUnitFramesManagerMover")
MovAny.API:SyncElement("RaidUnitFramesMover")
--[[elseif event == "PET_BATTLE_OPENING_START" then
if not MovAny:IsModified(MicroButtonsMover) and not MovAny:IsModified(MicroButtonsSplitMover) and not MovAny:IsModified(MicroButtonsVerticalMover) then
return
end
local children = {
CharacterMicroButton,
SpellbookMicroButton,
TalentMicroButton,
AchievementMicroButton,
QuestLogMicroButton,
GuildMicroButton,
LFDMicroButton,
CollectionsMicroButton,
EJMicroButton,
StoreMicroButton,
MainMenuMicroButton
}
for i = 1, #children, 1 do
MovAny:UnlockPoint(children[i])
MovAny:UnlockScale(children[i])
children[i]:ClearAllPoints()
children[i]:SetScale(1)
if i == 1 then
children[i]:SetPoint("TOPLEFT", PetBattleFrame.BottomFrame, "TOPRIGHT", - 180, 0)
elseif children[i] == LFDMicroButton then
children[i]:SetPoint("LEFT", CharacterMicroButton, "LEFT", 0, - 34)
else
children[i]:SetPoint("LEFT", children[i - 1], "RIGHT", - 2, 0)
end
MovAny:LockPoint(children[i])
MovAny:LockScale(children[i])
end
elseif event == "PET_BATTLE_CLOSE" then
if not MovAny:IsModified(MicroButtonsMover) and not MovAny:IsModified(MicroButtonsSplitMover) and not MovAny:IsModified(MicroButtonsVerticalMover) then
return
end
if MovAny:IsModified(MicroButtonsMover) then
MovAny.API:SyncElement("MicroButtonsMover")
elseif MovAny:IsModified(MicroButtonsSplitMover) then
MovAny.API:SyncElement("MicroButtonsSplitMover")
elseif MovAny:IsModified(MicroButtonsVerticalMover) then
MovAny.API:SyncElement("MicroButtonsVerticalMover")
end--]]
elseif event == "PLAYER_FOCUS_CHANGED" then
MovAny.API:SyncElement("FocusFrame")
elseif event == "BANKFRAME_OPENED" then
local e
for i = 1, 7, 1 do
e = API:GetElement("BankBagFrame"..i)
if e then
e.refuseSync = nil
end
end
MovAny:SyncFrames()
for i = 1, 7, 1 do
MovAny:CreateVM("BankBagFrame"..i)
end
elseif event == "BANKFRAME_CLOSED" then
local e
for i = 1, 7, 1 do
e = API:GetElement("BankBagFrame"..i)
--[[if e then
e.refuseSync = MOVANY.FRAME_ONLY_WHEN_BANK_IS_OPEN
end]]
end
elseif event == "PLAYER_LOGOUT" then
MovAny:OnPlayerLogout()
elseif event == "PLAYER_ENTERING_WORLD" then
if MovAny.Boot ~= nil then
MovAny:Boot()
MovAny.Boot = nil
end
MovAny:SyncAllFrames()
elseif event == "BAG_UPDATE" then
local e
if arg1 < 6 then
e = API:GetElement("BagFrame"..(arg1))
if e then
e.refuseSync = nil
e:Sync()
end
else
for i = 1, 5, 1 do
e = API:GetElement("BagFrame"..(arg1))
if e then
e.refuseSync = nil
e:Sync()
end
end
MAOptions:UnregisterEvent("BAG_UPDATE")
end
elseif event == "UNIT_AURA" then
if MovAny:IsModified("PlayerBuffsMover") or MovAny:IsModified("PlayerBuffsMover2") then
MovAny.API:SyncElement(PlayerBuffsMover)
end
else
MovAny:SyncAllFrames()
end
end
function MAMoverTemplate_OnMouseWheel(self, dir)
MovAny:MoverOnMouseWheel(self, dir)
end
function MANudgeButton_OnClick(self, event, button)
MovAny:Nudge(self.dir, button)
end
function MANudger_OnMouseWheel(self, dir)
MovAny:NudgerChangeMover(dir)
end
function MovAny:CreateVM(name)
local data = MovAny.lVirtualMovers[name]
if not data then
return
end
if data.created then
return _G[name]
end
local vm = CreateFrame("Frame", name, UIParent, data.inherits, "MADontHook")
vm.MAEVM = API:GetElement(name)
--[[if vm.MAEVM and vm.MAEVM.runOnce then
vm.MAEVM:runOnce()
vm.MAEVM.runOnce = nil
end]]
vm.opt = MovAny:GetUserData(name)
local opt = vm.opt
if data.id then
vm:SetID(data.id)
end
vm.data = data
if data.linkedSize then
local ref = _G[data.linkedSize]
if ref then
vm:SetWidth(ref:GetWidth())
vm:SetHeight(ref:GetHeight())
end
else
if data.w then
vm:SetWidth(data.w)
end
if data.h then
vm:SetHeight(data.h)
end
end
if data.s then
vm:SetScale(data.s)
end
if data.dontLock then
vm.MADontLock = true
end
if data.dontHide then
vm.MADontHide = true
end
vm.FoundChild = function(self, index, child)
if not self.firstChild then
self.firstChild = child
end
child.MAParent = self
if data.OnMAFoundChild then
data.OnMAFoundChild(self, index, child)
--[[xpcall(function()
data.OnMAFoundChild(self, index, child)
end,
function()
--print("Error: "..debugstack(2, 20, 20))
end)]]
end
if not self.MADontLock then
MovAny:LockPoint(child)
end
if self.MAHidden and not child.MAHidden then
MovAny:LockVisibility(child)
end
self.attachedChildren[index] = child
self.lastChild = child
return child
end
vm.ReleaseChild = function(self, index)
local child = self.attachedChildren[index]
if not child then
return
end
if not self.MADontLock then
MovAny:UnlockPoint(child)
end
if data.OnMAReleaseChild then
data.OnMAReleaseChild(self, index, child)
end
self.lastChild = child
end
vm.ReleaseChildByName = function(self, name)
for i, c in pairs(self.attachedChildren) do
if c:GetName() == name then
self:ReleaseChild(i)
return true
end
end
return false
end
local MAScanForChildren = function (self, dontCallNewChild, dontSync)
if not self.attachedChildren then
return
end
local newChild = false
if type(data.count) == "number" then
local name, child
if data.prefix == "ContainerFrame" then
for i = 1, data.count, 1 do
name = data.prefix..i..(data.postfix or "")
if not self.attachedChildren[name] then
child = _G[name]
if child then
local bag = MovAny:GetBagInContainerFrame(child)
if not bag or not MovAny:IsModified(bag:GetName()) then
newChild = self:FoundChild(i, child, 1)
end
else
break
end
end
end
else
for i = 1, data.count, 1 do
name = data.prefix..i..(data.postfix or "")
if not self.attachedChildren[name] then
child = _G[name]
if child then
if not MovAny:IsModified(name) then
newChild = self:FoundChild(i, child, 1)
end
else
break
end
end
end
end
if data.prefix1 then
for i = 1, data.count, 1 do
name = data.prefix1..i..(data.postfix1 or "")
if not self.attachedChildren[name] then
child = _G[name]
if child then
if not MovAny:IsModified(name) then
newChild = self:FoundChild(i, child, 2)
end
else
break
end
end
end
end
if data.prefix2 then
for i = 1, data.count, 1 do
name = data.prefix2..i..(data.postfix2 or "")
if not self.attachedChildren[name] then
child = _G[name]
if child then
if not MovAny:IsModified(name) then
newChild = self:FoundChild(i, child, 3)
end
else
break
end
end
end
end
end
if type(data.children) == "table" then
for i, v in pairs(data.children) do
local child = type(v) == "string" and _G[v] or v
if type(child) == "table" and not self.attachedChildren[child:GetName()] then
if not MovAny:IsModified(child) then
newChild = self:FoundChild(child:GetName(), child)
end
end
end
end
if not dontCallNewChild and newChild and self.OnMANewChild then
self:OnMANewChild()
end
if newChild and not dontSync then
self.MAEVM:Sync(self)
end
end
vm.MAScanForChildren = function(vm, dontCallNewChild, dontSync)
--[[xpcall(function()
MAScanForChildren(vm, dontCallNewChild, dontSync)
end,]]
xpcall(function()
MAScanForChildren(vm, dontCallNewChild, dontSync)
end, MovAny.SyncErrorHandler)
end
if not vm.MAPoint then
if data.point and _G[data.point[2]] then
vm:SetPoint(unpack(data.point))
if opt and opt.pos and not opt.orgPos then
opt.orgPos = data.point
end
elseif data.relPoint then
vm:SetPoint(unpack(data.relPoint))
vm:SetPoint(unpack(self:GetRelativePoint(nil, vm)))
if opt and opt.pos and not opt.orgPos then
opt.orgPos = data.point
end
elseif not opt or not opt.pos then
if data.linkedPoint then
local ref = _G[data.linkedPoint]
if ref then
local p = MovAny:GetRelativePoint(nil, ref)
if p then
vm:SetPoint(unpack(p))
end
end
end
end
elseif data.point then
opt.orgPos = data.point
end
if opt and opt.pos and data.point and not opt.orgPos then
opt.orgPos = data.point
end
if data.protected then
vm.MAProtected = true
end
if data.dontScale then
vm.MADontScaleChildren = true
end
if data.dontAlpha then
vm.MADontAlphaChildren = true
end
if data.frameStrata and (not opt or not opt.frameStrata) then
vm:SetFrameStrata(data.frameStrata)
end
vm.orgOnMAAttach = vm.OnMAAttach
vm.OnMAAttach = function(self, mover)
if data.linkedSize then
local ref = _G[data.linkedSize]
if ref then
self:SetWidth(ref:GetWidth())
self:SetHeight(ref:GetHeight())
end
end
if not self.MAEVM.userData or not self.MAEVM.userData.pos then
if data.linkedPoint then
local ref = _G[data.linkedPoint]
if ref then
local p = MovAny:GetRelativePoint(nil, ref)
if p then
self:SetPoint(unpack(p))
end
end
end
end
if data.OnMAAttach then
data.OnMAAttach(self, mover)
end
if data.OnMAPosition then
data.OnMAPosition(self)
end
if vm.orgOnMAAttach then
vm.orgOnMAAttach(self, mover)
end
end
if data.OnMAPosition then
vm.OnMAPosition = data.OnMAPosition
end
if data.OnMAAlpha then
vm.OnMAAlpha = data.OnMAAlpha
end
if data.OnMAScale then
vm.OnMAScale = data.OnMAScale
end
if data.OnMAPostAttach then
vm.OnMAPostAttach = data.OnMAPostAttach
end
if data.OnMAPostHook then
vm.OnMAPostHook = data.OnMAPostHook
end
vm.OnMAHide = function(self, hidden)
if hidden then
if self.attachedChildren then
for i, v in pairs(self.attachedChildren) do
MovAny:LockVisibility(v)
end
end
else
if self.attachedChildren then
for i, v in pairs(self.attachedChildren) do
MovAny:UnlockVisibility(v)
end
end
end
if data.OnMAHide then
data.OnMAHide(self, hidden)
end
end
if data.OnMAMoving then
vm.OnMAMoving = data.OnMAMoving
end
if data.OnMADetach then
vm.OnMADetach = data.OnMADetach
end
if data.OnMAPositionReset then
vm.OnMAPositionReset = data.OnMAPositionReset
end
if vm.OnMAHook and not data.OnMAHook then
data.OnMAHook = vm.OnMAHook
end
vm.OnMAHook = function(self)
self.MAEVM = MovAny.API:GetElement(self:GetName())
self.opt = MovAny:GetUserData(self:GetName())
if self.opt and self.opt.disabled then
return
end
if data.excludes and MovAny:IsModified(data.excludes) then
MovAny:ResetFrame(data.excludes)
MovAny:UpdateGUIIfShown(true)
end
if data.excludes2 and MovAny:IsModified(data.excludes2) then
MovAny:ResetFrame(data.excludes2)
MovAny:UpdateGUIIfShown(true)
end
if self.attachedChildren then
table.wipe(self.attachedChildren)
else
self.attachedChildren = { }
end
self:MAScanForChildren(true, true)
if data.OnMAHook then
data.OnMAHook(self)
end
self:Show()
end
if vm.OnMAPostReset and not data.OnMAPostReset then
data.OnMAPreReset = vm.OnMAPreReset
end
vm.OnMAPreReset = function(self, readOnly)
if data.OnMAPreReset then
if data.OnMAPreReset(self, readOnly) then
return
end
end
if type(self.attachedChildren) == "table" then
if type(data.count) == "number" then
local name
for i = 1, data.count, 1 do
self:ReleaseChild(i)
end
end
if type(self.data.children) == "table" then
self.lastChild = nil
for _, name in pairs(self.data.children) do
self:ReleaseChild(name)
end
end
table.wipe(self.attachedChildren)
end
self.firstChild = nil
self.lastChild = nil
end
if vm.OnMAPostReset and not data.OnMAPostReset then
data.OnMAPostReset = vm.OnMAPostReset
end
vm.OnMAPostReset = function(self, readOnly)
if data.OnMAPostReset then
if data.OnMAPostReset(self, readOnly) then
return
end
end
self:Hide()
end
if data.OnMAScanForChildren then
vm.OnMAScanForChildren = data.OnMAScanForChildren
end
vm.OnMANewChild = data.OnMANewChild
vm.MAOnEnable = function(self)
self:MAScanForChildren()
end
if data.inherits then
local super = _G[data.inherits]
if super and super.OnMACreateVM then
vm.OnMACreateVM = super.OnMACreateVM
vm:OnMACreateVM()
vm.OnMACreateVM = nil
end
end
if data.OnLoad then
vm.MAOnLoad = data.OnLoad
vm:MAOnLoad()
vm.MAOnLoad = nil
end
if data.OnMACreateVM then
data.OnMACreateVM(vm)
end
if vm.OnMACreateVM then
vm:OnMACreateVM()
end
data.created = true
return vm
end
function MovAny:UnserializeProfile(str)
str = string.gsub(str, "^%s+", "")
str = string.gsub(str, "%s+$", "")
str = string.gsub(str, "[\r\n]", "")
local sName
for i, v in string.gmatch(str, ",name:\"(.-)\"") do
sName = i
end
if not sName then
maPrint(MOVANY.UNSERIALIZE_PROFILE_NO_NAME)
return
end
local frames = { }
local opt
str = str..","
for i in string.gmatch(str, "frames:{(.+)}") do
for j in string.gmatch(i, "(%[.-%])") do
opt = MovAny:UnserializeFrame(j)
if opt then
frames[opt.name] = opt
end
end
end
local tName = sName
local ct = 1
while MADB.profiles[tName] do
tName = sName.." ("..ct..")"
ct = ct + 1
end
MovAny:AddProfile(tName)
MADB.profiles[tName].frames = frames
maPrint(string.format(MOVANY.UNSERIALIZE_PROFILE_COMPLETED, tlen(frames), tName))
return true
end
function MovAny:UnserializeFrame(str, name)
str = string.gsub(str, "^%s+", "")
str = string.gsub(str, "%s+$", "")
str = string.gsub(str, "[\r\n]", "")
str = string.match(str, "%[(.+)%]")
--[[s:0.70035458463692, h:1, p:("CENTER", "UIParent", "CENTER", 1028.675318659, 84.760391583122), n:"MAOptions"]]
if not str then
maPrint(MOVANY.UNSERIALIZE_FRAME_INVALID_FORMAT)
return nil
end
str = str..","
local scannedName
local opt = { }
for m1, m2, m3 in string.gmatch(str, "(%a+):(.-),") do
if m1 == "s" then
opt.scale = tonumber(m2)
elseif m1 == "hi" then
opt.hidden = true
elseif m1 == "a" then
opt.alpha = tonumber(m2)
elseif m1 == "w" then
opt.width = tonumber(m2)
elseif m1 == "h" then
opt.height = tonumber(m2)
elseif m1 == "fs" then
opt.frameStrata = string.sub(m2, 2, - 2)
elseif m1 == "cts" then
opt.clampToScreen = true
elseif m1 == "em" then
opt.enableMouse = true
elseif m1 == "m" then
opt.movable = true
elseif m1 == "uae" then
opt.unregisterAllEvents = true
elseif m1 == "dla" then
opt.disableLayerArtwork = true
elseif m1 == "dlb" then
opt.disableLayerBackground = true
elseif m1 == "dlbo" then
opt.disableLayerBorder = true
elseif m1 == "dlh" then
opt.disableLayerHighlight = true
elseif m1 == "dlo" then
opt.disableLayerOverlay = true
elseif m1 == "n" then
scannedName = string.sub(m2, 2, - 2)
end
-- XXX: what to do about groups?
end
for m1, m2, m3, m4, m5 in string.gmatch(str, "p:%(\"(.-)\",\"(.-)\",\"(.-)\",(-?%d+%.*%d*),(-?%d+%.*%d*)%)") do
opt.pos = {m1, m2, m3, tonumber(m4), tonumber(m5)}
end
if name and name ~= scannedName then
maPrint(MOVANY.UNSERIALIZE_FRAME_NAME_DIFFERS)
return
end
opt.name = scannedName or name
return opt
end
function MovAny:SerializeProfile(pn)
local p = MADB.profiles[pn]
local s = ""
for i, v in pairs(p.frames) do
s = s..","..self:SerializeFrame(i, v)
end
s = "frames:{"..string.sub(s, 2).."},name:\""..string.gsub(string.gsub(pn, "%]", ")"), "%[", "(").."\""
return s
end
function MovAny:SerializeFrame(fn, opt)
opt = opt or self:GetUserData(fn)
local s = "["
for i, v in pairs(opt) do
if i == "pos" then
s = s.."p:(\""..v[1].."\",\""..v[2].."\",\""..v[3].."\","..v[4]..","..v[5].."),"
elseif i == "hidden" then
s = s.."hi:1,"
elseif i == "alpha" then
s = s.."a:"..v..","
elseif i == "scale" then
s = s.."s:"..v..","
elseif i == "width" then
s = s.."w:"..v..","
elseif i == "height" then
s = s.."h:"..v..","
elseif i == "frameStrata" then
s = s.."fs:\""..v.."\","
elseif i == "clampToScreen" then
s = s.."cts:1,"
elseif i == "enableMouse" then
s = s.."em:1,"
elseif i == "movable" then
s = s.."m:1,"
elseif i == "unregisterAllEvents" then
s = s.."uae:1,"
elseif i == "disableLayerArtwork" then
s = s.."dla:1,"
elseif i == "disableLayerBackground" then
s = s.."dlb:1,"
elseif i == "disableLayerBorder" then
s = s.."dlbo:1,"
elseif i == "disableLayerHighlight" then
s = s.."dlh:1,"
elseif i == "disableLayerOverlay" then
s = s.."dlo:1,"
end
end
s = s.."n:\""..fn.."\"".."]"
return s
end
MovAny.core = { }
function MovAny:AddCore(name, m)
m.name = name
tinsert(self.core, m)
self[name] = m
return m
end
MovAny.modules = { }
function MovAny:AddModule(name, m)
m.name = name
tinsert(self.modules, m)
self[name] = m
return m
end
function MovAny:DeleteModule(m)
for i, v in ipairs(self.modules) do
if v == m then
tremove(self.modules, i)
break
end
end
self[m.name] = nil
end
function GetParentInfo(f)
local fn = f:GetName()
print("|cFF50C0FF".."<---------------------------------------------->".."|r")
print("|cFF50C0FF".."Frame:".."|r", fn)
local p = f:GetParent()
print("|cFF50C0FF".."Parent:".."|r", p:GetName())
for i = 1, f:GetNumPoints() do
local point, relativeTo, relativePoint, xOfs, yOfs = f:GetPoint(i)
if relativeTo then
print(i..".", "|cFF50C0FF".."p:".."|r", point, "|cFF50C0FF".."rfn:".."|r", relativeTo:GetName(), "|cFF50C0FF".."rp:".."|r", relativePoint, "|cFF50C0FF".."x:".."|r", xOfs, "|cFF50C0FF".."y:".."|r", yOfs)
end
end
print("|cFF50C0FF".."Width:".."|r", f:GetWidth())
print("|cFF50C0FF".."Height:".."|r", f:GetHeight())
end
function GetParentInfoFromCursor()
local fn = GetMouseFocus():GetName()
local f = _G[fn]
print("|cFF50C0FF".."<---------------------------------------------->".."|r")
print("|cFF50C0FF".."Frame:".."|r", fn)
local p = f:GetParent()
print("|cFF50C0FF".."Parent:".."|r", p:GetName())
for i = 1, f:GetNumPoints() do
local point, relativeTo, relativePoint, xOfs, yOfs = f:GetPoint(i)
if relativeTo then
print(i..".", "|cFF50C0FF".."p:".."|r", point, "|cFF50C0FF".."rfn:".."|r", relativeTo:GetName(), "|cFF50C0FF".."rp:".."|r", relativePoint, "|cFF50C0FF".."x:".."|r", xOfs, "|cFF50C0FF".."y:".."|r", yOfs)
end
end
print("|cFF50C0FF".."Width:".."|r", f:GetWidth())
print("|cFF50C0FF".."Height:".."|r", f:GetHeight())
end