feat(tracker): add objective marker button to quest lines

Ascension's client backports retail's floating objective marker. This adds
a button to each tracker quest line that points the marker at that quest,
mirroring the quest pin the world map draws for it.

Supertracking is a slave of the map's quest selection: both the map and the
Blizzard watch frame funnel through SelectQuestLogEntry, and calling
C_SuperTrack.SetSuperTrackedQuestID directly only moves the marker until the
next map interaction stomps it. So the button clicks the same POI frame the
client clicks -- the watch frame button when one exists, otherwise the map's
quest frame.

The client dropped GetSuperTrackedQuestID, so the current quest is read by
hooking SetSuperTrackedQuestID instead. Every path ends up there, including
the automatic re-pick on zone change, so the highlight cannot fall out of
sync with tracking changed outside the addon. Caching what we last set would
have gone stale the moment the player used the map.

The button mirrors the pin's own textures rather than picking atlas cells, so
the digit, the "?" completed quests use and the selected variant all follow
whatever the client draws. Quests with no pin get no button, and the map's
POI frames are built on demand so buttons appear without opening the map.

Adds trackerShowSuperTrackButton and trackerSuperTrackButtonSize.
This commit is contained in:
2026-07-25 01:50:03 +02:00
parent 9da949dd66
commit 6aafd2c112
6 changed files with 380 additions and 0 deletions
@@ -113,6 +113,8 @@ function QuestieOptionsDefaults:Load()
autoTrackQuests = true,
trackerShowCompleteQuests = true,
trackerShowQuestLevel = true,
trackerShowSuperTrackButton = true,
trackerSuperTrackButtonSize = 25,
collapseCompletedQuests = false,
hideCompletedQuestObjectives = false,
hideBlizzardCompletionText = false,
@@ -13,6 +13,8 @@ local TrackerBaseFrame = QuestieLoader:ImportModule("TrackerBaseFrame")
local TrackerLinePool = QuestieLoader:ImportModule("TrackerLinePool")
---@type TrackerQuestTimers
local TrackerQuestTimers = QuestieLoader:ImportModule("TrackerQuestTimers")
---@type TrackerUtils
local TrackerUtils = QuestieLoader:ImportModule("TrackerUtils")
---@type QuestieArrow
local QuestieArrow = QuestieLoader:ImportModule("QuestieArrow")
@@ -175,6 +177,37 @@ function QuestieOptions.tabs.tracker:Initialize()
QuestieTracker:Update()
end
},
showSuperTrackButton = {
type = "toggle",
order = 5,
width = 1.5,
name = function() return l10n('Show Objective Marker Button') end,
desc = function() return l10n('When this is checked, quests that can be reached by the floating objective marker get a button in the Questie Tracker that points the marker at them.') end,
hidden = function() return not TrackerUtils:IsSuperTrackAvailable() end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerShowSuperTrackButton end,
set = function(_, value)
Questie.db.profile.trackerShowSuperTrackButton = value
QuestieTracker:Update()
end
},
superTrackButtonSize = {
type = "range",
order = 6,
width = 1.5,
name = function() return l10n('Objective Marker Button Size') end,
desc = function() return l10n('The size of the objective marker button shown next to each quest in the Questie Tracker.') end,
hidden = function() return not TrackerUtils:IsSuperTrackAvailable() end,
disabled = function() return (not Questie.db.profile.trackerEnabled) or (not Questie.db.profile.trackerShowSuperTrackButton) end,
min = 8,
max = 32,
step = 1,
get = function() return Questie.db.profile.trackerSuperTrackButtonSize end,
set = function(_, value)
Questie.db.profile.trackerSuperTrackButtonSize = value
QuestieTracker:Update()
end
},
showQuestTimer = {
type = "toggle",
order = 3,