You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1016 lines
34 KiB
1016 lines
34 KiB
local SI, L = unpack((select(2, ...)))
|
|
local Config = SI:NewModule('Config')
|
|
local Tooltip = SI:GetModule('Tooltip')
|
|
local Currency = SI:GetModule('Currency')
|
|
local Progress = SI:GetModule('Progress')
|
|
local Warfront = SI:GetModule('Warfront')
|
|
|
|
-- Lua functions
|
|
local pairs, ipairs, tonumber, tostring, wipe = pairs, ipairs, tonumber, tostring, wipe
|
|
local unpack, date, tinsert, sort = unpack, date, tinsert, sort
|
|
local _G = _G
|
|
|
|
-- WoW API / Variables
|
|
local C_CurrencyInfo_GetCurrencyInfo = C_CurrencyInfo.GetCurrencyInfo
|
|
local GetBindingKey = GetBindingKey
|
|
local GetCurrentBindingSet = GetCurrentBindingSet
|
|
local GetRealmName = GetRealmName
|
|
local SaveBindings = SaveBindings
|
|
local SetBinding = SetBinding
|
|
|
|
local HideUIPanel = HideUIPanel
|
|
local Settings_OpenToCategory = Settings.OpenToCategory
|
|
local StaticPopup_Show = StaticPopup_Show
|
|
|
|
local ALL = ALL
|
|
local CALLINGS_QUESTS = CALLINGS_QUESTS
|
|
local COLOR = COLOR
|
|
local CURRENCY = CURRENCY
|
|
local DELETE = DELETE
|
|
local EMBLEM_SYMBOL = EMBLEM_SYMBOL
|
|
local GREEN_FONT_COLOR_CODE = GREEN_FONT_COLOR_CODE
|
|
local LEVEL = LEVEL
|
|
local RED_FONT_COLOR_CODE = RED_FONT_COLOR_CODE
|
|
|
|
-- GLOBALS: LibStub, BINDING_NAME_SAVEDINSTANCES, BINDING_HEADER_SAVEDINSTANCES
|
|
|
|
SI.diff_strings = {
|
|
D1 = DUNGEON_DIFFICULTY1, -- 5 man
|
|
D2 = DUNGEON_DIFFICULTY2, -- 5 man (Heroic)
|
|
D3 = DUNGEON_DIFFICULTY1.." ("..GetDifficultyInfo(23)..")", -- 5 man (Mythic)
|
|
R0 = EXPANSION_NAME0 .. " " .. LFG_TYPE_RAID,
|
|
R1 = RAID_DIFFICULTY1, -- "10 man"
|
|
R2 = RAID_DIFFICULTY2, -- "25 man"
|
|
R3 = RAID_DIFFICULTY3, -- "10 man (Heroic)"
|
|
R4 = RAID_DIFFICULTY4, -- "25 man (Heroic)"
|
|
R5 = GetDifficultyInfo(7), -- "Looking for Raid"
|
|
R6 = GetDifficultyInfo(14), -- "Normal raid"
|
|
R7 = GetDifficultyInfo(15), -- "Heroic raid"
|
|
R8 = GetDifficultyInfo(16), -- "Mythic raid"
|
|
}
|
|
|
|
local FONTEND = FONT_COLOR_CODE_CLOSE
|
|
local GOLDFONT = NORMAL_FONT_COLOR_CODE
|
|
|
|
-- config global functions
|
|
|
|
function Config:OnInitialize()
|
|
Config:SetupOptions()
|
|
end
|
|
|
|
BINDING_NAME_SAVEDINSTANCES = L["Show/Hide the SavedInstances tooltip"]
|
|
BINDING_HEADER_SAVEDINSTANCES = "SavedInstances"
|
|
|
|
-- general helper functions
|
|
|
|
function SI:idtext(instance,diff,info)
|
|
if instance.WorldBoss then
|
|
return L["World Boss"]
|
|
elseif info.ID < 0 then
|
|
return "" -- ticket 144: could be RAID_FINDER or FLEX_RAID, but this is already shown in the instance name so it's redundant anyhow
|
|
elseif not instance.Raid then
|
|
if diff == 23 then
|
|
return SI.diff_strings["D3"]
|
|
else
|
|
return SI.diff_strings["D"..diff]
|
|
end
|
|
elseif instance.Expansion == 0 then -- classic Raid
|
|
return SI.diff_strings.R0
|
|
elseif instance.Raid and diff >= 3 and diff <= 7 then -- pre-WoD raids
|
|
return SI.diff_strings["R"..(diff-2)]
|
|
elseif diff >= 14 and diff <= 16 then -- WoD raids
|
|
return SI.diff_strings["R"..(diff-8)]
|
|
elseif diff == 17 then -- Looking For Raid
|
|
return SI.diff_strings.R5
|
|
else
|
|
return ""
|
|
end
|
|
end
|
|
|
|
local function TableLen(table)
|
|
local i = 0
|
|
for _, _ in pairs(table) do
|
|
i = i + 1
|
|
end
|
|
return i
|
|
end
|
|
|
|
local function IndicatorOptions()
|
|
local args = {
|
|
Instructions = {
|
|
order = 1,
|
|
type = "description",
|
|
name = L["You can combine icons and text in a single indicator if you wish. Simply choose an icon, and insert the word ICON into the text field. Anywhere the word ICON is found, the icon you chose will be substituted in."].." "..L["Similarly, the words KILLED and TOTAL will be substituted with the number of bosses killed and total in the lockout."],
|
|
},
|
|
}
|
|
for diffname, diffstr in pairs(SI.diff_strings) do
|
|
local dorder = (tonumber(diffname:match("%d+")) or 0) + 10
|
|
if diffname:find("^R") then dorder = dorder + 10 end
|
|
args[diffname] = {
|
|
type = "group",
|
|
name = diffstr,
|
|
order = dorder,
|
|
args = {
|
|
[diffname.."Indicator"] = {
|
|
order = 1,
|
|
type = "select",
|
|
width = "half",
|
|
name = EMBLEM_SYMBOL,
|
|
values = SI.Indicators
|
|
},
|
|
[diffname.."Text"] = {
|
|
order = 2,
|
|
type = "input",
|
|
name = L["Text"],
|
|
multiline = false
|
|
},
|
|
[diffname.."Color"] = {
|
|
order = 3,
|
|
type = "color",
|
|
width = "half",
|
|
hasAlpha = false,
|
|
name = COLOR,
|
|
disabled = function()
|
|
return SI.db.Indicators[diffname .. "ClassColor"]
|
|
end,
|
|
get = function(info)
|
|
SI.db.Indicators[info[#info]] = SI.db.Indicators[info[#info]] or SI.defaultDB.Indicators[info[#info]]
|
|
local r = SI.db.Indicators[info[#info]][1]
|
|
local g = SI.db.Indicators[info[#info]][2]
|
|
local b = SI.db.Indicators[info[#info]][3]
|
|
return r, g, b, nil
|
|
end,
|
|
set = function(info, r, g, b, ...)
|
|
SI.db.Indicators[info[#info]][1] = r
|
|
SI.db.Indicators[info[#info]][2] = g
|
|
SI.db.Indicators[info[#info]][3] = b
|
|
end,
|
|
},
|
|
[diffname.."ClassColor"] = {
|
|
order = 4,
|
|
type = "toggle",
|
|
name = L["Use class color"]
|
|
},
|
|
},
|
|
}
|
|
end
|
|
return args
|
|
end
|
|
|
|
-- options table below
|
|
function Config:BuildOptions()
|
|
local valueslist = { ["always"] = GREEN_FONT_COLOR_CODE..L["Always show"]..FONTEND,
|
|
["saved"] = L["Show when saved"],
|
|
["never"] = RED_FONT_COLOR_CODE..L["Never show"]..FONTEND,
|
|
}
|
|
local opts = {
|
|
type = "group",
|
|
name = "SavedInstances",
|
|
handler = SI,
|
|
get = function(info)
|
|
return SI.db.Tooltip[info[#info]]
|
|
end,
|
|
set = function(info, value)
|
|
SI:Debug(info[#info].." set to: "..tostring(value))
|
|
SI.db.Tooltip[info[#info]] = value
|
|
wipe(SI.scaleCache)
|
|
wipe(SI.oi_cache)
|
|
SI.oc_cache = nil
|
|
end,
|
|
args = {
|
|
config = {
|
|
name = L["Open config"],
|
|
guiHidden = true,
|
|
type = "execute",
|
|
func = function() Config:ShowConfig() end,
|
|
},
|
|
time = {
|
|
name = L["Dump time debugging information"],
|
|
guiHidden = true,
|
|
type = "execute",
|
|
func = function() SI:TimeDebug() end,
|
|
},
|
|
quest = {
|
|
name = L["Dump quest debugging information"],
|
|
guiHidden = true,
|
|
type = "execute",
|
|
func = function(...) SI:QuestDebug(...) end,
|
|
},
|
|
show = {
|
|
name = L["Show/Hide the SavedInstances tooltip"],
|
|
guiHidden = true,
|
|
type = "execute",
|
|
func = function() Tooltip:ToggleDetached() end,
|
|
},
|
|
General = {
|
|
order = 1,
|
|
type = "group",
|
|
name = L["General settings"],
|
|
args = {
|
|
ver = {
|
|
order = 0.5,
|
|
type = "description",
|
|
name = function() return "Version: SavedInstances "..SI.version end,
|
|
},
|
|
GeneralHeader = {
|
|
order = 2,
|
|
type = "header",
|
|
name = L["General settings"],
|
|
},
|
|
MinimapIcon = {
|
|
type = "toggle",
|
|
name = L["Show minimap button"],
|
|
desc = L["Show the SavedInstances minimap button"],
|
|
order = 3,
|
|
hidden = function() return not SI.Libs.LDBI end,
|
|
get = function(info) return not SI.db.MinimapIcon.hide end,
|
|
set = function(info, value)
|
|
SI.db.MinimapIcon.hide = not value
|
|
SI.Libs.LDBI:Refresh("SavedInstances")
|
|
end,
|
|
},
|
|
DisableMouseover = {
|
|
type = "toggle",
|
|
name = L["Disable mouseover"],
|
|
desc = L["Disable tooltip display on icon mouseover"],
|
|
order = 3.5,
|
|
},
|
|
ShowHints = {
|
|
type = "toggle",
|
|
name = L["Show tooltip hints"],
|
|
order = 4,
|
|
},
|
|
ReportResets = {
|
|
type = "toggle",
|
|
name = L["Report instance resets to group"],
|
|
order = 4.5,
|
|
},
|
|
LimitWarn = {
|
|
type = "toggle",
|
|
name = L["Warn about instance limit"],
|
|
order = 4.7,
|
|
},
|
|
HistoryText = {
|
|
type = "toggle",
|
|
name = L["Instance limit in Broker"],
|
|
order = 4.8,
|
|
},
|
|
AbbreviateKeystone = {
|
|
type = "toggle",
|
|
name = L["Abbreviate keystones"],
|
|
desc = L["Abbreviate Mythic keystone dungeon names"],
|
|
order = 4.85
|
|
},
|
|
KeystoneReportTarget = {
|
|
type = "select",
|
|
name = L["Keystone report target"],
|
|
values = {
|
|
["PARTY"] = L["Party"],
|
|
["GUILD"] = L["Guild"],
|
|
["EXPORT"] = L["Export"]
|
|
},
|
|
order = 4.86
|
|
},
|
|
DebugMode = {
|
|
type = "toggle",
|
|
name = L["Debug Mode"],
|
|
order = 4.9,
|
|
},
|
|
|
|
CategoriesHeader = {
|
|
order = 11,
|
|
type = "header",
|
|
name = L["Categories"],
|
|
},
|
|
ShowCategories = {
|
|
type = "toggle",
|
|
name = L["Show category names"],
|
|
desc = L["Show category names in the tooltip"],
|
|
order = 12,
|
|
},
|
|
ShowSoloCategory = {
|
|
type = "toggle",
|
|
name = L["Single category name"],
|
|
desc = L["Show name for a category when all displayed instances belong only to that category"],
|
|
order = 13,
|
|
disabled = function()
|
|
return not SI.db.Tooltip.ShowCategories
|
|
end,
|
|
},
|
|
CategorySpaces = {
|
|
type = "toggle",
|
|
name = L["Space between categories"],
|
|
desc = L["Display instances with space inserted between categories"],
|
|
order = 14,
|
|
},
|
|
CategorySort = {
|
|
order = 15,
|
|
type = "select",
|
|
name = L["Sort categories by"],
|
|
values = {
|
|
["EXPANSION"] = L["Expansion"],
|
|
["TYPE"] = L["Type"],
|
|
},
|
|
},
|
|
NewFirst = {
|
|
type = "toggle",
|
|
name = L["Most recent first"],
|
|
desc = L["List categories from the current expansion pack first"],
|
|
order = 16,
|
|
},
|
|
RaidsFirst = {
|
|
type = "toggle",
|
|
name = L["Raids before dungeons"],
|
|
desc = L["List raid categories before dungeon categories"],
|
|
order = 17,
|
|
},
|
|
FitToScreen = {
|
|
type = "toggle",
|
|
name = L["Fit to screen"],
|
|
desc = L["Automatically shrink the tooltip to fit on the screen"],
|
|
order = 4.81,
|
|
},
|
|
Scale = {
|
|
type = "range",
|
|
name = L["Tooltip Scale"],
|
|
order = 4.82,
|
|
min = 0.1,
|
|
max = 5,
|
|
bigStep = 0.05,
|
|
},
|
|
RowHighlight = {
|
|
type = "range",
|
|
name = L["Row Highlight"],
|
|
desc = L["Opacity of the tooltip row highlighting"],
|
|
order = 4.83,
|
|
min = 0,
|
|
max = 0.5,
|
|
bigStep = 0.1,
|
|
isPercent = true,
|
|
},
|
|
InstancesHeader = {
|
|
order = 20,
|
|
type = "header",
|
|
name = L["Instances"],
|
|
},
|
|
ReverseInstances = {
|
|
type = "toggle",
|
|
name = L["Reverse ordering"],
|
|
desc = L["Display instances in order of recommended level from lowest to highest"],
|
|
order = 23,
|
|
},
|
|
ShowExpired = {
|
|
type = "toggle",
|
|
name = L["Show Expired"],
|
|
desc = L["Show expired instance lockouts"],
|
|
order = 23.5,
|
|
},
|
|
ShowHoliday = {
|
|
type = "toggle",
|
|
name = L["Show Holiday"],
|
|
desc = L["Show holiday boss rewards"],
|
|
order = 23.65,
|
|
},
|
|
ShowRandom = {
|
|
type = "toggle",
|
|
name = L["Show Random"],
|
|
desc = L["Show random dungeon bonus reward"],
|
|
order = 23.75,
|
|
},
|
|
CombineWorldBosses = {
|
|
type = "toggle",
|
|
name = L["Combine World Bosses"],
|
|
desc = L["Combine World Bosses"],
|
|
order = 23.85,
|
|
},
|
|
CombineLFR = {
|
|
type = "toggle",
|
|
name = L["Combine LFR"],
|
|
desc = L["Combine LFR"],
|
|
order = 23.95,
|
|
},
|
|
WarfrontHeader = {
|
|
order = 33,
|
|
type = "header",
|
|
name = L["Warfronts"],
|
|
},
|
|
EmissaryHeader = {
|
|
order = 36,
|
|
type = "header",
|
|
name = L["Emissary quests"],
|
|
},
|
|
EmissaryFullName = {
|
|
type = "toggle",
|
|
order = 39.1,
|
|
name = L["Show all emissary names"],
|
|
desc = L["Show both factions' emissay name"],
|
|
},
|
|
EmissaryShowCompleted = {
|
|
type = "toggle",
|
|
order = 39.2,
|
|
name = L["Show when completed"],
|
|
desc = L["Show emissary line when all quests completed"],
|
|
},
|
|
CombineEmissary = {
|
|
type = "toggle",
|
|
order = 39.3,
|
|
name = L["Combine Emissaries"],
|
|
desc = L["Combine emissaries of same expansion"],
|
|
},
|
|
MiscHeader = {
|
|
order = 40,
|
|
type = "header",
|
|
name = L["Miscellaneous Tracking"],
|
|
},
|
|
TrackDailyQuests = {
|
|
type = "toggle",
|
|
order = 43,
|
|
name = L["Daily Quests"],
|
|
},
|
|
TrackWeeklyQuests = {
|
|
type = "toggle",
|
|
order = 43.5,
|
|
name = L["Weekly Quests"],
|
|
},
|
|
TrackSkills = {
|
|
type = "toggle",
|
|
order = 43.7,
|
|
name = L["Trade skills"],
|
|
},
|
|
TrackBonus = {
|
|
type = "toggle",
|
|
order = 43.8,
|
|
name = L["Bonus rolls"],
|
|
},
|
|
AugmentBonus = {
|
|
type = "toggle",
|
|
order = 43.9,
|
|
name = L["Bonus loot frame"],
|
|
},
|
|
TrackLFG = {
|
|
type = "toggle",
|
|
order = 44,
|
|
name = L["LFG cooldown"],
|
|
desc = L["Show cooldown for characters to use LFG dungeon system"],
|
|
},
|
|
TrackDeserter = {
|
|
type = "toggle",
|
|
order = 45,
|
|
name = L["Battleground Deserter"],
|
|
desc = L["Show cooldown for characters to use battleground system"],
|
|
},
|
|
TrackPlayed = {
|
|
type = "toggle",
|
|
order = 46,
|
|
name = L["Time /played"],
|
|
},
|
|
MythicKey = {
|
|
type = "toggle",
|
|
order = 47,
|
|
name = L["Mythic Keystone"],
|
|
desc = L["Track Mythic keystone acquisition"],
|
|
},
|
|
TimewornMythicKey = {
|
|
type = "toggle",
|
|
order = 47.1,
|
|
name = L["Timeworn Mythic Keystone"],
|
|
desc = L["Track Timeworn Mythic keystone acquisition"],
|
|
},
|
|
MythicKeyBest = {
|
|
type = "toggle",
|
|
order = 47.5,
|
|
name = L["Mythic Best"],
|
|
desc = L["Track Mythic keystone best run"],
|
|
},
|
|
TrackParagon = {
|
|
type = "toggle",
|
|
order = 48,
|
|
name = L["Paragon Chests"],
|
|
},
|
|
Calling = {
|
|
type = "toggle",
|
|
order = 49,
|
|
name = CALLINGS_QUESTS,
|
|
},
|
|
CallingShowCompleted = {
|
|
type = "toggle",
|
|
order = 49.1,
|
|
name = L["Show when completed"],
|
|
desc = L["Show calling line when all quests completed"],
|
|
},
|
|
CombineCalling = {
|
|
type = "toggle",
|
|
order = 49.2,
|
|
name = L["Combine Callings"],
|
|
},
|
|
BindHeader = {
|
|
order = -0.6,
|
|
type = "header",
|
|
name = "",
|
|
cmdHidden = true,
|
|
},
|
|
ToggleBind = {
|
|
desc = L["Bind a key to toggle the SavedInstances tooltip"],
|
|
type = "keybinding",
|
|
name = L["Show/Hide the SavedInstances tooltip"],
|
|
width = "double",
|
|
cmdHidden = true,
|
|
order = -0.5,
|
|
set = function(info,val)
|
|
local b1, b2 = GetBindingKey("SAVEDINSTANCES")
|
|
if b1 then SetBinding(b1) end
|
|
if b2 then SetBinding(b2) end
|
|
SetBinding(val, "SAVEDINSTANCES")
|
|
SaveBindings(GetCurrentBindingSet())
|
|
end,
|
|
get = function(info) return GetBindingKey("SAVEDINSTANCES") end
|
|
},
|
|
},
|
|
},
|
|
Currency = {
|
|
order = 3,
|
|
type = "group",
|
|
name = L["Currency settings"],
|
|
get = function(info)
|
|
return SI.db.Tooltip[info[#info]]
|
|
end,
|
|
set = function(info, value)
|
|
SI:Debug(info[#info].." set to: "..tostring(value))
|
|
SI.db.Tooltip[info[#info]] = value
|
|
wipe(SI.scaleCache)
|
|
wipe(SI.oi_cache)
|
|
SI.oc_cache = nil
|
|
end,
|
|
args = {
|
|
CurrencyValueColor = {
|
|
type = "toggle",
|
|
order = 10,
|
|
name = L["Color currency by cap"]
|
|
},
|
|
NumberFormat = {
|
|
type = "toggle",
|
|
order = 20,
|
|
name = L["Format large numbers"]
|
|
},
|
|
CurrencyMax = {
|
|
type = "toggle",
|
|
order = 30,
|
|
name = L["Show currency max"]
|
|
},
|
|
CurrencyEarned = {
|
|
type = "toggle",
|
|
order = 40,
|
|
name = L["Show currency earned"]
|
|
},
|
|
CurrencySortName = {
|
|
type = "toggle",
|
|
order = 50,
|
|
name = L["Sort by currency name"],
|
|
},
|
|
CurrencyHeader = {
|
|
order = 60,
|
|
type = "header",
|
|
name = CURRENCY,
|
|
},
|
|
},
|
|
},
|
|
Indicators = {
|
|
order = 4,
|
|
type = "group",
|
|
name = L["Indicators"],
|
|
get = function(info)
|
|
if SI.db.Indicators[info[#info]] ~= nil then -- tri-state boolean logic
|
|
return SI.db.Indicators[info[#info]]
|
|
else
|
|
return SI.defaultDB.Indicators[info[#info]]
|
|
end
|
|
end,
|
|
set = function(info, value)
|
|
SI:Debug("Config set: "..info[#info].." = "..(value and "true" or "false"))
|
|
SI.db.Indicators[info[#info]] = value
|
|
end,
|
|
args = IndicatorOptions(),
|
|
},
|
|
Instances = {
|
|
order = 5,
|
|
type = "group",
|
|
name = L["Instances"],
|
|
childGroups = "select",
|
|
width = "double",
|
|
args = (function()
|
|
local ret = {}
|
|
for i,cat in ipairs(SI.OrderedCategories()) do
|
|
ret[cat] = {
|
|
order = i,
|
|
type = "group",
|
|
name = SI.Categories[cat],
|
|
childGroups = "tree",
|
|
args = (function()
|
|
local iret = {}
|
|
local insts = SI:OrderedInstances(cat)
|
|
for j, inst in ipairs(insts) do
|
|
iret[inst] = {
|
|
order = j,
|
|
name = inst,
|
|
type = "select",
|
|
-- style = "radio",
|
|
values = valueslist,
|
|
get = function(info)
|
|
local val = SI.db.Instances[inst].Show
|
|
return (val and valueslist[val] and val) or "saved"
|
|
end,
|
|
set = function(info, value)
|
|
SI.db.Instances[inst].Show = value
|
|
end,
|
|
}
|
|
end
|
|
iret[ALL] = {
|
|
order = 0,
|
|
name = L["Set All"],
|
|
type = "select",
|
|
values = valueslist,
|
|
get = function(info) return "" end,
|
|
set = function(info, value)
|
|
for j, inst in ipairs(insts) do
|
|
SI.db.Instances[inst].Show = value
|
|
end
|
|
end,
|
|
}
|
|
iret.spacer = {
|
|
order = 0.5,
|
|
name = "",
|
|
type = "description",
|
|
width = "full",
|
|
cmdHidden = true,
|
|
}
|
|
return iret
|
|
end)(),
|
|
}
|
|
end
|
|
return ret
|
|
end)(),
|
|
},
|
|
Characters = {
|
|
order = 6,
|
|
type = "group",
|
|
name = L["Characters"],
|
|
args = {
|
|
Sorting = {
|
|
name = L["Sorting"],
|
|
type = "group",
|
|
guiInline = true,
|
|
order = 1,
|
|
args = {
|
|
SelfAlways = {
|
|
type = "toggle",
|
|
name = L["Show self always"],
|
|
order = 2,
|
|
},
|
|
SelfFirst = {
|
|
type = "toggle",
|
|
name = L["Show self first"],
|
|
order = 3,
|
|
},
|
|
ShowServer = {
|
|
type = "toggle",
|
|
name = L["Show server name"],
|
|
order = 5,
|
|
},
|
|
ServerSort = {
|
|
type = "toggle",
|
|
name = L["Sort by server"],
|
|
order = 6,
|
|
},
|
|
ServerOnly = {
|
|
type = "toggle",
|
|
name = L["Show only current server"],
|
|
order = 7,
|
|
},
|
|
ConnectedRealms = {
|
|
type = "select",
|
|
name = L["Connected Realms"],
|
|
order = 10,
|
|
disabled = function()
|
|
return not (SI.db.Tooltip.ServerSort or SI.db.Tooltip.ServerOnly)
|
|
end,
|
|
values = {
|
|
["ignore"] = L["Ignore"],
|
|
["group"] = L["Group"],
|
|
["interleave"] = L["Interleave"],
|
|
},
|
|
},
|
|
}
|
|
},
|
|
Manage = {
|
|
name = L["Manage"],
|
|
type = "group",
|
|
guiInline = true,
|
|
order = 2,
|
|
childGroups = "select",
|
|
width = "double",
|
|
args = (function ()
|
|
local toons = {}
|
|
for toon, _ in pairs(SI.db.Toons) do
|
|
local tn, ts = toon:match('^(.*) [-] (.*)$')
|
|
toons[ts] = toons[ts] or {}
|
|
tinsert(toons[ts],tn)
|
|
end
|
|
local ret = {}
|
|
ret.reset = {
|
|
order = 0.1,
|
|
name = L["Reset Characters"],
|
|
type = "execute",
|
|
func = function()
|
|
StaticPopup_Show("SAVEDINSTANCES_RESET")
|
|
end
|
|
}
|
|
ret.recover = {
|
|
order = 0.2,
|
|
name = L["Recover Dailies"],
|
|
desc = L["Attempt to recover completed daily quests for this character. Note this may recover some additional, linked daily quests that were not actually completed today."],
|
|
type = "execute",
|
|
func = function()
|
|
SI:Refresh(true)
|
|
end
|
|
}
|
|
local deltoon = function(info)
|
|
local toon, tinfo = unpack(info.arg)
|
|
if not toon then return end
|
|
local dialog = StaticPopup_Show("SAVEDINSTANCES_DELETE_CHARACTER", toon, tinfo, toon)
|
|
end
|
|
local toonfncache = {}
|
|
local toonget = function(field, default)
|
|
local key = field.."_get"
|
|
local fn = toonfncache[key] or function(info)
|
|
return tostring(info.arg[field] or default)
|
|
end
|
|
toonfncache[key] = fn
|
|
return fn
|
|
end
|
|
local toonset = function(field, isnum)
|
|
local key = field.."_set"
|
|
local fn = toonfncache[key] or function(info, value)
|
|
if isnum then
|
|
value = tonumber(value)
|
|
end
|
|
info.arg[field] = value
|
|
end
|
|
toonfncache[key] = fn
|
|
return fn
|
|
end
|
|
local orderval = function(info, value)
|
|
if value:find("^%s*[0-9]?[0-9]?[0-9]%s*$") then
|
|
return true
|
|
else
|
|
local err = L["Order must be a number in [0 - 999]"]
|
|
SI:ChatMsg(err)
|
|
return err
|
|
end
|
|
end
|
|
-- label line
|
|
ret.newline1 = {
|
|
order = 0.40,
|
|
cmdHidden = true,
|
|
name = "",
|
|
type = "description",
|
|
width = "full",
|
|
}
|
|
ret.cname = {
|
|
order = 0.41,
|
|
cmdHidden = true,
|
|
name = " ",
|
|
type = "description",
|
|
width = "half",
|
|
}
|
|
ret.cshow = {
|
|
order = 0.42,
|
|
cmdHidden = true,
|
|
fontSize = "medium",
|
|
name = " "..L["Show When"],
|
|
type = "description",
|
|
width = "normal",
|
|
}
|
|
ret.csort = {
|
|
order = 0.43,
|
|
cmdHidden = true,
|
|
fontSize = "medium",
|
|
name = " "..L["Sort Order"],
|
|
type = "description",
|
|
width = "half",
|
|
}
|
|
|
|
for server, stoons in pairs(toons) do
|
|
ret[server] = {
|
|
order = (server == GetRealmName() and 0.5 or 100),
|
|
type = "group",
|
|
name = server,
|
|
guiInline = false,
|
|
--childGroups = "tree",
|
|
args = (function()
|
|
local tret = {}
|
|
sort(stoons)
|
|
for ord, tn in pairs(stoons) do
|
|
local toon = tn.." - "..server
|
|
local t = SI.db.Toons[toon]
|
|
local tinfo = ""
|
|
if t and t.Level and t.LClass then
|
|
tinfo = tinfo.."\n"..LEVEL.." "..t.Level.." "..t.LClass
|
|
end
|
|
if t and t.LastSeen then
|
|
tinfo = tinfo.."\n"..L["Last updated"]..": "..date("%c",t.LastSeen)
|
|
end
|
|
tret[tn.."_desc"] = {
|
|
order = function(info) return t.Order*1000 + ord*10 + 0 end,
|
|
name = SI:ClassColorToon(toon),
|
|
desc = tn, -- unfortunately does nothing in dialog
|
|
descStyle = "tooltip",
|
|
type = "description",
|
|
width = "half",
|
|
cmdHidden = true,
|
|
}
|
|
tret[tn] = {
|
|
order = function(info) return t.Order*1000 + ord*10 + 1 end,
|
|
name = "",
|
|
type = "select",
|
|
width = "normal",
|
|
values = valueslist,
|
|
arg = t,
|
|
get = toonget("Show", "saved"),
|
|
set = toonset("Show"),
|
|
}
|
|
tret[tn.."_order"] = {
|
|
order = function(info) return t.Order*1000 + ord*10 + 4 end,
|
|
name = "",
|
|
type = "input",
|
|
width = "half",
|
|
desc = L["Sort Order"],
|
|
--descStyle = "tooltip",
|
|
arg = t,
|
|
get = toonget("Order", 50),
|
|
set = toonset("Order", true),
|
|
validate = orderval,
|
|
--pattern = "^%s*[0-9]?[0-9]?[0-9]%s*$",
|
|
--usage = L["Order must be a number in [0 - 999]"],
|
|
}
|
|
tret[tn.."_sp1"] = {
|
|
order = function(info) return t.Order*1000 + ord*10 + 6 end,
|
|
name = " ",
|
|
type = "description",
|
|
width = "half",
|
|
cmdHidden = true,
|
|
}
|
|
tret[tn.."_delete"] = {
|
|
order = function(info) return t.Order*1000 + ord*10 + 7 end,
|
|
name = DELETE,
|
|
desc = DELETE.." "..toon..tinfo,
|
|
type = "execute",
|
|
width = "half",
|
|
arg = { toon, tinfo },
|
|
func = deltoon,
|
|
}
|
|
tret[tn.."_nl"] = {
|
|
order = function(info) return t.Order*1000 + ord*10 + 9 end,
|
|
name = "",
|
|
type = "description",
|
|
width = "full",
|
|
cmdHidden = true,
|
|
}
|
|
end
|
|
return tret
|
|
end)(),
|
|
}
|
|
end
|
|
return ret
|
|
end)()
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
SI.Options = SI.Options or {} -- allow option table rebuild
|
|
for k,v in pairs(opts) do
|
|
SI.Options[k] = v
|
|
end
|
|
SI.Options.args.Progress = Progress:BuildOptions(2)
|
|
local warfront = Warfront:BuildOptions(34)
|
|
for k, v in pairs(warfront) do
|
|
SI.Options.args.General.args[k] = v
|
|
end
|
|
for expansion, _ in pairs(SI.Emissaries) do
|
|
SI.Options.args.General.args["Emissary" .. expansion] = {
|
|
type = "toggle",
|
|
order = 37 + expansion * 0.1,
|
|
name = _G["EXPANSION_NAME" .. expansion],
|
|
}
|
|
end
|
|
local hdroffset = SI.Options.args.Currency.args.CurrencyHeader.order
|
|
for i, curr in ipairs(SI.currency) do
|
|
local data = C_CurrencyInfo_GetCurrencyInfo(curr)
|
|
local name = Currency.OverrideName[curr] or data.name
|
|
local tex = Currency.OverrideTexture[curr] or data.iconFileID
|
|
tex = "\124T"..tex..":0\124t "
|
|
SI.Options.args.Currency.args["Currency"..curr] = {
|
|
type = "toggle",
|
|
order = hdroffset+i,
|
|
name = tex..name,
|
|
}
|
|
end
|
|
end
|
|
|
|
-- global functions
|
|
|
|
local configFrameName, configCharactersFrameName
|
|
function Config:ReopenConfigDisplay(frame)
|
|
if _G.SettingsPanel:IsShown() then
|
|
HideUIPanel(_G.SettingsPanel)
|
|
Settings_OpenToCategory(configFrameName)
|
|
-- Settings.OpenToCategory(frame)
|
|
-- Not possible due to lack of WoW feature
|
|
end
|
|
end
|
|
|
|
function Config:ShowConfig()
|
|
if _G.SettingsPanel:IsShown() then
|
|
HideUIPanel(_G.SettingsPanel)
|
|
else
|
|
Settings_OpenToCategory(configFrameName)
|
|
end
|
|
end
|
|
|
|
function Config:SetupOptions()
|
|
Config:BuildOptions()
|
|
|
|
local namespace = "SavedInstances"
|
|
LibStub("AceConfig-3.0"):RegisterOptionsTable(namespace, SI.Options, { "si", "savedinstances" })
|
|
|
|
local AceConfigDialog = LibStub("AceConfigDialog-3.0")
|
|
local _, genernalFrameName = AceConfigDialog:AddToBlizOptions(namespace, nil, nil, "General")
|
|
AceConfigDialog:AddToBlizOptions(namespace, L["Quest progresses"], namespace, "Progress")
|
|
AceConfigDialog:AddToBlizOptions(namespace, CURRENCY, namespace, "Currency")
|
|
AceConfigDialog:AddToBlizOptions(namespace, L["Indicators"], namespace, "Indicators")
|
|
AceConfigDialog:AddToBlizOptions(namespace, L["Instances"], namespace, "Instances")
|
|
local _, charactersFrameName = AceConfigDialog:AddToBlizOptions(namespace, L["Characters"], namespace, "Characters")
|
|
|
|
configFrameName = genernalFrameName
|
|
configCharactersFrameName = charactersFrameName
|
|
end
|
|
|
|
local function ResetConfirmed()
|
|
SI:Debug("Resetting characters")
|
|
Tooltip:HideDetached()
|
|
-- clear saves
|
|
for instance, i in pairs(SI.db.Instances) do
|
|
for toon, t in pairs(SI.db.Toons) do
|
|
i[toon] = nil
|
|
end
|
|
end
|
|
wipe(SI.db.Toons) -- clear toon db
|
|
SI.PlayedTime = nil -- reset played cache
|
|
SI:toonInit() -- rebuild SI.thisToon
|
|
SI:Refresh()
|
|
Config:BuildOptions() -- refresh config table
|
|
Config:ReopenConfigDisplay(configCharactersFrameName)
|
|
end
|
|
|
|
local function DeleteCharacter(toon)
|
|
if toon == SI.thisToon or not SI.db.Toons[toon] then
|
|
SI:ChatMsg("ERROR: Failed to delete " .. toon .. ". Character is active or does not exist.")
|
|
return
|
|
end
|
|
SI:Debug("Deleting character: " .. toon)
|
|
Tooltip:HideDetached()
|
|
-- clear saves
|
|
for instance, i in pairs(SI.db.Instances) do
|
|
i[toon] = nil
|
|
end
|
|
SI.db.Toons[toon] = nil
|
|
Config:BuildOptions() -- refresh config table
|
|
Config:ReopenConfigDisplay(configCharactersFrameName)
|
|
end
|
|
|
|
StaticPopupDialogs["SAVEDINSTANCES_RESET"] = {
|
|
preferredIndex = STATICPOPUP_NUMDIALOGS, -- reduce the chance of UI taint
|
|
text = L["Are you sure you want to reset the SavedInstances character database? Characters will be re-populated as you log into them."],
|
|
button1 = OKAY,
|
|
button2 = CANCEL,
|
|
OnAccept = ResetConfirmed,
|
|
timeout = 0,
|
|
whileDead = true,
|
|
hideOnEscape = true,
|
|
enterClicksFirstButton = false,
|
|
showAlert = true,
|
|
}
|
|
|
|
StaticPopupDialogs["SAVEDINSTANCES_DELETE_CHARACTER"] = {
|
|
preferredIndex = STATICPOPUP_NUMDIALOGS, -- reduce the chance of UI taint
|
|
text = string.format(L["Are you sure you want to remove %s from the SavedInstances character database?"],"\n\n%s%s\n\n").."\n\n"..
|
|
L["This should only be used for characters who have been renamed or deleted, as characters will be re-populated when you log into them."],
|
|
button1 = OKAY,
|
|
button2 = CANCEL,
|
|
OnAccept = function(self, data) DeleteCharacter(data) end,
|
|
timeout = 0,
|
|
whileDead = true,
|
|
hideOnEscape = true,
|
|
enterClicksFirstButton = false,
|
|
showAlert = true,
|
|
}
|
|
|