Mercurial > wow > hotcorners
diff Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua @ 22:3596dadf9a90 v8.1.0.022
- ToC and Libraries update.
author | Tercioo |
---|---|
date | Mon, 31 Dec 2018 11:30:31 -0200 |
parents | 9ad7f3c634f1 |
children |
line wrap: on
line diff
--- a/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua Fri Jul 20 19:13:22 2018 -0300 +++ b/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua Mon Dec 31 11:30:31 2018 -0200 @@ -6,19 +6,21 @@ -- local DBICON10 = "LibDBIcon-1.0" -local DBICON10_MINOR = 36 -- Bump on changes +local DBICON10_MINOR = 43 -- Bump on changes if not LibStub then error(DBICON10 .. " requires LibStub.") end local ldb = LibStub("LibDataBroker-1.1", true) if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end local lib = LibStub:NewLibrary(DBICON10, DBICON10_MINOR) if not lib then return end -lib.disabled = lib.disabled or nil lib.objects = lib.objects or {} lib.callbackRegistered = lib.callbackRegistered or nil lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) lib.notCreated = lib.notCreated or {} +lib.radius = lib.radius or 5 lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") +local next, Minimap = next, Minimap +local isDraggingButton = false function lib:IconCallback(event, name, key, value) if lib.objects[name] then @@ -56,7 +58,15 @@ end local function onEnter(self) - if self.isMoving then return end + if isDraggingButton then return end + + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Stop() + button:SetAlpha(1) + end + end + local obj = self.dataObject if obj.OnTooltipShow then lib.tooltip:SetOwner(self, "ANCHOR_NONE") @@ -69,14 +79,25 @@ end local function onLeave(self) + lib.tooltip:Hide() + + if not isDraggingButton then + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Play() + end + end + end + local obj = self.dataObject - lib.tooltip:Hide() - if obj.OnLeave then obj.OnLeave(self) end + if obj.OnLeave then + obj.OnLeave(self) + end end -------------------------------------------------------------------------------- -local onClick, onMouseUp, onMouseDown, onDragStart, onDragStop, updatePosition +local onDragStart, updatePosition do local minimapShapes = { @@ -96,40 +117,60 @@ ["TRICORNER-BOTTOMRIGHT"] = {true, true, true, false}, } - function updatePosition(button) - local angle = math.rad(button.db and button.db.minimapPos or button.minimapPos or 225) - local x, y, q = math.cos(angle), math.sin(angle), 1 + local rad, cos, sin, sqrt, max, min = math.rad, math.cos, math.sin, math.sqrt, math.max, math.min + function updatePosition(button, position) + local angle = rad(position or 225) + local x, y, q = cos(angle), sin(angle), 1 if x < 0 then q = q + 1 end if y > 0 then q = q + 2 end local minimapShape = GetMinimapShape and GetMinimapShape() or "ROUND" local quadTable = minimapShapes[minimapShape] + local w = (Minimap:GetWidth() / 2) + lib.radius + local h = (Minimap:GetHeight() / 2) + lib.radius if quadTable[q] then - x, y = x*80, y*80 + x, y = x*w, y*h else - local diagRadius = 103.13708498985 --math.sqrt(2*(80)^2)-10 - x = math.max(-80, math.min(x*diagRadius, 80)) - y = math.max(-80, math.min(y*diagRadius, 80)) + local diagRadiusW = sqrt(2*(w)^2)-10 + local diagRadiusH = sqrt(2*(h)^2)-10 + x = max(-w, min(x*diagRadiusW, w)) + y = max(-h, min(y*diagRadiusH, h)) end button:SetPoint("CENTER", Minimap, "CENTER", x, y) end end -function onClick(self, b) if self.dataObject.OnClick then self.dataObject.OnClick(self, b) end end -function onMouseDown(self) self.isMouseDown = true; self.icon:UpdateCoord() end -function onMouseUp(self) self.isMouseDown = false; self.icon:UpdateCoord() end +local function onClick(self, b) + if self.dataObject.OnClick then + self.dataObject.OnClick(self, b) + end +end + +local function onMouseDown(self) + self.isMouseDown = true + self.icon:UpdateCoord() +end + +local function onMouseUp(self) + self.isMouseDown = false + self.icon:UpdateCoord() +end do + local deg, atan2 = math.deg, math.atan2 local function onUpdate(self) local mx, my = Minimap:GetCenter() local px, py = GetCursorPosition() local scale = Minimap:GetEffectiveScale() px, py = px / scale, py / scale + local pos = 225 if self.db then - self.db.minimapPos = math.deg(math.atan2(py - my, px - mx)) % 360 + pos = deg(atan2(py - my, px - mx)) % 360 + self.db.minimapPos = pos else - self.minimapPos = math.deg(math.atan2(py - my, px - mx)) % 360 + pos = deg(atan2(py - my, px - mx)) % 360 + self.minimapPos = pos end - updatePosition(self) + updatePosition(self, pos) end function onDragStart(self) @@ -137,17 +178,28 @@ self.isMouseDown = true self.icon:UpdateCoord() self:SetScript("OnUpdate", onUpdate) - self.isMoving = true + isDraggingButton = true lib.tooltip:Hide() + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Stop() + button:SetAlpha(1) + end + end end end -function onDragStop(self) +local function onDragStop(self) self:SetScript("OnUpdate", nil) self.isMouseDown = false self.icon:UpdateCoord() self:UnlockHighlight() - self.isMoving = nil + isDraggingButton = false + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Play() + end + end end local defaultCoords = {0, 1, 0, 1} @@ -202,12 +254,24 @@ button:SetScript("OnMouseDown", onMouseDown) button:SetScript("OnMouseUp", onMouseUp) + button.fadeOut = button:CreateAnimationGroup() + local animOut = button.fadeOut:CreateAnimation("Alpha") + animOut:SetOrder(1) + animOut:SetDuration(0.2) + animOut:SetFromAlpha(1) + animOut:SetToAlpha(0) + animOut:SetStartDelay(1) + button.fadeOut:SetToFinalAlpha(true) + lib.objects[name] = button if lib.loggedIn then - updatePosition(button) - if not db or not db.hide then button:Show() - else button:Hide() end + updatePosition(button, db and db.minimapPos) + if not db or not db.hide then + button:Show() + else + button:Hide() + end end lib.callbacks:Fire("LibDBIcon_IconCreated", button, name) -- Fire 'Icon Created' callback end @@ -221,20 +285,21 @@ end end -lib.loggedIn = lib.loggedIn or false -- Wait a bit with the initial positioning to let any GetMinimapShape addons -- load up. if not lib.loggedIn then local f = CreateFrame("Frame") - f:SetScript("OnEvent", function() - for _, object in pairs(lib.objects) do - updatePosition(object) - if not lib.disabled and (not object.db or not object.db.hide) then object:Show() - else object:Hide() end + f:SetScript("OnEvent", function(f) + for _, button in next, lib.objects do + updatePosition(button, button.db and button.db.minimapPos) + if not button.db or not button.db.hide then + button:Show() + else + button:Hide() + end end lib.loggedIn = true f:SetScript("OnEvent", nil) - f = nil end) f:RegisterEvent("PLAYER_LOGIN") end @@ -245,8 +310,8 @@ function lib:Register(name, object, db) if not object.icon then error("Can't register LDB objects without icons set!") end - if lib.objects[name] or lib.notCreated[name] then error("Already registered, nubcake.") end - if not lib.disabled and (not db or not db.hide) then + if lib.objects[name] or lib.notCreated[name] then error(DBICON10.. ": Object '".. name .."' is already registered.") end + if not db or not db.hide then createButton(name, object, db) else lib.notCreated[name] = {object, db} @@ -260,7 +325,9 @@ lib.objects[name]:SetScript("OnDragStop", nil) end local db = getDatabase(name) - if db then db.lock = true end + if db then + db.lock = true + end end function lib:Unlock(name) @@ -270,28 +337,36 @@ lib.objects[name]:SetScript("OnDragStop", onDragStop) end local db = getDatabase(name) - if db then db.lock = nil end + if db then + db.lock = nil + end end function lib:Hide(name) if not lib.objects[name] then return end lib.objects[name]:Hide() end + function lib:Show(name) - if lib.disabled then return end check(name) - lib.objects[name]:Show() - updatePosition(lib.objects[name]) + local button = lib.objects[name] + if button then + button:Show() + updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) + end end + function lib:IsRegistered(name) return (lib.objects[name] or lib.notCreated[name]) and true or false end + function lib:Refresh(name, db) - if lib.disabled then return end check(name) local button = lib.objects[name] - if db then button.db = db end - updatePosition(button) + if db then + button.db = db + end + updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) if not button.db or not button.db.hide then button:Show() else @@ -305,30 +380,91 @@ button:SetScript("OnDragStop", nil) end end + function lib:GetMinimapButton(name) return lib.objects[name] end -function lib:EnableLibrary() - lib.disabled = nil - for name, object in pairs(lib.objects) do - if not object.db or not object.db.hide then - object:Show() - updatePosition(object) +do + local function OnMinimapEnter() + if isDraggingButton then return end + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Stop() + button:SetAlpha(1) + end end end - for name, data in pairs(lib.notCreated) do - if not data.db or not data.db.hide then - createButton(name, data[1], data[2]) - lib.notCreated[name] = nil + local function OnMinimapLeave() + if isDraggingButton then return end + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Play() + end + end + end + Minimap:HookScript("OnEnter", OnMinimapEnter) + Minimap:HookScript("OnLeave", OnMinimapLeave) + + function lib:ShowOnEnter(name, value) + local button = lib.objects[name] + if button then + if value then + button.showOnMouseover = true + button.fadeOut:Stop() + button:SetAlpha(0) + else + button.showOnMouseover = false + button.fadeOut:Stop() + button:SetAlpha(1) + end end end end -function lib:DisableLibrary() - lib.disabled = true - for name, object in pairs(lib.objects) do - object:Hide() +function lib:GetButtonList() + local t = {} + for name in next, lib.objects do + t[#t+1] = name + end + return t +end + +function lib:SetButtonRadius(radius) + if type(radius) == "number" then + lib.radius = radius + for _, button in next, lib.objects do + updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) + end end end +function lib:SetButtonToPosition(button, position) + updatePosition(lib.objects[button] or button, position) +end + +-- Upgrade! +for name, button in next, lib.objects do + local db = getDatabase(name) + if not db or not db.lock then + button:SetScript("OnDragStart", onDragStart) + button:SetScript("OnDragStop", onDragStop) + end + button:SetScript("OnEnter", onEnter) + button:SetScript("OnLeave", onLeave) + button:SetScript("OnClick", onClick) + button:SetScript("OnMouseDown", onMouseDown) + button:SetScript("OnMouseUp", onMouseUp) + + if not button.fadeOut then -- Upgrade to 39 + button.fadeOut = button:CreateAnimationGroup() + local animOut = button.fadeOut:CreateAnimation("Alpha") + animOut:SetOrder(1) + animOut:SetDuration(0.2) + animOut:SetFromAlpha(1) + animOut:SetToAlpha(0) + animOut:SetStartDelay(1) + button.fadeOut:SetToFinalAlpha(true) + end +end +lib:SetButtonRadius(lib.radius) -- Upgrade to 40