--[[ 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 = "" 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