From 21103806fea6627682afb9e16ba25dde1bb997d3 Mon Sep 17 00:00:00 2001 From: Crum Date: Mon, 29 Oct 2018 20:56:33 -0500 Subject: [PATCH] update --- ElvUI/Core/Movers.lua | 207 ++++++++++++++++++++++-------------------- 1 file changed, 110 insertions(+), 97 deletions(-) diff --git a/ElvUI/Core/Movers.lua b/ElvUI/Core/Movers.lua index ad6c141..403dba5 100644 --- a/ElvUI/Core/Movers.lua +++ b/ElvUI/Core/Movers.lua @@ -4,17 +4,23 @@ local Sticky = LibStub("LibSimpleSticky-1.0"); --Cache global variables --Lua functions local _G = _G -local type, unpack, pairs = type, unpack, pairs +local type, unpack, pairs, error = type, unpack, pairs, error local format, split, find = string.format, string.split, string.find -local tinsert = table.insert +local getn = table.getn --WoW API / Variables local CreateFrame = CreateFrame +local IsControlKeyDown = IsControlKeyDown +local IsShiftKeyDown = IsShiftKeyDown E.CreatedMovers = {} E.DisabledMovers = {} -local function SizeChanged(self) - E:Size(self.mover, self.dirtyWidth and self.dirtyWidth or self:GetWidth(), self.dirtyHeight and self.dirtyHeight or self:GetHeight()) +local function SizeChanged(frame) + if frame.dirtyWidth and frame.dirtyHeight then + E:Size(frame.mover, frame.dirtyWidth, frame.dirtyHeight) + else + E:Size(frame.mover, frame:GetWidth(), frame:GetHeight()) + end end local function GetPoint(obj) @@ -46,6 +52,7 @@ local function CreateMover(parent, name, text, overlay, snapOffset, postdrag, sh if overlay == nil then overlay = true end local point, anchor, secondaryPoint, x, y = split(",", GetPoint(parent)) + --Use dirtyWidth / dirtyHeight to set initial size if possible local width = parent.dirtyWidth or parent:GetWidth() local height = parent.dirtyHeight or parent:GetHeight() @@ -65,6 +72,7 @@ local function CreateMover(parent, name, text, overlay, snapOffset, postdrag, sh f.overlay = overlay f.snapOffset = snapOffset or -2 f.shouldDisable = shouldDisable + f.configString = configString f:SetFrameLevel(parent:GetFrameLevel() + 1) if overlay == true then @@ -74,44 +82,47 @@ local function CreateMover(parent, name, text, overlay, snapOffset, postdrag, sh end E.CreatedMovers[name].mover = f - tinsert(E["snapBars"], f) + E.snapBars[getn(E.snapBars) + 1] = f local fs = f:CreateFontString(nil, "OVERLAY") E:FontTemplate(fs) fs:SetJustifyH("CENTER") - fs:SetPoint("CENTER", f) + E:Point(fs, "CENTER", 0) fs:SetText(text or name) - fs:SetTextColor(unpack(E["media"].rgbvaluecolor)) + fs:SetTextColor(unpack(E.media.rgbvaluecolor)) f:SetFontString(fs) f.text = fs - if E.db["movers"] and E.db["movers"][name] then - if type(E.db["movers"][name]) == "table" then - E:Point(f, E.db["movers"][name]["p"], E.UIParent, E.db["movers"][name]["p2"], E.db["movers"][name]["p3"], E.db["movers"][name]["p4"]) - E.db["movers"][name] = GetPoint(f) + if E.db.movers and E.db.movers[name] then + if type(E.db.movers[name]) == "table" then + E:Point(f, E.db.movers[name].p, E.UIParent, E.db.movers[name].p2, E.db.movers[name].p3, E.db.movers[name].p4) + E.db.movers[name] = GetPoint(f) f:ClearAllPoints() end + --Backward compatibility local delim - local anchorString = E.db["movers"][name] + local anchorString = E.db.movers[name] if find(anchorString, "\031") then delim = "\031" elseif find(anchorString, ",") then delim = "," end - local point, anchor, secondaryPoint, x, y = split(delim, anchorString) - E:Point(f, point, anchor, secondaryPoint, x, y) - else + local point1, anchor1, secondaryPoint1, x1, y1 = split(delim, anchorString) + E:Point(f, point1, anchor1, secondaryPoint1, x1, y1) + f.anchor = anchor + else E:Point(f, point, anchor, secondaryPoint, x, y) end local function OnDragStart(self) - if E.db["general"].stickyFrames then - Sticky:StartMoving(self, E["snapBars"], f.snapOffset, f.snapOffset, f.snapOffset, f.snapOffset) + if E.db.general.stickyFrames then + Sticky:StartMoving(self, E.snapBars, f.snapOffset, f.snapOffset, f.snapOffset, f.snapOffset) else self:StartMoving() end + coordFrame.child = self coordFrame:Show() isDragging = true @@ -119,24 +130,24 @@ local function CreateMover(parent, name, text, overlay, snapOffset, postdrag, sh local function OnDragStop(self) isDragging = false - if E.db["general"].stickyFrames then + if E.db.general.stickyFrames then Sticky:StopMoving(self) else self:StopMovingOrSizing() end - local x, y, point = E:CalculateMoverPoints(self) + local x2, y2, point2 = E:CalculateMoverPoints(self) self:ClearAllPoints() local overridePoint if self.positionOverride then - if (self.positionOverride == "BOTTOM" or self.positionOverride == "TOP") then + if self.positionOverride == "BOTTOM" or self.positionOverride == "TOP" then overridePoint = "BOTTOM" else overridePoint = "BOTTOMLEFT" end end - E:Point(self, self.positionOverride or point, E.UIParent, overridePoint and overridePoint or point, x, y) + E:Point(self, self.positionOverride or point2, E.UIParent, overridePoint and overridePoint or point2, x2, y2) if self.positionOverride then self.parent:ClearAllPoints() E:Point(self.parent, self.positionOverride, self, self.positionOverride) @@ -151,7 +162,7 @@ local function CreateMover(parent, name, text, overlay, snapOffset, postdrag, sh coordFrame.child = nil coordFrame:Hide() - if postdrag ~= nil and type(postdrag) == "function" then + if postdrag ~= nil and (type(postdrag) == "function") then postdrag(self, E:GetScreenQuadrant(self)) end @@ -164,37 +175,40 @@ local function CreateMover(parent, name, text, overlay, snapOffset, postdrag, sh ElvUIMoverNudgeWindow:Show() E.AssignFrameToNudge(this) coordFrame.child = this - UpdateCoords(coordFrame) coordFrame:GetScript("OnUpdate")(coordFrame) end local function OnMouseDown(button) if button == "RightButton" then isDragging = false - if E.db["general"].stickyFrames then + if E.db.general.stickyFrames then Sticky:StopMoving(this) else this:StopMovingOrSizing() end + + --Allow resetting of anchor by Ctrl+RightClick if IsControlKeyDown() and this.textString then E:ResetMovers(this.textString) - elseif IsShiftKeyDown() then + elseif IsShiftKeyDown() then --Allow hiding a mover temporarily this:Hide() + elseif this.configString then --OpenConfig + E:ToggleConfig(this.configString) end end end local function OnLeave(self) if isDragging then return end - this.text:SetTextColor(unpack(E["media"].rgbvaluecolor)) + this.text:SetTextColor(unpack(E.media.rgbvaluecolor)) end local function OnShow(self) - this:SetBackdropBorderColor(unpack(E["media"].rgbvaluecolor)) + this:SetBackdropBorderColor(unpack(E.media.rgbvaluecolor)) end local function OnMouseWheel(_, delta) - if(IsShiftKeyDown()) then + if IsShiftKeyDown() then E:NudgeMover(delta) else E:NudgeMover(nil, delta) @@ -214,7 +228,7 @@ local function CreateMover(parent, name, text, overlay, snapOffset, postdrag, sh parent.mover = f parent:ClearAllPoints() - parent:SetPoint(point, f) + E:Point(parent, point, f, 0, 0) if postdrag ~= nil and type(postdrag) == "function" then f:RegisterEvent("PLAYER_ENTERING_WORLD") @@ -236,7 +250,7 @@ function E:CalculateMoverPoints(mover, nudgeX, nudgeY) local TOP = screenHeight / 2 local point, nudgePoint, nudgeInversePoint - if(y >= TOP) then + if y >= TOP then point = "TOP" nudgePoint = "TOP" nudgeInversePoint = "BOTTOM" @@ -248,13 +262,13 @@ function E:CalculateMoverPoints(mover, nudgeX, nudgeY) y = mover:GetBottom() end - if(x >= RIGHT) then - point = point .. "RIGHT" + if x >= RIGHT then + point = point.."RIGHT" nudgePoint = "RIGHT" nudgeInversePoint = "LEFT" x = mover:GetRight() - screenWidth - elseif(x <= LEFT) then - point = point .. "LEFT" + elseif x <= LEFT then + point = point.."LEFT" nudgePoint = "LEFT" nudgeInversePoint = "RIGHT" x = mover:GetLeft() @@ -262,28 +276,29 @@ function E:CalculateMoverPoints(mover, nudgeX, nudgeY) x = x - screenCenter end - if(mover.positionOverride) then - if(mover.positionOverride == "TOPLEFT") then + if mover.positionOverride then + if mover.positionOverride == "TOPLEFT" then x = mover:GetLeft() - E.diffGetLeft y = mover:GetTop() - E.diffGetTop - elseif(mover.positionOverride == "TOPRIGHT") then + elseif mover.positionOverride == "TOPRIGHT" then x = mover:GetRight() - E.diffGetRight y = mover:GetTop() - E.diffGetTop - elseif(mover.positionOverride == "BOTTOMLEFT") then + elseif mover.positionOverride == "BOTTOMLEFT" then x = mover:GetLeft() - E.diffGetLeft y = mover:GetBottom() - E.diffGetBottom - elseif(mover.positionOverride == "BOTTOMRIGHT") then + elseif mover.positionOverride == "BOTTOMRIGHT" then x = mover:GetRight() - E.diffGetRight y = mover:GetBottom() - E.diffGetBottom - elseif(mover.positionOverride == "BOTTOM") then + elseif mover.positionOverride == "BOTTOM" then x = mover:GetCenter() - screenCenter y = mover:GetBottom() - E.diffGetBottom - elseif(mover.positionOverride == "TOP") then + elseif mover.positionOverride == "TOP" then x = mover:GetCenter() - screenCenter y = mover:GetTop() - E.diffGetTop end end + --Update coordinates if nudged x = x + (nudgeX or 0) y = y + (nudgeY or 0) @@ -297,7 +312,7 @@ function E:UpdatePositionOverride(name) end function E:HasMoverBeenMoved(name) - if E.db["movers"] and E.db["movers"][name] then + if E.db.movers and E.db.movers[name] then return true else return false @@ -308,42 +323,49 @@ function E:SaveMoverPosition(name) if not _G[name] then return end if not E.db.movers then E.db.movers = {} end - E.db.movers[name] = GetPoint(_G[name]) + local mover = _G[name] + local _, anchor = mover:GetPoint() + mover.anchor = anchor:GetName() + + E.db.movers[name] = GetPoint(mover) end function E:SetMoverSnapOffset(name, offset) if not _G[name] or not E.CreatedMovers[name] then return end E.CreatedMovers[name].mover.snapOffset = offset or -2 - E.CreatedMovers[name]["snapoffset"] = offset or -2 + E.CreatedMovers[name].snapoffset = offset or -2 end function E:SaveMoverDefaultPosition(name) if not _G[name] then return end - E.CreatedMovers[name]["point"] = GetPoint(_G[name]) - E.CreatedMovers[name]["postdrag"](_G[name], E:GetScreenQuadrant(_G[name])) + E.CreatedMovers[name].point = GetPoint(_G[name]) + E.CreatedMovers[name].postdrag(_G[name], E:GetScreenQuadrant(_G[name])) end -function E:CreateMover(parent, name, text, overlay, snapoffset, postdrag, moverTypes, shouldDisable) +function E:CreateMover(parent, name, text, overlay, snapoffset, postdrag, moverTypes, shouldDisable, configString) if not moverTypes then moverTypes = "ALL,GENERAL" end if E.CreatedMovers[name] == nil then E.CreatedMovers[name] = {} - E.CreatedMovers[name]["parent"] = parent - E.CreatedMovers[name]["text"] = text - E.CreatedMovers[name]["overlay"] = overlay - E.CreatedMovers[name]["postdrag"] = postdrag - E.CreatedMovers[name]["snapoffset"] = snapoffset - E.CreatedMovers[name]["point"] = GetPoint(parent) - E.CreatedMovers[name]["shouldDisable"] = shouldDisable + E.CreatedMovers[name].parent = parent + E.CreatedMovers[name].text = text + E.CreatedMovers[name].overlay = overlay + E.CreatedMovers[name].postdrag = postdrag + E.CreatedMovers[name].snapoffset = snapoffset + E.CreatedMovers[name].point = GetPoint(parent) + E.CreatedMovers[name].shouldDisable = shouldDisable + E.CreatedMovers[name].configString = configString - E.CreatedMovers[name]["type"] = {} - for _, moverType in {split(",", moverTypes)} do - E.CreatedMovers[name]["type"][moverType] = true + E.CreatedMovers[name].type = {} + local types = {split(",", moverTypes)} + for i = 1, getn(types) do + local moverType = types[i] + E.CreatedMovers[name].type[moverType] = true end end - CreateMover(parent, name, text, overlay, snapoffset, postdrag, shouldDisable) + CreateMover(parent, name, text, overlay, snapoffset, postdrag, shouldDisable, configString) end function E:ToggleMovers(show, moverType) @@ -353,7 +375,7 @@ function E:ToggleMovers(show, moverType) if not show then _G[name]:Hide() else - if E.CreatedMovers[name]["type"][moverType] then + if E.CreatedMovers[name].type[moverType] then _G[name]:Show() else _G[name]:Hide() @@ -363,8 +385,9 @@ function E:ToggleMovers(show, moverType) end function E:DisableMover(name) - if(self.DisabledMovers[name]) then return end - if(not self.CreatedMovers[name]) then + if self.DisabledMovers[name] then return end + + if not self.CreatedMovers[name] then error("mover doesn't exist") end @@ -373,7 +396,7 @@ function E:DisableMover(name) self.DisabledMovers[name][x] = y end - if(self.configMode) then + if self.configMode then _G[name]:Hide() end @@ -381,8 +404,9 @@ function E:DisableMover(name) end function E:EnableMover(name) - if(self.CreatedMovers[name]) then return end - if(not self.DisabledMovers[name]) then + if self.CreatedMovers[name] then return end + + if not self.DisabledMovers[name] then error("mover doesn't exist") end @@ -391,14 +415,13 @@ function E:EnableMover(name) self.CreatedMovers[name][x] = y end + --Make sure we add anchor information from a potential profile switch --Commented out, as it created an issue with trying to reset a mover after having used EnableMover on it. Not sure if this code is even needed anymore. ---[[ - if(E.db["movers"] and E.db["movers"][name] and type(E.db["movers"][name]) == "string") then - self.CreatedMovers[name]["point"] = E.db["movers"][name] - end -]] + -- if E.db.movers and E.db.movers[name] and type(E.db.movers[name]) == 'string' then + -- self.CreatedMovers[name].point = E.db.movers[name] + -- end - if(self.configMode) then + if self.configMode then _G[name]:Show() end @@ -409,7 +432,7 @@ function E:ResetMovers(arg) if arg == "" or arg == nil then for name, _ in pairs(E.CreatedMovers) do local f = _G[name] - local point, anchor, secondaryPoint, x, y = split(",", E.CreatedMovers[name]["point"]) + local point, anchor, secondaryPoint, x, y = split(",", E.CreatedMovers[name].point) f:ClearAllPoints() E:Point(f, point, anchor, secondaryPoint, x, y) @@ -426,7 +449,7 @@ function E:ResetMovers(arg) if key == "text" then if arg == value then local f = _G[name] - local point, anchor, secondaryPoint, x, y = split(",", E.CreatedMovers[name]["point"]) + local point, anchor, secondaryPoint, x, y = split(",", E.CreatedMovers[name].point) f:ClearAllPoints() E:Point(f, point, anchor, secondaryPoint, x, y) @@ -434,8 +457,8 @@ function E:ResetMovers(arg) self.db.movers[name] = nil end - if E.CreatedMovers[name]["postdrag"] ~= nil and type(E.CreatedMovers[name]["postdrag"]) == "function" then - E.CreatedMovers[name]["postdrag"](f, E:GetScreenQuadrant(f)) + if E.CreatedMovers[name].postdrag ~= nil and type(E.CreatedMovers[name].postdrag) == "function" then + E.CreatedMovers[name].postdrag(f, E:GetScreenQuadrant(f)) end end end @@ -446,8 +469,11 @@ end --Profile Change function E:SetMoversPositions() + --E:SetMoversPositions() is the first function called in E:UpdateAll(). + --Because of that, we can allow ourselves to re-enable all disabled movers here, + --as the subsequent updates to these elements will disable them again if needed. for name in pairs(E.DisabledMovers) do - local shouldDisable = ((E.DisabledMovers[name].shouldDisable and E.DisabledMovers[name]["shouldDisable"]()) or false) + local shouldDisable = ((E.DisabledMovers[name].shouldDisable and E.DisabledMovers[name].shouldDisable()) or false) if not shouldDisable then E:EnableMover(name) end @@ -456,19 +482,20 @@ function E:SetMoversPositions() for name, _ in pairs(E.CreatedMovers) do local f = _G[name] local point, anchor, secondaryPoint, x, y - if E.db["movers"] and E.db["movers"][name] and type(E.db["movers"][name]) == "string" then + if E.db.movers and E.db.movers[name] and type(E.db.movers[name]) == "string" then + --Backward compatibility local delim - local anchorString = E.db["movers"][name] - if(find(anchorString, "\031")) then + local anchorString = E.db.movers[name] + if find(anchorString, "\031") then delim = "\031" - elseif(find(anchorString, ",")) then + elseif find(anchorString, ",") then delim = "," end point, anchor, secondaryPoint, x, y = split(delim, anchorString) f:ClearAllPoints() E:Point(f, point, anchor, secondaryPoint, x, y) elseif f then - point, anchor, secondaryPoint, x, y = split(",", E.CreatedMovers[name]["point"]) + point, anchor, secondaryPoint, x, y = split(",", E.CreatedMovers[name].point) f:ClearAllPoints() E:Point(f, point, anchor, secondaryPoint, x, y) end @@ -477,21 +504,7 @@ end --Called from core.lua function E:LoadMovers() - for n, _ in pairs(E.CreatedMovers) do - local p, t, o, so, pd - for key, value in pairs(E.CreatedMovers[n]) do - if key == "parent" then - p = value - elseif key == "text" then - t = value - elseif key == "overlay" then - o = value - elseif key == "snapoffset" then - so = value - elseif key == "postdrag" then - pd = value - end - end - CreateMover(p, n, t, o, so, pd) + for n, t in pairs(E.CreatedMovers) do + CreateMover(t.parent, n, t.overlay, t.snapoffset, t.postdrag, t.shouldDisable, t.configString) end -end \ No newline at end of file +end