-- Questie-Octo tracker driver/state layer. -- -- Backport lineage: -- Questie 5.2.3/6.0.0: Shift+Click quest-log interception and native watch bypass. -- Questie 3.3.5: TrackedQuests / AutoUntrackedQuests semantics and tracker source state. -- Questie 7/8: keep quest-log cache authoritative; tracker renderer consumes state. -- -- This module deliberately does NOT draw the tracker. It produces stable tracked quest -- state for the upcoming 3.3.5-style TrackerBaseFrame/TrackerQuestFrame renderer. QuestieOcto.TrackerDriver = QuestieOcto.TrackerDriver or {} local D=QuestieOcto.TrackerDriver D.started=false D.tracked={} D.ordered={} D.snapshot="" D.questLogHooked=false D.stats={ rebuilds=0, tracked=0, manualToggles=0, shiftClicks=0 } local function Settings() return QuestieOcto.MinimapSettings end local function EnsureCharacterDB() QuestieOctoDB=QuestieOctoDB or {} QuestieOctoDB.tracker=QuestieOctoDB.tracker or {} local db=QuestieOctoDB.tracker db.TrackedQuests=db.TrackedQuests or {} db.AutoUntrackedQuests=db.AutoUntrackedQuests or {} return db end function D:IsTracked(questID) questID=tonumber(questID) if not questID then return false end local db=EnsureCharacterDB() if Settings():Get("trackerAutoTrack") then return QuestieOcto.QuestLog.active[questID] and not db.AutoUntrackedQuests[questID] and true or false end return db.TrackedQuests[questID] and QuestieOcto.QuestLog.active[questID] and true or false end function D:Track(questID) questID=tonumber(questID) if not questID or not QuestieOcto.QuestLog.active[questID] then return false end local db=EnsureCharacterDB() if Settings():Get("trackerAutoTrack") then db.AutoUntrackedQuests[questID]=nil else db.TrackedQuests[questID]=true end self:Rebuild() return true end function D:Untrack(questID) questID=tonumber(questID) if not questID then return false end local db=EnsureCharacterDB() if Settings():Get("trackerAutoTrack") then db.AutoUntrackedQuests[questID]=true else db.TrackedQuests[questID]=nil end self:Rebuild() return true end function D:Toggle(questID) self.stats.manualToggles=self.stats.manualToggles+1 if self:IsTracked(questID) then return self:Untrack(questID) end return self:Track(questID) end local function CompareZone(a,b) -- Questie 3.3.5: zone first, then quest level, then a stable title fallback. local az=string.lower(a.zoneGroup or "Other") local bz=string.lower(b.zoneGroup or "Other") if az~=bz then return az