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.
431 lines
16 KiB
431 lines
16 KiB
local _, WBT = ...;
|
|
|
|
local Options = {};
|
|
WBT.Options = Options;
|
|
|
|
local GUI = WBT.GUI;
|
|
local Util = WBT.Util;
|
|
local BossData = WBT.BossData;
|
|
local Sound = WBT.Sound;
|
|
|
|
local CYCLIC_HELP_TEXT = "This mode will repeat the boss timers if you miss the kill. A timer in " ..
|
|
Util.ColoredString(Util.COLOR_RED, "red text") ..
|
|
" indicates cyclic mode. By clicking a boss's name in the timer window you can reset it permanently.";
|
|
|
|
----- Setters and Getters for options -----
|
|
|
|
local OptionsItem = {};
|
|
|
|
function OptionsItem.CreateDefaultGetter(var_name)
|
|
local function getter()
|
|
return WBT.db.global[var_name];
|
|
end
|
|
return getter;
|
|
end
|
|
|
|
function OptionsItem.CreateDefaultSetter(var_name)
|
|
local function setter(state)
|
|
WBT.db.global[var_name] = state;
|
|
WBT.GUI:Rebuild();
|
|
end
|
|
return setter;
|
|
end
|
|
|
|
function OptionsItem:New(var_name, status_msg)
|
|
local ci = {
|
|
get = OptionsItem.CreateDefaultGetter(var_name);
|
|
set = OptionsItem.CreateDefaultSetter(var_name);
|
|
msg = status_msg,
|
|
};
|
|
|
|
setmetatable(ci, self);
|
|
self.__index = self;
|
|
|
|
return ci;
|
|
end
|
|
|
|
local ToggleItem = {};
|
|
|
|
function ToggleItem:New(var_name, status_msg)
|
|
local ti = OptionsItem:New(var_name, status_msg);
|
|
|
|
setmetatable(ti, self);
|
|
self.__index = self;
|
|
|
|
return ti;
|
|
end
|
|
|
|
function ToggleItem.GetColoredStatus(status_var)
|
|
local color = Util.COLOR_RED;
|
|
local status = "disabled";
|
|
if status_var then
|
|
color = Util.COLOR_GREEN;
|
|
status = "enabled";
|
|
end
|
|
|
|
return color .. status .. Util.COLOR_DEFAULT;
|
|
end
|
|
|
|
function ToggleItem:PrintFormattedStatus(status_var)
|
|
if self.msg then
|
|
WBT:Print(self.msg .. " " .. self.GetColoredStatus(status_var) .. ".");
|
|
end
|
|
end
|
|
|
|
function ToggleItem:Toggle()
|
|
local new_state = not self.get();
|
|
self.set(new_state);
|
|
self:PrintFormattedStatus(new_state);
|
|
WBT.GUI:Update();
|
|
end
|
|
|
|
local SelectItem = {};
|
|
|
|
function SelectItem:OverrideGetter(default_key)
|
|
local default_getter_fptr = self.get;
|
|
self.get = function()
|
|
local key = default_getter_fptr();
|
|
if key == nil then
|
|
return default_key;
|
|
end
|
|
return key;
|
|
end
|
|
end
|
|
|
|
function SelectItem:New(var_name, status_msg, mkt, mkt_options_key, mkt_values_key, default_key)
|
|
local si = OptionsItem:New(var_name, status_msg);
|
|
si.mkt = mkt; -- MultiKeyTable
|
|
si.mkt_options_key = mkt_options_key;
|
|
si.mkt_values_key = mkt_values_key;
|
|
si.options = si.mkt:GetAllSubVals(si.mkt_options_key);
|
|
|
|
setmetatable(si, self);
|
|
self.__index = self;
|
|
|
|
si:OverrideGetter(default_key);
|
|
|
|
return si;
|
|
end
|
|
|
|
function SelectItem:Key()
|
|
return self:get();
|
|
end
|
|
|
|
function SelectItem:Value()
|
|
local subtbl = self.mkt:GetSubtbl(self.mkt_options_key, self:Key());
|
|
return subtbl[self.mkt_values_key];
|
|
end
|
|
|
|
local RangeItem = {};
|
|
|
|
function RangeItem:OverrideGetter(default_val)
|
|
local default_getter = self.get;
|
|
self.get = function()
|
|
local val = default_getter();
|
|
if val == nil then
|
|
return default_val;
|
|
end
|
|
return val;
|
|
end
|
|
end
|
|
|
|
function RangeItem:New(var_name, status_msg, default_val)
|
|
local si = OptionsItem:New(var_name, status_msg);
|
|
|
|
setmetatable(si, self);
|
|
self.__index = self;
|
|
|
|
si:OverrideGetter(default_val);
|
|
|
|
return si;
|
|
end
|
|
|
|
local function ShowGUI(show)
|
|
local gui = GUI;
|
|
if show then
|
|
WBT.db.global.hide_gui = false;
|
|
if gui:ShouldShow() then
|
|
gui:Show();
|
|
else
|
|
WBT:Print("The GUI will show when next you enter a boss zone.");
|
|
end
|
|
else
|
|
WBT.db.global.hide_gui = true;
|
|
gui:Hide();
|
|
end
|
|
gui:Update();
|
|
end
|
|
|
|
function Options.InitializeItems()
|
|
local logger_opts = WBT.Logger.options_tbl;
|
|
local sound_opts = Sound.sound_tbl;
|
|
Options.lock = ToggleItem:New("lock", "GUI lock is now");
|
|
Options.show_gui = ToggleItem:New("show_gui", nil);
|
|
Options.sound = ToggleItem:New("sound_enabled", "Sound is now");
|
|
Options.multi_realm = ToggleItem:New("multi_realm", "Show timers for other shards option is now");
|
|
Options.show_boss_zone_only = ToggleItem:New("show_boss_zone_only", "Only show GUI in boss zone mode is now");
|
|
Options.cyclic = ToggleItem:New("cyclic", "Cyclic mode is now");
|
|
Options.highlight = ToggleItem:New("highlight", "Highlighting of current zone is now");
|
|
Options.show_saved = ToggleItem:New("show_saved", "Showing if saved on boss (on timer) is now");
|
|
Options.show_realm = ToggleItem:New("show_realm", "Showing realm on which timer was recorded is now");
|
|
Options.dev_silent = ToggleItem:New("dev_silent", "Silent mode is now");
|
|
Options.log_level = SelectItem:New("log_level", "Log level is now", logger_opts.tbl, logger_opts.keys.option, logger_opts.keys.log_level, WBT.defaults.global.log_level);
|
|
Options.spawn_alert_sound = SelectItem:New("spawn_alert_sound", "Spawn alert sound is now", sound_opts.tbl, sound_opts.keys.option, sound_opts.keys.file_id, WBT.defaults.global.spawn_alert_sound);
|
|
Options.spawn_alert_sec_before = RangeItem:New("spawn_alert_sec_before", "Spawn alert sound sec before is now", WBT.defaults.global.spawn_alert_sec_before);
|
|
-- Wrapping in some help printing for cyclic mode.
|
|
local cyclic_set_temp = Options.cyclic.set;
|
|
Options.cyclic.set = function(state) cyclic_set_temp(state); WBT:Print(CYCLIC_HELP_TEXT); end
|
|
-- Wrapping in 'play sound file when selected'.
|
|
local spawn_alert_sound_set_temp = Options.spawn_alert_sound.set;
|
|
Options.spawn_alert_sound.set = function(state) spawn_alert_sound_set_temp(state); Util.PlaySoundAlert(Options.spawn_alert_sound:Value()); end
|
|
-- Overriding setter for log_level to use same method as from CLI:
|
|
Options.log_level.set = function(state) WBT.Logger.SetLogLevel(state); end
|
|
-- Option show_gui is a bit complicated. Override overything:
|
|
Options.show_gui.set = function(state) ShowGUI(state); end -- Makes the option more snappy.
|
|
Options.show_gui.get = function() return not WBT.db.global.hide_gui; end -- I don't want to rename db variable, so just negate (hide -> show).
|
|
end
|
|
|
|
----- Slash commands -----
|
|
|
|
local function PrintHelp()
|
|
WBT.AceConfigDialog:Open(WBT.addon_name);
|
|
local indent = " ";
|
|
WBT:Print("WorldBossTimers slash commands:");
|
|
WBT:Print("/wbt reset" .. " --> Reset all kill info");
|
|
WBT:Print("/wbt gui-reset" .. " --> Reset the position of the GUI");
|
|
WBT:Print("/wbt saved" .. " --> Print your saved bosses");
|
|
WBT:Print("/wbt share" .. " --> Announce timers for boss in zone");
|
|
WBT:Print("/wbt show" .. " --> Show the timers window");
|
|
WBT:Print("/wbt hide" .. " --> Hide the timers window");
|
|
WBT:Print("/wbt gui-toggle" .. " --> Toggle visibility of the timers window");
|
|
WBT:Print("/wbt send" .. " --> Toggle send timer data in auto announce");
|
|
WBT:Print("/wbt sound" .. " --> Toggle sound alerts");
|
|
WBT:Print("/wbt cyclic" .. " --> Toggle cyclic timers");
|
|
WBT:Print("/wbt multi" .. " --> Toggle timers for other shards");
|
|
WBT:Print("/wbt zone" .. " --> Toggle show GUI in boss zones only");
|
|
WBT:Print("/wbt lock" .. " --> Toggle locking of GUI");
|
|
WBT:Print("/wbt log <level>" .. " --> Set log level for debug purposes");
|
|
-- WBT:Print("/wbt sound classic --> Sets sound to \'War Drums\'");
|
|
-- WBT:Print("/wbt sound fancy --> Sets sound to \'fancy mode\'");
|
|
end
|
|
|
|
function Options.SlashHandler(input)
|
|
local arg1, arg2 = strsplit(" ", input);
|
|
if arg1 then
|
|
arg1 = arg1:lower();
|
|
end
|
|
|
|
if arg1 == "hide" then
|
|
ShowGUI(false);
|
|
elseif arg1 == "show" then
|
|
ShowGUI(true);
|
|
elseif arg1 == "gui-toggle" then
|
|
Options.show_gui:Toggle();
|
|
elseif arg1 == "share" then
|
|
WBT.Functions.AnnounceTimerInChat();
|
|
elseif arg1 == "r"
|
|
or arg1 == "reset"
|
|
or arg1 == "restart" then
|
|
WBT.ResetKillInfo();
|
|
elseif arg1 == "s"
|
|
or arg1 == "saved"
|
|
or arg1 == "save" then
|
|
WBT.PrintKilledBosses();
|
|
elseif arg1 == "request" then
|
|
WBT.RequestKillData();
|
|
elseif arg1 == "sound" then
|
|
sound_type_args = {Sound.SOUND_CLASSIC, Sound.SOUND_FANCY};
|
|
if Util.SetContainsValue(sound_type_args, arg2) then
|
|
WBT.db.global.sound_type = arg2;
|
|
WBT:Print("SoundType: " .. arg2);
|
|
else
|
|
Options.sound:Toggle();
|
|
end
|
|
elseif arg1 == "cyclic" then
|
|
Options.cyclic:Toggle();
|
|
elseif arg1 == "multi" then
|
|
Options.multi_realm:Toggle();
|
|
elseif arg1 == "zone" then
|
|
Options.show_boss_zone_only:Toggle();
|
|
elseif arg1 == "lock" then
|
|
Options.lock:Toggle();
|
|
elseif arg1 == "gui-reset" then
|
|
WBT.GUI:ResetPosition();
|
|
elseif arg1 == "log" then
|
|
WBT.Logger.SetLogLevel(arg2);
|
|
else
|
|
PrintHelp();
|
|
end
|
|
end
|
|
|
|
-- Counter so I don't have to increment order all the time.
|
|
-- Option items are ordered as they are inserted.
|
|
local t_cnt = { 0 };
|
|
function t_cnt:plusplus()
|
|
self[1] = self[1] + 1;
|
|
return self[1];
|
|
end
|
|
|
|
----- Options table -----
|
|
function Options.InitializeOptionsTable()
|
|
local desc_toggle = "Enable/Disable";
|
|
|
|
Options.optionsTable = {
|
|
type = "group",
|
|
childGroups = "select",
|
|
args = {
|
|
sharing_explanation_header = {
|
|
name = Util.ColoredString(Util.COLOR_ORANGE, "Hints:"),
|
|
order = t_cnt:plusplus(),
|
|
type = "description",
|
|
fontSize = "large",
|
|
width = "full",
|
|
},
|
|
sharing_explanation_body = {
|
|
name = -- Hint_1
|
|
"- Press the " .. Util.ColoredString(Util.COLOR_ORANGE, "Req.") ..
|
|
" button to request timers from other nearby " .. Util.ColoredString(Util.COLOR_ORANGE, "WBT") ..
|
|
" users. Since 8.2.5 this no longer causes automatic sharing. The other player must manually " ..
|
|
" share the timer by using the " .. Util.ColoredString(Util.COLOR_ORANGE, "Share") .. " button.\n" ..
|
|
-- Hint_2
|
|
"- Click a timer that is shown in " .. Util.ColoredString(Util.COLOR_RED, "red") ..
|
|
" to reset that (and only that) timer.",
|
|
order = t_cnt:plusplus(),
|
|
type = "description",
|
|
fontSize = "medium",
|
|
width = "full",
|
|
},
|
|
lock = {
|
|
name = "Lock GUI",
|
|
order = t_cnt:plusplus(),
|
|
desc = "Toggle if the GUI should be locked or movable",
|
|
type = "toggle",
|
|
width = "full",
|
|
set = function(info, val) Options.lock:Toggle(); end,
|
|
get = function(info) return Options.lock.get() end,
|
|
},
|
|
show = {
|
|
name = "Show GUI",
|
|
order = t_cnt:plusplus(),
|
|
desc = desc_toggle,
|
|
type = "toggle",
|
|
width = "full",
|
|
set = function(info, val) Options.show_gui:Toggle(); end,
|
|
get = function(info) return Options.show_gui.get(); end,
|
|
},
|
|
show_boss_zone_only = {
|
|
name = "Only show GUI in boss zones",
|
|
order = t_cnt:plusplus(),
|
|
desc = desc_toggle,
|
|
type = "toggle",
|
|
width = "full",
|
|
set = function(info, val) Options.show_boss_zone_only:Toggle(); end,
|
|
get = function(info) return Options.show_boss_zone_only.get(); end,
|
|
},
|
|
sound = {
|
|
name = "Sound",
|
|
order = t_cnt:plusplus(),
|
|
desc = desc_toggle,
|
|
type = "toggle",
|
|
width = "full",
|
|
set = function(info, val) Options.sound:Toggle(); end,
|
|
get = function(info) return Options.sound.get(); end,
|
|
},
|
|
cyclic = {
|
|
name = "Cyclic (show expired)",
|
|
order = t_cnt:plusplus(),
|
|
desc = "If you missed a kill, the timer will wrap around and will now have a red color",
|
|
type = "toggle",
|
|
width = "full",
|
|
set = function(info, val) Options.cyclic:Toggle(); end,
|
|
get = function(info) return Options.cyclic.get(); end,
|
|
},
|
|
multi_realm = { -- NOTE: Should be named multi_shard, but to keep user set option values, it was not renamed.
|
|
name = "Show timers for other shards",
|
|
order = t_cnt:plusplus(),
|
|
desc = "Shows timers for other shards",
|
|
type = "toggle",
|
|
width = "full",
|
|
set =
|
|
function(info, val)
|
|
Options.multi_realm:Toggle();
|
|
GUI:UpdateWindowTitle();
|
|
end,
|
|
get = function(info) return Options.multi_realm.get(); end,
|
|
},
|
|
highlight = {
|
|
name = "Highlight boss in current zone",
|
|
order = t_cnt:plusplus(),
|
|
desc = "The boss in your current zone will have a different color if the current shard ID matches the timer:\n" ..
|
|
Util.ColoredString(Util.COLOR_LIGHTGREEN, "Green") .. " if timer not expired\n" ..
|
|
Util.ColoredString(Util.COLOR_YELLOW, "Yellow") .." if timer expired (with Cyclic mode)",
|
|
type = "toggle",
|
|
width = "full",
|
|
set = function(info, val) Options.highlight:Toggle(); end,
|
|
get = function(info) return Options.highlight.get(); end,
|
|
},
|
|
show_saved = {
|
|
name = "Show if saved",
|
|
order = t_cnt:plusplus(),
|
|
desc = "Appends a colored 'X' (" .. Util.ColoredString(Util.COLOR_RED, "X") .. "/" .. Util.ColoredString(Util.COLOR_GREEN, "X") .. ")" ..
|
|
" after the timer if you are saved for the boss.\n" ..
|
|
"NOTE: The color of the 'X' has no special meaning, it's just for improved visibility.",
|
|
type = "toggle",
|
|
width = "full",
|
|
set = function(info, val) Options.show_saved:Toggle(); end,
|
|
get = function(info) return Options.show_saved.get(); end,
|
|
},
|
|
show_realm = {
|
|
name = "Show realm",
|
|
order = t_cnt:plusplus(),
|
|
desc = "Shows the first three characters of the realm on which the timer was recorded.",
|
|
type = "toggle",
|
|
width = "full",
|
|
set = function(info, val) Options.show_realm:Toggle(); end,
|
|
get = function(info) return Options.show_realm.get(); end,
|
|
},
|
|
log_level = {
|
|
name = "Log level",
|
|
order = t_cnt:plusplus(),
|
|
desc = "Log level",
|
|
type = "select",
|
|
style = "dropdown",
|
|
width = "normal",
|
|
values = Options.log_level.options,
|
|
set = function(info, val) Options.log_level.set(val); end,
|
|
get = function(info) return Options.log_level.get(); end,
|
|
},
|
|
spawn_alert_sound = {
|
|
name = "Spawn alert sound",
|
|
order = t_cnt:plusplus(),
|
|
desc = "Sound alert that plays when boss spawns",
|
|
type = "select",
|
|
style = "dropdown",
|
|
width = "normal",
|
|
values = Options.spawn_alert_sound.options,
|
|
set = function(info, val) Options.spawn_alert_sound.set(val); end,
|
|
get = function(info) return Options.spawn_alert_sound.get(); end,
|
|
},
|
|
spawn_alert_sec_before = {
|
|
name = "Alert sec before spawn",
|
|
order = t_cnt:plusplus(),
|
|
desc = "How many seconds before boss spawns that alerts should happen",
|
|
type = "range",
|
|
min = 0,
|
|
max = 60*5,
|
|
softMin = 0,
|
|
softMax = 30,
|
|
bigStep = 1,
|
|
isPercent = false,
|
|
width = "normal",
|
|
set = function(info, val) Options.spawn_alert_sec_before.set(val); end,
|
|
get = function(info) return Options.spawn_alert_sec_before.get(); end,
|
|
},
|
|
}
|
|
}
|
|
end
|
|
|
|
function Options.Initialize()
|
|
Options.InitializeItems();
|
|
Options.InitializeOptionsTable();
|
|
end
|
|
|