From c44f0b26165fd54677a59335ac9b8ef131173bef Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Sun, 14 Jul 2024 18:42:20 +0200 Subject: [PATCH 01/12] Update lib --- APR-Recorder.toc | 6 +- libs/AceComm-3.0/AceComm-3.0.lua | 10 +- libs/AceComm-3.0/ChatThrottleLib.lua | 356 +++++++++++++----- libs/AceConfig-3.0/AceConfig-3.0.lua | 4 +- libs/AceDB-3.0/AceDB-3.0.lua | 8 +- .../widgets/AceGUIWidget-ColorPicker.lua | 25 +- libs/AceTimer-3.0/AceTimer-3.0.lua | 6 +- 7 files changed, 289 insertions(+), 126 deletions(-) diff --git a/APR-Recorder.toc b/APR-Recorder.toc index 8006906..b53bf11 100644 --- a/APR-Recorder.toc +++ b/APR-Recorder.toc @@ -1,5 +1,5 @@ -## Interface: 100207 -## X-Min-Interface: 100205 +## Interface: 110002 +## X-Min-Interface: 110000 ## Title: Azeroth Pilot Reloaded - [|cffeda55fRoute Recorder|r] ## Notes: A route recorder for Azeroth Pilot Reloaded @@ -16,7 +16,7 @@ ## X-Discord: https://discord.gg/YgcdybKdWX ## X-Curse-Project-ID: 965240 ## X-Wago-ID: rN4VYvKD -## X-WoWI-ID: ------ +## X-WoWI-ID: 26704 libs/embeds.xml locales/locales.xml diff --git a/libs/AceComm-3.0/AceComm-3.0.lua b/libs/AceComm-3.0/AceComm-3.0.lua index 3f21f5b..1fc7a37 100644 --- a/libs/AceComm-3.0/AceComm-3.0.lua +++ b/libs/AceComm-3.0/AceComm-3.0.lua @@ -9,7 +9,7 @@ -- make into AceComm. -- @class file -- @name AceComm-3.0 --- @release $Id: AceComm-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ +-- @release $Id: AceComm-3.0.lua 1333 2024-05-05 16:24:39Z nevcairiel $ --[[ AceComm-3.0 @@ -20,7 +20,7 @@ TODO: Time out old data rotting around from dead senders? Not a HUGE deal since local CallbackHandler = LibStub("CallbackHandler-1.0") local CTL = assert(ChatThrottleLib, "AceComm-3.0 requires ChatThrottleLib") -local MAJOR, MINOR = "AceComm-3.0", 12 +local MAJOR, MINOR = "AceComm-3.0", 14 local AceComm,oldminor = LibStub:NewLibrary(MAJOR, MINOR) if not AceComm then return end @@ -93,12 +93,12 @@ function AceComm:SendCommMessage(prefix, text, distribution, target, prio, callb local textlen = #text local maxtextlen = 255 -- Yes, the max is 255 even if the dev post said 256. I tested. Char 256+ get silently truncated. /Mikk, 20110327 - local queueName = prefix..distribution..(target or "") + local queueName = prefix local ctlCallback = nil if callbackFn then - ctlCallback = function(sent) - return callbackFn(callbackArg, sent, textlen) + ctlCallback = function(sent, sendResult) + return callbackFn(callbackArg, sent, textlen, sendResult) end end diff --git a/libs/AceComm-3.0/ChatThrottleLib.lua b/libs/AceComm-3.0/ChatThrottleLib.lua index d1dd8a0..688d318 100644 --- a/libs/AceComm-3.0/ChatThrottleLib.lua +++ b/libs/AceComm-3.0/ChatThrottleLib.lua @@ -23,7 +23,7 @@ -- LICENSE: ChatThrottleLib is released into the Public Domain -- -local CTL_VERSION = 24 +local CTL_VERSION = 29 local _G = _G @@ -74,9 +74,7 @@ local math_max = math.max local next = next local strlen = string.len local GetFramerate = GetFramerate -local strlower = string.lower local unpack,type,pairs,wipe = unpack,type,pairs,table.wipe -local UnitInRaid,UnitInParty = UnitInRaid,UnitInParty ----------------------------------------------------------------------- @@ -115,6 +113,23 @@ function Ring:Remove(obj) end end +-- Note that this is local because there's no upgrade logic for existing ring +-- metatables, and this isn't present on rings created in versions older than +-- v25. +local function Ring_Link(self, other) -- Move and append all contents of another ring to this ring + if not self.pos then + -- This ring is empty, so just transfer ownership. + self.pos = other.pos + other.pos = nil + elseif other.pos then + -- Our tail should point to their head, and their tail to our head. + self.pos.prev.next, other.pos.prev.next = other.pos, self.pos + -- Our head should point to their tail, and their head to our tail. + self.pos.prev, other.pos.prev = other.pos.prev, self.pos.prev + other.pos = nil + end +end + ----------------------------------------------------------------------- @@ -179,6 +194,13 @@ function ChatThrottleLib:Init() self.Prio["BULK"] = { ByName = {}, Ring = Ring:New(), avail = 0 } end + if not self.BlockedQueuesDelay then + -- v25: Add blocked queues to rings to handle new client throttles. + for _, Prio in pairs(self.Prio) do + Prio.Blocked = Ring:New() + end + end + -- v4: total send counters per priority for _, Prio in pairs(self.Prio) do Prio.nTotalSent = Prio.nTotalSent or 0 @@ -201,6 +223,7 @@ function ChatThrottleLib:Init() self.Frame:SetScript("OnEvent", self.OnEvent) -- v11: Monitor P_E_W so we can throttle hard for a few seconds self.Frame:RegisterEvent("PLAYER_ENTERING_WORLD") self.OnUpdateDelay = 0 + self.BlockedQueuesDelay = 0 self.LastAvailUpdate = GetTime() self.HardThrottlingBeginTime = GetTime() -- v11: Throttle hard for a few seconds after startup @@ -213,16 +236,27 @@ function ChatThrottleLib:Init() return ChatThrottleLib.Hook_SendChatMessage(...) end) --SendAddonMessage - if _G.C_ChatInfo then - hooksecurefunc(_G.C_ChatInfo, "SendAddonMessage", function(...) - return ChatThrottleLib.Hook_SendAddonMessage(...) - end) - else - hooksecurefunc("SendAddonMessage", function(...) - return ChatThrottleLib.Hook_SendAddonMessage(...) - end) - end + hooksecurefunc(_G.C_ChatInfo, "SendAddonMessage", function(...) + return ChatThrottleLib.Hook_SendAddonMessage(...) + end) + end + + -- v26: Hook SendAddonMessageLogged for traffic logging + if not self.securelyHookedLogged then + self.securelyHookedLogged = true + hooksecurefunc(_G.C_ChatInfo, "SendAddonMessageLogged", function(...) + return ChatThrottleLib.Hook_SendAddonMessageLogged(...) + end) + end + + -- v29: Hook BNSendGameData for traffic logging + if not self.securelyHookedBNGameData then + self.securelyHookedBNGameData = true + hooksecurefunc("BNSendGameData", function(...) + return ChatThrottleLib.Hook_BNSendGameData(...) + end) end + self.nBypass = 0 end @@ -251,6 +285,12 @@ function ChatThrottleLib.Hook_SendAddonMessage(prefix, text, chattype, destinati self.avail = self.avail - size self.nBypass = self.nBypass + size -- just a statistic end +function ChatThrottleLib.Hook_SendAddonMessageLogged(prefix, text, chattype, destination, ...) + ChatThrottleLib.Hook_SendAddonMessage(prefix, text, chattype, destination, ...) +end +function ChatThrottleLib.Hook_BNSendGameData(destination, prefix, text) + ChatThrottleLib.Hook_SendAddonMessage(prefix, text, "WHISPER", destination) +end @@ -292,38 +332,89 @@ end -- - ... made up of N "Pipe"s (1 for each destination/pipename) -- - and each pipe contains messages +local SendAddonMessageResult = Enum.SendAddonMessageResult or { + Success = 0, + AddonMessageThrottle = 3, + NotInGroup = 5, + ChannelThrottle = 8, + GeneralError = 9, +} + +local function MapToSendResult(ok, ...) + local result + + if not ok then + -- The send function itself errored; don't look at anything else. + result = SendAddonMessageResult.GeneralError + else + -- Grab the last return value from the send function and remap + -- it from a boolean to an enum code. If there are no results, + -- assume success (true). + + result = select(-1, true, ...) + + if result == true then + result = SendAddonMessageResult.Success + elseif result == false then + result = SendAddonMessageResult.GeneralError + end + end + + return result +end + +local function IsThrottledSendResult(result) + return result == SendAddonMessageResult.AddonMessageThrottle +end + +-- A copy of this function exists in FrameXML, but for clarity it's here too. +local function CallErrorHandler(...) + return geterrorhandler()(...) +end + +local function PerformSend(sendFunction, ...) + bMyTraffic = true + local sendResult = MapToSendResult(xpcall(sendFunction, CallErrorHandler, ...)) + bMyTraffic = false + return sendResult +end + function ChatThrottleLib:Despool(Prio) local ring = Prio.Ring while ring.pos and Prio.avail > ring.pos[1].nSize do - local msg = table_remove(ring.pos, 1) - if not ring.pos[1] then -- did we remove last msg in this pipe? - local pipe = Prio.Ring.pos + local pipe = ring.pos + local msg = pipe[1] + local sendResult = PerformSend(msg.f, unpack(msg, 1, msg.n)) + + if IsThrottledSendResult(sendResult) then + -- Message was throttled; move the pipe into the blocked ring. Prio.Ring:Remove(pipe) - Prio.ByName[pipe.name] = nil - DelPipe(pipe) - else - Prio.Ring.pos = Prio.Ring.pos.next - end - local didSend=false - local lowerDest = strlower(msg[3] or "") - if lowerDest == "raid" and not UnitInRaid("player") then - -- do nothing - elseif lowerDest == "party" and not UnitInParty("player") then - -- do nothing + Prio.Blocked:Add(pipe) else - Prio.avail = Prio.avail - msg.nSize - bMyTraffic = true - msg.f(unpack(msg, 1, msg.n)) - bMyTraffic = false - Prio.nTotalSent = Prio.nTotalSent + msg.nSize + -- Dequeue message after submission. + table_remove(pipe, 1) DelMsg(msg) - didSend = true - end - -- notify caller of delivery (even if we didn't send it) - if msg.callbackFn then - msg.callbackFn (msg.callbackArg, didSend) + + if not pipe[1] then -- did we remove last msg in this pipe? + Prio.Ring:Remove(pipe) + Prio.ByName[pipe.name] = nil + DelPipe(pipe) + else + ring.pos = ring.pos.next + end + + -- Update bandwidth counters on successful sends. + local didSend = (sendResult == SendAddonMessageResult.Success) + if didSend then + Prio.avail = Prio.avail - msg.nSize + Prio.nTotalSent = Prio.nTotalSent + msg.nSize + end + + -- Notify caller of message submission. + if msg.callbackFn then + securecallfunction(msg.callbackFn, msg.callbackArg, didSend, sendResult) + end end - -- USER CALLBACK MAY ERROR end end @@ -342,6 +433,7 @@ function ChatThrottleLib.OnUpdate(this,delay) local self = ChatThrottleLib self.OnUpdateDelay = self.OnUpdateDelay + delay + self.BlockedQueuesDelay = self.BlockedQueuesDelay + delay if self.OnUpdateDelay < 0.08 then return end @@ -353,40 +445,60 @@ function ChatThrottleLib.OnUpdate(this,delay) return -- argh. some bastard is spewing stuff past the lib. just bail early to save cpu. end - -- See how many of our priorities have queued messages (we only have 3, don't worry about the loop) - local n = 0 - for prioname,Prio in pairs(self.Prio) do - if Prio.Ring.pos or Prio.avail < 0 then - n = n + 1 + -- Integrate blocked queues back into their rings periodically. + if self.BlockedQueuesDelay >= 0.35 then + for _, Prio in pairs(self.Prio) do + Ring_Link(Prio.Ring, Prio.Blocked) end + + self.BlockedQueuesDelay = 0 end - -- Anything queued still? - if n<1 then - -- Nope. Move spillover bandwidth to global availability gauge and clear self.bQueueing - for prioname, Prio in pairs(self.Prio) do + -- See how many of our priorities have queued messages. This is split + -- into two counters because priorities that consist only of blocked + -- queues must keep our OnUpdate alive, but shouldn't count toward + -- bandwidth distribution. + local nSendablePrios = 0 + local nBlockedPrios = 0 + + for prioname, Prio in pairs(self.Prio) do + if Prio.Ring.pos then + nSendablePrios = nSendablePrios + 1 + elseif Prio.Blocked.pos then + nBlockedPrios = nBlockedPrios + 1 + end + + -- Collect unused bandwidth from priorities with nothing to send. + if not Prio.Ring.pos then self.avail = self.avail + Prio.avail Prio.avail = 0 end - self.bQueueing = false - self.Frame:Hide() + end + + -- Bandwidth reclamation may take us back over the burst cap. + self.avail = math_min(self.avail, self.BURST) + + -- If we can't currently send on any priorities, stop processing early. + if nSendablePrios == 0 then + -- If we're completely out of data to send, disable queue processing. + if nBlockedPrios == 0 then + self.bQueueing = false + self.Frame:Hide() + end + return end -- There's stuff queued. Hand out available bandwidth to priorities as needed and despool their queues - local avail = self.avail/n + local avail = self.avail / nSendablePrios self.avail = 0 for prioname, Prio in pairs(self.Prio) do - if Prio.Ring.pos or Prio.avail < 0 then + if Prio.Ring.pos then Prio.avail = Prio.avail + avail - if Prio.Ring.pos and Prio.avail > Prio.Ring.pos[1].nSize then - self:Despool(Prio) - -- Note: We might not get here if the user-supplied callback function errors out! Take care! - end + self:Despool(Prio) end end - end @@ -429,16 +541,22 @@ function ChatThrottleLib:SendChatMessage(prio, prefix, text, chattype, languag -- Check if there's room in the global available bandwidth gauge to send directly if not self.bQueueing and nSize < self:UpdateAvail() then - self.avail = self.avail - nSize - bMyTraffic = true - _G.SendChatMessage(text, chattype, language, destination) - bMyTraffic = false - self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize - if callbackFn then - callbackFn (callbackArg, true) + local sendResult = PerformSend(_G.SendChatMessage, text, chattype, language, destination) + + if not IsThrottledSendResult(sendResult) then + local didSend = (sendResult == SendAddonMessageResult.Success) + + if didSend then + self.avail = self.avail - nSize + self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize + end + + if callbackFn then + securecallfunction(callbackFn, callbackArg, didSend, sendResult) + end + + return end - -- USER CALLBACK MAY ERROR - return end -- Message needs to be queued @@ -453,54 +571,36 @@ function ChatThrottleLib:SendChatMessage(prio, prefix, text, chattype, languag msg.callbackFn = callbackFn msg.callbackArg = callbackArg - self:Enqueue(prio, queueName or (prefix..(chattype or "SAY")..(destination or "")), msg) + self:Enqueue(prio, queueName or prefix, msg) end -function ChatThrottleLib:SendAddonMessage(prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg) - if not self or not prio or not prefix or not text or not chattype or not self.Prio[prio] then - error('Usage: ChatThrottleLib:SendAddonMessage("{BULK||NORMAL||ALERT}", "prefix", "text", "chattype"[, "target"])', 2) - end - if callbackFn and type(callbackFn)~="function" then - error('ChatThrottleLib:SendAddonMessage(): callbackFn: expected function, got '..type(callbackFn), 2) - end +local function SendAddonMessageInternal(self, sendFunction, prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg) + local nSize = #text + self.MSG_OVERHEAD - local nSize = text:len(); + -- Check if there's room in the global available bandwidth gauge to send directly + if not self.bQueueing and nSize < self:UpdateAvail() then + local sendResult = PerformSend(sendFunction, prefix, text, chattype, target) - if C_ChatInfo or RegisterAddonMessagePrefix then - if nSize>255 then - error("ChatThrottleLib:SendAddonMessage(): message length cannot exceed 255 bytes", 2) - end - else - nSize = nSize + prefix:len() + 1 - if nSize>255 then - error("ChatThrottleLib:SendAddonMessage(): prefix + message length cannot exceed 254 bytes", 2) - end - end + if not IsThrottledSendResult(sendResult) then + local didSend = (sendResult == SendAddonMessageResult.Success) + + if didSend then + self.avail = self.avail - nSize + self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize + end - nSize = nSize + self.MSG_OVERHEAD; + if callbackFn then + securecallfunction(callbackFn, callbackArg, didSend, sendResult) + end - -- Check if there's room in the global available bandwidth gauge to send directly - if not self.bQueueing and nSize < self:UpdateAvail() then - self.avail = self.avail - nSize - bMyTraffic = true - if _G.C_ChatInfo then - _G.C_ChatInfo.SendAddonMessage(prefix, text, chattype, target) - else - _G.SendAddonMessage(prefix, text, chattype, target) - end - bMyTraffic = false - self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize - if callbackFn then - callbackFn (callbackArg, true) + return end - -- USER CALLBACK MAY ERROR - return end -- Message needs to be queued local msg = NewMsg() - msg.f = _G.C_ChatInfo and _G.C_ChatInfo.SendAddonMessage or _G.SendAddonMessage + msg.f = sendFunction msg[1] = prefix msg[2] = text msg[3] = chattype @@ -510,10 +610,64 @@ function ChatThrottleLib:SendAddonMessage(prio, prefix, text, chattype, target, msg.callbackFn = callbackFn msg.callbackArg = callbackArg - self:Enqueue(prio, queueName or (prefix..chattype..(target or "")), msg) + self:Enqueue(prio, queueName or prefix, msg) +end + + +function ChatThrottleLib:SendAddonMessage(prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg) + if not self or not prio or not prefix or not text or not chattype or not self.Prio[prio] then + error('Usage: ChatThrottleLib:SendAddonMessage("{BULK||NORMAL||ALERT}", "prefix", "text", "chattype"[, "target"])', 2) + elseif callbackFn and type(callbackFn)~="function" then + error('ChatThrottleLib:SendAddonMessage(): callbackFn: expected function, got '..type(callbackFn), 2) + elseif #text>255 then + error("ChatThrottleLib:SendAddonMessage(): message length cannot exceed 255 bytes", 2) + end + + local sendFunction = _G.C_ChatInfo.SendAddonMessage + SendAddonMessageInternal(self, sendFunction, prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg) end +function ChatThrottleLib:SendAddonMessageLogged(prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg) + if not self or not prio or not prefix or not text or not chattype or not self.Prio[prio] then + error('Usage: ChatThrottleLib:SendAddonMessageLogged("{BULK||NORMAL||ALERT}", "prefix", "text", "chattype"[, "target"])', 2) + elseif callbackFn and type(callbackFn)~="function" then + error('ChatThrottleLib:SendAddonMessageLogged(): callbackFn: expected function, got '..type(callbackFn), 2) + elseif #text>255 then + error("ChatThrottleLib:SendAddonMessageLogged(): message length cannot exceed 255 bytes", 2) + end + + local sendFunction = _G.C_ChatInfo.SendAddonMessageLogged + SendAddonMessageInternal(self, sendFunction, prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg) +end + +local function BNSendGameDataReordered(prefix, text, _, gameAccountID) + return _G.BNSendGameData(gameAccountID, prefix, text) +end + +function ChatThrottleLib:BNSendGameData(prio, prefix, text, chattype, gameAccountID, queueName, callbackFn, callbackArg) + -- Note that this API is intentionally limited to 255 bytes of data + -- for reasons of traffic fairness, which is less than the 4078 bytes + -- BNSendGameData natively supports. Additionally, a chat type is required + -- but must always be set to 'WHISPER' to match what is exposed by the + -- receipt event. + -- + -- If splitting messages, callers must also be aware that message + -- delivery over BNSendGameData is unordered. + + if not self or not prio or not prefix or not text or not gameAccountID or not chattype or not self.Prio[prio] then + error('Usage: ChatThrottleLib:BNSendGameData("{BULK||NORMAL||ALERT}", "prefix", "text", "chattype", gameAccountID)', 2) + elseif callbackFn and type(callbackFn)~="function" then + error('ChatThrottleLib:BNSendGameData(): callbackFn: expected function, got '..type(callbackFn), 2) + elseif #text>255 then + error("ChatThrottleLib:BNSendGameData(): message length cannot exceed 255 bytes", 2) + elseif chattype ~= "WHISPER" then + error("ChatThrottleLib:BNSendGameData(): chat type must be 'WHISPER'", 2) + end + + local sendFunction = BNSendGameDataReordered + SendAddonMessageInternal(self, sendFunction, prio, prefix, text, chattype, gameAccountID, queueName, callbackFn, callbackArg) +end ----------------------------------------------------------------------- diff --git a/libs/AceConfig-3.0/AceConfig-3.0.lua b/libs/AceConfig-3.0/AceConfig-3.0.lua index 5071cdc..ab91c9e 100644 --- a/libs/AceConfig-3.0/AceConfig-3.0.lua +++ b/libs/AceConfig-3.0/AceConfig-3.0.lua @@ -3,7 +3,7 @@ -- as well as associate it with a slash command. -- @class file -- @name AceConfig-3.0 --- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ +-- @release $Id: AceConfig-3.0.lua 1335 2024-05-05 19:35:16Z nevcairiel $ --[[ AceConfig-3.0 @@ -27,7 +27,7 @@ if not AceConfig then return end local pcall, error, type, pairs = pcall, error, type, pairs -- ------------------------------------------------------------------- --- :RegisterOptionsTable(appName, options, slashcmd, persist) +-- :RegisterOptionsTable(appName, options, slashcmd) -- -- - appName - (string) application name -- - options - table or function ref, see AceConfigRegistry diff --git a/libs/AceDB-3.0/AceDB-3.0.lua b/libs/AceDB-3.0/AceDB-3.0.lua index a8e306a..1e25429 100644 --- a/libs/AceDB-3.0/AceDB-3.0.lua +++ b/libs/AceDB-3.0/AceDB-3.0.lua @@ -40,8 +40,8 @@ -- end -- @class file -- @name AceDB-3.0.lua --- @release $Id: AceDB-3.0.lua 1306 2023-06-23 14:55:09Z nevcairiel $ -local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 28 +-- @release $Id: AceDB-3.0.lua 1328 2024-03-20 22:36:27Z nevcairiel $ +local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 29 local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR) if not AceDB then return end -- No upgrade needed @@ -606,8 +606,8 @@ end -- profile. -- @param defaultProfile The profile name to use as the default function DBObjectLib:ResetDB(defaultProfile) - if defaultProfile and type(defaultProfile) ~= "string" then - error(("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected, got %q."):format(type(defaultProfile)), 2) + if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then + error(("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or true expected, got %q."):format(type(defaultProfile)), 2) end local sv = self.sv diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua index 2d12ab7..ec811d0 100644 --- a/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua +++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua @@ -1,7 +1,7 @@ --[[----------------------------------------------------------------------------- ColorPicker Widget -------------------------------------------------------------------------------]] -local Type, Version = "ColorPicker", 27 +local Type, Version = "ColorPicker", 28 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end @@ -11,10 +11,17 @@ local pairs = pairs -- WoW APIs local CreateFrame, UIParent = CreateFrame, UIParent +-- Unfortunately we have no way to realistically detect if a client uses inverted alpha +-- as no API will tell you. Wrath uses the old colorpicker, era uses the new one, both are inverted +local INVERTED_ALPHA = (WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE) + --[[----------------------------------------------------------------------------- Support functions -------------------------------------------------------------------------------]] local function ColorCallback(self, r, g, b, a, isAlpha) + if INVERTED_ALPHA and a then + a = 1 - a + end if not self.HasAlpha then a = 1 end @@ -53,10 +60,12 @@ local function ColorSwatch_OnClick(frame) ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG") ColorPickerFrame:SetFrameLevel(frame:GetFrameLevel() + 10) ColorPickerFrame:SetClampedToScreen(true) - ColorPickerFrame:EnableMouse(true) -- Make sure the background isn't click-through if ColorPickerFrame.SetupColorPickerAndShow then -- 10.2.5 color picker overhaul - local r2, g2, b2, a2 = self.r, self.g, self.b, self.a + local r2, g2, b2, a2 = self.r, self.g, self.b, (self.a or 1) + if INVERTED_ALPHA then + a2 = 1 - a2 + end local info = { swatchFunc = function() @@ -71,7 +80,7 @@ local function ColorSwatch_OnClick(frame) local a = ColorPickerFrame:GetColorAlpha() ColorCallback(self, r, g, b, a, true) end, - opacity = (a2 or 1), + opacity = a2, cancelFunc = function() ColorCallback(self, r2, g2, b2, a2, true) @@ -86,20 +95,20 @@ local function ColorSwatch_OnClick(frame) else ColorPickerFrame.func = function() local r, g, b = ColorPickerFrame:GetColorRGB() - local a = 1 - OpacitySliderFrame:GetValue() + local a = OpacitySliderFrame:GetValue() ColorCallback(self, r, g, b, a) end ColorPickerFrame.hasOpacity = self.HasAlpha ColorPickerFrame.opacityFunc = function() local r, g, b = ColorPickerFrame:GetColorRGB() - local a = 1 - OpacitySliderFrame:GetValue() + local a = OpacitySliderFrame:GetValue() ColorCallback(self, r, g, b, a, true) end - local r, g, b, a = self.r, self.g, self.b, self.a + local r, g, b, a = self.r, self.g, self.b, 1 - (self.a or 1) if self.HasAlpha then - ColorPickerFrame.opacity = 1 - (a or 0) + ColorPickerFrame.opacity = a end ColorPickerFrame:SetColorRGB(r, g, b) diff --git a/libs/AceTimer-3.0/AceTimer-3.0.lua b/libs/AceTimer-3.0/AceTimer-3.0.lua index 8776da2..78fb4ed 100644 --- a/libs/AceTimer-3.0/AceTimer-3.0.lua +++ b/libs/AceTimer-3.0/AceTimer-3.0.lua @@ -15,7 +15,7 @@ -- make into AceTimer. -- @class file -- @name AceTimer-3.0 --- @release $Id: AceTimer-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ +-- @release $Id: AceTimer-3.0.lua 1342 2024-05-26 11:49:35Z nevcairiel $ local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR) @@ -78,7 +78,7 @@ end --- Schedule a new one-shot timer. -- The timer will fire once in `delay` seconds, unless canceled before. --- @param callback Callback function for the timer pulse (funcref or method name). +-- @param func Callback function for the timer pulse (funcref or method name). -- @param delay Delay for the timer, in seconds. -- @param ... An optional, unlimited amount of arguments to pass to the callback function. -- @usage @@ -107,7 +107,7 @@ end --- Schedule a repeating timer. -- The timer will fire every `delay` seconds, until canceled. --- @param callback Callback function for the timer pulse (funcref or method name). +-- @param func Callback function for the timer pulse (funcref or method name). -- @param delay Delay for the timer, in seconds. -- @param ... An optional, unlimited amount of arguments to pass to the callback function. -- @usage From 873e6b8affc000a9729054d6ee3a8b75d7f2ca1a Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Sun, 14 Jul 2024 18:42:48 +0200 Subject: [PATCH 02/12] Add highlight for filler frame --- frames/fillersSelection.lua | 64 +++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/frames/fillersSelection.lua b/frames/fillersSelection.lua index afe9fab..c6c0d8d 100644 --- a/frames/fillersSelection.lua +++ b/frames/fillersSelection.lua @@ -21,38 +21,46 @@ function AprRC.fillers:Show() local questList = AprRC.fillers:GetQuestList() for _, quest in ipairs(questList) do - local questGroup = AceGUI:Create("InlineGroup") - questGroup:SetFullWidth(true) - questGroup:SetTitle(quest.title) - questGroup:SetLayout("List") + if #quest.objectives > 0 then + local questGroup = AceGUI:Create("InlineGroup") + questGroup:SetFullWidth(true) + questGroup:SetTitle(quest.title) + questGroup:SetLayout("List") - for i, objective in ipairs(quest.objectives) do - local objectiveLabel = AceGUI:Create("InteractiveLabel") - objectiveLabel:SetText("[" .. objective.objectiveID .. "]" .. " - " .. objective.text) - objectiveLabel:SetFullWidth(true) - objectiveLabel:SetCallback("OnClick", function() - local currentStep = AprRC:GetLastStep() - if not currentStep.Fillers then - currentStep.Fillers = {} + for i, objective in ipairs(quest.objectives) do + local objectiveLabel = AceGUI:Create("InteractiveLabel") + objectiveLabel:SetText("[" .. objective.objectiveID .. "]" .. " - " .. objective.text) + objectiveLabel:SetFullWidth(true) + objectiveLabel:SetCallback("OnClick", function() + local currentStep = AprRC:GetLastStep() + if not currentStep.Fillers then + currentStep.Fillers = {} + end + if not currentStep.Fillers[quest.questID] then + currentStep.Fillers[quest.questID] = {} + end + tinsert(currentStep.Fillers[quest.questID], objective.objectiveID) + print("|cff00bfffFillers - [" .. quest.title .. "] - " .. objective.objectiveID .. "|r Added") + AceGUI:Release(frame) + end) + objectiveLabel:SetCallback("OnEnter", function(widget) + widget:SetHighlight("Interface\\Buttons\\UI-Common-MouseHilight") + end) + objectiveLabel:SetCallback("OnLeave", function(widget) + widget:SetHighlight(nil) + end) + questGroup:AddChild(objectiveLabel) + if i < #quest.objectives then + local spacer = AceGUI:Create("Label") + spacer:SetText("") + spacer:SetFullWidth(true) + spacer:SetHeight(10) + questGroup:AddChild(spacer) end - if not currentStep.Fillers[quest.questID] then - currentStep.Fillers[quest.questID] = {} - end - tinsert(currentStep.Fillers[quest.questID], objective.objectiveID) - print("|cff00bfffFillers - [" .. quest.title .. "] - " .. objective.objectiveID .. "|r Added") - AceGUI:Release(frame) - end) - questGroup:AddChild(objectiveLabel) - if i < #quest.objectives then - local spacer = AceGUI:Create("Label") - spacer:SetText("") - spacer:SetFullWidth(true) - spacer:SetHeight(10) - questGroup:AddChild(spacer) end - end - scrollFrame:AddChild(questGroup) + scrollFrame:AddChild(questGroup) + end end frame:AddChild(scrollFrame) From 3704ebcf8d41d9d82a153ddb434d7c343bb3a345 Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Sun, 14 Jul 2024 19:13:34 +0200 Subject: [PATCH 03/12] Fix lua error for settings frame --- Config.lua | 70 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/Config.lua b/Config.lua index 15f0d99..bb64ab7 100644 --- a/Config.lua +++ b/Config.lua @@ -120,31 +120,20 @@ function AprRC.settings:createBlizzOptions() order = 2, type = "header", width = "full", - name = "Somthing :)", + name = "Settings", }, - somthing = { + icon = { order = 3, type = "group", - name = "What a group", + name = "Minimap", inline = true, args = { - enableAddon = { - order = 3.1, - type = "toggle", - name = L_APR["ENABLE_ADDON"], - width = "full", - get = GetProfileOption, - set = function(info, value) - SetProfileOption(info, value) - self:ToggleAddon() - end, - }, enableMinimapButton = { name = L_APR["ENABLE_MINIMAP_BUTTON"], desc = L_APR["ENABLE_MINIMAP_BUTTON_DESC"], type = "toggle", width = "full", - order = 9.20, + order = 3.1, get = GetProfileOption, set = function(info, value) SetProfileOption(info, value) @@ -155,8 +144,28 @@ function AprRC.settings:createBlizzOptions() end end }, + + } + }, + debug = { + order = 4, + type = "group", + name = "Debug", + inline = true, + args = { + enableAddon = { + order = 4.1, + type = "toggle", + name = L_APR["ENABLE_ADDON"], + width = "full", + get = GetProfileOption, + set = function(info, value) + SetProfileOption(info, value) + self:ToggleAddon() + end, + }, debug = { - order = 3.2, + order = 4.2, type = "toggle", name = L_APR["DEBUG"], width = "full", @@ -179,6 +188,9 @@ function AprRC.settings:createBlizzOptions() -- add profile to bliz option aceConfig:RegisterOptionsTable(AprRC.title .. "/Profile", _G.LibStub("AceDBOptions-3.0"):GetOptionsTable(SettingsDB)) aceDialog:AddToBlizOptions(AprRC.title .. "/Profile", L_APR["PROFILES"], AprRC.title) + + local category, layout = Settings.RegisterCanvasLayoutCategory(AprRC, AprRC.title); + AprRC.settings.category = category end function AprRC.settings:CreateMiniMapButton() @@ -192,7 +204,11 @@ function AprRC.settings:CreateMiniMapButton() self.profile.enableAddon = not self.profile.enableAddon self:ToggleAddon() else - AprRC.settings:OpenSettings(AprRC.title) + if SettingsPanel:IsShown() then + self:CloseSettings() + else + self:OpenSettings(AprRC.title) + end end end, OnTooltipShow = function(tooltip) @@ -219,7 +235,11 @@ end function AprRC.settings:OpenSettings(name) if name == AprRC.title then - InterfaceOptionsFrame_OpenToCategory(AprRC.title) + if InterfaceOptionsFrame_OpenToCategory then + InterfaceOptionsFrame_OpenToCategory(AprRC.title) + else + Settings.OpenToCategory(self.category.ID) + end AprRC.settings:OpenSettings(L_APR["PROFILES"]) end if AprRC.Options then @@ -244,6 +264,20 @@ function AprRC.settings:OpenSettings(name) InterfaceOptionsFrame_OpenToCategory(AprRC.OptionsRoute) end return + else + Settings.OpenToCategory(self.category.ID) + end + end +end + +function AprRC.settings:CloseSettings() + if AprRC.Options then + if SettingsPanel then + local category = SettingsPanel:GetCategoryList():GetCategory(AprRC.Options.name) + if category then + SettingsPanel:Hide() + end + return end end end From 6505e470faa120dfbc6041e08a0b6fb4860d18d0 Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Sun, 14 Jul 2024 23:13:06 +0200 Subject: [PATCH 04/12] Add highlight et index on step --- Commands.lua | 69 ++++++++++++++++++---------------- frames/autocompleteLocales.lua | 7 +++- frames/fillersSelection.lua | 2 +- helper/RouteManagement.lua | 1 + 4 files changed, 44 insertions(+), 35 deletions(-) diff --git a/Commands.lua b/Commands.lua index 9e25110..f26abbe 100644 --- a/Commands.lua +++ b/Commands.lua @@ -142,55 +142,58 @@ function AprRC.command:SlashCmd(input) return elseif inputText == "pickupdb" then if AprRC:HasStepOption("PickUp") then - AprRC.questionDialog:CreateEditBoxPopupWithCallback("PickUp DB (QuestID)", function(questId) - local currentStep = AprRC:GetLastStep() - if AprRC:HasStepOption("PickUpDB") then - tinsert(currentStep.PickUpDB, tonumber(questId, 10)) - else - currentStep.PickUpDB = { tonumber(questId, 10) } - for _, qID in pairs(currentStep.PickUp) do - tinsert(currentStep.PickUpDB, qID) + AprRC.questionDialog:CreateEditBoxPopupWithCallback("PickUp DB (QuestID) - Also add PickUp QuestID", + function(questId) + local currentStep = AprRC:GetLastStep() + if AprRC:HasStepOption("PickUpDB") then + tinsert(currentStep.PickUpDB, tonumber(questId, 10)) + else + currentStep.PickUpDB = { tonumber(questId, 10) } + for _, qID in pairs(currentStep.PickUp) do + tinsert(currentStep.PickUpDB, qID) + end end - end - print("|cff00bfffPickUpDB - " .. tonumber(questId, 10) .. "|r Added") - end) + print("|cff00bfffPickUpDB - " .. tonumber(questId, 10) .. "|r Added") + end) else AprRC:Error('Missing PickUp option on current step') end return elseif inputText == "qpartdb" then if AprRC:HasStepOption("Qpart") then - AprRC.questionDialog:CreateEditBoxPopupWithCallback("Qpart DB (QuestID)", function(questId) - local currentStep = AprRC:GetLastStep() - if AprRC:HasStepOption("QpartDB") then - tinsert(currentStep.QpartDB, tonumber(questId, 10)) - else - currentStep.QpartDB = { tonumber(questId, 10) } + AprRC.questionDialog:CreateEditBoxPopupWithCallback("Qpart DB (QuestID) - Also add Qpart QuestID", + function(questId) + local currentStep = AprRC:GetLastStep() + if AprRC:HasStepOption("QpartDB") then + tinsert(currentStep.QpartDB, tonumber(questId, 10)) + else + currentStep.QpartDB = { tonumber(questId, 10) } - for qID, _ in pairs(currentStep.Qpart) do - tinsert(currentStep.QpartDB, qID) + for qID, _ in pairs(currentStep.Qpart) do + tinsert(currentStep.QpartDB, qID) + end end - end - print("|cff00bfffQpartDB - " .. tonumber(questId, 10) .. "|r Added") - end) + print("|cff00bfffQpartDB - " .. tonumber(questId, 10) .. "|r Added") + end) else AprRC:Error('Missing Qpart option on current step') end return elseif inputText == "donedb" then if AprRC:HasStepOption("Done") then - AprRC.questionDialog:CreateEditBoxPopupWithCallback("Done DB (QuestID)", function(questId) - local currentStep = AprRC:GetLastStep() - if AprRC:HasStepOption("DoneDB") then - tinsert(currentStep.DoneDB, tonumber(questId, 10)) - else - currentStep.DoneDB = { tonumber(questId, 10) } - for _, qID in pairs(currentStep.Done) do - tinsert(currentStep.DoneDB, qID) + AprRC.questionDialog:CreateEditBoxPopupWithCallback("Done DB (QuestID) - Also add Done QuestID", + function(questId) + local currentStep = AprRC:GetLastStep() + if AprRC:HasStepOption("DoneDB") then + tinsert(currentStep.DoneDB, tonumber(questId, 10)) + else + currentStep.DoneDB = { tonumber(questId, 10) } + for _, qID in pairs(currentStep.Done) do + tinsert(currentStep.DoneDB, qID) + end end - end - print("|cff00bfffDoneDB - " .. tonumber(questId, 10) .. "|r Added") - end) + print("|cff00bfffDoneDB - " .. tonumber(questId, 10) .. "|r Added") + end) else AprRC:Error('Missing Done option on current step') end diff --git a/frames/autocompleteLocales.lua b/frames/autocompleteLocales.lua index 1f96f5c..843ce0d 100644 --- a/frames/autocompleteLocales.lua +++ b/frames/autocompleteLocales.lua @@ -14,7 +14,6 @@ function AprRC.autocomplete:Show() frame:EnableResize(false) frame:SetLayout("Flow") - local editbox = AceGUI:Create("EditBox") editbox:SetLabel("Enter text") editbox:SetFullWidth(true) @@ -63,6 +62,12 @@ function AprRC.autocomplete:Show() scrollFrame:ReleaseChildren() -- Clear list after selection scrollFrame.frame:Hide() end) + interacLabel:SetCallback("OnEnter", function(widget) + widget:SetHighlight("Interface\\QuestFrame\\UI-QuestTitleHighlight") + end) + interacLabel:SetCallback("OnLeave", function(widget) + widget:SetHighlight(nil) + end) scrollFrame.frame:Show() scrollFrame:AddChild(interacLabel) end diff --git a/frames/fillersSelection.lua b/frames/fillersSelection.lua index c6c0d8d..26619a3 100644 --- a/frames/fillersSelection.lua +++ b/frames/fillersSelection.lua @@ -44,7 +44,7 @@ function AprRC.fillers:Show() AceGUI:Release(frame) end) objectiveLabel:SetCallback("OnEnter", function(widget) - widget:SetHighlight("Interface\\Buttons\\UI-Common-MouseHilight") + widget:SetHighlight("Interface\\QuestFrame\\UI-QuestTitleHighlight") end) objectiveLabel:SetCallback("OnLeave", function(widget) widget:SetHighlight(nil) diff --git a/helper/RouteManagement.lua b/helper/RouteManagement.lua index cee3bce..5b84c17 100644 --- a/helper/RouteManagement.lua +++ b/helper/RouteManagement.lua @@ -28,6 +28,7 @@ function AprRC:NewStep(step) if AprRC:IsTableEmpty(lastStep) then AprRCData.CurrentRoute.steps = {} end + step._index = #AprRCData.CurrentRoute.steps + 1 tinsert(AprRCData.CurrentRoute.steps, step) end From 6c03e80e497756157ea589ccdb66258e892200fa Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Sun, 14 Jul 2024 23:15:50 +0200 Subject: [PATCH 05/12] Add Debounce on autocomplete to avoid lag --- frames/autocompleteLocales.lua | 57 ++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/frames/autocompleteLocales.lua b/frames/autocompleteLocales.lua index 843ce0d..ce0cd0a 100644 --- a/frames/autocompleteLocales.lua +++ b/frames/autocompleteLocales.lua @@ -41,23 +41,35 @@ function AprRC.autocomplete:Show() local debounceTimer = nil local function UpdateAutoCompleteList(text) - if not debounceTimer then - debounceTimer = C_Timer.NewTimer(0.3, function() - scrollFrame:ReleaseChildren() -- Clear current list - scrollFrame.frame:Hide() - editbox.key = '' - editbox.newKey = true - if text ~= "" then - btnConfirm:SetDisabled(false) - for key, value in pairs(L_APR) do - if string.match(value:lower(), text:lower()) then + if debounceTimer then + debounceTimer:Cancel() + end + debounceTimer = C_Timer.NewTimer(0.3, function() + scrollFrame:ReleaseChildren() -- Clear current list + scrollFrame.frame:Hide() + editbox.key = '' + editbox.newKey = true + if text ~= "" then + btnConfirm:SetDisabled(false) + local matches = {} + for key, value in pairs(L_APR) do + if string.match(value:lower(), text:lower()) then + table.insert(matches, { key = key, value = value }) + end + end + + -- Render items in chunks to avoid lag + local function RenderMatches(startIndex, endIndex) + for i = startIndex, endIndex do + local match = matches[i] + if match then local interacLabel = AceGUI:Create("InteractiveLabel") - interacLabel:SetText(value) + interacLabel:SetText(match.value) interacLabel:SetColor(255, 255, 255) interacLabel:SetFullWidth(true) interacLabel:SetCallback("OnClick", function() - editbox:SetText(value) - editbox.key = key + editbox:SetText(match.value) + editbox.key = match.key editbox.newKey = false scrollFrame:ReleaseChildren() -- Clear list after selection scrollFrame.frame:Hide() @@ -68,16 +80,23 @@ function AprRC.autocomplete:Show() interacLabel:SetCallback("OnLeave", function(widget) widget:SetHighlight(nil) end) - scrollFrame.frame:Show() scrollFrame:AddChild(interacLabel) end end - else - btnConfirm:SetDisabled(true) + if endIndex < #matches then + C_Timer.After(0.01, function() + RenderMatches(endIndex + 1, math.min(endIndex + 10, #matches)) + end) + end end - debounceTimer = nil - end) - end + + scrollFrame.frame:Show() + RenderMatches(1, math.min(10, #matches)) -- Start rendering first 10 matches + else + btnConfirm:SetDisabled(true) + end + debounceTimer = nil + end) end editbox:SetCallback("OnTextChanged", function(widget, event, text) From 4f2302e11d9f3e5df190d645fefe6e0c0638863b Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Mon, 15 Jul 2024 01:11:45 +0200 Subject: [PATCH 06/12] Rework autocomplete to generic component --- Commands.lua | 4 +- frames/autocompleteLocales.lua | 193 +++++++++++++++++++++++---------- 2 files changed, 136 insertions(+), 61 deletions(-) diff --git a/Commands.lua b/Commands.lua index f26abbe..c3a01fc 100644 --- a/Commands.lua +++ b/Commands.lua @@ -125,10 +125,12 @@ function AprRC.command:SlashCmd(input) print("|cff00bfffNoArrow|r Added") return elseif inputText == "text" or inputText == "txt" then - AprRC.autocomplete:Show() + AprRC.autocomplete:ShowLocaleAutoComplete() return elseif inputText == "button" or inputText == "btn" then AprRC.SelectButton:Show() + -- AprRC.autocomplete:ShowItemAutoComplete() + -- AprRC.autocomplete:ShowSpellAutoComplete() return elseif inputText == "fillers" or inputText == "filler" then AprRC.fillers:Show() diff --git a/frames/autocompleteLocales.lua b/frames/autocompleteLocales.lua index ce0cd0a..0e7a412 100644 --- a/frames/autocompleteLocales.lua +++ b/frames/autocompleteLocales.lua @@ -4,13 +4,14 @@ local L_APR = LibStub("AceLocale-3.0"):GetLocale("APR") AprRC.autocomplete = AprRC:NewModule('AutoComplete') -function AprRC.autocomplete:Show() +function AprRC.autocomplete:ShowAutoComplete(title, list, onConfirm, formatItem, width, height, showAllOnEmpty) + showAllOnEmpty = showAllOnEmpty or false local frame = AceGUI:Create("Frame") - frame:SetTitle("Extra Line Text") + frame:SetTitle(title) frame.statustext:GetParent():Hide() frame:SetCallback("OnClose", function(widget) AceGUI:Release(widget) end) - frame:SetWidth(1000) - frame:SetHeight(450) + frame:SetWidth(width or 1000) + frame:SetHeight(height or 450) frame:EnableResize(false) frame:SetLayout("Flow") @@ -30,13 +31,7 @@ function AprRC.autocomplete:Show() btnConfirm:SetWidth(100) btnConfirm:SetDisabled(false) btnConfirm:SetCallback("OnClick", function() - local key = editbox.key - if editbox.newKey then - key = AprRC:ExtraLineTextToKey(editbox:GetText()) - AprRCData.ExtraLineTexts[key] = editbox:GetText() - end - AprRC.autocomplete:SetExtraLineText(key) - AceGUI:Release(frame) + onConfirm(editbox:GetText(), editbox.key, frame) end) local debounceTimer = nil @@ -46,55 +41,55 @@ function AprRC.autocomplete:Show() end debounceTimer = C_Timer.NewTimer(0.3, function() scrollFrame:ReleaseChildren() -- Clear current list - scrollFrame.frame:Hide() - editbox.key = '' - editbox.newKey = true - if text ~= "" then - btnConfirm:SetDisabled(false) - local matches = {} - for key, value in pairs(L_APR) do - if string.match(value:lower(), text:lower()) then + editbox.key = nil + local matches = {} + + if text ~= "" or showAllOnEmpty then + for key, value in pairs(list) do + if text == "" or string.match(value:lower(), text:lower()) then table.insert(matches, { key = key, value = value }) end end + end - -- Render items in chunks to avoid lag - local function RenderMatches(startIndex, endIndex) - for i = startIndex, endIndex do - local match = matches[i] - if match then - local interacLabel = AceGUI:Create("InteractiveLabel") - interacLabel:SetText(match.value) - interacLabel:SetColor(255, 255, 255) - interacLabel:SetFullWidth(true) - interacLabel:SetCallback("OnClick", function() - editbox:SetText(match.value) - editbox.key = match.key - editbox.newKey = false - scrollFrame:ReleaseChildren() -- Clear list after selection - scrollFrame.frame:Hide() - end) - interacLabel:SetCallback("OnEnter", function(widget) - widget:SetHighlight("Interface\\QuestFrame\\UI-QuestTitleHighlight") - end) - interacLabel:SetCallback("OnLeave", function(widget) - widget:SetHighlight(nil) - end) - scrollFrame:AddChild(interacLabel) - end - end - if endIndex < #matches then - C_Timer.After(0.01, function() - RenderMatches(endIndex + 1, math.min(endIndex + 10, #matches)) + -- Render items in chunks to avoid lag + local function RenderMatches(startIndex, endIndex) + for i = startIndex, endIndex do + local match = matches[i] + if match then + local interacLabel = AceGUI:Create("InteractiveLabel") + interacLabel:SetText(formatItem and formatItem(match) or match.value) + interacLabel:SetColor(255, 255, 255) + interacLabel:SetFullWidth(true) + interacLabel:SetCallback("OnClick", function() + editbox:SetText(match.value) + editbox.key = match.key + scrollFrame:ReleaseChildren() -- Clear list after selection + scrollFrame.frame:Hide() end) + interacLabel:SetCallback("OnEnter", function(widget) + widget:SetHighlight("Interface\\QuestFrame\\UI-QuestTitleHighlight") + end) + interacLabel:SetCallback("OnLeave", function(widget) + widget:SetHighlight(nil) + end) + scrollFrame:AddChild(interacLabel) end end + if endIndex < #matches then + C_Timer.After(0.01, function() + RenderMatches(endIndex + 1, math.min(endIndex + 10, #matches)) + end) + end + end + if #matches > 0 then scrollFrame.frame:Show() - RenderMatches(1, math.min(10, #matches)) -- Start rendering first 10 matches + RenderMatches(1, math.min(10, #matches)) -- Start rendering first 10 matches for lazy rendering else - btnConfirm:SetDisabled(true) + scrollFrame.frame:Hide() end + debounceTimer = nil end) end @@ -106,23 +101,101 @@ function AprRC.autocomplete:Show() frame:AddChild(editbox) frame:AddChild(scrollFrame) frame:AddChild(btnConfirm) + + -- Initial call to show all items if the text is empty and showAllOnEmpty is true + if showAllOnEmpty then + UpdateAutoCompleteList("") + end end -function AprRC.autocomplete:SetExtraLineText(key) - local currentStep = AprRC:GetLastStep() +function AprRC.autocomplete:ShowLocaleAutoComplete() + self:ShowAutoComplete( + "Extra Line Text", + L_APR, + function(text, key, frame) + if not key then + key = AprRC:ExtraLineTextToKey(text) + AprRCData.ExtraLineTexts[key] = text + end + local currentStep = AprRC:GetLastStep() + + local baseName = "ExtraLineText" + local index = 2 + local propertyName = baseName - local baseName = "ExtraLineText" - local index = 2 - local propertyName = baseName + if currentStep[baseName] then + while currentStep[baseName .. index] do + index = index + 1 + end + propertyName = baseName .. index + end - if currentStep[baseName] then - while currentStep[baseName .. index] do - index = index + 1 + currentStep[propertyName] = key + + print("|cff00bfffExtraLineTexts|r Added") + AceGUI:Release(frame) + end + ) +end + +function AprRC.autocomplete:ShowItemAutoComplete() + local itemList = {} + for bag = 0, 4 do + for slot = 1, C_Container.GetContainerNumSlots(bag) do + local itemID = C_Container.GetContainerItemID(bag, slot) + if itemID then + local itemName, _, _, _, _, _, _, _, _, itemIcon = C_Item.GetItemInfo(itemID) + if itemName then + itemList[itemID] = itemName + end + end end - propertyName = baseName .. index end - currentStep[propertyName] = key + self:ShowAutoComplete( + "Select Item", + itemList, + function(text, key, frame) + print(text, key) + AceGUI:Release(frame) + end, + function(match) + local itemName, _, _, _, _, _, _, _, _, itemIcon = C_Item.GetItemInfo(match.key) + return "|T" .. itemIcon .. ":35:35|t " .. itemName + end, + 500, + 450, + true + ) +end + +function AprRC.autocomplete:ShowSpellAutoComplete() + local spellList = {} + for i = 1, C_SpellBook.GetNumSpellBookSkillLines() do + local skillLineInfo = C_SpellBook.GetSpellBookSkillLineInfo(i) + local offset, numSlots = skillLineInfo.itemIndexOffset, skillLineInfo.numSpellBookItems + for j = offset + 1, offset + numSlots do + local name, subName = C_SpellBook.GetSpellBookItemName(j, Enum.SpellBookSpellBank.Player) + local spellID = select(2, C_SpellBook.GetSpellBookItemType(j, Enum.SpellBookSpellBank.Player)) + spellList[spellID] = name + end + end - print("|cff00bfffExtraLineTexts|r Added") + self:ShowAutoComplete( + "Select Spell", + spellList, + function(text, key, frame) + print(text, key) + AceGUI:Release(frame) + end, + function(match) + local spellInfo = C_Spell.GetSpellInfo(match.key) + if spellInfo then + return "|T" .. spellInfo.iconID .. ":35:35|t " .. spellInfo.name + end + end, + 500, + 450, + true + ) end From eb04ceda8f5da41724cead3b8ffe9e1797a77e3a Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Tue, 16 Jul 2024 01:15:14 +0200 Subject: [PATCH 07/12] Beta - Rework button & SpellButton frame --- APR-Recorder.toc | 4 +- Commands.lua | 20 +++- ...lection.lua => QuestObjectiveSelector.lua} | 97 +++++++++++++------ ...tocompleteLocales.lua => autocomplete.lua} | 22 +++-- frames/exportRoute.lua | 1 - frames/selectButton.lua | 80 +++++++-------- helper/Utils.lua | 5 +- 7 files changed, 140 insertions(+), 89 deletions(-) rename frames/{fillersSelection.lua => QuestObjectiveSelector.lua} (50%) rename frames/{autocompleteLocales.lua => autocomplete.lua} (89%) diff --git a/APR-Recorder.toc b/APR-Recorder.toc index b53bf11..1da0b2c 100644 --- a/APR-Recorder.toc +++ b/APR-Recorder.toc @@ -29,12 +29,12 @@ helper/RouteManagement.lua Commands.lua Event.lua -frames/autocompleteLocales.lua +frames/autocomplete.lua frames/CommandsBar.lua frames/exportExtraLineText.lua frames/exportRoute.lua -frames/fillersSelection.lua frames/QuestionPopUp.lua +frames/QuestObjectiveSelector.lua frames/RecorderBar.lua frames/routeSelector.lua frames/selectButton.lua diff --git a/Commands.lua b/Commands.lua index c3a01fc..a5f0e52 100644 --- a/Commands.lua +++ b/Commands.lua @@ -129,11 +129,25 @@ function AprRC.command:SlashCmd(input) return elseif inputText == "button" or inputText == "btn" then AprRC.SelectButton:Show() - -- AprRC.autocomplete:ShowItemAutoComplete() - -- AprRC.autocomplete:ShowSpellAutoComplete() return elseif inputText == "fillers" or inputText == "filler" then - AprRC.fillers:Show() + AprRC.QuestObjectiveSelector:Show({ + title = "Fillers quest list", + statusText = "Click on an objective to add it as a filler", + questList = AprRC.QuestObjectiveSelector:GetQuestList(), + onClick = function(questID, objectiveID) + local currentStep = AprRC:GetLastStep() + if not currentStep.Fillers then + currentStep.Fillers = {} + end + if not currentStep.Fillers[questID] then + currentStep.Fillers[questID] = {} + end + table.insert(currentStep.Fillers[questID], objectiveID) + print("|cff00bfffFillers - [" .. + C_QuestLog.GetTitleForQuestID(questID) .. "] - " .. objectiveID .. "|r Added") + end + }) return elseif inputText == "spelltrigger" then AprRC.questionDialog:CreateEditBoxPopupWithCallback("SpellTrigger (Spell ID)", function(text) diff --git a/frames/fillersSelection.lua b/frames/QuestObjectiveSelector.lua similarity index 50% rename from frames/fillersSelection.lua rename to frames/QuestObjectiveSelector.lua index 26619a3..5b04252 100644 --- a/frames/fillersSelection.lua +++ b/frames/QuestObjectiveSelector.lua @@ -1,12 +1,13 @@ local _G = _G local AceGUI = LibStub("AceGUI-3.0") -AprRC.fillers = AprRC:NewModule('Fillers') +AprRC.QuestObjectiveSelector = AprRC:NewModule('QuestObjectiveSelector') -function AprRC.fillers:Show() + +function AprRC.QuestObjectiveSelector:Show(config) local frame = AceGUI:Create("Frame") - frame:SetTitle("Fillers quest list") - frame:SetStatusText("Click on an objective to add it as a filler") + frame:SetTitle(config.title or "Quest Objective Selector") + frame:SetStatusText(config.statusText or "Select a quest objective") frame:SetCallback("OnClose", function(widget) AceGUI:Release(widget) end) frame:SetWidth(800) frame:SetHeight(600) @@ -18,9 +19,8 @@ function AprRC.fillers:Show() scrollFrame:SetFullHeight(true) scrollFrame:SetLayout("Flow") - local questList = AprRC.fillers:GetQuestList() - for _, quest in ipairs(questList) do + for _, quest in ipairs(config.questList) do if #quest.objectives > 0 then local questGroup = AceGUI:Create("InlineGroup") questGroup:SetFullWidth(true) @@ -32,15 +32,9 @@ function AprRC.fillers:Show() objectiveLabel:SetText("[" .. objective.objectiveID .. "]" .. " - " .. objective.text) objectiveLabel:SetFullWidth(true) objectiveLabel:SetCallback("OnClick", function() - local currentStep = AprRC:GetLastStep() - if not currentStep.Fillers then - currentStep.Fillers = {} - end - if not currentStep.Fillers[quest.questID] then - currentStep.Fillers[quest.questID] = {} + if config.onClick then + config.onClick(quest.questID, objective.objectiveID) end - tinsert(currentStep.Fillers[quest.questID], objective.objectiveID) - print("|cff00bfffFillers - [" .. quest.title .. "] - " .. objective.objectiveID .. "|r Added") AceGUI:Release(frame) end) objectiveLabel:SetCallback("OnEnter", function(widget) @@ -66,7 +60,40 @@ function AprRC.fillers:Show() frame:AddChild(scrollFrame) end -function AprRC.fillers:GetQuestList() +local function GetFormattedQuestObjectives(questID, objectiveIDs) + local formattedObjectives = {} + local objectivesInfo = C_QuestLog.GetQuestObjectives(questID) + + if objectivesInfo then + for _, objectiveID in ipairs(objectiveIDs) do + local objective = objectivesInfo[objectiveID] + if objective then + table.insert(formattedObjectives, { + objectiveID = objectiveID, + text = objective.text + }) + end + end + end + + return formattedObjectives +end + +local function AddQuestsToList(questList, questsTable) + for questID, objectives in pairs(questsTable) do + local title = C_QuestLog.GetTitleForQuestID(questID) + if title then + local formattedObjectives = GetFormattedQuestObjectives(questID, objectives) + table.insert(questList, { + title = questID .. " - " .. title, + questID = questID, + objectives = formattedObjectives + }) + end + end +end + +function AprRC.QuestObjectiveSelector:GetQuestList() local questList = {} for i = 1, C_QuestLog.GetNumQuestLogEntries() do @@ -74,28 +101,38 @@ function AprRC.fillers:GetQuestList() if info and not info.isHeader then local questID = info.questID local title = C_QuestLog.GetTitleForQuestID(questID) - local isComplete = C_QuestLog.IsComplete(questID) - if not isComplete then - local objectives = C_QuestLog.GetQuestObjectives(questID) - - local formattedObjectives = {} - for j, objective in ipairs(objectives) do - local formattedObjective = { - objectiveID = j, - text = objective.text - } - table.insert(formattedObjectives, formattedObjective) + if title and not C_QuestLog.IsComplete(questID) then + local objectives = {} + local objectivesInfo = C_QuestLog.GetQuestObjectives(questID) + for j, objective in ipairs(objectivesInfo) do + table.insert(objectives, j) end - - local questData = { + local formattedObjectives = GetFormattedQuestObjectives(questID, objectives) + table.insert(questList, { title = questID .. " - " .. title, questID = questID, objectives = formattedObjectives - } - table.insert(questList, questData) + }) end end end return questList end + +function AprRC.QuestObjectiveSelector:GetQuestListFromLastStep() + local questList = {} + local lastStep = AprRC:GetLastStep() + + if lastStep then + if lastStep.Qpart then + AddQuestsToList(questList, lastStep.Qpart) + end + + if lastStep.Fillers then + AddQuestsToList(questList, lastStep.Fillers) + end + end + + return questList +end diff --git a/frames/autocompleteLocales.lua b/frames/autocomplete.lua similarity index 89% rename from frames/autocompleteLocales.lua rename to frames/autocomplete.lua index 0e7a412..a3abc18 100644 --- a/frames/autocompleteLocales.lua +++ b/frames/autocomplete.lua @@ -138,7 +138,7 @@ function AprRC.autocomplete:ShowLocaleAutoComplete() ) end -function AprRC.autocomplete:ShowItemAutoComplete() +function AprRC.autocomplete:ShowItemAutoComplete(questID, objectiveID) local itemList = {} for bag = 0, 4 do for slot = 1, C_Container.GetContainerNumSlots(bag) do @@ -155,8 +155,13 @@ function AprRC.autocomplete:ShowItemAutoComplete() self:ShowAutoComplete( "Select Item", itemList, - function(text, key, frame) - print(text, key) + function(_, itemID, frame) + local currentStep = AprRC:GetLastStep() + if not currentStep.Button then + currentStep.Button = {} + end + currentStep.Button[questID .. "-" .. objectiveID] = tonumber(itemID, 10) + print("|cff00bfff Button |r Added") AceGUI:Release(frame) end, function(match) @@ -169,7 +174,7 @@ function AprRC.autocomplete:ShowItemAutoComplete() ) end -function AprRC.autocomplete:ShowSpellAutoComplete() +function AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID) local spellList = {} for i = 1, C_SpellBook.GetNumSpellBookSkillLines() do local skillLineInfo = C_SpellBook.GetSpellBookSkillLineInfo(i) @@ -184,8 +189,13 @@ function AprRC.autocomplete:ShowSpellAutoComplete() self:ShowAutoComplete( "Select Spell", spellList, - function(text, key, frame) - print(text, key) + function(_, spellID, frame) + local currentStep = AprRC:GetLastStep() + if not currentStep.SpellButton then + currentStep.SpellButton = {} + end + currentStep.SpellButton[questID .. "-" .. objectiveID] = tonumber(spellID, 10) + print("|cff00bfff SpellButton |r Added") AceGUI:Release(frame) end, function(match) diff --git a/frames/exportRoute.lua b/frames/exportRoute.lua index e637c68..db5bb57 100644 --- a/frames/exportRoute.lua +++ b/frames/exportRoute.lua @@ -95,7 +95,6 @@ function AprRC.export:Show() local routeText = editbox:GetText() local newStepRouteTable = AprRC:stringToTable(routeText) if not newStepRouteTable then - UIErrorsFrame:AddMessage("Route not saved, incorrect format", 1, 0, 0, 1, 5) AprRC:Error("Route not saved, incorrect format") return end diff --git a/frames/selectButton.lua b/frames/selectButton.lua index 857e006..4a6bc35 100644 --- a/frames/selectButton.lua +++ b/frames/selectButton.lua @@ -17,51 +17,41 @@ function AprRC.SelectButton:Show() buttonGroup:SetLayout("Flow") frame:AddChild(buttonGroup) - local btnItem = AceGUI:Create("Button") - btnItem:SetText("Item") - btnItem:SetFullWidth(true) - btnItem:SetCallback("OnClick", function() - AceGUI:Release(frame) - AprRC.questionDialog:CreateEditBoxPopupWithCallback("QuestID for the button (ID)", function(questID) - C_Timer.After(0.2, function() - AprRC.questionDialog:CreateEditBoxPopupWithCallback("Objective index of the quest", function(index) - C_Timer.After(0.2, function() - AprRC.questionDialog:CreateEditBoxPopupWithCallback("Item Button (ID)", function(itemID) - local currentStep = AprRC:GetLastStep() - if not currentStep.Button then - currentStep.Button = {} - end - currentStep.Button[questID .. "-" .. index] = tonumber(itemID, 10) - print("|cff00bfff Button |r Added") - end) - end) - end) - end) + local function AddButton(text, callback) + local button = AceGUI:Create("Button") + button:SetText(text) + button:SetFullWidth(true) + button:SetCallback("OnClick", function() + AceGUI:Release(frame) + callback() end) - end) - buttonGroup:AddChild(btnItem) + buttonGroup:AddChild(button) + end - local btnSpell = AceGUI:Create("Button") - btnSpell:SetText("Spell") - btnSpell:SetFullWidth(true) - btnSpell:SetCallback("OnClick", function() - AceGUI:Release(frame) - AprRC.questionDialog:CreateEditBoxPopupWithCallback("QuestID for the button (ID)", function(questID) - C_Timer.After(0.2, function() - AprRC.questionDialog:CreateEditBoxPopupWithCallback("Objective index of the quest", function(index) - C_Timer.After(0.2, function() - AprRC.questionDialog:CreateEditBoxPopupWithCallback("Spell Button (ID)", function(spellID) - local currentStep = AprRC:GetLastStep() - if not currentStep.SpellButton then - currentStep.SpellButton = {} - end - currentStep.SpellButton[questID .. "-" .. index] = tonumber(spellID, 10) - print("|cff00bfff SpellButton |r Added") - end) - end) - end) - end) - end) - end) - buttonGroup:AddChild(btnSpell) + AddButton("Item", function() self:ShowQuestSelector("Item") end) + AddButton("Spell", function() self:ShowQuestSelector("Spell") end) +end + +function AprRC.SelectButton:ShowQuestSelector(type) + local questList = AprRC.QuestObjectiveSelector:GetQuestListFromLastStep() + if #questList == 0 then + AprRC:Error("No Qpart or Filler quests available on your last step") + return + end + + local callback + if type == "Item" then + callback = function(questID, objectiveID) + AprRC.autocomplete:ShowItemAutoComplete(questID, objectiveID) + end + elseif type == "Spell" then + callback = function(questID, objectiveID) + AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID) + end + end + + AprRC.QuestObjectiveSelector:Show({ + questList = questList, + onClick = callback + }) end diff --git a/helper/Utils.lua b/helper/Utils.lua index ceba924..b045fc6 100644 --- a/helper/Utils.lua +++ b/helper/Utils.lua @@ -21,6 +21,7 @@ function AprRC:Error(errorMessage, data) else DEFAULT_CHAT_FRAME:AddMessage(redColorCode .. L["ERROR"] .. ": " .. errorMessage .. "|r") end + UIErrorsFrame:AddMessage(errorMessage, 1, 0, 0, 1, 5) end end @@ -124,7 +125,7 @@ local function qpartTableToString(tbl, level, parrentKey) for _, k in ipairs(keys) do local v = tbl[k] local keyStr = '' - if parrentKey == "Button" then + if parrentKey == "Button" or parrentKey == "SpellButton" then keyStr = '["' .. tostring(k) .. '"] = ' else keyStr = "[" .. k .. "] = " @@ -162,7 +163,7 @@ function AprRC:RouteToString(tbl, level) str = str .. itemIndent .. keyStr .. "{}" .. ",\n" else local valueStr - if k == "Qpart" or k == "Fillers" or k == "Button" then + if k == "Qpart" or k == "Fillers" or k == "Button" or k == "SpellButton" then valueStr = qpartTableToString(v, level + 1, k) else valueStr = self:RouteToString(v, level + 1) From b379ab1ca368fddb949fa8a821601feac79a4cb8 Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Thu, 18 Jul 2024 00:12:14 +0200 Subject: [PATCH 08/12] handle portal coord before tp --- Core.lua | 1 + Event.lua | 42 +++++++++++++++++++++++++++++++++++++++++- helper/Utils.lua | 13 +++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Core.lua b/Core.lua index a5fea25..bdd87e4 100644 --- a/Core.lua +++ b/Core.lua @@ -34,6 +34,7 @@ function AprRC:OnInitialize() AprRCData.ExtraLineTexts = AprRCData.ExtraLineTexts or {} AprRCData.QuestLookup = AprRCData.QuestLookup or {} AprRCData.TaxiLookup = AprRCData.TaxiLookup or {} + AprRCData.BeforePortal = AprRCData.BeforePortal or {} -- Init module AprRC.settings:InitializeBlizOptions() diff --git a/Event.lua b/Event.lua index 156913d..2d101af 100644 --- a/Event.lua +++ b/Event.lua @@ -29,7 +29,8 @@ local events = { buy = "MERCHANT_SHOW", qpart = "QUEST_WATCH_UPDATE", loot = "CHAT_MSG_LOOT", - target = "PLAYER_TARGET_CHANGED" + target = "PLAYER_TARGET_CHANGED", + portal = { "PLAYER_LEAVING_WORLD", "PLAYER_ENTERING_WORLD" } -- warMode = "WAR_MODE_STATUS_UPDATE", -- vehicle = { "UNIT_ENTERING_VEHICLE", "UNIT_EXITING_VEHICLE" }, } @@ -532,6 +533,45 @@ function AprRC.event.functions.pet(event, ...) AprRC.record:RefreshFrameAnchor() end +function AprRC.event.functions.portal(event, ...) + if event == "PLAYER_LEAVING_WORLD" then + local step = {} + AprRC:SetStepCoord(step) + AprRCData.BeforePortal.lastStep = AprRC:GetLastStep() + AprRCData.BeforePortal.lastCoord = step + else + local isInitialLogin, isReloadingUi = ... + -- wait 2s si last step = saved last step alors waypoints + text prendre portal -- not skippable waypoints (new option) + -- sinon check IsCurrentStepFarAway si trop loin alors override coord + text prendre portal + -- pour les tp sans portail ni cast => LOSS_OF_CONTROL_ADDED into Zone changed indoors, waypoint update, area pois updated + -- pour les tp avec spell => spell list teleport (sans les spell de class) + unit spellcast-succeeded + + if not isInitialLogin and not isReloadingUi then + C_Timer.After(3, function() + local last = AprRC:GetLastStep() + if AprRC:DeepCompare(AprRCData.BeforePortal.lastStep, last) then + local step = { + Waypoint = AprRC:FindClosestIncompleteQuest(), + ExtraLineText = "USE_PORTAL", + Coord = AprRCData.BeforePortal.lastStep.Coord + } + AprRC:NewStep(step) + print("|cff00bfffWaypoint|r Added") + elseif AprRC:IsCurrentStepFarAway() then + local last = AprRC:GetLastStep() + last.Coord = AprRCData.BeforePortal.lastStep.Coord + last.ExtraLineText = "USE_PORTAL" + AprRCData.BeforePortal = {} + print("|cff00bfffLast Step coord updated|r Added") + end + end) + end + if isInitialLogin then + AprRCData.BeforePortal = {} + end + end +end + --------------------- -- V2 --------------------- diff --git a/helper/Utils.lua b/helper/Utils.lua index b045fc6..210755d 100644 --- a/helper/Utils.lua +++ b/helper/Utils.lua @@ -40,6 +40,19 @@ function AprRC:Contains(list, x) return false end +function AprRC:DeepCompare(t1, t2) + if t1 == t2 then return true end + if type(t1) ~= "table" or type(t2) ~= "table" then return false end + for k1, v1 in pairs(t1) do + local v2 = t2[k1] + if v2 == nil or not deepCompare(v1, v2) then return false end + end + for k2, v2 in pairs(t2) do + if t1[k2] == nil then return false end + end + return true +end + function AprRC:IsTableEmpty(table) if (table) then return next(table) == nil From 0da1c5847051367eec1d60feea0fe410218020da Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Thu, 18 Jul 2024 19:24:31 +0200 Subject: [PATCH 09/12] Add default auto scroll in the export frame --- frames/exportRoute.lua | 59 ++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/frames/exportRoute.lua b/frames/exportRoute.lua index db5bb57..1278b02 100644 --- a/frames/exportRoute.lua +++ b/frames/exportRoute.lua @@ -17,28 +17,6 @@ end function AprRC.export:Show() local refreshTimer - local function StartAutoRefresh(dropdown, editbox) - if not refreshTimer then - refreshTimer = AceTimer:ScheduleRepeatingTimer(function() - if dropdown:GetValue() then - if AprRCData.CurrentRoute.name ~= "" then - AprRC:UpdateRouteByName(AprRCData.CurrentRoute.name, AprRCData.CurrentRoute) - local route = AprRCData.Routes[dropdown:GetValue()] - if route then - editbox:SetText(AprRC:RouteToString(route.steps)) - end - end - end - end, 5) - end - end - - local function StopAutoRefresh() - if refreshTimer then - AceTimer:CancelTimer(refreshTimer) - refreshTimer = nil - end - end frame = AceGUI:Create("Frame") frame:SetTitle("Export") @@ -77,6 +55,39 @@ function AprRC.export:Show() editbox:SetFullHeight(true) editbox:DisableButton(true) scrollContainer:AddChild(editbox) + AprRC.export.editbox = editbox + + local function AutoScrollToBottom() + C_Timer.After(0.1, function() + local scrollFrame = editbox.scrollFrame + scrollFrame:SetVerticalScroll(scrollFrame:GetVerticalScrollRange()) + end) + end + + local function StartAutoRefresh(dropdown, editbox) + if not refreshTimer then + refreshTimer = AceTimer:ScheduleRepeatingTimer(function() + if dropdown:GetValue() then + if AprRCData.CurrentRoute.name ~= "" then + AprRC:UpdateRouteByName(AprRCData.CurrentRoute.name, AprRCData.CurrentRoute) + local route = AprRCData.Routes[dropdown:GetValue()] + if route then + editbox:SetText(AprRC:RouteToString(route.steps)) + AutoScrollToBottom() + end + end + end + end, 5) + end + end + + local function StopAutoRefresh() + if refreshTimer then + AceTimer:CancelTimer(refreshTimer) + refreshTimer = nil + end + end + local btnExportELT = AceGUI:Create("Button") btnExportELT:SetText("Export Extra Line Text") @@ -103,6 +114,7 @@ function AprRC.export:Show() if AprRCData.CurrentRoute.name == selectedRouteName then AprRCData.CurrentRoute = newRoute end + AutoScrollToBottom() end) frame:AddChild(btnSave) @@ -115,6 +127,7 @@ function AprRC.export:Show() APRData.CustomRoute[name] = route.steps APR.RouteQuestStepList[name] = route.steps APR.RouteList.Custom[name] = name:match("%d+-(.*)") + AutoScrollToBottom() end) frame:AddChild(exportToAPRBtn) @@ -138,6 +151,7 @@ function AprRC.export:Show() end dropdown:SetValue(defaultIndex) editbox:SetText(AprRC:RouteToString(AprRCData.Routes[defaultIndex].steps)) + AutoScrollToBottom() end dropdown:SetCallback("OnValueChanged", function(widget, event, index) @@ -152,6 +166,7 @@ function AprRC.export:Show() checkbox:SetValue(false) StopAutoRefresh() end + AutoScrollToBottom() end end) From eec9241f6bad2aea32a260f5bf3b80fd8eb7e351 Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Thu, 18 Jul 2024 21:42:24 +0200 Subject: [PATCH 10/12] add command bar btn --- APR-Recorder.toc | 1 + Config.lua | 2 +- Core.lua | 2 + assets/icons/Button.blp | Bin 0 -> 88596 bytes assets/icons/Class.blp | Bin 0 -> 88596 bytes assets/icons/Coord.blp | Bin 0 -> 88596 bytes assets/icons/DoneDB.blp | Bin 0 -> 88596 bytes assets/icons/DontHaveAchievement.blp | Bin 0 -> 88596 bytes assets/icons/Dontskipvid.blp | Bin 0 -> 88596 bytes assets/icons/ETA.blp | Bin 0 -> 88596 bytes assets/icons/ExtraLineText.blp | Bin 0 -> 88596 bytes assets/icons/Faction.blp | Bin 0 -> 88596 bytes assets/icons/Fillers.blp | Bin 0 -> 88596 bytes assets/icons/Grind.blp | Bin 0 -> 88596 bytes assets/icons/HasAchievement.blp | Bin 0 -> 88596 bytes assets/icons/InstanceQuest.blp | Bin 0 -> 88596 bytes assets/icons/LearnProfession.blp | Bin 0 -> 88596 bytes assets/icons/NoArrow.blp | Bin 0 -> 88596 bytes assets/icons/PickUpDB.blp | Bin 0 -> 88596 bytes assets/icons/QpartDB.blp | Bin 0 -> 88596 bytes assets/icons/QpartPart.blp | Bin 0 -> 88596 bytes assets/icons/SpellTrigger.blp | Bin 0 -> 88596 bytes assets/icons/VehicleExit.blp | Bin 0 -> 88596 bytes assets/icons/WarMode.blp | Bin 0 -> 88596 bytes assets/icons/Waypoint.blp | Bin 0 -> 88596 bytes assets/icons/ZoneStepTrigger.blp | Bin 0 -> 88596 bytes assets/icons/gender.blp | Bin 0 -> 88596 bytes assets/icons/race.blp | Bin 0 -> 88596 bytes assets/icons/range.blp | Bin 0 -> 88596 bytes assets/icons/rec.blp | Bin 0 -> 88596 bytes assets/icons/rotate.blp | Bin 0 -> 88596 bytes assets/icons/settings.blp | Bin 0 -> 88596 bytes assets/icons/stop.blp | Bin 0 -> 88596 bytes frames/CommandsBar.lua | 245 ++++++++++++++------------- frames/CommandsBarSetting.lua | 159 +++++++++++++++++ frames/RecorderBar.lua | 33 ++-- 36 files changed, 302 insertions(+), 140 deletions(-) create mode 100644 assets/icons/Button.blp create mode 100644 assets/icons/Class.blp create mode 100644 assets/icons/Coord.blp create mode 100644 assets/icons/DoneDB.blp create mode 100644 assets/icons/DontHaveAchievement.blp create mode 100644 assets/icons/Dontskipvid.blp create mode 100644 assets/icons/ETA.blp create mode 100644 assets/icons/ExtraLineText.blp create mode 100644 assets/icons/Faction.blp create mode 100644 assets/icons/Fillers.blp create mode 100644 assets/icons/Grind.blp create mode 100644 assets/icons/HasAchievement.blp create mode 100644 assets/icons/InstanceQuest.blp create mode 100644 assets/icons/LearnProfession.blp create mode 100644 assets/icons/NoArrow.blp create mode 100644 assets/icons/PickUpDB.blp create mode 100644 assets/icons/QpartDB.blp create mode 100644 assets/icons/QpartPart.blp create mode 100644 assets/icons/SpellTrigger.blp create mode 100644 assets/icons/VehicleExit.blp create mode 100644 assets/icons/WarMode.blp create mode 100644 assets/icons/Waypoint.blp create mode 100644 assets/icons/ZoneStepTrigger.blp create mode 100644 assets/icons/gender.blp create mode 100644 assets/icons/race.blp create mode 100644 assets/icons/range.blp create mode 100644 assets/icons/rec.blp create mode 100644 assets/icons/rotate.blp create mode 100644 assets/icons/settings.blp create mode 100644 assets/icons/stop.blp create mode 100644 frames/CommandsBarSetting.lua diff --git a/APR-Recorder.toc b/APR-Recorder.toc index 1da0b2c..7255053 100644 --- a/APR-Recorder.toc +++ b/APR-Recorder.toc @@ -31,6 +31,7 @@ Event.lua frames/autocomplete.lua frames/CommandsBar.lua +frames/CommandsBarSetting.lua frames/exportExtraLineText.lua frames/exportRoute.lua frames/QuestionPopUp.lua diff --git a/Config.lua b/Config.lua index bb64ab7..c9634d0 100644 --- a/Config.lua +++ b/Config.lua @@ -47,8 +47,8 @@ function AprRC.settings:InitializeSettings() commandsBarFrame = { rotation = "HORIZONTAL", position = {}, - isRecording = false, }, + commandBarSettingFrame = {}, --debug minimap = { minimapPos = 285 }, enableMinimapButton = true, diff --git a/Core.lua b/Core.lua index bdd87e4..6d86657 100644 --- a/Core.lua +++ b/Core.lua @@ -35,9 +35,11 @@ function AprRC:OnInitialize() AprRCData.QuestLookup = AprRCData.QuestLookup or {} AprRCData.TaxiLookup = AprRCData.TaxiLookup or {} AprRCData.BeforePortal = AprRCData.BeforePortal or {} + AprRCData.CommandBarCommands = AprRCData.CommandBarCommands or {} -- Init module AprRC.settings:InitializeBlizOptions() + AprRC.CommandBar:OnInit() AprRC.record:OnInit() AprRC.event:MyRegisterEvent() AprRC:saveQuestInfo() diff --git a/assets/icons/Button.blp b/assets/icons/Button.blp new file mode 100644 index 0000000000000000000000000000000000000000..3a2f09bbc4df753d1e0c1e33af0d7225b89fe6e8 GIT binary patch literal 88596 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Class.blp b/assets/icons/Class.blp new file mode 100644 index 0000000000000000000000000000000000000000..954945964698913d0dbabfdae9974461ef146166 GIT binary patch literal 88596 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 Q*gp8Mr~DrZZdqG)vvzwn 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 literal 0 HcmV?d00001 diff --git a/assets/icons/DoneDB.blp b/assets/icons/DoneDB.blp new file mode 100644 index 0000000000000000000000000000000000000000..d673c15ba8ff2213957c171b65ca07a80d6798b3 GIT binary patch literal 88596 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 KE-XNr>HiPy@d^_F literal 0 HcmV?d00001 diff --git a/assets/icons/DontHaveAchievement.blp b/assets/icons/DontHaveAchievement.blp new file mode 100644 index 0000000000000000000000000000000000000000..f065ed3f446c4572d5715112cac2e6f103df661a GIT binary patch literal 88596 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Dontskipvid.blp b/assets/icons/Dontskipvid.blp new file mode 100644 index 0000000000000000000000000000000000000000..317c2d1e0b83bc5ab14ae4adcb007566d2645677 GIT binary patch literal 88596 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 literal 0 HcmV?d00001 diff --git a/assets/icons/ETA.blp b/assets/icons/ETA.blp new file mode 100644 index 0000000000000000000000000000000000000000..9833711e5ceab560b68375a94d17abde1ede4e07 GIT binary patch literal 88596 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Faction.blp b/assets/icons/Faction.blp new file mode 100644 index 0000000000000000000000000000000000000000..2dce519f29a6b3ce97a1f6ef872efe2ffd686b23 GIT binary patch literal 88596 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Fillers.blp b/assets/icons/Fillers.blp new file mode 100644 index 0000000000000000000000000000000000000000..81766560bd9b71606bd3df7f6fbe2e7d56aba145 GIT binary patch literal 88596 zcmeI5U1%It6vyvw5*nc<5v@(zm~8EW75X5)Rgo^*2Nx78Wa0<0PEiDfKwpGbDLYDw zPtvp|et#@gP*OjN)Ih<9RZviT5NWY(`mi-=34L+J1}wOa=gv0to=s(4yK&Rm->_5m zbawCT{hj~+%-xwgo4fDZa(luUlk8lUF!qV8W9@cLn6b^W4$AtltdAtjQCVkXJuhqf zqX~1vKdezB8ELCWR%y$&IUm~pnqTE93j`nl0ZpJohlW@Kfd@QX0_ee|VW<}x2Rz`R z2v9E+4*a2UzyltN0QExQz#ke1Jm8@SP%jh?{GoBc10IS1^+Msm9~uWd;GqamFBA^^ zp>eeoBGH*iJA0KjQiGj~?eAIe$Psx30UiEa1^-|2Mlmu0LE#wme&q zZ?%=}EzhUfer@#r@xO9-%j;Xwpx!OeL!iyvG6n`nP>`cL*3?f23@#FtpuXYgoo z9*y=t$6qBV{H1VEZ#0hP^T7WqBluO}Xudx6$Kmrdng{+@MDf4Ef!{Qa`0>F1D#Q3+ z;fSB!b@%8W{#S~?{|X2G&^Y491OKZG<9~%CetOs4qks5cDFXj19QZ@yh#wF9uQH7P z6^{7nU3ZWE;eVwF{I77}4~-*!Jn+BDF#cCK;-`1rJ^Cm97bKPWx$+ml?0nrTie>)a z#rMnfTjt+VPqg9S0S}h|dT?nlA0IuS2bTbPaA{B<&;xpK37`j;2K50wpa+)#dT?n_ zAJ7AOa0#FXmj?9#J)j4d0D5p~P#@3(dTy7co$H!Nl zF+Zj+ycha&`IMJ5rf=GersXHpCGPcvT%%*z-{=S7@0+6i1=7BG;6VD`7t_(_85$bm z_w2P?8_lC{?c}yK@+dxN%rRM}XaCq6$|GOSzn_#P`u%*#e^CBvZbFtu$J4XnZv*nM z`wL|0TYKo*DS6n>^N=i!?l0|WJ=L54vww;h!f;toE*zDX3X(rrx{b}B#1r+#-=7il zhp)8f%Y}oI{&TDP58pp^Sn@CRNbHaQ7x{QyZ~nv8LD%{qx!#{Eq%yLs9ytEg)Z|E% zuL;ld`qmmhip9U-zlc}$r?`#qi)nqZH_rX+FZvT@g}Y@aDD z%SW%zp`S&r@74LPj_b|;m5%?YAOEkvtMgqQlmDfakLvs^c3f}%!whN4_-?WDTdVzg^H2SbSG^$r@ycf{ zzgKT3|Kz`(^S{*pchay0|P&n|1#sLp_C<4?Ag`<`~y8C6a#N@U+&8>3s-8(kEeMaKZ zF`1wL@8;V@uiszVH2?ajy+b!mRoZ)K$G}EP(ftMIRu6pf*whzS&;13p`oCsxcj@G3<&(v7 zzIRxb{&ki4*Or%^f4zEOq%yzy;(YA(Yp$;O)wTMcn7XBOSTY`nABOXCJJ)38ex-al z)#*(b({?0y=fsD*giof^+d4d4%Wq3&V!2*t`!Ba+cx^|d z^KV>x-1dKXcg*MCyF-zvMjayUFqkk)&F46OS_KC!_K#kWB=uN z^~4%EJ#NX-fUh7MJDgG6M@38TX1L?wZ;%{$o=o9nZ zzPIJS0{K2-$8(!DU;IA$W#xX~L382y4f|e67ax)Oux+Qe{KmDn*@6@FraC|RbYf!p Sb(Qi{kok%S<@X4xUiRoHRTU8j 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 aZlLo&7hCibuKL;pV?cyGS| literal 0 HcmV?d00001 diff --git a/assets/icons/HasAchievement.blp b/assets/icons/HasAchievement.blp new file mode 100644 index 0000000000000000000000000000000000000000..2ec87fc0e96cb5248ffac31662d1d4a0ec460836 GIT binary patch literal 88596 zcmeHQeQ;FQb-%mIA}v@Sok&5pjI|)ia$IYGPDSf+sa}${V;VOoGkTJeDr7V140)gYjTI90;(!aKORx;e>!SdmRgYjTI z90;(!aKORx;e>w`IIC41_;7Nwli@^0&|oAz>y<$pQ*5A~xJw!LZ4APS4Z|4AaJ zTzj!D5)iWYLCT?9dV4_K$)tb5@}F6JJsv+16?t~Nps|tT1s>?9xG1#d^QEPj&&%P; zq`Y~|4{7(8<=-?bNZ;eqtnn|B@i>%qZ^~ZkZv+Q0$7qI7v6u>`CoPVS^io6lVm_S|2K(t`l=lLEdMP3 zNiv`u|0mJT@}G_QiBf?r-2YWw|EbRZs?)DJ|Eo^F>in-d{i^f7>h!D5|EklkI{&Lq zzv}$2I{m8izv}d>&i|^@uR8y$PQU8>uR8sz^S|o!tIq$b)2}-Jt4_b_{I5Fws`J0< z^sCPQs?)DJ|Eo^F>in-d{i^f7>h!D5|EklkI{&Lqzv}$2I{m8izv}d>&i~7we&SF% zPfMe&dVYSp>in-d{a(MH!t?XTv+w+$Sdl!B-RBG9Ja*Oji|Ho>cz@!8&zBpksJGrX zp=k|S@V<#y5zcFs=W_;2OYQSHdHk9G7tH@sfvSsNJ4zMzWdH!IG+l6*n8{zc-Z?KJU^cG0ZD|q_Kfv`d;BZvE&DFChAg!2 z>G}`Tm@ioL`$};_KE(@SiSyWlR@qFHy*lszmilD80^Q(vg&Of1`Tj+V4D4YrUp!? zGtXa6cINh$9Ug^obcysa!j-na!Tx#f&QBox_IM+l#`ZVk_Lb01x|V%=h)+yg>z4ux zn7MBc$^Xr5eTVnwTK+x)YHWX#WRboudwE>!{$f6mSicOGvOkdZ@qlb!KU-}6=k^>3 z1lb?RHvb@zFN1hG+k3X}4sl+9zjK@TfT!K_S`fBiF_Ft zbmlK7dodnakB3`7V7`GD}-^6$gtf&6FL`4dify~mg9cOby>?0{qG`Hkh@F(AyJ4mg&cKb_s-{&C1PT`Nw&q ziT*Uo{@@>5U+B8V`hw+wxMJ>NJm#>VZ@?oSv)1eM(jemXo}V9`rhLnv!~QS${LZn2 ze$Z@sMg6E;Pt^4WO;LZ1kgzV6hXfMJ;Ng__wB>85lB`p~HkasiLH z{XPWPcRo)f<$Oiz19@JD-pKoRbAkUI60MxSgLoV+D;@_VQu4nvr|J0HY1-o@Zy)hS z3oi;cGXFcIhw)hc`UB?$6w332OG``H-lwhaa9*GN{+mYj2Uz}>z5K)3hsh^<9}Ieu zf1B<0Jk9)>T;mHcQ%6hzGSR=4D}DJ9WuTm_p>%-JAYgB z?5?!w>5=sQ&BH#6-bsJD__=>C$7|p0kTqW0ThhhPIJmjvEdFS`>u_Z%e-U_0uIlUS zE16n1^D*-p@+Y+7mWUy~L;SIAe^u{m;rwjaZ!G(}_0<)2e@jcIRt9d&P(GtpTpjWw zDMY42m_%2xX)bd*! zqS18e$@K3{@!SimH+B1|zjeWag2ea|J+yH*QFhboRe7n$fA0y<2>y%B8f9X-wbeL? zI3;zwcX`kLp>)0+o&l#3gx4s zR&-YZM@UbZj`F=rTz2=zthzglZpr?J=!+}=5%ik%$Y+xD8nGDgI6QE)U^sz?8!zBl z^gi^j#B)Px{kzoTpQ`w*X{H8^Z2v;Oa0IC&-$PBKihw{|Lp&<|2Nyq{y+Qw zJpXgW@4cRXrJC=#@6WX#xuf{+-V+G^6pfk`uV`(ZzGZ!2&GVT2?;bZP-a+dJXUCxY zubDFb69~-3N4<)NEw}gq;y;-Gk4t)EF+;3*9+UrF*KgwCj_2<^f#8pJL*iLix8as} zlAFG{`G3Td_%GHgUTEEV=q(w~EbSSbx{lx*UTH}2>%JpL{>j}wmkA$=_b>Row0Zsh z;s^3^#1q3mrm&+a+P_`%nfIz>yu7jLmUxm|zEhP~6%FhdM*OxnjCdUuU`qP0b%|4t zJ$nC9vUlWf5{_co&kwEsn()VBd(hulXzHE6ee;=uVPi6!A8l#k{p+szZ7TjLxp?8J zjRQ{%YgfYgq3S{1q(${Wagi|_&IdcxCiH`xkM#BRCd!%izoE}3k-qbHk6r|Oc7FU# zY0ri6v?+==)NFgPN}PjzZq0uCoN9a)`+n%Nn|IQDg!1WnFds2RN%t%8hqNo0j~u76 z2>Uv}Q3d-^Cd4F_g;?8NO!E~XR#&IukIwU?ZlWix@$7A(-?vY^g!59iD8{5))U@|7n4FrLX^;ydH%1cdQmJdzMt@uQXE{-1Wu#1JpkzZVJx z2dw>O$gjxP`yf6)be7?t9Q#A#E)Da6e0_UNJVJ}L@c-gJkp5rV>+x27yUXqR25CO} zwU38|Z0|U>%engF?(d2piEkBmj^;^v_CzA7+3=O zlWfl%$NCDjXJ}S`rm7PCk^TLzt{YZ={TM$Gk3XU(f@{9?yMKRQrL})ee8JkkcIJFy z|62SM&U?=IdgYn(iTy*!0Kj!$rL}*I`a}E2+~eo&KhvKi?DW;8|5M?|iv?~CpoLcRr^hk@mH&*x*N$m{lP>b{HG3xo<%t}mv`A6Snpe8>pg zPwmAb(X`L^aO=PMmQUflgSQYO$L@VmH>m4t{}225fA-YI*eq5={h{LtdMSR2@ag_U z`J?##Hzq3E`r_mE^D$a~)nebjpZ5EMgIjBUv9DIH|NbY|TbE(}4B~$>UzXy35Fh=j z_{Z*3Ac@weDL)dgGKlz~VkjR33==|G{1hT85@4@7QGfueD|X#IFfMe;8%Zuh6F;-YC?lOzxR{{^;7D+0Q>c z-}aXJdEfZJj<%_t6ET`E4AxaYF@E7NX)M@_CzH>Epm^aC2t-02sQe(xt>c}xeh=@A zfcO35N4E@pWA;s1Uvuk{%X=z(O|hxif94SKC4?vl{j(l)*^Bv>DPMA9Ir1-Hf1;5m zvyT5$;kDHFYaWMu;(RagC(c(ItZQpWSxkUm!N0KnGqnEs+5KBcU+H>tO8%42Z~a!0 z_55J9tj|Asvp(4#&Zn~4Yi@08x6YTM_9#E2yw^0lU;pwwa{h+%V*;1!UwHkRwcZmo z;9j}sf3gHW6`**59g<}wOi*SQG1l%;cma8t!u0df3QC? z|08~Ge)GHdIp_SWqAgnZEBsM?M4!9;PfsE_WdQprATJjEAijvszoPc1Mf`GNe-zCx zG5Joh-W9)`*k45R!x-oX@sHoI*1s`-{?r7LTVBEWYG{w>&wCchmKgHLTb8~0^yD>} zk8aF{;XLYk^)T%Db&7|;qWJ?U^YhpLg3hAH5C#nBwgQ}d|k_+szr`yL^B%zxjt_s_m2t-R>{iuQ2tzx4I}@t=ZC Pah>^(i0FrXcbESks75fZ literal 0 HcmV?d00001 diff --git a/assets/icons/InstanceQuest.blp b/assets/icons/InstanceQuest.blp new file mode 100644 index 0000000000000000000000000000000000000000..e33e515d68d0c0b7b86c38b1590df941d3e2d956 GIT binary patch literal 88596 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 literal 0 HcmV?d00001 diff --git a/assets/icons/LearnProfession.blp b/assets/icons/LearnProfession.blp new file mode 100644 index 0000000000000000000000000000000000000000..fa9072b378fa4ea2850bfbb90e693a2e2f5b1d95 GIT binary patch literal 88596 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 literal 0 HcmV?d00001 diff --git a/assets/icons/QpartDB.blp b/assets/icons/QpartDB.blp new file mode 100644 index 0000000000000000000000000000000000000000..2d21c57bb5de1564cda64d70902c62d958e93a9c GIT binary patch literal 88596 zcmeHQ4|G)3nZGlWAsLcMQk@A=pcx>6s&Eu_vf3{4>h9X+R4}#klC)-V0NbivU@E7s zYwPA2(JpFBK;nO8tRD5iajSKShjY4hO5Gml+N0ZTYLH-O1r()VLI?}%gtx!%zW0*% zW`dJp{vjR zf}d~N*dOt806)j^Q}itx^PJ&_-$cT_D)EDR(LD{4{$%{%qc{Wt0s(=56#=J}WP-K= zBJdD+m=O^2U`B%pdtrq`;34p^ARz381rDJfRyYJ60uKuU!d_V55c*+-L*OCsupl7p zg#`|wA67U79s&;w0>WNc;K&dCP*i1zFJ&6sh2nct7G#eI7Fjaq-uq~2ehriS%H$e)3P_FLdF`S6Gs`U>VJ=<7*RSFS&# zzRbx<(7ztsiX#u{eq%fm9}nxR(Z?s#A4vWa>_>>{_9MX0)Ax)+=!=1b_FLdF5%7rV z^6DgcjT!Pyym1zsK9f4<&>pcqhk+;D3(X$%Idr@mg?+G!zrZ6aczlL_b9Km}K8W@R zff0Xb6n_FHL)Zsh4}^bUH3(zCBZ?`T%a0cxxR}4W!5PuFe6v3+#MFL`p8-ktA50=K z26-@DExunEc$wz&$Odgb0c&}_EZ^jNEd8zE@igRE*766b(&qVgEbUF?>lY8_9~xl} zL_A@!ZUt)J%5{DBB0kTDc)ZQfSLDB-Z(tGmBeVhlx`IA&8VdrJ&}K8gEh9FHibbk097 zX7q`XKj-piL9 z3X{R{v^jPAFrM*+um>6Dx8-(Yv#(}(zaKOjbf76iD z*B8^x@Uh_U7paJ1n1r_z0SNaOPFC>v4(_M@<-Vg|g^~kKqUwM@HEz4f- zc*O5DP;oy0NR5cca~^L`GX1s=cMSGyG=G813(NuJCF}NJl>C8FzZ4MlOKIDK+~?h9Yw?mz+b_iPBYgEx zv$rYJ{aXH8mZZ`7XTmV=>?ijRau_cFt6~u!3`>kNQW4YT71Mo|)_ctPx9$&$|%GP>}slKkz{rhD67y55OC}DoLoE?jONQ@7%TAxV$Gx7s+ zA>^aWqnPq}e1(L52I5g3FqrnEP4f9ZUY>>iTM$WK|1Gye{YgbkmuH(Z8}f``04@RP z3(AQKpq>bec@Rk&57K*?$VbKLKk&k#;U((tAfLl{i~Ju1Bjftd%A>lxd5!wRjOGUl zEkBs~{dPwFlug?FDFo0s669OxzX1*Zoq&(!YzFKDf&qPgW0{%X66*=gUC#P=%#Gpm zS+p00iKO`$<+@pj_u(Ar{!t^2v+18@gl93niT!<{|GDK4f&o1qKsbz1z`Qhnl zQH`fouz=lq`R_)qrnTcmFs z?2W+R!U3WG7C7>B{^9jQwA`Ql{#)V7zxIUwTR1o#`p@fu@HDc_JWoCko|g&ywf(GkL^rLM;5Zu^@@M1UhyBI(1^yNU67Zn>UoyN?S|31t zyH*d3=hNgty-T*&{|Nnp+8<#NC!t?fI0_$+gy*3TKi`xdNPy?d_Bj9v+3!X?Ab#TG z0sYtOA)L-E)kEmdTSYlk9@xXlCeLEL76cOf1IyV$^k1nSirXucL+SozO8yRCKt1#N zDX)j%`+eaKNfX~57CgVL1Dt&FF2-+0Ac6m+&KZ553*u3-CwTh4goYE^Gj~Ru7x)Ny zupp3gec|~izW+Z<`M}}*5psU)kFc;q=%*D9fk&a?k?ni{;(@|{e$t3gB(>jS{ci*; zd`gO!H{XbKOpqqBB6z-|B<`ZXcfKB;qSEfJD3MN@yDCx=O=M@!0Zo9viCCz z{Wq&a>hqK3+Y=%lp!ZvIeK)<&KJr(=a*}kskCMNioX%r8T*|-kX4@Y?asW74*9!`{ zen{xQMS~~)d}!$|>F;OjJ88YDj_7|p&EHS%;PxUvo*z1jKakD*0FMv2J)rV|{Ii!< zaY^hy^dFaK@fFpJK|XYvzX2?Dy1z#MKFWXdp#CfwJ`?YJdiox(|0;ieAnCtELnZr% zdO2#F9JA#jM^jjDN&yYMAMOn^NFeVVtf;Te;L+y zF3)H72k<;$yaJ2#zmdPc-XaZoAP*QGOakdAGKN{m7i#uX*aKZICV+leB(wnflUsdP zRYTudUh2Dr`(&ST93PBk548LNyeHjW7IOX|0e|ZsCZ;|{HUF00FNI_o4x;h)c;eS^ zehluflneh(=(|Z|GA=K`Q(G2+n%|6J({(`oD z8;>g%`xVblKGM+l%-aK@@8hZOrnc#0f;>$$dk}9gMzs&R{~!zhA%UM-{73%$$osam z^>A>1_&sSK3Y#F>T9;oj}|XvbA2&h-&3U%;)@W& zEqHtp(D5zq(`dXNR>L#r`3Sx~1AhkbHu2BskF50vDQ7Jn%0|4c@sr2*{P`G!Z#M0L z#=p$jm&E%OSia7x&=byHBs^~=$Lk9k|3}svvQ5KS;2?b@^8tMwrlGB)(Wi~;z5IO2 z{mb$5>iGULzP^R!V$>&S{mrJnQVZ$aU+6mtmVQh)`+&(r&nGaOAx{(8Ur1R$`4_Ti zf5!R!m0J8q{((6kl#ad%eK(X9zbBl&n)*f`Gv2>Z{001p=2J8_Jl|wdpR%p5S-wBw zX=6X;xICXB_x3={@1z_0k#T)AZah)$KNkBinf-@}wjY!4H{t6E*nf)r1vh`fpEuO1 z;PurQXwK|M{PPd6Ua8gR!+p^F2mN{7@K|+!qM+;r#REJaC{aoJgp)7Cdq^o#yg&iN zSnPqA-*w%gUlWd>roI(K|6m+&P`qJ7!X5INXg~Dx!~1&@?1>StoYnLHRkc{RS1h2} zr?~cv=TkHOeCoy2UEW`ixSo?E|4n#0(H;nWA7Nkq@zd0I`Z(d`PxRMWNc;7Fz)rRR68+S|2iPV@`3`Xz6Fg*9xdZTN$m{hO}@^hGMs zuU}yE9VB`?Q|`s}D1na-NtLp!CeYJA#QEuc^MZp)wJhJrdg%Mt**68>@X`HWES*Q~ z&FsH4Xr>*;bH{y$d4 zq$7|o{DJrPNA~_`FUea|FxBx+w(C!DeSNYbNchR!byfT7OFkH){VL(=ZnvH7d*9%v z^pKr^*Xy;C@o&7&_x_Le{6)yi8xeGO_D7qC%G3ds8Xf)H#{VjKpdilCJ%wbUCZZy z->{yn+wXR~x8Km`;1i#v&%hH_Kz&`Mx-2#Y{3ZOA5csq1)Y470WG~nq&2p*oxqra? zzc+FxW34%;Hz`%_TVb^4M|&!>hbkJL)cUgk@o?QTOJ^zocFXhS{@_Zjvg z+8e=F1BYLp33(_cyqa4>k$jT}=r{O%^fcG+&N_Dr{MPgt80>oV)p-i+Ba7V8M4FL0f;vkN9{T3px${lRp9bm0&O8<-zmXt0WKqP4=O= zsU?(d|1$l3n$He2JY22K-<^K5J-3m9pTV9R_SVp^8uNmO>$nW>h z*v~p@F|h;(!__kQ6i=5QQl8rL!d>t3>swnhj_)Y)&}Vz4qnhl4-R1Th_?>CKnEg>j z?5(!rTgabm3`LYo>vOXEQT(-TcV{J!Z#uno$^3H_PMyTc<|~6z31g9<>-oDE81_5> z1y9yqy62U9>sRl`zbN8;uzwg|WBxVpHfZJEAK%r3e{?+yujc2qiMg=`e>I^C|}=kFN!8U5Af zw+k;shUK2R&@XDKemT_A+7v(jY||5+|MBBj*}{&p^&4AhK6Tgmy(4(?cqhSMP}$p# zE12UD@uM*ml;ZD~F0JL)mVZghcXfBFOKm|`IYsnr|0&n7gJz;)Tmoj^Vl}MD2k}w_c z{N&3s_iFrVPW%0*)jeI`exmD^Im(;9lJ3qA?CP*;$(v*}8sXCFRe( zUVojT@8rL~Xv(h|{eiuAEPC6qi1IC=#>R1f-evyte_==Ij*e2o)9pO-`%;M?7hbq^ z>+}!rp4qcyXipI97lAK+8I^=l63{7?G+6P^Ei zq8k2b$1f^#ZLG!=K=vQ*Xq-Pf+WZgW50{ke70my*&;L^U?W^Y?zT)_8mu2N%wSw~h z6yGs5k(Syw%4!OaIcT@-%~074F7P= zBek&q)r|eSe4K^a=iPa%Hrgwdv<7IuX4>+%0{-6(Eeg@Z{>8-7epVOl%H5?m)I1FN0bJHBMI^UgU8kW z*RkG-c>e*)S3bxZj=>+T4MTpg-kJ0GzkCKdZ>kTOF^gz7i+-Kgi>UFmcKvXD$Fg+s zE41$;9;vh=MM3#z#3N_)N4P&q^%4xpska@Mz#pv)wB~+3xb0B=io;#250m|*{NMgV z+Vd~NL*Zw)Lbc-Q+Ya4**Pci2+C$gpBLA0f@`3#C#@2>M4^aNuj|9cO_l@~LdI)gZ z6Xt{2iapGVU@zDOm<`x#RPV8*eV$gIm41FA8GfnyubK9rll3pt=WU1UgBzCpDi+2% zw7lKz_(-$AbE96WU(5V@QPsZKhS&#djw|p#9JVvt10!CU_0g80U2T1Q{h~D_DOe97 zd(79zWK0m5#slj=YX(lNaOnCk&)5%nZLl+1|AD+F(B+4)`16>%N7w(f{ijTiC;om$ zeFgEG>MIWSY4sJsnuvEB?C-3@8)C)kDK%UbWPqEMz5u*YVi2w(d63hdk591m8*gfO zn%6)0JK-PDqME(ZM)f@Skl-H}_5t_~B3-f7v+eGoNL$}xTHkJJ31(d$;_=HiZS!jW zM;Pm1z`NTvMU!_Q3Ex@Bdoq3-_!`eU^=u>iJWw31QqZCj^bBrX(nI-p@V~Vw^YM*m z+tD=#>Q_uB{c+cI%I}fBY4HLoI1=XvqrZkc%=%~@?86DH&ju@-Q2xT_i|g9w>h-*7 z$Fteyci@|x-_s+X*Z3VcTz~6H{Qk5wLw`9huD=#WTq;Xj~!lEMGjIj^!pB7ahD4pDr8dT;wxT6`go zyT3l|aMy~1@2%;J0B^s0WIl{mMXHc4-)hwNkbV9bv{CP6$V0yKJDEIqwvjyC%JUhn zy6(97f+ehX8}`AF2ZJ`^iwBQiXFPBEfgqQUf42XG%S*7bIm+ebeYJz?vn9w2W2LXa z*;xLm8i9S1<;or!gM3Uw+JlkOW zU;-krub2+yS%=lP)Lm;1()^3*aCrU3u+IZ0wfaA$MyYBeOMOzCzlo-T8DqT0^$GTT zob@{yzmuIm!A^C&0Trh8Zis_iwNL%C8eDx3`I9K0>`oS682H4?N2cgk^n6BmDEg|T zD6luz@q7m5!^V=&fc@w45G4DL@dXa6TObbyNZ-jK8vQr;8&4M+zmv&B{CSnV(D6%> z5BLLa;D`L;C2V0Q;!os1?F*2PA{;Bf!Shj!EimUNQC>Ohf0Dg`xeXimCX)|bPwKbz z!@uBvJin6okA@WFGur32{H%`p6KG9+eao}$_BC^`zR#v%e(02C&filTVw!(ucTIMF z$MZiKU3z{!ug9kRZg@@*wuBB7R+k9))SY*EYtAUSm%_2M2@dV`VHz;QaNAl__+6iF~8NPSgGFviH+^ zFZ|7Dk&D_xzEo>3Ws-G0yhu75cQPYM24btm>~8u>@~OTDyF zR`bt%U&QX)29S5CB#(bMF^{eX3Nojk*c{X7sV0ApU%$YJm+5{HeAV``H&&^B%J&;I zg%oC|{`}&pUq^U&t1rKcIasjiX{>U>|ar;B`J0O#PciDO{RT z`cM6}*<7xo*V=|izG!|Ki+rgJUp|lOjU|##x9X(9V^hXgLV`Zl?->#dvQ#wNTYf4)0>VW)jga}1R{)c4Q zv7=2Y*Xdwe@_d4$3>SADiAZ1uy7&F~@elCvKJKCXGmY2qS0czibAN^1Y`;=+%%%0; z)=(&Ee=qIT_NS5mL-|YF0P>grx#1xB8q zg6HLE`XVQtf8xi}i}4)T-8n*X-fyI&{AnA1~1v)kM2P(O?Lirt6_>*}v)@)*XsPW0Dy z{M75Qmeupa7%wfT{co(8zpq!S30J*?mNPxxcz(pw@%l1*--^{MA);hIN+B;9j~u7`!ooKM$~mjssBP z2=vzrJW5WhzuDqj9wB*V?YGG3@;82blbxPI#;R-8{P3I5XFNd5^C{?#KOKNS33`Zm zW1t`Edk*#w{(KuNeweN|;<41%W9=;^$TQwPQrfns*CIEZ_?m0{nkIsv|$?t~+_jrCzL4T)r zefLXRyoCLYNX#or`Q@aKw)SACq)oFIzF%U#0|1E6H{H>&(G#I~eY@We`qFtfx6kGD zvewp;b=rDQv>pB^zg}4yoYrBd{z&aEH}IkOY_A@lHF;w7w_en>;uD%byr@rf?A;LC z`NGg18ed~e;{KhLH*5QuNndcef91{Eer2LZt5;I_r~s>xo6|h z9^x0a2eo=)Csw2VXQ_SM&Z}a6m`g4*^5NLNk+6TO?55jSU);6oZ^*x*`Jn8k4NvXq zS^)i(DqBa{-??zDR)0_Vbv}PQ{K8Xv?!)sP;E%N;fj(t(*UBHl#F0Ji#QkP}sy;a_ zw*IQ%k#KcLYPU^&0P=)-B}J3JCY7!4^sIlRR)Kx=`?rH1x3$k*yNT1SxS^wj)L;;LyZ}=}e zE7}#UVm5z;61?(HT0Mpj{zwRb#mi$nJ!SK6`T7RovmNr}i7hF=1w$f!G58P2H?%H> zJtRCM@Ew&cU)z(pCRl;dp9P|ceT59d?4TCFTh_qXYD=rUBxJW^-_E5 zQONff&waR=(|5M}>wbsp!4J|0_`j`3*ly3W&pf?=&e#3E;g*-#(#MM$I*OvmZN205 zdS7Ns9<2Rpdo8E&{@0`ITi0JP?IC`B%i86)9A$gX`FP>uW%T`98h&5*7;AX=K*QV5 zDNp!HI%V%WkFl>EtNrR9YKd-=1I@eHtcPlM*W44n7T3%2Pil8-`bPaB`8vuDU3T-r zM-ZPwAKG7%cd+%&Ww$Qe-$Q<8#-sHg+*@+_mNN`NyBVS6X)SN}}H#Sik*g_R}N3tb6xMz8QFaME6_G zjpy5DUw>$NN4Ozc{pByTe*g0MEx(|Ah_8X!w*KqZt#iHrLBtWfo|RBNUOfH(E}!#& literal 0 HcmV?d00001 diff --git a/assets/icons/QpartPart.blp b/assets/icons/QpartPart.blp new file mode 100644 index 0000000000000000000000000000000000000000..038b0114d2f73b0975e1a0e957a39f7a41121e6c GIT binary patch literal 88596 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 nUVLYB^PN}z9TO0SF?p%9bSoY>H}^}bJqJ;D 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 ew^EpNUvpKI)DxP}Qxrrl5?Pi18YI9iq> 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 RG*fe6ItOEd_7_{_{|Cka;VS?D literal 0 HcmV?d00001 diff --git a/assets/icons/WarMode.blp b/assets/icons/WarMode.blp new file mode 100644 index 0000000000000000000000000000000000000000..12b11fb3a70171ac90ccc7049588709490039707 GIT binary patch literal 88596 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Waypoint.blp b/assets/icons/Waypoint.blp new file mode 100644 index 0000000000000000000000000000000000000000..2ccd01a4b869cda88f317423ef4d140cb5603834 GIT binary patch literal 88596 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 R!Ii*(UJ3Az&Z|#v{~uKUe#Za+ literal 0 HcmV?d00001 diff --git a/assets/icons/ZoneStepTrigger.blp b/assets/icons/ZoneStepTrigger.blp new file mode 100644 index 0000000000000000000000000000000000000000..3f7ad43dcb464c62415a768d6a1d82676802e01b GIT binary patch literal 88596 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�ql|Bg9VDp-$={M|sld)}Fj1&1D?d{}>ObMu;* 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 literal 0 HcmV?d00001 diff --git a/assets/icons/rec.blp b/assets/icons/rec.blp new file mode 100644 index 0000000000000000000000000000000000000000..f0802fd2caeb217d24b2657ef41029f4a75a8c6a GIT binary patch literal 88596 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 R)t~bkV|Oz~`Mt*a{{z@jHU0nq literal 0 HcmV?d00001 diff --git a/assets/icons/rotate.blp b/assets/icons/rotate.blp new file mode 100644 index 0000000000000000000000000000000000000000..d5da390fc96fe774829c6220a42ce93eeeac161b GIT binary patch literal 88596 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

8|*_DU%zbA#U_8AKbh=< zTluFw@2-*i$bQiHPpAX@)7h<4xAZnDG*yr&e%8E z9Y>m04>ZL$QF}-P^NHYBteZnx$luC5>^tP2+w(PcWjOFcbb*3+v7#b)!Sz)1_69hF z(`?f~%SL|-^~Xda5!dYrLjLnB|JsAM^p3B1Xq?&;gU!v&y#42Cb;}c*5B~M$g9)@J zbYpX?e?tEAEB^&!5dJL>9Ywr{_SfbM;@^x9)h!UdkpHaE@@%i&;*Gz)^7t*i)P+Fu z4^GIkx&@P0DPKVUC)2Dn+7m!8+OW0mpmDssyVHHVD)2w6O8TD1^@-Q7OtjbKUrGJL zBkLNC{$Y8~;wy=+VANko;kDOjy}x^;?qI4uIqy&Oy8PE4U(s`7r1ym3KbJ3m=Qsu@ z>G@LZnIQn$Yjoq-yGhFTX#B%Ql)rlS$lVwZL;V9`xikCy174SZp_QMH*WJ=)|A09@ z3ghLDG~GJTqK}vB>?ryCzu4t(>W?{I?)KAyVOqWwcds#g82fPxDV57%x~_4$TJni7G%m=D0v z|C8YBV(0M&puoA=WqP; z<~Jz*n?(EdIkq$U6C>UUFF25zU-QH0U($F;%%2#1>m75xjPxYf!8CUJRW17h*U#IF^vV1z89jkz)!6|)V%zmss7}P zx_wgDOJK-h*7mEW+Xh^!$ZpPyNvx;{DL`D|)^PmeBmk z8tBKv6PWKewH5PaC}Z^pkPic)tF=MSZ?wJDODFM-yJ| zKWp3O)BT|=hn7%sit#99AEEA=TiUmT?zgi#b^na==JhMr_17+Xdb_tMNvPUkMPg&d~w9T!|48@&=1n?$KT&6jrLH+ zuGoq4($0Hw`O{U451~nv>Ww}3Yt_P)JeiF_<5d6`|x`k`^l_@82{e}m6obqqggfTvko@ZTOhT8wn zLDlxYP4k;5pF{*3kH?XZPlm5cR>cwjA6Q<|td+(6Yawa!_lm0LLpQgoRT4Q}1(r4@QP5YV{v*&a5|9-vy3Zyj3D@wQqH}wB!|MtsQ zE0-h?e=9u?Y`Em;n%>>O59Kcl_Q-P0^y^cfoBHNWRKC9WK&bkDy*#50J;cAxh~wus zarspF!wR+clRP${JUsuA&qo)A9;;SSzl!GO<(Mz}-Il(As}+=|BhuaN^!W?xVb7kc zYh=HP{;^fp5NY5E8CI|u!P zJs*cXSNB5wq)XSV|LtSzE00n8#QF5)LjDQY>+6TCnm~T{MBPEscbcEG@Y}|EC2S1s zKak(*vuCT?z)~s?jpz3r>mLb$rt-%7Wx3^kqd$ZANBmr~)|d}K`b+2Y^r{K1k*=rb z(ed&qI?w3-SdR$iQ1%av+}Hdw%DVF@4I{Bm#DuYahS0m-z&>W zw)RuMU-tO5pd+_%f#+2}ec)Wji`2N75_^XeoPb%R}$=EmkV&&?AX4E&fURwDq799HQYI-i> N+W%4*wQuqC{{!0%7=!=- literal 0 HcmV?d00001 diff --git a/assets/icons/settings.blp b/assets/icons/settings.blp new file mode 100644 index 0000000000000000000000000000000000000000..c6d6f767592aabf282c3d3db4767f38d3f088e7e GIT binary patch literal 88596 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 Date: Fri, 19 Jul 2024 02:40:55 +0200 Subject: [PATCH 11/12] Add autocomplete on spellTrigger --- Commands.lua | 10 +++++++--- frames/QuestionPopUp.lua | 1 + frames/autocomplete.lua | 12 ++---------- frames/selectButton.lua | 10 +++++++++- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Commands.lua b/Commands.lua index a5f0e52..3e4f099 100644 --- a/Commands.lua +++ b/Commands.lua @@ -1,5 +1,6 @@ local L = LibStub("AceLocale-3.0"):GetLocale("APR-Recorder") local L_APR = LibStub("AceLocale-3.0"):GetLocale("APR") +local AceGUI = LibStub("AceGUI-3.0") AprRC.command = AprRC:NewModule("Command") @@ -150,11 +151,14 @@ function AprRC.command:SlashCmd(input) }) return elseif inputText == "spelltrigger" then - AprRC.questionDialog:CreateEditBoxPopupWithCallback("SpellTrigger (Spell ID)", function(text) + AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID, function(_, spellID, frame) local currentStep = AprRC:GetLastStep() - currentStep.SpellTrigger = tonumber(text, 10) - print("|cff00bfffSpellTrigger -" .. tonumber(text, 10) .. "|r Added") + + currentStep.SpellTrigger = tonumber(spellID, 10) + print("|cff00bfff SpellTrigger |r Added") + AceGUI:Release(frame) end) + return elseif inputText == "pickupdb" then if AprRC:HasStepOption("PickUp") then diff --git a/frames/QuestionPopUp.lua b/frames/QuestionPopUp.lua index 7b8f674..2321f28 100644 --- a/frames/QuestionPopUp.lua +++ b/frames/QuestionPopUp.lua @@ -8,6 +8,7 @@ function AprRC.questionDialog:CreateEditBoxPopupWithCallback(text, onAcceptCallb text = text or "General Kenobi", hasEditBox = true, button1 = CONTINUE, + button2 = CANCEL, OnShow = function(self) local box = _G[self:GetName() .. "EditBox"] local button = _G[self:GetName() .. "Button1"] -- Récupère le bouton OK diff --git a/frames/autocomplete.lua b/frames/autocomplete.lua index a3abc18..54086e9 100644 --- a/frames/autocomplete.lua +++ b/frames/autocomplete.lua @@ -174,7 +174,7 @@ function AprRC.autocomplete:ShowItemAutoComplete(questID, objectiveID) ) end -function AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID) +function AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID, onConfirm) local spellList = {} for i = 1, C_SpellBook.GetNumSpellBookSkillLines() do local skillLineInfo = C_SpellBook.GetSpellBookSkillLineInfo(i) @@ -189,15 +189,7 @@ function AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID) self:ShowAutoComplete( "Select Spell", spellList, - function(_, spellID, frame) - local currentStep = AprRC:GetLastStep() - if not currentStep.SpellButton then - currentStep.SpellButton = {} - end - currentStep.SpellButton[questID .. "-" .. objectiveID] = tonumber(spellID, 10) - print("|cff00bfff SpellButton |r Added") - AceGUI:Release(frame) - end, + onConfirm, function(match) local spellInfo = C_Spell.GetSpellInfo(match.key) if spellInfo then diff --git a/frames/selectButton.lua b/frames/selectButton.lua index 4a6bc35..632677d 100644 --- a/frames/selectButton.lua +++ b/frames/selectButton.lua @@ -46,7 +46,15 @@ function AprRC.SelectButton:ShowQuestSelector(type) end elseif type == "Spell" then callback = function(questID, objectiveID) - AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID) + AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID, function(_, spellID, frame) + local currentStep = AprRC:GetLastStep() + if not currentStep.SpellButton then + currentStep.SpellButton = {} + end + currentStep.SpellButton[questID .. "-" .. objectiveID] = tonumber(spellID, 10) + print("|cff00bfff SpellButton |r Added") + AceGUI:Release(frame) + end) end end From 6510b3b5a7ea553a30d701b418390bb2804b46f0 Mon Sep 17 00:00:00 2001 From: Aldric Ducreux Date: Fri, 19 Jul 2024 02:53:06 +0200 Subject: [PATCH 12/12] Add autocomplete on achievements --- Commands.lua | 16 ++++++++++------ frames/autocomplete.lua | 25 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Commands.lua b/Commands.lua index 3e4f099..0c3cfcb 100644 --- a/Commands.lua +++ b/Commands.lua @@ -248,17 +248,21 @@ function AprRC.command:SlashCmd(input) print("|cff00bfffClass - " .. select(2, UnitClass("player")) .. "|r Added") return elseif inputText == "achievement" then - AprRC.questionDialog:CreateEditBoxPopupWithCallback("Has Achievement (ID)", function(text) + AprRC.autocomplete:ShowAchievementAutoComplete(function(name, achievementID, frame) local currentStep = AprRC:GetLastStep() - currentStep.HasAchievement = tonumber(text, 10) - print("|cff00bfffHasAchievement - " .. tonumber(text, 10) .. "|r Added") + currentStep.HasAchievement = tonumber(achievementID, 10) + print("|cff00bfffHasAchievement - " .. name .. "|r Added") + + AceGUI:Release(frame) end) return elseif inputText == "noachievement" then - AprRC.questionDialog:CreateEditBoxPopupWithCallback("Dont Have Achievement (ID)", function(text) + AprRC.autocomplete:ShowAchievementAutoComplete(function(name, achievementID, frame) local currentStep = AprRC:GetLastStep() - currentStep.DontHaveAchievement = tonumber(text, 10) - print("|cff00bfffDontHaveAchievement - " .. tonumber(text, 10) .. "|r Added") + currentStep.DontHaveAchievement = tonumber(achievementID, 10) + print("|cff00bfffDontHaveAchievement - " .. name .. "|r Added") + + AceGUI:Release(frame) end) return elseif inputText == "vehicle" then diff --git a/frames/autocomplete.lua b/frames/autocomplete.lua index 54086e9..0946efc 100644 --- a/frames/autocomplete.lua +++ b/frames/autocomplete.lua @@ -201,3 +201,28 @@ function AprRC.autocomplete:ShowSpellAutoComplete(questID, objectiveID, onConfir true ) end + +function AprRC.autocomplete:ShowAchievementAutoComplete(onConfirm) + local achievementList = {} + for _, catId in ipairs(GetCategoryList()) do + for i = 1, GetCategoryNumAchievements(catId) do + local id, name = GetAchievementInfo(catId, i) + if id and name then + achievementList[id] = name + end + end + end + + self:ShowAutoComplete( + "Select Achievement", + achievementList, + onConfirm, + function(match) + local id, name, _, _, _, _, _, _, _, icon = GetAchievementInfo(match.key) + return "|T" .. icon .. ":35:35|t " .. name + end, + 500, + 450, + true + ) +end