Files
Questie-X/Modules/Options/TrackerTab/QuestieOptionsTracker.lua
T
Narcasung 9da949dd66 feat(tracker): add "By Zone + % Complete" sort options
Groups quests by zone with headers, then orders each zone's quests by
completion percent (completes on top / bottom in the reversed variant).
2026-07-19 17:22:53 +02:00

1049 lines
61 KiB
Lua

-------------------------
--Import modules.
-------------------------
---@type QuestieOptions
local QuestieOptions = QuestieLoader:ImportModule("QuestieOptions")
---@type QuestieOptionsUtils
local QuestieOptionsUtils = QuestieLoader:ImportModule("QuestieOptionsUtils")
---@type QuestieTracker
local QuestieTracker = QuestieLoader:ImportModule("QuestieTracker")
---@type TrackerBaseFrame
local TrackerBaseFrame = QuestieLoader:ImportModule("TrackerBaseFrame")
---@type TrackerLinePool
local TrackerLinePool = QuestieLoader:ImportModule("TrackerLinePool")
---@type TrackerQuestTimers
local TrackerQuestTimers = QuestieLoader:ImportModule("TrackerQuestTimers")
---@type QuestieArrow
local QuestieArrow = QuestieLoader:ImportModule("QuestieArrow")
---@type l10n
local l10n = QuestieLoader:ImportModule("l10n")
--- COMPATIBILITY ---
local C_Timer = QuestieCompat.C_Timer
QuestieOptions.tabs.tracker = {}
local _GetShortcuts
local trackerOptions = {}
local SharedMedia = LibStub and LibStub("LibSharedMedia-3.0", true)
-- Build expanded font list from SharedMedia + common WoW fonts
local function GetExpandedFontList()
local fonts = {}
-- Add SharedMedia fonts if available (HashTable returns nil if media type not registered yet)
if SharedMedia and SharedMedia.HashTable then
local lsmFonts = SharedMedia:HashTable("font")
if lsmFonts then
for name, _ in pairs(lsmFonts) do
fonts[name] = name
end
end
end
-- Add common WoW fonts not typically in SharedMedia
local wowFonts = {
["Friz Quadrata TT"] = true,
["Friz Quadrata"] = true,
["Arial Narrow"] = true,
["Arial"] = true,
["Skull"] = true,
["Number Font"] = true,
["GameFontHighlight"] = true,
["GameFontNormal"] = true,
["GameFontBold"] = true,
["GameFontLarge"] = true,
["GameFontNormalSmall"] = true,
["ChatFontNormal"] = true,
["QuestFont"] = true,
["QuestFont_Large"] = true,
["DialogNormal"] = true,
}
for name, _ in pairs(wowFonts) do
fonts[name] = name
end
return fonts
end
function QuestieOptions.tabs.tracker:Initialize()
trackerOptions = {
name = function() return l10n('Tracker') end,
type = "group",
order = 3,
args = {
header = {
type = "header",
order = 1,
name = function() return l10n('Tracker Options') end,
},
enableQuestieTracker = {
type = "toggle",
order = 2,
width = 1.5,
name = function() return l10n('Enable Tracker') end,
desc = function() return l10n("Enabling the Tracker will replace the default Blizzard Quest Tracker with the Questie Tracker.\n\nNOTE: Changing this setting will reload the UI.") end,
disabled = function() return InCombatLockdown() end,
get = function() return Questie.db.profile.trackerEnabled end,
set = function()
if Questie.db.profile.trackerEnabled then
QuestieTracker:Disable()
else
QuestieTracker:Enable()
end
end
},
arrowEnabled = {
type = "toggle",
order = 2.5,
width = 1.5,
name = function() return "Enable Arrow"; end,
desc = function() return "Show the QuestieArrow and auto-track the nearest objective/turn-in."; end,
get = function() return Questie.db.profile.arrowEnabled ~= false; end,
set = function(_, value)
Questie.db.profile.arrowEnabled = value
if QuestieArrow and QuestieArrow.Refresh then
if not value and QuestieArrow.ClearTarget then
QuestieArrow:ClearTarget()
end
QuestieArrow:Refresh()
end
end,
},
Space_X = QuestieOptionsUtils:HorizontalSpacer(3, 0.1),
resetTrackerLocation = {
type = "execute",
order = 4,
width = 0.8,
name = function() return l10n('Reset Tracker') end,
desc = function() return l10n("If the Questie Tracker is stuck offscreen or lost, you can reset it's location to the center of the screen with this button.") end,
disabled = function() return not Questie.db.profile.trackerEnabled or InCombatLockdown() end,
func = function()
QuestieTracker:ResetLocation()
QuestieTracker:Update()
end
},
Spacer_S = QuestieOptionsUtils:Spacer(5),
group_quests = {
type = "group",
order = 6,
inline = true,
width = 0.5,
name = function()
if Questie.IsWotlk then
return l10n("Quest and Achievement Options")
else
return l10n('Quest Options')
end
end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
args = {
autoTrackQuests = {
type = "toggle",
order = 1,
width = 1.5,
name = function() return l10n('Auto Track Quests') end,
desc = function() return l10n("This is the same as 'Enable Automatic Quest Tracking' in the Blizzard Interface Options. When enabled, the Questie Tracker will automatically track all Quests in your Quest Log. Disabling this option will untrack all Quests. You will have to manually select which Quests to track.\n\nNOTE: 'Show Complete Quests' is disabled while this option is not being used.") end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.autoTrackQuests end,
set = function(_, value)
Questie.db.profile.autoTrackQuests = value
if value then
Questie.db.char.TrackedQuests = {}
else
Questie.db.char.AutoUntrackedQuests = {}
end
-- Update Quest Log and mark tracked Quests
local questLogFrame = QuestLogExFrame or ClassicQuestLog or QuestLogFrame
if questLogFrame:IsShown() then
QuestLog_Update()
end
QuestieTracker:Update()
end
},
showQuestLevels = {
type = "toggle",
order = 2,
width = 1.5,
name = function() return l10n('Show Quest Level') end,
desc = function() return l10n('When this is checked, the Quest Level Tags for Quest Titles will show in the Questie Tracker.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerShowQuestLevel end,
set = function(_, value)
Questie.db.profile.trackerShowQuestLevel = value
QuestieTracker:Update()
end
},
showQuestTimer = {
type = "toggle",
order = 3,
width = 1.5,
name = function() return l10n('Show Blizzard Timer') end,
desc = function() return l10n('When this is checked, the default Blizzard Timer Frame for Quests will be shown instead of being embedded inside the Questie Tracker.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.showBlizzardQuestTimer end,
set = function(_, value)
Questie.db.profile.showBlizzardQuestTimer = value
if value == true then
TrackerQuestTimers:ShowBlizzardTimer()
else
TrackerQuestTimers:HideBlizzardTimer()
end
QuestieTracker:Update()
end
},
listAchievementsFirst = {
type = "toggle",
order = 4,
width = 1.5,
name = function() return l10n("List Achievements First") end,
desc = function() return l10n("When this is checked, the Questie Tracker will list Achievements first then Quests.") end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
hidden = function() return not (Questie.IsWotlk or QuestieCompat.Is335) end,
get = function() return Questie.db.profile.listAchievementsFirst end,
set = function(_, value)
Questie.db.profile.listAchievementsFirst = value
QuestieTracker:Update()
end
},
Spacer_Dropdowns = QuestieOptionsUtils:Spacer(5),
openQuestLog = {
type = "select",
order = 7,
values = _GetShortcuts(),
style = 'dropdown',
name = function()
if Questie.IsWotlk then
return l10n('Show Quest / Achievement')
else
return l10n('Show in Quest Log')
end
end,
desc = function()
if Questie.IsWotlk then
return l10n('This shortcut will open the Quest Log with the clicked Quest selected or open Achievements with the clicked Achievement selected.')
else
return l10n('This shortcut will open the Quest Log with the clicked Quest selected.')
end
end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerbindOpenQuestLog end,
set = function(_, key)
Questie.db.profile.trackerbindOpenQuestLog = key
end
},
Space_Y = QuestieOptionsUtils:HorizontalSpacer(7.1, 0.1),
untrackQuest = {
type = "select",
order = 8,
values = _GetShortcuts(),
style = 'dropdown',
name = function()
if Questie.IsWotlk then
return l10n('Untrack / Link')
else
return l10n('Untrack / Link Quest')
end
end,
desc = function()
if Questie.IsWotlk then
return l10n('This shortcut removes a Quest or an Achievement from the Questie Tracker when the chat input box is NOT visible, otherwise this will link a Quest or an Achievement to chat.')
else
return l10n('This shortcut removes a Quest from the Questie Tracker when the chat input box is NOT visible, otherwise this will link a Quest to chat.')
end
end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerbindUntrack end,
set = function(_, key)
Questie.db.profile.trackerbindUntrack = key
end
},
Spacer_Sliders = QuestieOptionsUtils:Spacer(9),
questPadding = {
type = "range",
order = 10,
name = function() return l10n('Padding Between Quests') end,
desc = function() return l10n('The amount of padding between Quests in the Questie Tracker.\n\nNOTE: Changing this setting while in Sizer Manual Mode will reset the Sizer back to Auto Mode') end,
width = 3,
min = 2,
max = 15,
step = 1,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerQuestPadding end,
set = function(_, value)
Questie.db.profile.trackerQuestPadding = value
local trackerHeightByManual = Questie.db.profile.TrackerHeight
if IsMouseButtonDown("LeftButton") and trackerHeightByManual == 0 then
QuestieTracker:Update()
elseif IsMouseButtonDown("LeftButton") and trackerHeightByManual > 0 then
Questie.db.profile.TrackerWidth = 0
Questie.db.profile.TrackerHeight = 0
QuestieTracker:Update()
end
end
},
group_tracker = {
type = "group",
order = 11,
inline = true,
width = 0.5,
name = function() return l10n('Objectives'); end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
args = {
showCompleteQuests = {
type = "toggle",
order = 1,
width = 1.5,
name = function() return l10n('Show Completed Quests') end,
desc = function() return l10n("When this is checked, completed Quests will show in the Questie Tracker.\n\nNOTE: This setting only works when 'Auto Track Quests' is enabled.") end,
disabled = function() return (not Questie.db.profile.trackerEnabled) or (not Questie.db.profile.autoTrackQuests) end,
get = function() return Questie.db.profile.trackerShowCompleteQuests end,
set = function(_, value)
Questie.db.profile.trackerShowCompleteQuests = value
QuestieTracker:Update()
end
},
collapseCompletedQuests = {
type = "toggle",
order = 2,
width = 1.5,
name = function() return l10n('Auto Minimize Completed Quests') end,
desc = function() return l10n('When this is checked, completed Quests will automatically minimize.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.collapseCompletedQuests end,
set = function(_, value)
Questie.db.profile.collapseCompletedQuests = value
if Questie.db.profile.collapseCompletedQuests == false then
Questie.db.char.collapsedQuests = {}
end
QuestieTracker:Update()
end
},
hideCompletedQuestObjectives = {
type = "toggle",
order = 3,
width = 1.5,
name = function() return l10n('Hide Completed Quest Objectives') end,
desc = function() return l10n('When this is checked, completed Quest Objectives will automatically be removed from the Questie Tracker.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.hideCompletedQuestObjectives end,
set = function(_, value)
Questie.db.profile.hideCompletedQuestObjectives = value
QuestieTracker:Update()
end
},
hideCompletedAchieveObjectives = {
type = "toggle",
order = 4,
width = 1.5,
name = function() return l10n('Hide Completed Achieve Objectives') end,
desc = function() return l10n('When this is checked, completed Achievement Objectives will automatically be removed from the Questie Tracker.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
hidden = function() return not Questie.IsWotlk end,
get = function() return Questie.db.profile.hideCompletedAchieveObjectives end,
set = function(_, value)
Questie.db.profile.hideCompletedAchieveObjectives = value
QuestieTracker:Update()
end
},
Spacer_X = QuestieOptionsUtils:Spacer(5),
colorObjectives = {
type = "select",
order = 6,
values = function()
return {
['white'] = l10n('White'),
['whiteToGreen'] = l10n('White to Green'),
['whiteAndGreen'] = l10n('White and Green'),
['redToGreen'] = l10n('Red to Green'),
['minimal'] = l10n('Minimalistic')
}
end,
style = 'dropdown',
name = function() return l10n('Objective Color') end,
desc = function() return l10n('Change the color of Objectives in the Questie Tracker by how complete they are.\n\nNOTE: The Minimalistic option will not display the "Blizzard Completion Text" and just label the Quest as either "Quest Complete!" or "Quest Failed!".') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerColorObjectives end,
set = function(_, key)
Questie.db.profile.trackerColorObjectives = key
QuestieTracker:Update()
end
},
Space_Y = QuestieOptionsUtils:HorizontalSpacer(7, 0.1),
hideBlizzardCompletionText = {
type = "toggle",
order = 8,
width = 1.5,
name = function() return l10n('Hide Blizzard Completion Text') end,
desc = function() return l10n('When this is checked, Blizzard Completion Text will be hidden for completed Quests and instead show the old Questie tags: "Quest Complete!" or "Quest Failed!"') end,
disabled = function() return not Questie.db.profile.trackerEnabled or Questie.db.profile.trackerColorObjectives == "minimal" end,
get = function() return Questie.db.profile.hideBlizzardCompletionText end,
set = function(_, value)
Questie.db.profile.hideBlizzardCompletionText = value
if Questie.db.profile.hideBlizzardCompletionText == false then
Questie.db.char.collapsedQuests = {}
end
QuestieTracker:Update()
end
},
Spacer_Z = QuestieOptionsUtils:Spacer(9),
sortObjectives = {
type = "select",
order = 10,
values = function()
return {
['byComplete'] = l10n('By %% Complete'),
['byCompleteReversed'] = l10n('By %% Complete (Reversed)'),
['byLevel'] = l10n('By Level'),
['byLevelReversed'] = l10n('By Level (Reversed)'),
['byProximity'] = l10n('By Proximity'),
['byProximityReversed'] = l10n('By Proximity (Reversed)'),
['byZone'] = l10n('By Zone'),
['byZoneComplete'] = l10n('By Zone + %% Complete'),
['byZoneCompleteReversed'] = l10n('By Zone + %% Complete (Reversed)'),
['byZonePlayerProximity'] = l10n('By Zone Prox'),
['byZonePlayerProximityReversed'] = l10n('By Zone Prox (Reversed)'),
}
end,
style = 'dropdown',
name = function() return l10n('Objective Sorting') end,
desc = function() return l10n('How Objectives are sorted in the Questie Tracker.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerSortObjectives end,
set = function(_, key)
Questie.db.profile.trackerSortObjectives = key
QuestieTracker:Update()
end
},
},
},
}
},
group_tracker = {
type = "group",
order = 7,
inline = true,
width = 0.5,
name = function() return l10n('Tracker Window Options'); end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
args = {
minimizeInCombat = {
type = "toggle",
order = 1,
width = 1.5,
name = function() return l10n('Minimize In Combat') end,
desc = function() return l10n('When this is checked, the Questie Tracker will automatically be minimized while entering combat.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.hideTrackerInCombat end,
set = function(_, value)
Questie.db.profile.hideTrackerInCombat = value
end
},
minimizeInDungeons = {
type = "toggle",
order = 2,
width = 1.5,
name = function() return l10n('Minimize In Dungeons') end,
desc = function() return l10n('When this is checked, the Questie Tracker will automatically be minimized when entering a dungeon.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.hideTrackerInDungeons end,
set = function(_, value)
Questie.db.profile.hideTrackerInDungeons = value
if value and IsInInstance() then
QuestieTracker:Collapse()
else
QuestieTracker:Expand()
end
end
},
fadeMinMaxButtons = {
type = "toggle",
order = 3,
width = 1.5,
name = function() return l10n('Fade Min/Max Buttons') end,
desc = function() return l10n('When this is checked, the Minimize and Maximize Buttons will fade and become transparent when not in use.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFadeMinMaxButtons end,
set = function(_, value)
Questie.db.profile.trackerFadeMinMaxButtons = value
if value == true then
local fadeTicker
local fadeTickerValue = 1
fadeTicker = C_Timer.NewTicker(0.02, function()
if fadeTickerValue <= 1 then
fadeTickerValue = fadeTickerValue - 0.05
if fadeTickerValue < 0 then
fadeTickerValue = 0
fadeTicker:Cancel()
end
if (Questie.db.char.isTrackerExpanded) then
TrackerLinePool.SetAllExpandQuestAlpha(fadeTickerValue)
end
else
fadeTicker:Cancel()
TrackerLinePool.SetAllExpandQuestAlpha(0)
end
end)
else
TrackerLinePool.SetAllExpandQuestAlpha(1)
end
QuestieTracker:Update()
end
},
fadeQuestItemButtons = {
type = "toggle",
order = 4,
width = 1.5,
name = function() return l10n('Fade Quest Item Buttons') end,
desc = function() return l10n('When this is checked, the Quest Item Buttons will fade and become transparent when not in use.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFadeQuestItemButtons end,
set = function(_, value)
Questie.db.profile.trackerFadeQuestItemButtons = value
if value == true then
local fadeTicker
local fadeTickerValue = 1
fadeTicker = C_Timer.NewTicker(0.02, function()
if fadeTickerValue <= 1 then
fadeTickerValue = fadeTickerValue - 0.05
if fadeTickerValue < 0 then
fadeTickerValue = 0
fadeTicker:Cancel()
end
if (Questie.db.char.isTrackerExpanded) then
TrackerLinePool.SetAllItemButtonAlpha(fadeTickerValue)
end
else
fadeTicker:Cancel()
TrackerLinePool.SetAllItemButtonAlpha(0)
end
end)
else
TrackerLinePool.SetAllItemButtonAlpha(1)
end
QuestieTracker:Update()
end
},
hideSizer = {
type = "toggle",
order = 5,
width = 1.5,
name = function() return l10n("Hide Tracker Sizer") end,
desc = function() return l10n("When this is checked, the Questie Tracker Sizer that appears in the bottom or top right hand corner will be hidden.") end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.sizerHidden end,
set = function(_, value)
Questie.db.profile.sizerHidden = value
QuestieTracker:UpdateFormatting()
end
},
lockTracker = {
type = "toggle",
order = 6,
width = 1.5,
name = function() return l10n("Lock Tracker") end,
desc = function() return l10n("When this is checked, the Questie Tracker is locked and you need to hold CTRL when you want to move it.") end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerLocked end,
set = function(_, value)
Questie.db.profile.trackerLocked = value
TrackerBaseFrame:Update()
end
},
stickyDurabilityFrame = {
type = "toggle",
order = 7,
width = 1.5,
name = function() return l10n('Sticky Durability Frame') end,
desc = function() return l10n('When this is checked, the durability frame will be placed on the left or right side of the Questie Tracker depending on where the Tracker is placed on your screen.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.stickyDurabilityFrame end,
set = function(_, value)
Questie.db.profile.stickyDurabilityFrame = value
if value == false then
QuestieTracker:ResetDurabilityFrame()
end
QuestieTracker:Update()
end
},
stickyVoiceOverFrame = {
type = "toggle",
order = 8,
width = 1.5,
name = function() return l10n("Sticky VoiceOver Frame") end,
desc = function() return l10n("When this is checked, the VoiceOver talking head / sound queue frame will be placed on the left or right side of the Questie Tracker depending on where the Tracker is placed on your screen.") end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
hidden = function() return not (IsAddOnLoaded("AI_VoiceOver") and IsAddOnLoaded("AI_VoiceOverData_Vanilla")) end,
get = function() return Questie.db.profile.stickyVoiceOverFrame end,
set = function(_, value)
Questie.db.profile.stickyVoiceOverFrame = value
if value == false then
QuestieTracker:ResetVoiceOverFrame()
end
QuestieTracker:Update()
end
},
Spacer_Dropdowns = QuestieOptionsUtils:Spacer(9),
setTomTom = {
type = "select",
order = 10,
values = _GetShortcuts(),
style = 'dropdown',
name = function() return l10n('Set |cFF54e33bTomTom|r Target') end,
desc = function()
if Questie.IsWotlk then
return l10n('This shortcut will set the TomTom arrow to point to either an NPC or the first incomplete Quest Objective (if location data is available).\n\nNOTE: This will not work with Achievements.')
else
return l10n('This shortcut will set the TomTom arrow to point to either an NPC or the first incomplete Quest Objective (if location data is available).')
end
end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
hidden = function() return not IsAddOnLoaded("TomTom") end,
get = function() return Questie.db.profile.trackerbindSetTomTom end,
set = function(_, key)
Questie.db.profile.trackerbindSetTomTom = key
end
},
trackerSetpoint = {
type = "select",
order = 11,
values = function()
return {
["TOPLEFT"] = l10n('Down & Right'),
["BOTTOMLEFT"] = l10n('Up & Right'),
["TOPRIGHT"] = l10n('Down & Left'),
["BOTTOMRIGHT"] = l10n('Up & Left'),
}
end,
style = 'dropdown',
name = function() return l10n('Tracker Growth Direction') end,
desc = function()
return l10n("This determines the direction in which the Questie Tracker grows when you add or remove Quests. For example, if you use the 'Up & Right' option then the ideal place for the Tracker should be in the lower left-hand corner of your screen. This allows the 'Sizer Mode: Auto' to push the Tracker Height and Width 'Up & Right' so the Tracker doesn't inadvertently cover up elements of your UI.")
end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerSetpoint end,
set = function(_, key)
Questie.db.profile.trackerSetpoint = key
QuestieTracker:ResetLocation()
QuestieTracker:Update()
end
},
Spacer_Sliders = QuestieOptionsUtils:Spacer(12),
trackerHeightRatio = {
type = "range",
order = 13,
name = function() return l10n('Tracker Height Ratio') end,
desc = function() return l10n('The height of the Questie Tracker based on percentage of usable screen height. A setting of 100 percent would make the Tracker fill the players entire screen height.\n\nNOTE: This setting only applies while in Sizer Mode: Auto') end,
width = 3,
min = 20,
max = 100,
step = 1,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerHeightRatio * 100 end,
set = function(_, value)
Questie.db.profile.trackerHeightRatio = value / 100
if IsMouseButtonDown("LeftButton") and Questie.db.profile.TrackerHeight == 0 then
TrackerBaseFrame.isSizing = true
Questie.db.profile.trackerBackdropEnabled = true
Questie.db.profile.trackerBorderEnabled = true
Questie.db.profile.trackerBackdropFader = false
QuestieTracker:UpdateFormatting()
else
TrackerBaseFrame.isSizing = false
Questie.db.profile.trackerBackdropEnabled = Questie.db.profile.currentBackdropEnabled
Questie.db.profile.trackerBorderEnabled = Questie.db.profile.currentBorderEnabled
Questie.db.profile.trackerBackdropFader = Questie.db.profile.currentBackdropFader
QuestieTracker:UpdateFormatting()
end
end
},
group_header = {
type = "group",
order = 14,
inline = true,
width = 0.5,
name = function() return l10n('Tracker Header') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
args = {
enableHeader = {
type = "toggle",
order = 1,
width = 1.5,
name = function() return l10n("Enable Tracker Header") end,
desc = function() return l10n("When this is enabled the Tracker Header with the number of active quests and the Questie Icon will be permanently visible.\n\nWhen this is disabled the Questie Icon will fade in while your mouse is over the Tracker.") end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerHeaderEnabled end,
set = function(_, value)
Questie.db.profile.trackerHeaderEnabled = value
QuestieTracker:UpdateFormatting()
end
},
moveHeaderToBottom = {
type = "toggle",
order = 2,
width = 1.5,
name = function() return l10n("Show Tracker Header At The Bottom") end,
desc = function() return l10n("When this is enabled the Tracker Header and/or the Questie Icon will be moved to the bottom of the Questie Tracker and the sizer to the top.") end,
disabled = function() return (not Questie.db.profile.trackerEnabled) end,
get = function() return Questie.db.profile.moveHeaderToBottom end,
set = function(_, value)
Questie.db.profile.moveHeaderToBottom = value
QuestieTracker:UpdateFormatting()
end
},
alwaysShowTracker = {
type = "toggle",
order = 3,
width = 1.5,
name = function() return l10n("Show Header For Empty Tracker") end,
desc = function() return l10n("When this is enabled the Tracker Header will be visible even when no quests are being tracked versus the Tracker being hidden completely.") end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.alwaysShowTracker end,
set = function(_, value)
Questie.db.profile.alwaysShowTracker = value
if (Questie.db.profile.alwaysShowTracker == true) and (Questie.db.char.isTrackerExpanded == false) then
Questie.db.char.isTrackerExpanded = true
end
QuestieTracker:UpdateFormatting()
end
},
},
},
group_background = {
type = "group",
order = 15,
inline = true,
width = 0.5,
name = function() return l10n('Tracker Background') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
args = {
enableBackground = {
type = "toggle",
order = 1,
width = 1.5,
name = function() return l10n('Enable Background') end,
desc = function() return l10n('When this is checked, the Questie Tracker Background becomes visible.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerBackdropEnabled end,
set = function(_, value)
Questie.db.profile.trackerBackdropEnabled = value
Questie.db.profile.currentBackdropEnabled = value
if value == true and not Questie.db.profile.trackerBackdropFader then
TrackerBaseFrame.baseFrame:SetBackdropColor(0, 0, 0, Questie.db.profile.trackerBackdropAlpha)
else
TrackerBaseFrame.baseFrame:SetBackdropColor(0, 0, 0, 0)
end
QuestieTracker:UpdateFormatting()
end
},
enableBorder = {
type = "toggle",
order = 2,
width = 1.5,
name = function() return l10n('Enable Border') end,
desc = function() return l10n('When this is checked, the Questie Tracker Border becomes visible.') end,
disabled = function() return not Questie.db.profile.trackerEnabled or not Questie.db.profile.trackerBackdropEnabled end,
get = function() return Questie.db.profile.trackerBorderEnabled end,
set = function(_, value)
Questie.db.profile.trackerBorderEnabled = value
Questie.db.profile.currentBorderEnabled = value
if value == true and not Questie.db.profile.trackerBackdropFader then
TrackerBaseFrame.baseFrame:SetBackdropBorderColor(1, 1, 1, Questie.db.profile.trackerBackdropAlpha)
else
TrackerBaseFrame.baseFrame:SetBackdropBorderColor(1, 1, 1, 0)
end
QuestieTracker:UpdateFormatting()
end
},
fadeTrackerBackdrop = {
type = "toggle",
order = 3,
width = 1.5,
name = function() return l10n('Fade Background') end,
desc = function() return l10n('When this is checked, the Questie Tracker Backdrop and Border (if enabled) will fade and become transparent when not in use.') end,
disabled = function() return not Questie.db.profile.trackerEnabled or not Questie.db.profile.trackerBackdropEnabled end,
get = function() return Questie.db.profile.trackerBackdropFader end,
set = function(_, value)
Questie.db.profile.trackerBackdropFader = value
Questie.db.profile.currentBackdropFader = value
if value == true then
local fadeTicker
local fadeTickerValue = 1
fadeTicker = C_Timer.NewTicker(0.02, function()
if fadeTickerValue <= 1 then
fadeTickerValue = fadeTickerValue - 0.05
if fadeTickerValue < 0 then
fadeTickerValue = 0
fadeTicker:Cancel()
end
if Questie.db.char.isTrackerExpanded then
TrackerBaseFrame.baseFrame:SetBackdropColor(0, 0, 0, fadeTickerValue)
if Questie.db.profile.trackerBorderEnabled then
TrackerBaseFrame.baseFrame:SetBackdropBorderColor(1, 1, 1, fadeTickerValue)
end
end
else
fadeTicker:Cancel()
end
end)
end
QuestieTracker:UpdateFormatting()
end
},
questBackdropAlpha = {
type = "range",
order = 4,
name = function() return l10n('Tracker Backdrop Alpha') end,
desc = function() return l10n('The alpha level of the Questie Trackers backdrop. A setting of 100 percent is fully visible.') end,
width = 3,
min = 0,
max = 100,
step = 5,
disabled = function() return not Questie.db.profile.trackerBackdropEnabled or not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerBackdropAlpha * 100 end,
set = function(_, value)
Questie.db.profile.trackerBackdropAlpha = value / 100
QuestieTracker:UpdateFormatting()
end
},
},
},
}
},
group_fonts = {
type = "group",
order = 8,
inline = true,
width = 0.5,
name = function() return l10n('Font Options'); end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
args = {
fontSizeHeader = {
type = "range",
order = 1,
name = function() return l10n("Font Size for Active Quests Header") end,
desc = function() return l10n("The font size used for the Active Quests Header.") end,
width = "double",
min = 8,
max = 26,
step = 1,
disabled = function() return not Questie.db.profile.trackerEnabled or not Questie.db.profile.trackerHeaderEnabled end,
get = function() return Questie.db.profile.trackerFontSizeHeader end,
set = function(_, value)
Questie.db.profile.trackerFontSizeHeader = value
QuestieTracker:Update()
end
},
fontHeader = {
type = "select",
dialogControl = 'LSM30_Font',
order = 2,
values = GetExpandedFontList(),
style = 'dropdown',
name = function() return l10n("Font for Active Quests Header") end,
desc = function() return l10n("The font used for the Active Quests Header.") end,
disabled = function() return not Questie.db.profile.trackerEnabled or not Questie.db.profile.trackerHeaderEnabled end,
get = function() return Questie.db.profile.trackerFontHeader or "Friz Quadrata TT" end,
set = function(_, value)
Questie.db.profile.trackerFontHeader = value
QuestieTracker:Update()
end
},
fontSizeZone = {
type = "range",
order = 3,
name = function() return l10n('Font Size for Zone Names') end,
desc = function() return l10n('The font size used for zone names.') end,
width = "double",
min = 8,
max = 26,
step = 1,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontSizeZone end,
set = function(_, value)
Questie.db.profile.trackerFontSizeZone = value
QuestieTracker:Update()
end
},
fontZone = {
type = "select",
dialogControl = 'LSM30_Font',
order = 4,
values = GetExpandedFontList(),
style = 'dropdown',
name = function() return l10n('Font for Zone Names') end,
desc = function() return l10n('The font used for zone names.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontZone or "Friz Quadrata TT" end,
set = function(_, value)
Questie.db.profile.trackerFontZone = value
QuestieTracker:Update()
end
},
fontSizeQuest = {
type = "range",
order = 5,
name = function() return l10n('Font Size for Quest Titles') end,
desc = function() return l10n("The font size used for Quest Titles.\n\nNOTE: Objective font size will auto adjust to less than or equal to Quest font size. This is necessary to avoid any text collisions and formatting abnormalities.") end,
width = "double",
min = 8,
max = 26,
step = 1,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontSizeQuest end,
set = function(_, value)
Questie.db.profile.trackerFontSizeQuest = value
if Questie.db.profile.trackerFontSizeObjective > value then
Questie.db.profile.trackerFontSizeObjective = value
end
QuestieTracker:Update()
end
},
fontQuest = {
type = "select",
dialogControl = 'LSM30_Font',
order = 6,
values = GetExpandedFontList(),
style = 'dropdown',
name = function() return l10n('Font for Quest Titles') end,
desc = function() return l10n('The font used for Quest Titles.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontQuest or "Friz Quadrata TT" end,
set = function(_, value)
Questie.db.profile.trackerFontQuest = value
QuestieTracker:Update()
end
},
fontSizeObjective = {
type = "range",
order = 7,
name = function() return l10n('Font Size for Objectives') end,
desc = function() return l10n("The font size used for Objectives.\n\nNOTE: Objective font size will auto adjust to less than or equal to Quest font size. This is necessary to avoid any text collisions and formatting abnormalities.") end,
width = "double",
min = 8,
max = 26,
step = 1,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontSizeObjective end,
set = function(_, value)
if Questie.db.profile.trackerFontSizeQuest < value then
Questie.db.profile.trackerFontSizeObjective = Questie.db.profile.trackerFontSizeQuest
else
Questie.db.profile.trackerFontSizeObjective = value
end
QuestieTracker:Update()
end
},
fontObjective = {
type = "select",
dialogControl = 'LSM30_Font',
order = 8,
values = GetExpandedFontList(),
style = 'dropdown',
name = function() return l10n('Font for Objectives') end,
desc = function() return l10n('The font used for Objectives.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontObjective or "Friz Quadrata TT" end,
set = function(_, value)
Questie.db.profile.trackerFontObjective = value
QuestieTracker:Update()
end
},
applyAllHeader = {
type = "header",
order = 9.1,
name = function() return l10n("Apply to All") end,
},
applyAllFont = {
type = "select",
dialogControl = 'LSM30_Font',
order = 9.2,
values = GetExpandedFontList(),
style = 'dropdown',
width = 1.5,
name = function() return l10n("Font for All") end,
desc = function() return l10n("Set the font for Header, Zones, Quests, and Objectives all at once.") end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontHeader or "Friz Quadrata TT" end,
set = function(_, value)
Questie.db.profile.trackerFontHeader = value
Questie.db.profile.trackerFontZone = value
Questie.db.profile.trackerFontQuest = value
Questie.db.profile.trackerFontObjective = value
QuestieTracker:Update()
end
},
applyAllFontSize = {
type = "range",
order = 9.3,
name = function() return l10n("Font Size for All") end,
desc = function() return l10n("Set the font size for Header, Zones, Quests, and Objectives all at once.") end,
width = "double",
min = 8,
max = 26,
step = 1,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontSizeHeader or 12 end,
set = function(_, value)
Questie.db.profile.trackerFontSizeHeader = value
Questie.db.profile.trackerFontSizeZone = value
Questie.db.profile.trackerFontSizeQuest = value
Questie.db.profile.trackerFontSizeObjective = math.min(value, Questie.db.profile.trackerFontSizeQuest)
QuestieTracker:Update()
end
},
fontOutline = {
type = "select",
dialogControl = 'LSM30_Font',
order = 9,
width = 1.5,
values = {
["None"] = "",
["Outline"] = "OUTLINE",
["Monochrome"] = "MONOCHROME"
},
style = 'dropdown',
name = function() return l10n('Outline for Zones, Titles, and Objectives') end,
desc = function() return l10n('The outline used for Quest Zones, Titles, and Objectives in the Questie Tracker.') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.trackerFontOutline end,
set = function(_, value)
Questie.db.profile.trackerFontOutline = value
QuestieTracker:Update()
end
},
}
},
}
}
return trackerOptions
end
_GetShortcuts = function()
return {
['left'] = l10n('Left Click'),
['right'] = l10n('Right Click'),
['shiftleft'] = l10n('Shift') .. " + " .. l10n('Left Click'),
['shiftright'] = l10n('Shift') .. " + " .. l10n('Right Click'),
['ctrlleft'] = l10n('Control') .. " + " .. l10n('Left Click'),
['ctrlright'] = l10n('Control') .. " + " .. l10n('Right Click'),
['altleft'] = l10n('Alt') .. " + " .. l10n('Left Click'),
['altright'] = l10n('Alt') .. " + " .. l10n('Right Click'),
['disabled'] = l10n('Disabled'),
}
end