From 80a4b7c8c1dc25cb29feb9801a5b360648c3210f Mon Sep 17 00:00:00 2001 From: Steven Jackson Date: Thu, 20 Nov 2014 21:02:48 -0600 Subject: [PATCH] 5.2.19 --- Interface/AddOns/SVUI/Bindings.xml | 1 + .../AddOns/SVUI/assets/artwork/Minimap/Thumbs.db | Bin 47104 -> 0 bytes Interface/AddOns/SVUI/framework/api/api.xml | 69 ++++ .../AddOns/SVUI/framework/api/api_templates.lua | 2 + .../SVUI/framework/movers/mover_blizzard.lua | 173 --------- .../AddOns/SVUI/framework/movers/mover_graph.lua | 1 - .../AddOns/SVUI/framework/movers/mover_mentalo.lua | 375 +++++++++++++------- Interface/AddOns/SVUI/framework/movers/movers.xml | 3 +- .../AddOns/SVUI/framework/widgets/widget_comix.lua | 11 +- Interface/AddOns/SVUI/packages/actionbar/SVBar.lua | 8 +- Interface/AddOns/SVUI/packages/aura/SVAura.lua | 20 +- Interface/AddOns/SVUI/packages/bag/SVBag.lua | 163 ++++++--- .../AddOns/SVUI/packages/henchmen/SVHenchmen.lua | 4 +- .../AddOns/SVUI/packages/override/SVOverride.lua | 8 +- Interface/AddOns/SVUI/packages/tip/SVTip.lua | 38 +- .../SVUI/packages/tools/components/garrison.lua | 21 +- Interface/AddOns/SVUI/packages/unit/SVUnit.lua | 12 +- .../AddOns/SVUI/packages/unit/elements/castbar.lua | 26 +- .../AddOns/SVUI/packages/unit/elements/misc.lua | 12 +- Interface/AddOns/SVUI/packages/unit/frames.lua | 24 +- Interface/AddOns/SVUI/packages/unit/groups.lua | 14 +- .../SVUI/packages/unit/resources/deathknight.lua | 2 +- .../AddOns/SVUI/packages/unit/resources/druid.lua | 2 +- .../AddOns/SVUI/packages/unit/resources/mage.lua | 2 +- .../AddOns/SVUI/packages/unit/resources/monk.lua | 2 +- .../SVUI/packages/unit/resources/paladin.lua | 2 +- .../AddOns/SVUI/packages/unit/resources/priest.lua | 2 +- .../AddOns/SVUI/packages/unit/resources/rogue.lua | 2 +- .../AddOns/SVUI/packages/unit/resources/shaman.lua | 2 +- .../SVUI/packages/unit/resources/warlock.lua | 2 +- Interface/AddOns/SVUI/system/media.lua | 2 + .../AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua | 2 +- .../AddOns/SVUI_CraftOMatic/SVUI_CraftOMatic.lua | 10 +- .../SVUI_CraftOMatic/components/archaeology.lua | 2 +- .../AddOns/SVUI_CraftOMatic/components/cooking.lua | 2 +- .../AddOns/SVUI_CraftOMatic/components/fishing.lua | 2 +- .../components/blizzard/garrison.lua | 97 +++++ .../SVUI_StyleOMatic/components/blizzard/quest.lua | 1 + .../SVUI_StyleOMatic/components/style_methods.lua | 23 +- 39 files changed, 675 insertions(+), 469 deletions(-) delete mode 100644 Interface/AddOns/SVUI/assets/artwork/Minimap/Thumbs.db delete mode 100644 Interface/AddOns/SVUI/framework/movers/mover_blizzard.lua diff --git a/Interface/AddOns/SVUI/Bindings.xml b/Interface/AddOns/SVUI/Bindings.xml index d0c3a17..9e47fe2 100644 --- a/Interface/AddOns/SVUI/Bindings.xml +++ b/Interface/AddOns/SVUI/Bindings.xml @@ -8,4 +8,5 @@ SVUILetsRide() + \ No newline at end of file diff --git a/Interface/AddOns/SVUI/assets/artwork/Minimap/Thumbs.db b/Interface/AddOns/SVUI/assets/artwork/Minimap/Thumbs.db deleted file mode 100644 index b5ecd0a5466e8e44b44a78efd9cb6a3e755db862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47104 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 diff --git a/Interface/AddOns/SVUI/framework/api/api.xml b/Interface/AddOns/SVUI/framework/api/api.xml index d1f4658..c661a3a 100644 --- a/Interface/AddOns/SVUI/framework/api/api.xml +++ b/Interface/AddOns/SVUI/framework/api/api.xml @@ -654,6 +654,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Interface/AddOns/SVUI/framework/api/api_templates.lua b/Interface/AddOns/SVUI/framework/api/api_templates.lua index 8199d92..f1e4347 100644 --- a/Interface/AddOns/SVUI/framework/api/api_templates.lua +++ b/Interface/AddOns/SVUI/framework/api/api_templates.lua @@ -69,6 +69,7 @@ local XML_LOOKUP = { ["Inset"] = "SVUI_PanelTemplate_Inset", ["Comic"] = "SVUI_PanelTemplate_Comic", ["Model"] = "SVUI_PanelTemplate_Model", + ["ModelBorder"] = "SVUI_PanelTemplate_ModelBorder", ["Paper"] = "SVUI_PanelTemplate_Paper", ["Container"] = "SVUI_PanelTemplate_Container", ["Pattern"] = "SVUI_PanelTemplate_Pattern", @@ -642,6 +643,7 @@ local function SetButtonTemplate(self, invisible, overridePadding, xOffset, yOff CreatePanelTemplate(self, "Transparent", underlay, true, padding, x, y, defaultColor) self:SetBackdropColor(0,0,0,0) self:SetBackdropBorderColor(0,0,0,0) + if(self.Panel.BorderLeft) then self.Panel.BorderLeft:SetVertexColor(0,0,0,0) self.Panel.BorderRight:SetVertexColor(0,0,0,0) diff --git a/Interface/AddOns/SVUI/framework/movers/mover_blizzard.lua b/Interface/AddOns/SVUI/framework/movers/mover_blizzard.lua deleted file mode 100644 index 7426602..0000000 --- a/Interface/AddOns/SVUI/framework/movers/mover_blizzard.lua +++ /dev/null @@ -1,173 +0,0 @@ ---[[ -############################################################################## -_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_ # - ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__ # - __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____ # - ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____ # - ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____ # - _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____ # - __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ # - _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_# - ___\///////////___________\///___________\/////////_____\///////////_# -############################################################################## -S U P E R - V I L L A I N - U I By: Munglunch # -############################################################################## -########################################################## -LOCALIZED LUA FUNCTIONS -########################################################## -]]-- ---[[ GLOBALS ]]-- -local _G = _G; -local unpack = _G.unpack; -local select = _G.select; -local type = _G.type; -local pairs = _G.pairs; -local string = _G.string; -local math = _G.math; ---[[ STRING METHODS ]]-- -local format, split = string.format, string.split; ---[[ MATH METHODS ]]-- -local min, floor = math.min, math.floor; -local parsefloat = math.parsefloat; ---[[ -########################################################## -GET ADDON DATA -########################################################## -]]-- -local SV = select(2, ...) -local L = SV.L; - -local Movable = CreateFrame("Frame", nil) -local MovableFrames = {} -MovableFrames["GameMenuFrame"] = {} ---[[ -########################################################## -LOCAL VARS -########################################################## -]]-- -local DraggableFrames = { - "AchievementFrame", - "AuctionFrame", - "ArchaeologyFrame", - "BattlefieldMinimap", - "BarberShopFrame", - "BlackMarketFrame", - "CalendarFrame", - "CharacterFrame", - "ClassTrainerFrame", - "DressUpFrame", - "EncounterJournal", - "FriendsFrame", - "GameMenuFrame", - "GMSurveyFrame", - "GossipFrame", - "GuildFrame", - "GuildBankFrame", - "GuildRegistrarFrame", - "HelpFrame", - "InterfaceOptionsFrame", - "ItemUpgradeFrame", - "KeyBindingFrame", - "LFGDungeonReadyPopup", - "MacOptionsFrame", - "MacroFrame", - "MailFrame", - "MerchantFrame", - "PlayerTalentFrame", - "PetJournalParent", - "PVEFrame", - "PVPFrame", - "QuestFrame", - "QuestLogFrame", - "RaidBrowserFrame", - "ReadyCheckFrame", - "ReforgingFrame", - "ReportCheatingDialog", - "ReportPlayerNameDialog", - "RolePollPopup", - "ScrollOfResurrectionSelectionFrame", - "SpellBookFrame", - "TabardFrame", - "TaxiFrame", - "TimeManagerFrame", - "TradeSkillFrame", - "TradeFrame", - "TransmorgifyFrame", - "TutorialFrame", - "VideoOptionsFrame", - "VoidStorageFrame", - --"WorldStateAlwaysUpFrame" -}; ---[[ -########################################################## -LOCAL FUNCTIONS -########################################################## -]]-- -local BlizzardFrame_OnUpdate = function(self) - if InCombatLockdown() or self:GetName() == "GameMenuFrame" then return end - if self.IsMoving then return end - self:ClearAllPoints() - if self:GetName() == "QuestFrame" then - if MovableFrames["GossipFrame"].Points ~= nil then - self:SetPoint(unpack(MovableFrames["GossipFrame"].Points)) - end - elseif MovableFrames[self:GetName()].Points ~= nil then - self:SetPoint(unpack(MovableFrames[self:GetName()].Points)) - end -end - -local BlizzardFrame_OnDragStart = function(self) - if not self:IsMovable() then return end - self:StartMoving() - self.IsMoving = true -end - -local BlizzardFrame_OnDragStop = function(self) - if not self:IsMovable() then return end - self.IsMoving = false; - self:StopMovingOrSizing() - if self:GetName() == "GameMenuFrame" then return end - local anchor1, parent, anchor2, x, y = self:GetPoint() - parent = self:GetParent():GetName() - self:ClearAllPoints() - self:SetPoint(anchor1, parent, anchor2, x, y) - if self:GetName() == "QuestFrame" then - MovableFrames["GossipFrame"].Points = {anchor1, parent, anchor2, x, y} - else - MovableFrames[self:GetName()].Points = {anchor1, parent, anchor2, x, y} - end -end - -local Movable_OnEvent = function(self) - for _, frameName in pairs(DraggableFrames) do - local frame = _G[frameName] - if(frame) then - if(frameName ~= "LossOfControlFrame" and (not MovableFrames[frameName])) then - frame:EnableMouse(true) - - if(frameName == "LFGDungeonReadyPopup") then - LFGDungeonReadyDialog:EnableMouse(false) - end - - frame:SetMovable(true) - frame:RegisterForDrag("LeftButton") - frame:SetClampedToScreen(true) - frame:HookScript("OnUpdate", BlizzardFrame_OnUpdate) - frame:SetScript("OnDragStart", BlizzardFrame_OnDragStart) - frame:SetScript("OnDragStop", BlizzardFrame_OnDragStop) - MovableFrames[frameName] = {} - end - end - end -end - -Movable:RegisterEvent("PLAYER_LOGIN") -Movable:RegisterEvent("ADDON_LOADED") -Movable:RegisterEvent("LFG_UPDATE") -Movable:RegisterEvent("ROLE_POLL_BEGIN") -Movable:RegisterEvent("READY_CHECK") -Movable:RegisterEvent("UPDATE_WORLD_STATES") -Movable:RegisterEvent("WORLD_STATE_TIMER_START") -Movable:RegisterEvent("WORLD_STATE_UI_TIMER_UPDATE") - -Movable:SetScript("OnEvent", Movable_OnEvent) \ No newline at end of file diff --git a/Interface/AddOns/SVUI/framework/movers/mover_graph.lua b/Interface/AddOns/SVUI/framework/movers/mover_graph.lua index 0feab5c..ad2915a 100644 --- a/Interface/AddOns/SVUI/framework/movers/mover_graph.lua +++ b/Interface/AddOns/SVUI/framework/movers/mover_graph.lua @@ -48,7 +48,6 @@ function Graph:Toggle(enabled) if((not self.Grid) or (self.CellSize ~= SV.db.general.graphSize)) then self:Generate() end - print(enabled) if(not enabled) then self.Grid:Hide() else diff --git a/Interface/AddOns/SVUI/framework/movers/mover_mentalo.lua b/Interface/AddOns/SVUI/framework/movers/mover_mentalo.lua index c458ff3..29cd08d 100644 --- a/Interface/AddOns/SVUI/framework/movers/mover_mentalo.lua +++ b/Interface/AddOns/SVUI/framework/movers/mover_mentalo.lua @@ -42,19 +42,53 @@ GET ADDON DATA local SV = select(2, ...) local L = SV.L; -local Mentalo = {} - +local Mentalo = CreateFrame("Frame", nil) Mentalo.Frames = {} - -local MentaloUpdateHandler = CreateFrame("Frame", nil) - +Mentalo.Blizzard = {} + +local DraggableFrames = { + "AchievementFrame", "AuctionFrame", "ArchaeologyFrame", + "BattlefieldMinimap", "BarberShopFrame", "BlackMarketFrame", + "CalendarFrame", "CharacterFrame", "ClassTrainerFrame", + "DressUpFrame", + "EncounterJournal", + "FriendsFrame", + "GameMenuFrame", "GMSurveyFrame", "GossipFrame", "GuildFrame", "GuildBankFrame", "GuildRegistrarFrame", + "GarrisonLandingPage", "GarrisonMissionFrame", "GarrisonCapacitiveDisplayFrame", + "HelpFrame", + "InterfaceOptionsFrame", + "ItemUpgradeFrame", + "KeyBindingFrame", + "LFGDungeonReadyPopup", + "MacOptionsFrame", "MacroFrame", "MailFrame", "MerchantFrame", + "PlayerTalentFrame", "PetJournalParent", "PetStableFrame", "PVEFrame", "PVPFrame", + "QuestFrame", "QuestLogFrame", + "RaidBrowserFrame", "ReadyCheckFrame", "ReforgingFrame", "ReportCheatingDialog", "ReportPlayerNameDialog", "RolePollPopup", + "ScrollOfResurrectionSelectionFrame", "SpellBookFrame", + "TabardFrame", "TaxiFrame", "TimeManagerFrame", "TradeSkillFrame", "TradeFrame", "TransmogrifyFrame", "TutorialFrame", + "VideoOptionsFrame", "VoidStorageFrame", + --"WorldStateAlwaysUpFrame" +}; +--[[ + /$$$$$$ /$$ /$$ /$$ + /$$__ $$ | $$ |__/ | $$ +| $$ \__//$$$$$$ /$$ /$$$$$$$| $$ /$$ /$$ /$$ +| $$$$$$|_ $$_/ | $$ /$$_____/| $$ /$$/| $$ | $$ + \____ $$ | $$ | $$| $$ | $$$$$$/ | $$ | $$ + /$$ \ $$ | $$ /$$| $$| $$ | $$_ $$ | $$ | $$ +| $$$$$$/ | $$$$/| $$| $$$$$$$| $$ \ $$| $$$$$$$ + \______/ \___/ |__/ \_______/|__/ \__/ \____ $$ + /$$ | $$ + | $$$$$$/ + \______/ +--]] local Sticky = {}; Sticky.Frames = {}; Sticky.Frames[1] = SV.Screen; Sticky.scripts = Sticky.scripts or {} Sticky.rangeX = 15 Sticky.rangeY = 15 -Sticky.sticky = Sticky.sticky or {} +Sticky.StuckTo = Sticky.StuckTo or {} local function SnapStickyFrame(frameA, frameB, left, top, right, bottom) local sA, sB = frameA:GetEffectiveScale(), frameB:GetEffectiveScale() @@ -142,16 +176,15 @@ function Sticky:GetStickyUpdate(frame, xoffset, yoffset, left, top, right, botto return function() local x, y = GetCursorPosition() local s = frame:GetEffectiveScale() - local sticky = nil x, y = x / s, y / s frame:ClearAllPoints() frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", x + xoffset, y + yoffset) - self.sticky[frame] = nil + self.StuckTo[frame] = nil for i = 1, #Sticky.Frames do local v = Sticky.Frames[i] if(frame ~= v and frame ~= v:GetParent() and not IsShiftKeyDown() and v:IsVisible()) then if SnapStickyFrame(frame, v, left, top, right, bottom) then - self.sticky[frame] = v + self.StuckTo[frame] = v break end end @@ -172,19 +205,24 @@ end function Sticky:StopMoving(frame) frame:SetScript("OnUpdate", self.scripts[frame]) self.scripts[frame] = nil - if self.sticky[frame] then - local sticky = self.sticky[frame] - self.sticky[frame] = nil - return true, sticky + if self.StuckTo[frame] then + local frame2 = self.StuckTo[frame] + self.StuckTo[frame] = nil + return true, frame2 else return false, nil end end ---[[ -########################################################## -LOCAL VARS -########################################################## -]]-- +--[[ + /$$ /$$ /$$ /$$ +| $$$ /$$$ | $$ | $$ +| $$$$ /$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$ | $$ /$$$$$$ +| $$ $$/$$ $$ /$$__ $$| $$__ $$|_ $$_/ |____ $$| $$ /$$__ $$ +| $$ $$$| $$| $$$$$$$$| $$ \ $$ | $$ /$$$$$$$| $$| $$ \ $$ +| $$\ $ | $$| $$_____/| $$ | $$ | $$ /$$ /$$__ $$| $$| $$ | $$ +| $$ \/ | $$| $$$$$$$| $$ | $$ | $$$$/| $$$$$$$| $$| $$$$$$/ +|__/ |__/ \_______/|__/ |__/ \___/ \_______/|__/ \______/ +--]] local CurrentFrameTarget, UpdateFrameTarget; --[[ ########################################################## @@ -228,6 +266,10 @@ end local function CurrentPosition(frame) if not frame then return end local anchor1, parent, anchor2, x, y = frame:GetPoint() + anchor1 = anchor1 or "TOPLEFT" + anchor2 = anchor2 or "TOPLEFT" + x = x or 50 + y = y or -50 local parentName if not parent then parentName = "SVUIParent" @@ -290,7 +332,6 @@ local function ResetAllAlphas() end end end - --[[ /$$$$$$$$/$$ /$$ /$$$$$$$$ /$$ /$$ /$$$$$$ /$$ /$$ /$$$$$$$ |__ $$__/ $$ | $$| $$_____/ | $$ | $$ /$$__ $$| $$$ | $$| $$__ $$ @@ -301,7 +342,6 @@ end | $$ | $$ | $$| $$$$$$$$ | $$ | $$| $$ | $$| $$ \ $$| $$$$$$$/ |__/ |__/ |__/|________/ |__/ |__/|__/ |__/|__/ \__/|_______/ --]] - local TheHand = CreateFrame("Frame", "SVUI_HandOfMentalo", SV.Screen) TheHand:SetFrameStrata("DIALOG") TheHand:SetFrameLevel(99) @@ -353,6 +393,8 @@ end HANDLERS ########################################################## ]]-- +local MentaloUpdateHandler = CreateFrame("Frame", nil) + local Movable_OnMouseUp = function(self) CurrentFrameTarget = self; local xOffset, yOffset, anchor = CalculateOffsets() @@ -403,16 +445,16 @@ end local Movable_OnSizeChanged = function(self) if InCombatLockdown()then return end if self.dirtyWidth and self.dirtyHeight then - self.Avatar:Size(self.dirtyWidth, self.dirtyHeight) + self.Grip:Size(self.dirtyWidth, self.dirtyHeight) else - self.Avatar:Size(self:GetSize()) + self.Grip:Size(self:GetSize()) end end local Movable_OnDragStart = function(self) if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT)return end if SV.db.general.stickyFrames then - Sticky:StartMoving(self, self.snapOffset, self.snapOffset, self.snapOffset, self.snapOffset) + Sticky:StartMoving(self, self.snapOffset) else self:StartMoving() end @@ -483,7 +525,7 @@ local Movable_OnEnter = function(self) self.text:SetTextColor(0, 1, 1) self:SetBackdropBorderColor(0, 0.7, 1) UpdateFrameTarget = self; - SVUI_Mentalo.Avatar:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-ON]]) + SVUI_Mentalo.Portrait:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-ON]]) TheHand:SetPoint("CENTER", self, "TOP", 0, 0) TheHand:Show() if CurrentFrameTarget ~= self then @@ -496,7 +538,7 @@ local Movable_OnLeave = function(self) if TheHand.UserHeld then return end self.text:SetTextColor(0.5, 0.5, 0.5) self:SetBackdropBorderColor(0.5, 0.5, 0.5) - SVUI_Mentalo.Avatar:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-OFF]]) + SVUI_Mentalo.Portrait:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-OFF]]) TheHand:Hide() if(CurrentFrameTarget ~= self and not SVUI_MentaloPrecision:IsShown()) then self:SetAlpha(0.4) @@ -528,37 +570,30 @@ end CONSTRUCTS ########################################################## ]]-- -function Mentalo:New(frame, moveName, title, raised, snap, dragStopFunc) - if(not frame) then return end - if self.Frames[moveName].Created then return end - if raised == nil then raised = true end +function Mentalo:New(frame, moveName, title, snap, dragStopFunc) + if(not frame or (self.Frames[moveName] ~= nil)) then return end + + self.Frames[moveName] = { + text = title, + postdrag = dragStopFunc, + point = CurrentPosition(frame) + } local movable = CreateFrame("Button", moveName, SV.Screen) movable:SetFrameLevel(frame:GetFrameLevel() + 1) movable:SetClampedToScreen(true) movable:SetWidth(frame:GetWidth()) movable:SetHeight(frame:GetHeight()) + movable:SetFrameStrata("DIALOG") movable.parent = frame; movable.name = moveName; movable.textString = title; movable.postdrag = dragStopFunc; - movable.overlay = raised; - movable.snapOffset = snap or -2; - - if raised == true then - movable:SetFrameStrata("DIALOG") - else - movable:SetFrameStrata("BACKGROUND") - end + movable.snapOffset = snap or -2; local anchor1, anchorParent, anchor2, xPos, yPos = split("\031", CurrentPosition(frame)) - if(SV.cache.Anchors and SV.cache.Anchors[moveName]) then - if(type(SV.cache.Anchors[moveName]) == "table") then - movable:SetPoint(SV.cache.Anchors[moveName]["p"], SV.Screen, SV.cache.Anchors[moveName]["p2"], SV.cache.Anchors[moveName]["p3"], SV.cache.Anchors[moveName]["p4"]) - SV.cache.Anchors[moveName] = CurrentPosition(movable) - movable:ClearAllPoints() - end + if(SV.cache.Anchors and SV.cache.Anchors[moveName] and (type(SV.cache.Anchors[moveName]) == "string")) then anchor1, anchorParent, anchor2, xPos, yPos = split("\031", SV.cache.Anchors[moveName]) movable:SetPoint(anchor1, anchorParent, anchor2, xPos, yPos) else @@ -568,13 +603,10 @@ function Mentalo:New(frame, moveName, title, raised, snap, dragStopFunc) movable:SetFixedPanelTemplate("Transparent") movable:SetAlpha(0.4) - self.Frames[moveName].Avatar = movable; - Sticky.Frames[#Sticky.Frames + 1] = movable; - frame:SetScript("OnSizeChanged", Movable_OnSizeChanged) - frame.Avatar = movable; + frame.Grip = movable; frame:ClearAllPoints() - frame:SetPoint(anchor1, movable, 0, 0) + frame:SetPoint(anchor1, movable, anchor1, 0, 0) local mtext = movable:CreateFontString(nil, "OVERLAY") mtext:FontManager() @@ -598,7 +630,7 @@ function Mentalo:New(frame, moveName, title, raised, snap, dragStopFunc) movable:SetMovable(true) movable:Hide() - if dragStopFunc ~= nil and type(dragStopFunc) == "function" then + if(dragStopFunc and (type(dragStopFunc) == "function")) then movable:RegisterEvent("PLAYER_ENTERING_WORLD") movable:SetScript("OnEvent", function(this, event) local point = Pinpoint(this) @@ -607,105 +639,113 @@ function Mentalo:New(frame, moveName, title, raised, snap, dragStopFunc) end) end - self.Frames[moveName].Created = true + Sticky.Frames[#Sticky.Frames + 1] = movable; end -function Mentalo:HasMoved(frame) - if SV.cache.Anchors and SV.cache.Anchors[frame] then +function Mentalo:HasMoved(frameName) + if(SV.cache.Anchors and SV.cache.Anchors[frameName]) then return true else return false end end -function Mentalo:SaveMovable(frame) - if(not _G[frame] or not SV.cache.Anchors) then return end - SV.cache.Anchors[frame] = CurrentPosition(_G[frame]) -end +function Mentalo:SaveMovable(frameName) + if((not _G[frameName]) or (not SV.cache.Anchors)) then return end + SV.cache.Anchors[frameName] = CurrentPosition(_G[frameName]) +end -function Mentalo:ChangeSnapOffset(frame, snapOffset) - if not _G[frame] or not self.Frames[frame] then return end - self.Frames[frame].Avatar.snapOffset = snapOffset or -2; - self.Frames[frame]["snapoffset"] = snapOffset or -2 +function Mentalo:ChangeSnapOffset(frameName, snapOffset) + if(not _G[frameName]) then return end + _G[frameName].snapOffset = snapOffset or -2; end -function Mentalo:Add(frame, title, raised, snapOffset, dragStopFunc, movableGroup, overrideName) +function Mentalo:Add(frame, title, snapOffset, dragStopFunc, overrideName) if(not frame or (not overrideName and not frame:GetName())) then return end local frameName = overrideName or frame:GetName() - local moveName = ("%s_MOVE"):format(frameName) - if not movableGroup then movableGroup = "ALL, GENERAL" end - if self.Frames[moveName] == nil then - self.Frames[moveName] = {} - self.Frames[moveName]["parent"] = frame; - self.Frames[moveName]["text"] = title; - self.Frames[moveName]["overlay"] = raised; - self.Frames[moveName]["postdrag"] = dragStopFunc; - self.Frames[moveName]["snapoffset"] = snapOffset; - self.Frames[moveName]["point"] = CurrentPosition(frame) - end - - self:New(frame, moveName, title, raised, snapOffset, dragStopFunc) + local moveName = ("%s_MOVE"):format(frameName) + self:New(frame, moveName, title, snapOffset, dragStopFunc) end function Mentalo:Reset(request) - if request == "" or request == nil then - for name, _ in pairs(self.Frames)do - local frame = _G[name]; - if self.Frames[name]["point"] then - local u, v, w, x, y = split("\031", self.Frames[name]["point"]) + if(request == "" or request == nil) then + for frameName, frameData in pairs(self.Frames) do + local frame = _G[frameName]; + if(frameData.point) then + local u, v, w, x, y = split("\031", frameData.point) frame:ClearAllPoints() frame:SetPoint(u, v, w, x, y) - for arg, func in pairs(self.Frames[name])do - if arg == "postdrag" and type(func) == "function" then - func(frame, Pinpoint(frame)) - end + if(frameData.postdrag and (type(frameData.postdrag) == "function")) then + frameData.postdrag(frame, Pinpoint(frame)) end + end + if(SV.cache.Anchors and SV.cache.Anchors[frameName]) then + SV.cache.Anchors[frameName] = nil end end - if(SV.cache.Anchors) then - wipe(SV.cache.Anchors) - end + elseif(request == "Blizzard") then + for frameName, point in pairs(self.Blizzard) do + local frame = _G[frameName]; + if(point and (type(point) == "string")) then + local u, v, w, x, y = split("\031", point) + frame:ClearAllPoints() + frame:SetPoint(u, v, w, x, y) + end + if(SV.cache.Anchors and SV.cache.Anchors[frameName]) then + SV.cache.Anchors[frameName] = nil + end + end else - for name, _ in pairs(self.Frames)do - if self.Frames[name]["point"] then - for arg1, arg2 in pairs(self.Frames[name])do - local mover; - if arg1 == "text" then - if request == arg2 then - local frame = _G[name] - local u, v, w, x, y = split("\031", self.Frames[name]["point"]) - frame:ClearAllPoints() - frame:SetPoint(u, v, w, x, y) - if(SV.cache.Anchors and SV.cache.Anchors[name]) then - SV.cache.Anchors[name] = nil - end - if (self.Frames[name]["postdrag"] ~= nil and type(self.Frames[name]["postdrag"]) == "function")then - self.Frames[name]["postdrag"](frame, Pinpoint(frame)) - end - end - end + for frameName, frameData in pairs(self.Frames) do + if(frameData.point and (request == frameData.text)) then + local frame = _G[frameName] + local u, v, w, x, y = split("\031", frameData.point) + frame:ClearAllPoints() + frame:SetPoint(u, v, w, x, y) + if (frameData.postdrag and (type(frameData.postdrag) == "function"))then + frameData.postdrag(frame, Pinpoint(frame)) end + if(SV.cache.Anchors and SV.cache.Anchors[frameName]) then + SV.cache.Anchors[frameName] = nil + end + break end end end end function Mentalo:SetPositions() - for name, _ in pairs(self.Frames)do - local frame = _G[name]; + for frameName, frameData in pairs(self.Frames) do + local frame = _G[frameName]; local anchor1, parent, anchor2, x, y; if frame then - if (SV.cache.Anchors and SV.cache.Anchors[name] and type(SV.cache.Anchors[name]) == "string") then - anchor1, parent, anchor2, x, y = split("\031", SV.cache.Anchors[name]) + if (SV.cache.Anchors and SV.cache.Anchors[frameName] and (type(SV.cache.Anchors[frameName]) == "string")) then + anchor1, parent, anchor2, x, y = split("\031", SV.cache.Anchors[frameName]) frame:ClearAllPoints() frame:SetPoint(anchor1, parent, anchor2, x, y) - elseif self.Frames[name]["point"] then - anchor1, parent, anchor2, x, y = split("\031", self.Frames[name]["point"]) + elseif(frameData.point) then + anchor1, parent, anchor2, x, y = split("\031", frameData.point) frame:ClearAllPoints() frame:SetPoint(anchor1, parent, anchor2, x, y) end end - end + end + + for frameName, point in pairs(self.Blizzard) do + local frame = _G[frameName]; + local anchor1, parent, anchor2, x, y; + if(frame) then + if (SV.cache.Anchors and SV.cache.Anchors[frameName] and (type(SV.cache.Anchors[frameName]) == "string")) then + anchor1, parent, anchor2, x, y = split("\031", SV.cache.Anchors[frameName]) + frame:ClearAllPoints() + frame:SetPoint(anchor1, parent, anchor2, x, y) + elseif(point and (type(point) == "string")) then + anchor1, parent, anchor2, x, y = split("\031", point) + frame:ClearAllPoints() + frame:SetPoint(anchor1, parent, anchor2, x, y) + end + end + end end function Mentalo:Toggle(isConfigMode) @@ -813,6 +853,84 @@ local XML_MentaloPrecisionInputY_EnterPressed = function(self) end --[[ ########################################################## +DRAGGABLE HANDLERS +########################################################## +]]-- +local BlizzardFrame_OnUpdate = function(self) + local frameName = self:GetName(); + if(InCombatLockdown() or (frameName == "GameMenuFrame") or (self.IsMoving)) then return end + if(frameName == "QuestFrame") then + frameName = "GossipFrame" + end + if (SV.cache.Anchors and SV.cache.Anchors[frameName] and (type(SV.cache.Anchors[frameName]) == "string")) then + local anchor1, parent, anchor2, x, y = split("\031", SV.cache.Anchors[frameName]) + self:ClearAllPoints() + self:SetPoint(anchor1, parent, anchor2, x, y) + elseif(Mentalo.Blizzard[frameName] and (type(Mentalo.Blizzard[frameName]) == "string")) then + local anchor1, parent, anchor2, x, y = split("\031", Mentalo.Blizzard[frameName]) + self:ClearAllPoints() + self:SetPoint(anchor1, parent, anchor2, x, y) + end +end + +local BlizzardFrame_OnDragStart = function(self) + if not self:IsMovable() then return end + self:StartMoving() + self.IsMoving = true +end + +local BlizzardFrame_OnDragStop = function(self) + if(not self:IsMovable()) then return end + local frameName = self:GetName(); + self.IsMoving = false; + self:StopMovingOrSizing() + if(frameName == "GameMenuFrame") then return end + local anchor1, parent, anchor2, x, y = self:GetPoint() + parent = self:GetParent():GetName() + self:ClearAllPoints() + self:SetPoint(anchor1, parent, anchor2, x, y) + if(frameName == "QuestFrame") then + frameName = "GossipFrame" + end + Mentalo:SaveMovable(frameName) +end + +local MentaloMaster_OnEvent = function(self) + for _, frameName in pairs(DraggableFrames) do + local frame = _G[frameName] + if(frame) then + if(frameName ~= "LossOfControlFrame" and (not self.Blizzard[frameName])) then + frame:EnableMouse(true) + + if(frameName == "LFGDungeonReadyPopup") then + LFGDungeonReadyDialog:EnableMouse(false) + end + + frame:SetMovable(true) + frame:RegisterForDrag("LeftButton") + frame:SetClampedToScreen(true) + frame:HookScript("OnUpdate", BlizzardFrame_OnUpdate) + frame:SetScript("OnDragStart", BlizzardFrame_OnDragStart) + frame:SetScript("OnDragStop", BlizzardFrame_OnDragStop) + + self.Blizzard[frameName] = CurrentPosition(frame) + end + end + end +end + +Mentalo:RegisterEvent("PLAYER_LOGIN") +Mentalo:RegisterEvent("ADDON_LOADED") +Mentalo:RegisterEvent("LFG_UPDATE") +Mentalo:RegisterEvent("ROLE_POLL_BEGIN") +Mentalo:RegisterEvent("READY_CHECK") +Mentalo:RegisterEvent("UPDATE_WORLD_STATES") +Mentalo:RegisterEvent("WORLD_STATE_TIMER_START") +Mentalo:RegisterEvent("WORLD_STATE_UI_TIMER_UPDATE") + +Mentalo:SetScript("OnEvent", MentaloMaster_OnEvent) +--[[ +########################################################## Initialize ########################################################## ]]-- @@ -844,25 +962,24 @@ function Mentalo:Initialize() SV.cache.Anchors = SV.cache.Anchors or {} - for name, _ in pairs(self.Frames)do - local parent, text, overlay, snapoffset, postdrag; - for key, value in pairs(self.Frames[name])do - if(key == "parent") then - parent = value - elseif(key == "text") then - text = value - elseif(key == "overlay") then - overlay = value - elseif(key == "snapoffset") then - snapoffset = value - elseif(key == "postdrag") then - postdrag = value - end - end - self:New(parent, name, text, overlay, snapoffset, postdrag) - end - self:SetPositions() + + if(SV.db.general.multiMonitor) then + for panelName, panelData in pairs(_G["UIPanelWindows"]) do + if(self.Blizzard[panelName] and (not SV.cache.Anchors[frameName])) then + if(panelData.area and (panelData.area == 'left')) then + local frame = _G[panelName]; + local parent = frame:GetParent():GetName() + if(parent and ((parent == UIParent) or (parent == SV.Screen))) then + frame:ClearAllPoints() + frame:SetPoint('CENTER', parent, 'CENTER', 0, 0) + SetUIPanelAttribute(frame, 'area', 'center') + self.Blizzard[frameName] = CurrentPosition(frame) + end + end + end + end + end end SV.Mentalo = Mentalo \ No newline at end of file diff --git a/Interface/AddOns/SVUI/framework/movers/movers.xml b/Interface/AddOns/SVUI/framework/movers/movers.xml index b673c63..1c1d332 100644 --- a/Interface/AddOns/SVUI/framework/movers/movers.xml +++ b/Interface/AddOns/SVUI/framework/movers/movers.xml @@ -215,7 +215,7 @@ - + @@ -258,5 +258,4 @@