diff --git a/data/addon/ForeverUI/ObjectiveTracker.lua b/data/addon/ForeverUI/ObjectiveTracker.lua index 9d77fb8..cc66fe3 100644 --- a/data/addon/ForeverUI/ObjectiveTracker.lua +++ b/data/addon/ForeverUI/ObjectiveTracker.lua @@ -49,7 +49,6 @@ local TEXT = { viewPage = OBJECTIVES_VIEW_IN_QUESTLOG, -- OBJECTIVES_VIEW_IN_QUESTLOG (in 3.3.5) viewMap = L.OBJECTIVETRACKER_OPEN_MAP, -- OBJECTIVES_SHOW_QUEST_MAP untrack = L.OBJECTIVETRACKER_UNTRACK, -- OBJECTIVES_STOP_TRACKING - shareInChat = L.OBJECTIVETRACKER_SHARE_IN_CHAT, -- SHARE_IN_CHAT abandonQuest = ABANDON_QUEST_ABBREV, -- ABANDON_QUEST_ABBREV (in 3.3.5) viewAchievement = OBJECTIVES_VIEW_ACHIEVEMENT, -- OBJECTIVES_VIEW_ACHIEVEMENT (in 3.3.5) minutes = "%.2d:%.2d", -- MINUTES_SECONDS @@ -471,6 +470,23 @@ end -- Widths are set by hand: the block is not placed yet when its texts are measured, and -- 3.3.5 only measures a text that has a width (camelot relies on anchors). +-- camelot 70450 block title (QuestObjectiveTrackerMixin:UpdateSingle with QuestUtilsOverrides): +-- "[" level ("+" if elite) "] " title, then the quest type ("(Elite)", "(Dungeon)"...). The +-- difficulty color (showQuestDifficultyColor) is a modern CVar 3.3.5 lacks: not applied. +local function trackerTitle(title, level, questTag) + if not title then + return title + end + local tagText = ForeverUI.QuestTagText and ForeverUI.QuestTagText(questTag) + if tagText then + title = title .. " " .. tagText + end + if level and level > 0 then + title = "[" .. level .. ((questTag == ELITE) and "+" or "") .. "] " .. title + end + return title +end + local function setBlockTitle(b, text) b.title:SetWidth(G.width - G.blockX + b.right) b.title:SetHeight(0) @@ -717,7 +733,7 @@ local function displayQuests(lineFrame, initialOffset, maxHeight, frameWidth) for w = 1, numWatched do local index = GetQuestIndexForWatch(w) if index then - local title, _, _, _, _, _, isComplete, _, questID = GetQuestLogTitle(index) + local title, level, questTag, _, _, _, isComplete, _, questID = GetQuestLogTitle(index) local required = GetQuestLogRequiredMoney(index) local numObjectives = GetNumQuestLeaderBoards(index) local failed = isComplete and isComplete < 0 @@ -752,7 +768,7 @@ local function displayQuests(lineFrame, initialOffset, maxHeight, frameWidth) button = T.object(objects, lineFrame, index, object, charges) b.right = -(G.itemSide + G.rightGap) end - setBlockTitle(b, title) + setBlockTitle(b, trackerTitle(title, level, questTag)) local animate = {} if isComplete then @@ -1019,12 +1035,7 @@ local function questClick(b, mouse) table.insert(l, { text = SHARE_QUEST, func = function() WatchFrame_ShareQuest(nil, w) end }) end end - table.insert(l, { text = TEXT.shareInChat, func = function() - local link = GetQuestLink(index) - if link and not (ChatEdit_InsertLink and ChatEdit_InsertLink(link)) then - ChatFrame_OpenChat(link) - end - end }) + -- camelot 70450 drops "Share in chat" outside the gamepad UI; Shift-click links the quest table.insert(l, { text = TEXT.abandonQuest, func = function() WatchFrame_AbandonQuest(nil, w) end }) -- WotLK manual ordering local n = #VISIBLE_WATCHES diff --git a/data/addon/ForeverUI/QuestLog.lua b/data/addon/ForeverUI/QuestLog.lua index a26a447..5454b83 100644 --- a/data/addon/ForeverUI/QuestLog.lua +++ b/data/addon/ForeverUI/QuestLog.lua @@ -67,7 +67,6 @@ local TEXT = { ready = L.QUESTLOG_READY, -- QUEST_WATCH_QUEST_READY details = L.QUESTLOG_CLICK_DETAILS, -- CLICK_QUEST_DETAILS untrack = L.QUESTLOG_UNTRACK_QUEST, -- UNTRACK_QUEST - shareInChat = L.QUESTLOG_SHARE_IN_CHAT, -- SHARE_IN_CHAT trackAll = L.QUESTLOG_TRACK_ALL, -- QUEST_LOG_TRACK_ALL untrackAll = L.QUESTLOG_UNTRACK_ALL, -- QUEST_LOG_UNTRACK_ALL -- Quest details page @@ -122,10 +121,36 @@ local function entry(index) } end +-- camelot 70450 QuestMapFrameOverrides.titleFrameLeftPadding +local QUEST_LEFT_PADDING = 4 + local function isElite(info) return info.questTag == ELITE end +-- camelot QuestUtilsOverrides.GetQuestTagText (1.60.1.70450): the quest type as text, for four +-- types only: "(Elite)", "(Dungeon)", "(PvP)", "(Raid)" (CALENDAR_TYPE_DUNGEON, CALENDAR_TYPE_PVP, +-- RAID). 3.3.5 GetQuestLogTitle gives the type as a localized text (QuestInfo.dbc): compared with +-- the client's own strings; "Raid (10)" / "Raid (25)" start with RAID. Group and Heroic: nothing. +-- Shared with the objective tracker. +local function questTagText(tag) + if not tag or tag == "" then + return nil + end + local label + if tag == ELITE then + label = ELITE + elseif tag == CALENDAR_TYPE_DUNGEON or tag == LFG_TYPE_DUNGEON then + label = CALENDAR_TYPE_DUNGEON + elseif tag == PVP or tag == CALENDAR_TYPE_PVP then + label = CALENDAR_TYPE_PVP + elseif RAID and string.sub(tag, 1, string.len(RAID)) == RAID then + label = RAID + end + return label and format(PARENS_TEMPLATE, label) or nil +end +ForeverUI.QuestTagText = questTagText + -- QuestLogQuests_GetTitle with camelot's override: "[" level ("+" if elite) "] ", -- preceded by "[n] " if n party members have the quest. local function questTitle(info) @@ -335,15 +360,7 @@ local function questMenu(row) disabled = not shareable, func = function() shareQuest(index) end, }) - table.insert(l, { - text = TEXT.shareInChat, - func = function() - local link = GetQuestLink(index) - if link and not (ChatEdit_InsertLink and ChatEdit_InsertLink(link)) then - ChatFrame_OpenChat(link) - end - end, - }) + -- camelot 70450 drops "Share in chat" outside the gamepad UI; Shift-click links the quest table.insert(l, { text = ABANDON_QUEST, func = function() abandonQuest(index) end, @@ -1744,8 +1761,9 @@ local function fillQuest(v, b, info, count) b.text:SetText(questTitle(info)) color(b.text, c) color(b.tag, c) - if isElite(info) then - b.tag:SetText(format(PARENS_TEMPLATE, ELITE)) + local tagText = questTagText(info.questTag) + if tagText then + b.tag:SetText(tagText) b.tag:Show() b.text:SetPoint("RIGHT", b.tag, "LEFT", -4, 0) else @@ -1885,7 +1903,8 @@ function J.update() count.q = count.q + 1 local b = acquire(v, v.quests, count.q, createQuest) fillQuest(v, b, info, count) - place(b, "quest", 0) + -- camelot 70450 QuestMapFrameOverrides.titleFrameLeftPadding: quest rows 4 px in + place(b, "quest", QUEST_LEFT_PADDING) end end end diff --git a/docs/SUIVI_DES_QUETES.md b/docs/SUIVI_DES_QUETES.md index 69f9474..71e2443 100644 --- a/docs/SUIVI_DES_QUETES.md +++ b/docs/SUIVI_DES_QUETES.md @@ -55,8 +55,15 @@ sa lueur, lueurs d'animation, cadre de l'objet de quête. Feuille ## Décisions (2026-09-25) -1. **Titre** : Camelot par défaut — titre seul, doré uniforme, sans niveau ni - couleur de difficulté. +1. **Titre** : ~~Camelot par défaut — titre seul, doré uniforme, sans niveau ni + couleur de difficulté.~~ **Révisé le 2026-10-17** (camelot 1.60.1.70450, + appliqué à la demande de l'utilisateur) : `[niveau(+)] Titre (Type)` — + préfixe de niveau toujours posé, « + » pour une quête élite + (`QuestUtilsOverrides.GetQuestTitlePrefix`), puis le type pour quatre cas + seulement : (Élite), (Donjon), (JcJ), (Raid) (`GetQuestTagText`). Toujours + doré uniforme : la couleur de difficulté dépend de la CVar moderne + `showQuestDifficultyColor`, absente de 3.3.5. « Lien dans la discussion » + quitte le menu de la quête (camelot ne le garde qu'en mode manette). 2. **Fonctions propres à WotLK** : gardées, habillées Camelot — tri et filtres dans le bouton filtre de l'en-tête, déplacement manuel dans le menu de la quête, minuteurs de quête en barre de temps dans le bloc.