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