--- Kaliel's Tracker
--- Copyright (c) 2012-2023, Marouan Sabbagh <mar.sabbagh@gmail.com>
--- All Rights Reserved.
---
--- This file is part of addon Kaliel's Tracker.
local addonName , KT = ...
KT.forcedUpdate = false
local ACD = LibStub ( " MSA-AceConfigDialog-3.0 " )
local ACR = LibStub ( " AceConfigRegistry-3.0 " )
local LSM = LibStub ( " LibSharedMedia-3.0 " )
local WidgetLists = AceGUIWidgetLSMlists
local _DBG = function ( ... ) if _DBG then _DBG ( " KT " , ... ) end end
-- Lua API
local floor = math.floor
local fmod = math.fmod
local format = string.format
local ipairs = ipairs
local pairs = pairs
local strlen = string.len
local strsub = string.sub
local db , dbChar
local mediaPath = " Interface \\ AddOns \\ " .. addonName .. " \\ Media \\ "
local anchors = { " TOPLEFT " , " TOPRIGHT " , " BOTTOMLEFT " , " BOTTOMRIGHT " }
local strata = { " BACKGROUND " , " LOW " , " MEDIUM " , " HIGH " }
local flags = { [ " " ] = " None " , [ " OUTLINE " ] = " Outline " , [ " OUTLINE, MONOCHROME " ] = " Outline Monochrome " }
local textures = { " None " , " Default (Blizzard) " , " One line " , " Two lines " }
local modifiers = { [ " " ] = " None " , [ " ALT " ] = " Alt " , [ " CTRL " ] = " Ctrl " , [ " ALT-CTRL " ] = " Alt + Ctrl " }
local realmZones = { [ " EU " ] = " Europe " , [ " NA " ] = " North America " }
local cTitle = " " .. NORMAL_FONT_COLOR_CODE
local cBold = " |cff00ffe3 "
local cWarning = " |cffff7f00 "
local beta = " |cffff7fff[Beta]|r "
local warning = cWarning .. " Warning:|r UI will be re-loaded! "
local KTF = KT.frame
local OTF = KT_ObjectiveTrackerFrame
local overlay
local overlayShown = false
local OverlayFrameUpdate , OverlayFrameHide , GetModulesOptionsTable , MoveModule , SetSharedColor , IsSpecialLocale -- functions
local defaults = {
profile = {
anchorPoint = " TOPRIGHT " ,
xOffset = - 115 ,
yOffset = - 280 ,
maxHeight = 400 ,
frameScrollbar = true ,
frameStrata = " LOW " ,
bgr = " Solid " ,
bgrColor = { r = 0 , g = 0 , b = 0 , a = 0.7 } ,
border = " None " ,
borderColor = { r = 1 , g = 0.82 , b = 0 } ,
classBorder = false ,
borderAlpha = 1 ,
borderThickness = 16 ,
bgrInset = 4 ,
progressBar = " Blizzard " ,
font = LSM : GetDefault ( " font " ) ,
fontSize = 12 ,
fontFlag = " " ,
fontShadow = 1 ,
colorDifficulty = false ,
textWordWrap = false ,
objNumSwitch = false ,
hdrBgr = 2 ,
hdrBgrColor = { r = 1 , g = 0.82 , b = 0 } ,
hdrBgrColorShare = false ,
hdrTxtColor = { r = 1 , g = 0.82 , b = 0 } ,
hdrTxtColorShare = false ,
hdrBtnColor = { r = 1 , g = 0.82 , b = 0 } ,
hdrBtnColorShare = false ,
hdrQuestsTitleAppend = true ,
hdrAchievsTitleAppend = true ,
hdrPetTrackerTitleAppend = true ,
hdrCollapsedTxt = 3 ,
hdrOtherButtons = true ,
keyBindMinimize = " " ,
qiBgrBorder = false ,
qiXOffset = - 5 ,
qiActiveButton = true ,
qiActiveButtonBindingShow = true ,
hideEmptyTracker = false ,
collapseInInstance = false ,
tooltipShow = true ,
tooltipShowRewards = true ,
tooltipShowID = true ,
menuWowheadURL = true ,
menuWowheadURLModifier = " ALT " ,
questDefaultActionMap = true ,
questShowTags = true ,
questShowZones = true ,
messageQuest = true ,
messageAchievement = true ,
sink20OutputSink = " UIErrorsFrame " ,
sink20Sticky = false ,
soundQuest = true ,
soundQuestComplete = " KT - Default " ,
modulesOrder = KT.BLIZZARD_MODULES ,
addonMasque = false ,
addonPetTracker = false ,
addonTomTom = false ,
hackLFG = true ,
} ,
char = {
collapsed = false ,
quests = {
num = 0 ,
favorites = { } ,
cache = { }
} ,
achievements = {
favorites = { }
} ,
}
}
local options = {
name = " |T " .. mediaPath .. " KT_logo:22:22:-1:7|t " .. KT.title ,
type = " group " ,
get = function ( info ) return db [ info [ # info ] ] end ,
args = {
general = {
name = " Options " ,
type = " group " ,
args = {
sec0 = {
name = " Info " ,
type = " group " ,
inline = true ,
order = 0 ,
args = {
version = {
name = " |cffffd100Version:|r " .. KT.version ,
type = " description " ,
width = " normal " ,
fontSize = " medium " ,
order = 0.11 ,
} ,
build = {
name = " |cffffd100Build:|r Retail " ,
type = " description " ,
width = " normal " ,
fontSize = " medium " ,
order = 0.12 ,
} ,
slashCmd = {
name = cBold .. " /kt|r |cff808080...............|r Toggle (expand/collapse) the tracker \n " ..
cBold .. " /kt config|r |cff808080...|r Show this config window \n " ,
type = " description " ,
width = " double " ,
order = 0.3 ,
} ,
news = {
name = " What's New " ,
type = " execute " ,
disabled = function ( )
return not KT.Help : IsEnabled ( )
end ,
func = function ( )
KT.Help : ShowHelp ( true )
end ,
order = 0.2 ,
} ,
help = {
name = " Help " ,
type = " execute " ,
disabled = function ( )
return not KT.Help : IsEnabled ( )
end ,
func = function ( )
KT.Help : ShowHelp ( )
end ,
order = 0.4 ,
} ,
supportersSpacer = {
name = " " ,
type = " description " ,
width = " normal " ,
order = 0.51 ,
} ,
supportersLabel = {
name = " |cff00ff00Become a Patron " ,
type = " description " ,
width = " normal " ,
fontSize = " medium " ,
order = 0.52 ,
} ,
supporters = {
name = " Supporters " ,
type = " execute " ,
disabled = function ( )
return not KT.Help : IsEnabled ( )
end ,
func = function ( )
KT.Help : ShowSupporters ( )
end ,
order = 0.53 ,
} ,
} ,
} ,
sec1 = {
name = " Position / Size " ,
type = " group " ,
inline = true ,
order = 1 ,
args = {
anchorPoint = {
name = " Anchor point " ,
desc = " - Default: " .. defaults.profile . anchorPoint ,
type = " select " ,
values = anchors ,
get = function ( )
for k , v in ipairs ( anchors ) do
if db.anchorPoint == v then
return k
end
end
end ,
set = function ( _ , value )
db.anchorPoint = anchors [ value ]
db.xOffset = 0
db.yOffset = 0
KT : MoveTracker ( )
OverlayFrameUpdate ( )
KT_ObjectiveTracker_Collapse ( )
KT_ObjectiveTracker_Expand ( )
end ,
order = 1.1 ,
} ,
xOffset = {
name = " X offset " ,
desc = " - Default: " .. defaults.profile . xOffset .. " \n - Step: 1 " ,
type = " range " ,
min = 0 ,
max = 0 ,
step = 1 ,
set = function ( _ , value )
db.xOffset = value
KT : MoveTracker ( )
end ,
order = 1.2 ,
} ,
yOffset = {
name = " Y offset " ,
desc = " - Default: " .. defaults.profile . yOffset .. " \n - Step: 2 " ,
type = " range " ,
min = 0 ,
max = 0 ,
step = 2 ,
set = function ( _ , value )
db.yOffset = value
KT : MoveTracker ( )
KT : SetSize ( )
OverlayFrameUpdate ( )
end ,
order = 1.3 ,
} ,
maxHeight = {
name = " Max. height " ,
desc = " - Default: " .. defaults.profile . maxHeight .. " \n - Step: 2 " ,
type = " range " ,
min = 100 ,
max = 100 ,
step = 2 ,
set = function ( _ , value )
db.maxHeight = value
KT : SetSize ( )
OverlayFrameUpdate ( )
end ,
order = 1.4 ,
} ,
maxHeightShowOverlay = {
name = " Show Max. height overlay " ,
desc = " Show overlay, for better visualisation Max. height value. " ,
type = " toggle " ,
width = 1.3 ,
get = function ( )
return overlayShown
end ,
set = function ( )
overlayShown = not overlayShown
if overlayShown and not overlay then
overlay = CreateFrame ( " Frame " , KTF : GetName ( ) .. " Overlay " , KTF )
overlay : SetFrameLevel ( KTF : GetFrameLevel ( ) + 12 )
overlay : EnableMouse ( true )
overlay.texture = overlay : CreateTexture ( nil , " BACKGROUND " )
overlay.texture : SetAllPoints ( )
overlay.texture : SetColorTexture ( 0 , 1 , 0 , 0.3 )
OverlayFrameUpdate ( )
end
overlay : SetShown ( overlayShown )
end ,
order = 1.5 ,
} ,
maxHeightNote = {
name = cBold .. " \n Max. height is related with value Y offset. \n " ..
" Content is lesser ... tracker height is automatically increases. \n " ..
" Content is greater ... tracker enables scrolling. " ,
type = " description " ,
order = 1.6 ,
} ,
frameScrollbar = {
name = " Show scroll indicator " ,
desc = " Show scroll indicator when srolling is enabled. Color is shared with border. " ,
type = " toggle " ,
set = function ( )
db.frameScrollbar = not db.frameScrollbar
KTF.Bar : SetShown ( db.frameScrollbar )
KT : SetSize ( )
end ,
order = 1.7 ,
} ,
frameStrata = {
name = " Strata " ,
desc = " - Default: " .. defaults.profile . frameStrata ,
type = " select " ,
values = strata ,
get = function ( )
for k , v in ipairs ( strata ) do
if db.frameStrata == v then
return k
end
end
end ,
set = function ( _ , value )
db.frameStrata = strata [ value ]
KTF : SetFrameStrata ( strata [ value ] )
KTF.Buttons : SetFrameStrata ( strata [ value ] )
end ,
order = 1.8 ,
} ,
} ,
} ,
sec2 = {
name = " Background / Border " ,
type = " group " ,
inline = true ,
order = 2 ,
args = {
bgr = {
name = " Background texture " ,
type = " select " ,
dialogControl = " LSM30_Background " ,
values = WidgetLists.background ,
set = function ( _ , value )
db.bgr = value
KT : SetBackground ( )
end ,
order = 2.1 ,
} ,
bgrColor = {
name = " Background color " ,
type = " color " ,
hasAlpha = true ,
get = function ( )
return db.bgrColor . r , db.bgrColor . g , db.bgrColor . b , db.bgrColor . a
end ,
set = function ( _ , r , g , b , a )
db.bgrColor . r = r
db.bgrColor . g = g
db.bgrColor . b = b
db.bgrColor . a = a
KT : SetBackground ( )
end ,
order = 2.2 ,
} ,
bgrNote = {
name = cBold .. " For a custom background \n texture set white color. " ,
type = " description " ,
width = " normal " ,
order = 2.21 ,
} ,
border = {
name = " Border texture " ,
type = " select " ,
dialogControl = " LSM30_Border " ,
values = WidgetLists.border ,
set = function ( _ , value )
db.border = value
KT : SetBackground ( )
KT : MoveButtons ( )
end ,
order = 2.3 ,
} ,
borderColor = {
name = " Border color " ,
type = " color " ,
disabled = function ( )
return db.classBorder
end ,
get = function ( )
if not db.classBorder then
SetSharedColor ( db.borderColor )
end
return db.borderColor . r , db.borderColor . g , db.borderColor . b
end ,
set = function ( _ , r , g , b )
db.borderColor . r = r
db.borderColor . g = g
db.borderColor . b = b
KT : SetBackground ( )
KT : SetText ( )
SetSharedColor ( db.borderColor )
end ,
order = 2.4 ,
} ,
classBorder = {
name = " Border color by |cff%sClass|r " ,
type = " toggle " ,
get = function ( info )
if db [ info [ # info ] ] then
SetSharedColor ( KT.classColor )
end
return db [ info [ # info ] ]
end ,
set = function ( )
db.classBorder = not db.classBorder
KT : SetBackground ( )
KT : SetText ( )
end ,
order = 2.5 ,
} ,
borderAlpha = {
name = " Border transparency " ,
desc = " - Default: " .. defaults.profile . borderAlpha .. " \n - Step: 0.05 " ,
type = " range " ,
min = 0.1 ,
max = 1 ,
step = 0.05 ,
set = function ( _ , value )
db.borderAlpha = value
KT : SetBackground ( )
end ,
order = 2.6 ,
} ,
borderThickness = {
name = " Border thickness " ,
desc = " - Default: " .. defaults.profile . borderThickness .. " \n - Step: 0.5 " ,
type = " range " ,
min = 1 ,
max = 24 ,
step = 0.5 ,
set = function ( _ , value )
db.borderThickness = value
KT : SetBackground ( )
end ,
order = 2.7 ,
} ,
bgrInset = {
name = " Background inset " ,
desc = " - Default: " .. defaults.profile . bgrInset .. " \n - Step: 0.5 " ,
type = " range " ,
min = 0 ,
max = 10 ,
step = 0.5 ,
set = function ( _ , value )
db.bgrInset = value
KT : SetBackground ( )
KT : MoveButtons ( )
end ,
order = 2.8 ,
} ,
progressBar = {
name = " Progress bar texture " ,
type = " select " ,
dialogControl = " LSM30_Statusbar " ,
values = WidgetLists.statusbar ,
set = function ( _ , value )
db.progressBar = value
KT.forcedUpdate = true
KT_ObjectiveTracker_Update ( )
if PetTracker then
PetTracker.Objectives : Update ( )
end
KT.forcedUpdate = false
end ,
order = 2.9 ,
} ,
} ,
} ,
sec3 = {
name = " Texts " ,
type = " group " ,
inline = true ,
order = 3 ,
args = {
font = {
name = " Font " ,
type = " select " ,
dialogControl = " LSM30_Font " ,
values = WidgetLists.font ,
set = function ( _ , value )
db.font = value
KT.forcedUpdate = true
KT : SetText ( )
KT_ObjectiveTracker_Update ( )
if PetTracker then
PetTracker.Objectives : Update ( )
end
KT.forcedUpdate = false
end ,
order = 3.1 ,
} ,
fontSize = {
name = " Font size " ,
type = " range " ,
min = 8 ,
max = 24 ,
step = 1 ,
set = function ( _ , value )
db.fontSize = value
KT.forcedUpdate = true
KT : SetText ( )
KT_ObjectiveTracker_Update ( )
if PetTracker then
PetTracker.Objectives : Update ( )
end
KT.forcedUpdate = false
end ,
order = 3.2 ,
} ,
fontFlag = {
name = " Font flag " ,
type = " select " ,
values = flags ,
get = function ( )
for k , v in pairs ( flags ) do
if db.fontFlag == k then
return k
end
end
end ,
set = function ( _ , value )
db.fontFlag = value
KT.forcedUpdate = true
KT : SetText ( )
KT_ObjectiveTracker_Update ( )
if PetTracker then
PetTracker.Objectives : Update ( )
end
KT.forcedUpdate = false
end ,
order = 3.3 ,
} ,
fontShadow = {
name = " Font shadow " ,
desc = warning ,
type = " toggle " ,
confirm = true ,
confirmText = warning ,
get = function ( )
return ( db.fontShadow == 1 )
end ,
set = function ( _ , value )
db.fontShadow = value and 1 or 0
ReloadUI ( ) -- WTF
end ,
order = 3.4 ,
} ,
colorDifficulty = {
name = " Color by difficulty " ,
desc = " Quest titles color by difficulty. " ,
type = " toggle " ,
set = function ( )
db.colorDifficulty = not db.colorDifficulty
KT_ObjectiveTracker_Update ( )
QuestMapFrame_UpdateAll ( )
end ,
order = 3.5 ,
} ,
textWordWrap = {
name = " Wrap long texts " ,
desc = " Long texts shows on two lines or on one line with ellipsis (...). " ,
type = " toggle " ,
set = function ( )
db.textWordWrap = not db.textWordWrap
KT.forcedUpdate = true
KT_ObjectiveTracker_Update ( )
KT_ObjectiveTracker_Update ( )
KT.forcedUpdate = false
end ,
order = 3.6 ,
} ,
objNumSwitch = {
name = " Objective numbers at the beginning " ,
desc = " Changing the position of objective numbers at the beginning of the line. " ..
cBold .. " Only for deDE, esES, frFR, ruRU locale. " ,
descStyle = " inline " ,
type = " toggle " ,
width = 2.2 ,
disabled = function ( )
return not IsSpecialLocale ( )
end ,
set = function ( )
db.objNumSwitch = not db.objNumSwitch
KT_ObjectiveTracker_Update ( )
end ,
order = 3.7 ,
} ,
} ,
} ,
sec4 = {
name = " Headers " ,
type = " group " ,
inline = true ,
order = 4 ,
args = {
hdrBgrLabel = {
name = " Texture " ,
type = " description " ,
width = " half " ,
fontSize = " medium " ,
order = 4.1 ,
} ,
hdrBgr = {
name = " " ,
type = " select " ,
values = textures ,
get = function ( )
for k , v in ipairs ( textures ) do
if db.hdrBgr == k then
return k
end
end
end ,
set = function ( _ , value )
db.hdrBgr = value
KT : SetBackground ( )
end ,
order = 4.11 ,
} ,
hdrBgrColor = {
name = " Color " ,
desc = " Sets the color to texture of the header. " ,
type = " color " ,
width = " half " ,
disabled = function ( )
return ( db.hdrBgr < 3 or db.hdrBgrColorShare )
end ,
get = function ( )
return db.hdrBgrColor . r , db.hdrBgrColor . g , db.hdrBgrColor . b
end ,
set = function ( _ , r , g , b )
db.hdrBgrColor . r = r
db.hdrBgrColor . g = g
db.hdrBgrColor . b = b
KT : SetBackground ( )
end ,
order = 4.12 ,
} ,
hdrBgrColorShare = {
name = " Use border color " ,
desc = " The color of texture is shared with the border color. " ,
type = " toggle " ,
disabled = function ( )
return ( db.hdrBgr < 3 )
end ,
set = function ( )
db.hdrBgrColorShare = not db.hdrBgrColorShare
KT : SetBackground ( )
end ,
order = 4.13 ,
} ,
hdrTxtLabel = {
name = " Text " ,
type = " description " ,
width = " half " ,
fontSize = " medium " ,
order = 4.2 ,
} ,
hdrTxtColor = {
name = " Color " ,
desc = " Sets the color to header texts. " ,
type = " color " ,
width = " half " ,
disabled = function ( )
KT : SetText ( )
return ( db.hdrBgr == 2 or db.hdrTxtColorShare )
end ,
get = function ( )
return db.hdrTxtColor . r , db.hdrTxtColor . g , db.hdrTxtColor . b
end ,
set = function ( _ , r , g , b )
db.hdrTxtColor . r = r
db.hdrTxtColor . g = g
db.hdrTxtColor . b = b
KT : SetText ( )
end ,
order = 4.21 ,
} ,
hdrTxtColorShare = {
name = " Use border color " ,
desc = " The color of header texts is shared with the border color. " ,
type = " toggle " ,
disabled = function ( )
return ( db.hdrBgr == 2 )
end ,
set = function ( )
db.hdrTxtColorShare = not db.hdrTxtColorShare
KT : SetText ( )
end ,
order = 4.22 ,
} ,
hdrTxtSpacer = {
name = " " ,
type = " description " ,
width = " normal " ,
order = 4.23 ,
} ,
hdrBtnLabel = {
name = " Buttons " ,
type = " description " ,
width = " half " ,
fontSize = " medium " ,
order = 4.3 ,
} ,
hdrBtnColor = {
name = " Color " ,
desc = " Sets the color to all header buttons. " ,
type = " color " ,
width = " half " ,
disabled = function ( )
return db.hdrBtnColorShare
end ,
get = function ( )
return db.hdrBtnColor . r , db.hdrBtnColor . g , db.hdrBtnColor . b
end ,
set = function ( _ , r , g , b )
db.hdrBtnColor . r = r
db.hdrBtnColor . g = g
db.hdrBtnColor . b = b
KT : SetBackground ( )
end ,
order = 4.32 ,
} ,
hdrBtnColorShare = {
name = " Use border color " ,
desc = " The color of all header buttons is shared with the border color. " ,
type = " toggle " ,
set = function ( )
db.hdrBtnColorShare = not db.hdrBtnColorShare
KT : SetBackground ( )
end ,
order = 4.33 ,
} ,
hdrBtnSpacer = {
name = " " ,
type = " description " ,
width = " normal " ,
order = 4.34 ,
} ,
sec4SpacerMid1 = {
name = " " ,
type = " description " ,
order = 4.35 ,
} ,
hdrQuestsTitleAppend = {
name = " Show number of Quests " ,
desc = " Show number of Quests inside the Quests header. " ,
type = " toggle " ,
width = " normal+half " ,
set = function ( )
db.hdrQuestsTitleAppend = not db.hdrQuestsTitleAppend
KT : SetQuestsHeaderText ( true )
end ,
order = 4.4 ,
} ,
hdrAchievsTitleAppend = {
name = " Show Achievement points " ,
desc = " Show Achievement points inside the Achievements header. " ,
type = " toggle " ,
width = " normal+half " ,
set = function ( )
db.hdrAchievsTitleAppend = not db.hdrAchievsTitleAppend
KT : SetAchievsHeaderText ( true )
end ,
order = 4.5 ,
} ,
hdrPetTrackerTitleAppend = { -- Addon - PetTracker
name = " Show number of owned Pets " ,
desc = " Show number of owned Pets inside the PetTracker header. " ,
type = " toggle " ,
width = " normal+half " ,
disabled = function ( )
return not KT.AddonPetTracker . isLoaded
end ,
set = function ( )
db.hdrPetTrackerTitleAppend = not db.hdrPetTrackerTitleAppend
KT.AddonPetTracker : SetPetsHeaderText ( true )
end ,
order = 4.6 ,
} ,
sec4SpacerMid2 = {
name = " " ,
type = " description " ,
order = 4.65 ,
} ,
hdrCollapsedTxtLabel = {
name = " Collapsed tracker text " ,
type = " description " ,
width = " normal " ,
fontSize = " medium " ,
order = 4.7 ,
} ,
hdrCollapsedTxt1 = {
name = " None " ,
desc = " Reduces the tracker width when minimized. " ,
type = " toggle " ,
width = " half " ,
get = function ( )
return ( db.hdrCollapsedTxt == 1 )
end ,
set = function ( )
db.hdrCollapsedTxt = 1
KT_ObjectiveTracker_Update ( )
end ,
order = 4.71 ,
} ,
hdrCollapsedTxt2 = {
name = ( " %d/%d " ) : format ( 0 , MAX_QUESTS ) ,
type = " toggle " ,
width = " half " ,
get = function ( )
return ( db.hdrCollapsedTxt == 2 )
end ,
set = function ( )
db.hdrCollapsedTxt = 2
KT_ObjectiveTracker_Update ( )
end ,
order = 4.72 ,
} ,
hdrCollapsedTxt3 = {
name = ( " %d/%d Quests " ) : format ( 0 , MAX_QUESTS ) ,
type = " toggle " ,
get = function ( )
return ( db.hdrCollapsedTxt == 3 )
end ,
set = function ( )
db.hdrCollapsedTxt = 3
KT_ObjectiveTracker_Update ( )
end ,
order = 4.73 ,
} ,
hdrOtherButtons = {
name = " Show Quest Log and Achievements buttons " ,
type = " toggle " ,
width = " double " ,
set = function ( )
db.hdrOtherButtons = not db.hdrOtherButtons
KT : SetOtherButtons ( )
KT : SetBackground ( )
KT_ObjectiveTracker_Update ( )
end ,
order = 4.8 ,
} ,
keyBindMinimize = {
name = " Key - Minimize button " ,
type = " keybinding " ,
set = function ( _ , value )
SetOverrideBinding ( KTF , false , db.keyBindMinimize , nil )
if value ~= " " then
local key = GetBindingKey ( " EXTRAACTIONBUTTON1 " )
if key == value then
SetBinding ( key )
SaveBindings ( GetCurrentBindingSet ( ) )
end
SetOverrideBindingClick ( KTF , false , value , KTF.MinimizeButton : GetName ( ) )
end
db.keyBindMinimize = value
end ,
order = 4.9 ,
} ,
} ,
} ,
sec5 = {
name = " Quest item buttons " ,
type = " group " ,
inline = true ,
order = 5 ,
args = {
qiBgrBorder = {
name = " Show buttons block background and border " ,
type = " toggle " ,
width = " double " ,
set = function ( )
db.qiBgrBorder = not db.qiBgrBorder
KT : SetBackground ( )
KT : MoveButtons ( )
end ,
order = 5.1 ,
} ,
qiXOffset = {
name = " X offset " ,
type = " range " ,
min = - 10 ,
max = 10 ,
step = 1 ,
set = function ( _ , value )
db.qiXOffset = value
KT : MoveButtons ( )
end ,
order = 5.2 ,
} ,
qiActiveButton = {
name = " Enable Active button " ,
desc = " Show Quest item button for CLOSEST quest as \" Extra Action Button \" . \n " ..
cBold .. " Key bind is shared with EXTRAACTIONBUTTON1. " ,
descStyle = " inline " ,
width = " double " ,
type = " toggle " ,
confirm = true ,
confirmText = warning ,
set = function ( )
db.qiActiveButton = not db.qiActiveButton
if db.qiActiveButton then
KT.ActiveButton : Enable ( )
else
KT.ActiveButton : Disable ( )
end
ReloadUI ( )
end ,
order = 5.3 ,
} ,
keyBindActiveButton = {
name = " Key - Active button " ,
type = " keybinding " ,
disabled = function ( )
return not db.qiActiveButton
end ,
get = function ( )
local key = GetBindingKey ( " EXTRAACTIONBUTTON1 " )
return key
end ,
set = function ( _ , value )
local key = GetBindingKey ( " EXTRAACTIONBUTTON1 " )
if key then
SetBinding ( key )
end
if value ~= " " then
if db.keyBindMinimize == value then
SetOverrideBinding ( KTF , false , db.keyBindMinimize , nil )
db.keyBindMinimize = " "
end
SetBinding ( value , " EXTRAACTIONBUTTON1 " )
end
SaveBindings ( GetCurrentBindingSet ( ) )
end ,
order = 5.4 ,
} ,
qiActiveButtonBindingShow = {
name = " Show Active button Binding text " ,
width = " normal+half " ,
type = " toggle " ,
disabled = function ( )
return not db.qiActiveButton
end ,
set = function ( )
db.qiActiveButtonBindingShow = not db.qiActiveButtonBindingShow
KTF.ActiveFrame : Hide ( )
KT.ActiveButton : Update ( )
end ,
order = 5.5 ,
} ,
qiActiveButtonSpacer = {
name = " " ,
type = " description " ,
width = " half " ,
order = 5.51 ,
} ,
qiActiveButtonUnlock = {
name = UNLOCK ,
type = " execute " ,
disabled = function ( )
return not db.qiActiveButton
end ,
func = function ( )
HideUIPanel ( SettingsPanel )
KTF.ActiveFrame . overlay : Show ( )
StaticPopup_Show ( addonName .. " _LockUI " , nil , " Addon UI elements unlocked. \n Move them and click Lock when you are done. \n \n " .. cBold .. " Right Click|r on mover restore the default position. " )
end ,
order = 5.6 ,
} ,
addonMasqueLabel = {
name = " Skin options - for Quest item buttons or Active button " ,
type = " description " ,
width = " double " ,
fontSize = " medium " ,
order = 5.7 ,
} ,
addonMasqueOptions = {
name = " Masque " ,
type = " execute " ,
disabled = function ( )
return ( not IsAddOnLoaded ( " Masque " ) or not db.addonMasque or not KT.AddonOthers : IsEnabled ( ) )
end ,
func = function ( )
SlashCmdList [ " MASQUE " ] ( )
SlashCmdList [ " MASQUE " ] ( )
end ,
order = 5.71 ,
} ,
} ,
} ,
sec6 = {
name = " Other options " ,
type = " group " ,
inline = true ,
order = 6 ,
args = {
trackerTitle = {
name = cTitle .. " Tracker " ,
type = " description " ,
fontSize = " medium " ,
order = 6.1 ,
} ,
hideEmptyTracker = {
name = " Hide empty tracker " ,
type = " toggle " ,
set = function ( )
db.hideEmptyTracker = not db.hideEmptyTracker
KT : ToggleEmptyTracker ( )
end ,
order = 6.11 ,
} ,
collapseInInstance = {
name = " Collapse in instance " ,
desc = " Collapses the tracker when entering an instance. Note: Enabled Auto filtering can expand the tracker. " ,
type = " toggle " ,
set = function ( )
db.collapseInInstance = not db.collapseInInstance
end ,
order = 6.12 ,
} ,
tooltipTitle = {
name = " \n " .. cTitle .. " Tooltips " ,
type = " description " ,
fontSize = " medium " ,
order = 6.2 ,
} ,
tooltipShow = {
name = " Show tooltips " ,
desc = " Show Quest / World Quest / Achievement / Scenario tooltips. " ,
type = " toggle " ,
set = function ( )
db.tooltipShow = not db.tooltipShow
end ,
order = 6.21 ,
} ,
tooltipShowRewards = {
name = " Show Rewards " ,
desc = " Show Quest Rewards inside tooltips - Artifact Power, Order Resources, Money, Equipment etc. " ,
type = " toggle " ,
disabled = function ( )
return not db.tooltipShow
end ,
set = function ( )
db.tooltipShowRewards = not db.tooltipShowRewards
end ,
order = 6.22 ,
} ,
tooltipShowID = {
name = " Show ID " ,
desc = " Show Quest / World Quest / Achievement ID inside tooltips. " ,
type = " toggle " ,
disabled = function ( )
return not db.tooltipShow
end ,
set = function ( )
db.tooltipShowID = not db.tooltipShowID
end ,
order = 6.23 ,
} ,
menuTitle = {
name = " \n " .. cTitle .. " Menu items " ,
type = " description " ,
fontSize = " medium " ,
order = 6.3 ,
} ,
menuWowheadURL = {
name = " Wowhead URL " ,
desc = " Show Wowhead URL menu item inside the tracker and Quest Log. " ,
type = " toggle " ,
set = function ( )
db.menuWowheadURL = not db.menuWowheadURL
end ,
order = 6.31 ,
} ,
menuWowheadURLModifier = {
name = " Wowhead URL click modifier " ,
type = " select " ,
values = modifiers ,
get = function ( )
for k , v in pairs ( modifiers ) do
if db.menuWowheadURLModifier == k then
return k
end
end
end ,
set = function ( _ , value )
db.menuWowheadURLModifier = value
end ,
order = 6.32 ,
} ,
questTitle = {
name = cTitle .. " \n Quests " ,
type = " description " ,
fontSize = " medium " ,
order = 6.4 ,
} ,
questDefaultActionMap = {
name = " Quest default action - World Map " ,
desc = " Set the Quest default action as \" World Map \" . Otherwise is the default action \" Quest Details \" . " ,
type = " toggle " ,
width = " normal+half " ,
set = function ( )
db.questDefaultActionMap = not db.questDefaultActionMap
end ,
order = 6.41 ,
} ,
questShowTags = {
name = " Show Quest tags " ,
desc = " Show / Hide Quest tags (quest level, quest type) inside the tracker. " ,
type = " toggle " ,
set = function ( )
db.questShowTags = not db.questShowTags
KT_ObjectiveTracker_Update ( )
end ,
order = 6.42 ,
} ,
questShowZones = {
name = " Show Quest Zones " ,
desc = " Show / Hide Quest Zones inside the tracker. " ,
type = " toggle " ,
set = function ( )
db.questShowZones = not db.questShowZones
KT_ObjectiveTracker_Update ( )
end ,
order = 6.43 ,
} ,
questAutoTrack = {
name = " Auto Quest tracking " ,
desc = " Quests are automatically watched when accepted. Uses Blizzard's value \" autoQuestWatch \" . \n " .. warning ,
type = " toggle " ,
confirm = true ,
confirmText = warning ,
get = function ( )
return GetCVarBool ( " autoQuestWatch " )
end ,
set = function ( _ , value )
SetCVar ( " autoQuestWatch " , value )
ReloadUI ( )
end ,
order = 6.44 ,
} ,
questProgressAutoTrack = {
name = " Auto Quest progress tracking " ,
desc = " Quests are automatically watched when progress updated. Uses Blizzard's value \" autoQuestProgress \" . \n " .. warning ,
type = " toggle " ,
width = " normal+half " ,
confirm = true ,
confirmText = warning ,
get = function ( )
return GetCVarBool ( " autoQuestProgress " )
end ,
set = function ( _ , value )
SetCVar ( " autoQuestProgress " , value )
ReloadUI ( )
end ,
order = 6.45 ,
} ,
} ,
} ,
sec7 = {
name = " Notification messages " ,
type = " group " ,
inline = true ,
order = 7 ,
args = {
messageQuest = {
name = " Quest messages " ,
type = " toggle " ,
set = function ( )
db.messageQuest = not db.messageQuest
end ,
order = 7.1 ,
} ,
messageAchievement = {
name = " Achievement messages " ,
width = 1.1 ,
type = " toggle " ,
set = function ( )
db.messageAchievement = not db.messageAchievement
end ,
order = 7.2 ,
} ,
-- LibSink
} ,
} ,
sec8 = {
name = " Notification sounds " ,
type = " group " ,
inline = true ,
order = 8 ,
args = {
soundQuest = {
name = " Quest sounds " ,
type = " toggle " ,
set = function ( )
db.soundQuest = not db.soundQuest
end ,
order = 8.1 ,
} ,
soundQuestComplete = {
name = " Complete Sound " ,
desc = " Addon sounds are prefixed \" KT - \" . " ,
type = " select " ,
width = 1.2 ,
disabled = function ( )
return not db.soundQuest
end ,
dialogControl = " LSM30_Sound " ,
values = WidgetLists.sound ,
set = function ( _ , value )
db.soundQuestComplete = value
end ,
order = 8.11 ,
} ,
} ,
} ,
} ,
} ,
modules = {
name = " Modules " ,
type = " group " ,
args = {
sec1 = {
name = " Order of Modules " ,
type = " group " ,
inline = true ,
order = 1 ,
} ,
} ,
} ,
addons = {
name = " Supported addons " ,
type = " group " ,
args = {
desc = {
name = " |cff00d200Green|r - compatible version - this version was tested and support is inserted. \n " ..
" |cffff0000Red|r - incompatible version - this version wasn't tested, maybe will need some code changes. \n " ..
" Please report all problems. " ,
type = " description " ,
order = 0 ,
} ,
sec1 = {
name = " Addons " ,
type = " group " ,
inline = true ,
order = 1 ,
args = {
addonMasque = {
name = " Masque " ,
desc = " Version: %s " ,
descStyle = " inline " ,
type = " toggle " ,
width = 1.05 ,
confirm = true ,
confirmText = warning ,
disabled = function ( )
return ( not IsAddOnLoaded ( " Masque " ) or not KT.AddonOthers : IsEnabled ( ) )
end ,
set = function ( )
db.addonMasque = not db.addonMasque
ReloadUI ( )
end ,
order = 1.11 ,
} ,
addonMasqueDesc = {
name = " Masque adds skinning support for Quest Item buttons. \n It also affects the Active Button. " ,
type = " description " ,
width = " double " ,
order = 1.12 ,
} ,
addonPetTracker = {
name = " PetTracker " ,
desc = " Version: %s " ,
descStyle = " inline " ,
type = " toggle " ,
width = 1.05 ,
confirm = true ,
confirmText = warning ,
disabled = function ( )
return not IsAddOnLoaded ( " PetTracker " )
end ,
set = function ( )
db.addonPetTracker = not db.addonPetTracker
if PetTracker.sets then
PetTracker.sets . trackPets = db.addonPetTracker
end
db.modulesOrder = nil
ReloadUI ( )
end ,
order = 1.21 ,
} ,
addonPetTrackerDesc = {
name = " PetTracker support adjusts display of zone pet tracking inside " .. KT.title .. " . It also fix some visual bugs. " ,
type = " description " ,
width = " double " ,
order = 1.22 ,
} ,
addonTomTom = {
name = " TomTom " ,
desc = " Version: %s " ,
descStyle = " inline " ,
type = " toggle " ,
width = 1.05 ,
confirm = true ,
confirmText = warning ,
disabled = function ( )
return not IsAddOnLoaded ( " TomTom " )
end ,
set = function ( )
db.addonTomTom = not db.addonTomTom
ReloadUI ( )
end ,
order = 1.31 ,
} ,
addonTomTomDesc = {
name = " TomTom support combined Blizzard's POI and TomTom's Arrow. " ,
type = " description " ,
width = " double " ,
order = 1.32 ,
} ,
} ,
} ,
sec2 = {
name = " User Interfaces " ,
type = " group " ,
inline = true ,
order = 2 ,
args = {
elvui = {
name = " ElvUI " ,
type = " toggle " ,
disabled = true ,
order = 2.1 ,
} ,
tukui = {
name = " Tukui " ,
type = " toggle " ,
disabled = true ,
order = 2.2 ,
} ,
nibrealui = {
name = " RealUI " ,
type = " toggle " ,
disabled = true ,
order = 2.3 ,
} ,
syncui = {
name = " SyncUI " ,
type = " toggle " ,
disabled = true ,
order = 2.4 ,
} ,
spartanui = {
name = " SpartanUI " ,
type = " toggle " ,
disabled = true ,
order = 2.5 ,
} ,
} ,
} ,
} ,
} ,
hacks = {
name = " Hacks " ,
type = " group " ,
args = {
desc = {
name = cWarning .. " Warning:|r Hacks may affect other addons! " ,
type = " description " ,
order = 0 ,
} ,
sec1 = {
name = DUNGEONS_BUTTON ,
type = " group " ,
inline = true ,
order = 1 ,
args = {
hackLFG = {
name = " LFG Hack " ,
desc = cBold .. " Affects the small Eye buttons|r for finding groups inside the tracker. When the hack is active, " ..
" the buttons work without errors. When hack is inactive, the buttons are not available. \n \n " ..
" Negative impacts:|r \n " ..
" - Inside the dialog for create Premade Group is hidden item \" Goal \" . \n " ..
" - Tooltips of items in the list of Premade Groups have a hidden 2nd (green) row with \" Goal \" . \n " ..
" - Inside the dialog for create Premade Group, no automatically set the \" Title \" , \n " ..
" e.g. keystone level for Mythic+. \n " ,
descStyle = " inline " ,
type = " toggle " ,
width = " full " ,
confirm = true ,
confirmText = warning ,
set = function ( )
db.hackLFG = not db.hackLFG
ReloadUI ( )
end ,
order = 1.1 ,
} ,
} ,
} ,
} ,
} ,
} ,
}
local general = options.args . general.args
local modules = options.args . modules.args
local addons = options.args . addons.args
local hacks = options.args . hacks.args
function KT : CheckAddOn ( addon , version , isUI )
local name = strsplit ( " _ " , addon )
local ver = isUI and " " or " --- "
local result = false
local path
if IsAddOnLoaded ( addon ) then
local actualVersion = GetAddOnMetadata ( addon , " Version " ) or " unknown "
ver = isUI and " - " or " "
ver = ( ver .. " |cff%s " .. actualVersion .. " |r " ) : format ( actualVersion == version and " 00d200 " or " ff0000 " )
result = true
end
if not isUI then
path = addons.sec1 . args [ " addon " .. name ]
path.desc = path.desc : format ( ver )
else
local path = addons.sec2 . args [ strlower ( name ) ]
path.name = path.name .. ver
path.disabled = not result
path.get = function ( ) return result end
end
return result
end
function KT : OpenOptions ( )
if not EditModeManagerFrame : IsEditModeActive ( ) then
Settings.OpenToCategory ( self.optionsFrame . general.name , true )
end
end
function KT : InitProfile ( event , database , profile )
ReloadUI ( )
end
function KT : SetupOptions ( )
self.db = LibStub ( " AceDB-3.0 " ) : New ( strsub ( addonName , 2 ) .. " DB " , defaults , true )
self.options = options
db = self.db . profile
dbChar = self.db . char
general.sec2 . args.classBorder . name = general.sec2 . args.classBorder . name : format ( self.RgbToHex ( self.classColor ) )
general.sec7 . args.messageOutput = self : GetSinkAce3OptionsDataTable ( )
general.sec7 . args.messageOutput . inline = true
general.sec7 . args.messageOutput . disabled = function ( ) return not ( db.messageQuest or db.messageAchievement ) end
self : SetSinkStorage ( db )
options.args . profiles = LibStub ( " AceDBOptions-3.0 " ) : GetOptionsTable ( self.db )
options.args . profiles.confirm = true
options.args . profiles.args . reset.confirmText = warning
options.args . profiles.args . new.confirmText = warning
options.args . profiles.args . choose.confirmText = warning
options.args . profiles.args . copyfrom.confirmText = warning
if not options.args . profiles.plugins then
options.args . profiles.plugins = { }
end
options.args . profiles.plugins [ addonName ] = {
clearTrackerDataDesc1 = {
name = " Clear the data (no settings) of the tracked content (Quests, Achievements etc.) for current character. " ,
type = " description " ,
order = 0.1 ,
} ,
clearTrackerData = {
name = " Clear Tracker Data " ,
desc = " Clear the data of the tracked content. " ,
type = " execute " ,
confirmText = " Clear Tracker Data - " .. cBold .. self.playerName ,
func = function ( )
dbChar.quests . cache = { }
for i = 1 , # db.filterAuto do
db.filterAuto [ i ] = nil
end
self : SetBackground ( )
KT.QuestsCache_Init ( )
KT_ObjectiveTracker_Update ( )
end ,
order = 0.2 ,
} ,
clearTrackerDataDesc2 = {
name = " Current Character: " .. cBold .. self.playerName ,
type = " description " ,
width = " double " ,
order = 0.3 ,
} ,
clearTrackerDataDesc4 = {
name = " " ,
type = " description " ,
order = 0.4 ,
}
}
ACR : RegisterOptionsTable ( addonName , options , nil )
self.optionsFrame = { }
self.optionsFrame . general = ACD : AddToBlizOptions ( addonName , self.title , nil , " general " )
self.optionsFrame . modules = ACD : AddToBlizOptions ( addonName , options.args . modules.name , self.title , " modules " )
self.optionsFrame . addons = ACD : AddToBlizOptions ( addonName , options.args . addons.name , self.title , " addons " )
self.optionsFrame . hacks = ACD : AddToBlizOptions ( addonName , options.args . hacks.name , self.title , " hacks " )
self.optionsFrame . profiles = ACD : AddToBlizOptions ( addonName , options.args . profiles.name , self.title , " profiles " )
self.db . RegisterCallback ( self , " OnProfileChanged " , " InitProfile " )
self.db . RegisterCallback ( self , " OnProfileCopied " , " InitProfile " )
self.db . RegisterCallback ( self , " OnProfileReset " , " InitProfile " )
-- Disable some options
if not IsSpecialLocale ( ) then
db.objNumSwitch = false
end
end
SettingsPanel : HookScript ( " OnHide " , function ( self )
OverlayFrameHide ( )
end )
function OverlayFrameUpdate ( )
if overlay then
overlay : SetSize ( 280 , db.maxHeight )
overlay : ClearAllPoints ( )
overlay : SetPoint ( db.anchorPoint , 0 , 0 )
end
end
function OverlayFrameHide ( )
if overlayShown then
overlay : Hide ( )
overlayShown = false
end
end
function GetModulesOptionsTable ( )
local numModules = # db.modulesOrder
local text
local defaultModule , defaultText
local numSkipped = 0
local args = {
descCurOrder = {
name = cTitle .. " Current Order " ,
type = " description " ,
width = " double " ,
fontSize = " medium " ,
order = 0.1 ,
} ,
descDefOrder = {
name = " |T:1:40|t " .. cTitle .. " Default Order " ,
type = " description " ,
width = " normal " ,
fontSize = " medium " ,
order = 0.2 ,
} ,
descModules = {
name = " \n * " .. TRACKER_HEADER_DUNGEON .. " / " .. CHALLENGE_MODE .. " / " .. TRACKER_HEADER_SCENARIO .. " / " .. TRACKER_HEADER_PROVINGGROUNDS .. " \n " ,
type = " description " ,
order = 20 ,
} ,
}
for i , module in ipairs ( db.modulesOrder ) do
if _G [ module ] . Header then
text = _G [ module ] . Header.Text : GetText ( )
if module == " KT_SCENARIO_CONTENT_TRACKER_MODULE " then
text = text .. " * "
elseif module == " KT_UI_WIDGET_TRACKER_MODULE " then
text = " [ " .. ZONE .. " ] "
end
defaultModule = numSkipped == 0 and OTF.MODULES_UI_ORDER [ i ] or OTF.MODULES_UI_ORDER [ i - numSkipped ]
defaultText = defaultModule.Header . Text : GetText ( )
if defaultModule == KT_SCENARIO_CONTENT_TRACKER_MODULE then
defaultText = defaultText .. " * "
elseif defaultModule == KT_UI_WIDGET_TRACKER_MODULE then
defaultText = " [ " .. ZONE .. " ] "
end
args [ " pos " .. i ] = {
name = " " .. text ,
type = " description " ,
width = " normal " ,
fontSize = " medium " ,
order = i ,
}
args [ " pos " .. i .. " up " ] = {
name = ( i > 1 ) and " Up " or " " ,
desc = text ,
type = ( i > 1 ) and " execute " or " description " ,
width = " half " ,
func = function ( )
MoveModule ( i , " up " )
end ,
order = i + 0.1 ,
}
args [ " pos " .. i .. " down " ] = {
name = ( i < numModules ) and " Down " or " " ,
desc = text ,
type = ( i < numModules ) and " execute " or " description " ,
width = " half " ,
func = function ( )
MoveModule ( i )
end ,
order = i + 0.2 ,
}
args [ " pos " .. i .. " default " ] = {
name = " |T:1:44|t|cff808080 " .. defaultText ,
type = " description " ,
width = " normal " ,
fontSize = " medium " ,
order = i + 0.3 ,
}
else
numSkipped = numSkipped + 1
end
end
return args
end
function MoveModule ( idx , direction )
local text = strsub ( modules.sec1 . args [ " pos " .. idx ] . name , 2 )
local tmpIdx = ( direction == " up " ) and idx - 1 or idx + 1
local tmpText = strsub ( modules.sec1 . args [ " pos " .. tmpIdx ] . name , 2 )
modules.sec1 . args [ " pos " .. tmpIdx ] . name = " " .. text
modules.sec1 . args [ " pos " .. tmpIdx .. " up " ] . desc = text
modules.sec1 . args [ " pos " .. tmpIdx .. " down " ] . desc = text
modules.sec1 . args [ " pos " .. idx ] . name = " " .. tmpText
modules.sec1 . args [ " pos " .. idx .. " up " ] . desc = tmpText
modules.sec1 . args [ " pos " .. idx .. " down " ] . desc = tmpText
local module = tremove ( db.modulesOrder , idx )
tinsert ( db.modulesOrder , tmpIdx , module )
module = tremove ( OTF.MODULES_UI_ORDER , idx )
tinsert ( OTF.MODULES_UI_ORDER , tmpIdx , module )
KT_ObjectiveTracker_Update ( )
end
function SetSharedColor ( color )
local name = " Use border |cff " .. KT.RgbToHex ( color ) .. " color|r "
local sec4 = general.sec4 . args
sec4.hdrBgrColorShare . name = name
sec4.hdrTxtColorShare . name = name
sec4.hdrBtnColorShare . name = name
end
function IsSpecialLocale ( )
return ( KT.locale == " deDE " or
KT.locale == " esES " or
KT.locale == " frFR " or
KT.locale == " ruRU " )
end
-- Init
OTF : HookScript ( " OnEvent " , function ( self , event )
if event == " PLAYER_ENTERING_WORLD " and not KT.initialized then
modules.sec1 . args = GetModulesOptionsTable ( )
end
end )