Mercurial > wow > hotcorners
comparison 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 |
comparison
equal
deleted
inserted
replaced
21:f29a995e98e3 | 22:3596dadf9a90 |
---|---|
4 -- | 4 -- |
5 -- Allows addons to easily create a lightweight minimap icon as an alternative to heavier LDB displays. | 5 -- Allows addons to easily create a lightweight minimap icon as an alternative to heavier LDB displays. |
6 -- | 6 -- |
7 | 7 |
8 local DBICON10 = "LibDBIcon-1.0" | 8 local DBICON10 = "LibDBIcon-1.0" |
9 local DBICON10_MINOR = 36 -- Bump on changes | 9 local DBICON10_MINOR = 43 -- Bump on changes |
10 if not LibStub then error(DBICON10 .. " requires LibStub.") end | 10 if not LibStub then error(DBICON10 .. " requires LibStub.") end |
11 local ldb = LibStub("LibDataBroker-1.1", true) | 11 local ldb = LibStub("LibDataBroker-1.1", true) |
12 if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end | 12 if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end |
13 local lib = LibStub:NewLibrary(DBICON10, DBICON10_MINOR) | 13 local lib = LibStub:NewLibrary(DBICON10, DBICON10_MINOR) |
14 if not lib then return end | 14 if not lib then return end |
15 | 15 |
16 lib.disabled = lib.disabled or nil | |
17 lib.objects = lib.objects or {} | 16 lib.objects = lib.objects or {} |
18 lib.callbackRegistered = lib.callbackRegistered or nil | 17 lib.callbackRegistered = lib.callbackRegistered or nil |
19 lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) | 18 lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) |
20 lib.notCreated = lib.notCreated or {} | 19 lib.notCreated = lib.notCreated or {} |
20 lib.radius = lib.radius or 5 | |
21 lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") | 21 lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") |
22 local next, Minimap = next, Minimap | |
23 local isDraggingButton = false | |
22 | 24 |
23 function lib:IconCallback(event, name, key, value) | 25 function lib:IconCallback(event, name, key, value) |
24 if lib.objects[name] then | 26 if lib.objects[name] then |
25 if key == "icon" then | 27 if key == "icon" then |
26 lib.objects[name].icon:SetTexture(value) | 28 lib.objects[name].icon:SetTexture(value) |
54 local vhalf = (y > UIParent:GetHeight()/2) and "TOP" or "BOTTOM" | 56 local vhalf = (y > UIParent:GetHeight()/2) and "TOP" or "BOTTOM" |
55 return vhalf..hhalf, frame, (vhalf == "TOP" and "BOTTOM" or "TOP")..hhalf | 57 return vhalf..hhalf, frame, (vhalf == "TOP" and "BOTTOM" or "TOP")..hhalf |
56 end | 58 end |
57 | 59 |
58 local function onEnter(self) | 60 local function onEnter(self) |
59 if self.isMoving then return end | 61 if isDraggingButton then return end |
62 | |
63 for _, button in next, lib.objects do | |
64 if button.showOnMouseover then | |
65 button.fadeOut:Stop() | |
66 button:SetAlpha(1) | |
67 end | |
68 end | |
69 | |
60 local obj = self.dataObject | 70 local obj = self.dataObject |
61 if obj.OnTooltipShow then | 71 if obj.OnTooltipShow then |
62 lib.tooltip:SetOwner(self, "ANCHOR_NONE") | 72 lib.tooltip:SetOwner(self, "ANCHOR_NONE") |
63 lib.tooltip:SetPoint(getAnchors(self)) | 73 lib.tooltip:SetPoint(getAnchors(self)) |
64 obj.OnTooltipShow(lib.tooltip) | 74 obj.OnTooltipShow(lib.tooltip) |
67 obj.OnEnter(self) | 77 obj.OnEnter(self) |
68 end | 78 end |
69 end | 79 end |
70 | 80 |
71 local function onLeave(self) | 81 local function onLeave(self) |
82 lib.tooltip:Hide() | |
83 | |
84 if not isDraggingButton then | |
85 for _, button in next, lib.objects do | |
86 if button.showOnMouseover then | |
87 button.fadeOut:Play() | |
88 end | |
89 end | |
90 end | |
91 | |
72 local obj = self.dataObject | 92 local obj = self.dataObject |
73 lib.tooltip:Hide() | 93 if obj.OnLeave then |
74 if obj.OnLeave then obj.OnLeave(self) end | 94 obj.OnLeave(self) |
95 end | |
75 end | 96 end |
76 | 97 |
77 -------------------------------------------------------------------------------- | 98 -------------------------------------------------------------------------------- |
78 | 99 |
79 local onClick, onMouseUp, onMouseDown, onDragStart, onDragStop, updatePosition | 100 local onDragStart, updatePosition |
80 | 101 |
81 do | 102 do |
82 local minimapShapes = { | 103 local minimapShapes = { |
83 ["ROUND"] = {true, true, true, true}, | 104 ["ROUND"] = {true, true, true, true}, |
84 ["SQUARE"] = {false, false, false, false}, | 105 ["SQUARE"] = {false, false, false, false}, |
94 ["TRICORNER-TOPRIGHT"] = {true, false, true, true}, | 115 ["TRICORNER-TOPRIGHT"] = {true, false, true, true}, |
95 ["TRICORNER-BOTTOMLEFT"] = {true, true, false, true}, | 116 ["TRICORNER-BOTTOMLEFT"] = {true, true, false, true}, |
96 ["TRICORNER-BOTTOMRIGHT"] = {true, true, true, false}, | 117 ["TRICORNER-BOTTOMRIGHT"] = {true, true, true, false}, |
97 } | 118 } |
98 | 119 |
99 function updatePosition(button) | 120 local rad, cos, sin, sqrt, max, min = math.rad, math.cos, math.sin, math.sqrt, math.max, math.min |
100 local angle = math.rad(button.db and button.db.minimapPos or button.minimapPos or 225) | 121 function updatePosition(button, position) |
101 local x, y, q = math.cos(angle), math.sin(angle), 1 | 122 local angle = rad(position or 225) |
123 local x, y, q = cos(angle), sin(angle), 1 | |
102 if x < 0 then q = q + 1 end | 124 if x < 0 then q = q + 1 end |
103 if y > 0 then q = q + 2 end | 125 if y > 0 then q = q + 2 end |
104 local minimapShape = GetMinimapShape and GetMinimapShape() or "ROUND" | 126 local minimapShape = GetMinimapShape and GetMinimapShape() or "ROUND" |
105 local quadTable = minimapShapes[minimapShape] | 127 local quadTable = minimapShapes[minimapShape] |
128 local w = (Minimap:GetWidth() / 2) + lib.radius | |
129 local h = (Minimap:GetHeight() / 2) + lib.radius | |
106 if quadTable[q] then | 130 if quadTable[q] then |
107 x, y = x*80, y*80 | 131 x, y = x*w, y*h |
108 else | 132 else |
109 local diagRadius = 103.13708498985 --math.sqrt(2*(80)^2)-10 | 133 local diagRadiusW = sqrt(2*(w)^2)-10 |
110 x = math.max(-80, math.min(x*diagRadius, 80)) | 134 local diagRadiusH = sqrt(2*(h)^2)-10 |
111 y = math.max(-80, math.min(y*diagRadius, 80)) | 135 x = max(-w, min(x*diagRadiusW, w)) |
136 y = max(-h, min(y*diagRadiusH, h)) | |
112 end | 137 end |
113 button:SetPoint("CENTER", Minimap, "CENTER", x, y) | 138 button:SetPoint("CENTER", Minimap, "CENTER", x, y) |
114 end | 139 end |
115 end | 140 end |
116 | 141 |
117 function onClick(self, b) if self.dataObject.OnClick then self.dataObject.OnClick(self, b) end end | 142 local function onClick(self, b) |
118 function onMouseDown(self) self.isMouseDown = true; self.icon:UpdateCoord() end | 143 if self.dataObject.OnClick then |
119 function onMouseUp(self) self.isMouseDown = false; self.icon:UpdateCoord() end | 144 self.dataObject.OnClick(self, b) |
145 end | |
146 end | |
147 | |
148 local function onMouseDown(self) | |
149 self.isMouseDown = true | |
150 self.icon:UpdateCoord() | |
151 end | |
152 | |
153 local function onMouseUp(self) | |
154 self.isMouseDown = false | |
155 self.icon:UpdateCoord() | |
156 end | |
120 | 157 |
121 do | 158 do |
159 local deg, atan2 = math.deg, math.atan2 | |
122 local function onUpdate(self) | 160 local function onUpdate(self) |
123 local mx, my = Minimap:GetCenter() | 161 local mx, my = Minimap:GetCenter() |
124 local px, py = GetCursorPosition() | 162 local px, py = GetCursorPosition() |
125 local scale = Minimap:GetEffectiveScale() | 163 local scale = Minimap:GetEffectiveScale() |
126 px, py = px / scale, py / scale | 164 px, py = px / scale, py / scale |
165 local pos = 225 | |
127 if self.db then | 166 if self.db then |
128 self.db.minimapPos = math.deg(math.atan2(py - my, px - mx)) % 360 | 167 pos = deg(atan2(py - my, px - mx)) % 360 |
168 self.db.minimapPos = pos | |
129 else | 169 else |
130 self.minimapPos = math.deg(math.atan2(py - my, px - mx)) % 360 | 170 pos = deg(atan2(py - my, px - mx)) % 360 |
131 end | 171 self.minimapPos = pos |
132 updatePosition(self) | 172 end |
173 updatePosition(self, pos) | |
133 end | 174 end |
134 | 175 |
135 function onDragStart(self) | 176 function onDragStart(self) |
136 self:LockHighlight() | 177 self:LockHighlight() |
137 self.isMouseDown = true | 178 self.isMouseDown = true |
138 self.icon:UpdateCoord() | 179 self.icon:UpdateCoord() |
139 self:SetScript("OnUpdate", onUpdate) | 180 self:SetScript("OnUpdate", onUpdate) |
140 self.isMoving = true | 181 isDraggingButton = true |
141 lib.tooltip:Hide() | 182 lib.tooltip:Hide() |
142 end | 183 for _, button in next, lib.objects do |
143 end | 184 if button.showOnMouseover then |
144 | 185 button.fadeOut:Stop() |
145 function onDragStop(self) | 186 button:SetAlpha(1) |
187 end | |
188 end | |
189 end | |
190 end | |
191 | |
192 local function onDragStop(self) | |
146 self:SetScript("OnUpdate", nil) | 193 self:SetScript("OnUpdate", nil) |
147 self.isMouseDown = false | 194 self.isMouseDown = false |
148 self.icon:UpdateCoord() | 195 self.icon:UpdateCoord() |
149 self:UnlockHighlight() | 196 self:UnlockHighlight() |
150 self.isMoving = nil | 197 isDraggingButton = false |
198 for _, button in next, lib.objects do | |
199 if button.showOnMouseover then | |
200 button.fadeOut:Play() | |
201 end | |
202 end | |
151 end | 203 end |
152 | 204 |
153 local defaultCoords = {0, 1, 0, 1} | 205 local defaultCoords = {0, 1, 0, 1} |
154 local function updateCoord(self) | 206 local function updateCoord(self) |
155 local coords = self:GetParent().dataObject.iconCoords or defaultCoords | 207 local coords = self:GetParent().dataObject.iconCoords or defaultCoords |
200 button:SetScript("OnDragStop", onDragStop) | 252 button:SetScript("OnDragStop", onDragStop) |
201 end | 253 end |
202 button:SetScript("OnMouseDown", onMouseDown) | 254 button:SetScript("OnMouseDown", onMouseDown) |
203 button:SetScript("OnMouseUp", onMouseUp) | 255 button:SetScript("OnMouseUp", onMouseUp) |
204 | 256 |
257 button.fadeOut = button:CreateAnimationGroup() | |
258 local animOut = button.fadeOut:CreateAnimation("Alpha") | |
259 animOut:SetOrder(1) | |
260 animOut:SetDuration(0.2) | |
261 animOut:SetFromAlpha(1) | |
262 animOut:SetToAlpha(0) | |
263 animOut:SetStartDelay(1) | |
264 button.fadeOut:SetToFinalAlpha(true) | |
265 | |
205 lib.objects[name] = button | 266 lib.objects[name] = button |
206 | 267 |
207 if lib.loggedIn then | 268 if lib.loggedIn then |
208 updatePosition(button) | 269 updatePosition(button, db and db.minimapPos) |
209 if not db or not db.hide then button:Show() | 270 if not db or not db.hide then |
210 else button:Hide() end | 271 button:Show() |
272 else | |
273 button:Hide() | |
274 end | |
211 end | 275 end |
212 lib.callbacks:Fire("LibDBIcon_IconCreated", button, name) -- Fire 'Icon Created' callback | 276 lib.callbacks:Fire("LibDBIcon_IconCreated", button, name) -- Fire 'Icon Created' callback |
213 end | 277 end |
214 | 278 |
215 -- We could use a metatable.__index on lib.objects, but then we'd create | 279 -- We could use a metatable.__index on lib.objects, but then we'd create |
219 createButton(name, lib.notCreated[name][1], lib.notCreated[name][2]) | 283 createButton(name, lib.notCreated[name][1], lib.notCreated[name][2]) |
220 lib.notCreated[name] = nil | 284 lib.notCreated[name] = nil |
221 end | 285 end |
222 end | 286 end |
223 | 287 |
224 lib.loggedIn = lib.loggedIn or false | |
225 -- Wait a bit with the initial positioning to let any GetMinimapShape addons | 288 -- Wait a bit with the initial positioning to let any GetMinimapShape addons |
226 -- load up. | 289 -- load up. |
227 if not lib.loggedIn then | 290 if not lib.loggedIn then |
228 local f = CreateFrame("Frame") | 291 local f = CreateFrame("Frame") |
229 f:SetScript("OnEvent", function() | 292 f:SetScript("OnEvent", function(f) |
230 for _, object in pairs(lib.objects) do | 293 for _, button in next, lib.objects do |
231 updatePosition(object) | 294 updatePosition(button, button.db and button.db.minimapPos) |
232 if not lib.disabled and (not object.db or not object.db.hide) then object:Show() | 295 if not button.db or not button.db.hide then |
233 else object:Hide() end | 296 button:Show() |
297 else | |
298 button:Hide() | |
299 end | |
234 end | 300 end |
235 lib.loggedIn = true | 301 lib.loggedIn = true |
236 f:SetScript("OnEvent", nil) | 302 f:SetScript("OnEvent", nil) |
237 f = nil | |
238 end) | 303 end) |
239 f:RegisterEvent("PLAYER_LOGIN") | 304 f:RegisterEvent("PLAYER_LOGIN") |
240 end | 305 end |
241 | 306 |
242 local function getDatabase(name) | 307 local function getDatabase(name) |
243 return lib.notCreated[name] and lib.notCreated[name][2] or lib.objects[name].db | 308 return lib.notCreated[name] and lib.notCreated[name][2] or lib.objects[name].db |
244 end | 309 end |
245 | 310 |
246 function lib:Register(name, object, db) | 311 function lib:Register(name, object, db) |
247 if not object.icon then error("Can't register LDB objects without icons set!") end | 312 if not object.icon then error("Can't register LDB objects without icons set!") end |
248 if lib.objects[name] or lib.notCreated[name] then error("Already registered, nubcake.") end | 313 if lib.objects[name] or lib.notCreated[name] then error(DBICON10.. ": Object '".. name .."' is already registered.") end |
249 if not lib.disabled and (not db or not db.hide) then | 314 if not db or not db.hide then |
250 createButton(name, object, db) | 315 createButton(name, object, db) |
251 else | 316 else |
252 lib.notCreated[name] = {object, db} | 317 lib.notCreated[name] = {object, db} |
253 end | 318 end |
254 end | 319 end |
258 if lib.objects[name] then | 323 if lib.objects[name] then |
259 lib.objects[name]:SetScript("OnDragStart", nil) | 324 lib.objects[name]:SetScript("OnDragStart", nil) |
260 lib.objects[name]:SetScript("OnDragStop", nil) | 325 lib.objects[name]:SetScript("OnDragStop", nil) |
261 end | 326 end |
262 local db = getDatabase(name) | 327 local db = getDatabase(name) |
263 if db then db.lock = true end | 328 if db then |
329 db.lock = true | |
330 end | |
264 end | 331 end |
265 | 332 |
266 function lib:Unlock(name) | 333 function lib:Unlock(name) |
267 if not lib:IsRegistered(name) then return end | 334 if not lib:IsRegistered(name) then return end |
268 if lib.objects[name] then | 335 if lib.objects[name] then |
269 lib.objects[name]:SetScript("OnDragStart", onDragStart) | 336 lib.objects[name]:SetScript("OnDragStart", onDragStart) |
270 lib.objects[name]:SetScript("OnDragStop", onDragStop) | 337 lib.objects[name]:SetScript("OnDragStop", onDragStop) |
271 end | 338 end |
272 local db = getDatabase(name) | 339 local db = getDatabase(name) |
273 if db then db.lock = nil end | 340 if db then |
341 db.lock = nil | |
342 end | |
274 end | 343 end |
275 | 344 |
276 function lib:Hide(name) | 345 function lib:Hide(name) |
277 if not lib.objects[name] then return end | 346 if not lib.objects[name] then return end |
278 lib.objects[name]:Hide() | 347 lib.objects[name]:Hide() |
279 end | 348 end |
349 | |
280 function lib:Show(name) | 350 function lib:Show(name) |
281 if lib.disabled then return end | |
282 check(name) | 351 check(name) |
283 lib.objects[name]:Show() | 352 local button = lib.objects[name] |
284 updatePosition(lib.objects[name]) | 353 if button then |
285 end | 354 button:Show() |
355 updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) | |
356 end | |
357 end | |
358 | |
286 function lib:IsRegistered(name) | 359 function lib:IsRegistered(name) |
287 return (lib.objects[name] or lib.notCreated[name]) and true or false | 360 return (lib.objects[name] or lib.notCreated[name]) and true or false |
288 end | 361 end |
362 | |
289 function lib:Refresh(name, db) | 363 function lib:Refresh(name, db) |
290 if lib.disabled then return end | |
291 check(name) | 364 check(name) |
292 local button = lib.objects[name] | 365 local button = lib.objects[name] |
293 if db then button.db = db end | 366 if db then |
294 updatePosition(button) | 367 button.db = db |
368 end | |
369 updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) | |
295 if not button.db or not button.db.hide then | 370 if not button.db or not button.db.hide then |
296 button:Show() | 371 button:Show() |
297 else | 372 else |
298 button:Hide() | 373 button:Hide() |
299 end | 374 end |
303 else | 378 else |
304 button:SetScript("OnDragStart", nil) | 379 button:SetScript("OnDragStart", nil) |
305 button:SetScript("OnDragStop", nil) | 380 button:SetScript("OnDragStop", nil) |
306 end | 381 end |
307 end | 382 end |
383 | |
308 function lib:GetMinimapButton(name) | 384 function lib:GetMinimapButton(name) |
309 return lib.objects[name] | 385 return lib.objects[name] |
310 end | 386 end |
311 | 387 |
312 function lib:EnableLibrary() | 388 do |
313 lib.disabled = nil | 389 local function OnMinimapEnter() |
314 for name, object in pairs(lib.objects) do | 390 if isDraggingButton then return end |
315 if not object.db or not object.db.hide then | 391 for _, button in next, lib.objects do |
316 object:Show() | 392 if button.showOnMouseover then |
317 updatePosition(object) | 393 button.fadeOut:Stop() |
318 end | 394 button:SetAlpha(1) |
319 end | 395 end |
320 for name, data in pairs(lib.notCreated) do | 396 end |
321 if not data.db or not data.db.hide then | 397 end |
322 createButton(name, data[1], data[2]) | 398 local function OnMinimapLeave() |
323 lib.notCreated[name] = nil | 399 if isDraggingButton then return end |
324 end | 400 for _, button in next, lib.objects do |
325 end | 401 if button.showOnMouseover then |
326 end | 402 button.fadeOut:Play() |
327 | 403 end |
328 function lib:DisableLibrary() | 404 end |
329 lib.disabled = true | 405 end |
330 for name, object in pairs(lib.objects) do | 406 Minimap:HookScript("OnEnter", OnMinimapEnter) |
331 object:Hide() | 407 Minimap:HookScript("OnLeave", OnMinimapLeave) |
332 end | 408 |
333 end | 409 function lib:ShowOnEnter(name, value) |
334 | 410 local button = lib.objects[name] |
411 if button then | |
412 if value then | |
413 button.showOnMouseover = true | |
414 button.fadeOut:Stop() | |
415 button:SetAlpha(0) | |
416 else | |
417 button.showOnMouseover = false | |
418 button.fadeOut:Stop() | |
419 button:SetAlpha(1) | |
420 end | |
421 end | |
422 end | |
423 end | |
424 | |
425 function lib:GetButtonList() | |
426 local t = {} | |
427 for name in next, lib.objects do | |
428 t[#t+1] = name | |
429 end | |
430 return t | |
431 end | |
432 | |
433 function lib:SetButtonRadius(radius) | |
434 if type(radius) == "number" then | |
435 lib.radius = radius | |
436 for _, button in next, lib.objects do | |
437 updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) | |
438 end | |
439 end | |
440 end | |
441 | |
442 function lib:SetButtonToPosition(button, position) | |
443 updatePosition(lib.objects[button] or button, position) | |
444 end | |
445 | |
446 -- Upgrade! | |
447 for name, button in next, lib.objects do | |
448 local db = getDatabase(name) | |
449 if not db or not db.lock then | |
450 button:SetScript("OnDragStart", onDragStart) | |
451 button:SetScript("OnDragStop", onDragStop) | |
452 end | |
453 button:SetScript("OnEnter", onEnter) | |
454 button:SetScript("OnLeave", onLeave) | |
455 button:SetScript("OnClick", onClick) | |
456 button:SetScript("OnMouseDown", onMouseDown) | |
457 button:SetScript("OnMouseUp", onMouseUp) | |
458 | |
459 if not button.fadeOut then -- Upgrade to 39 | |
460 button.fadeOut = button:CreateAnimationGroup() | |
461 local animOut = button.fadeOut:CreateAnimation("Alpha") | |
462 animOut:SetOrder(1) | |
463 animOut:SetDuration(0.2) | |
464 animOut:SetFromAlpha(1) | |
465 animOut:SetToAlpha(0) | |
466 animOut:SetStartDelay(1) | |
467 button.fadeOut:SetToFinalAlpha(true) | |
468 end | |
469 end | |
470 lib:SetButtonRadius(lib.radius) -- Upgrade to 40 |