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.

588 lines
19 KiB

local addon, ns = ...
local addonLabel = addon;
local C, L, I = ns.LC.color, ns.L, ns.I;
local setmetatable,type,rawget,tostring=setmetatable,type,rawget,tostring;
local ipairs,pairs,wipe,strsplit,tremove=ipairs,pairs,wipe,strsplit,tremove;
local dbDefaults,db = {
profile = {
GeneralOptions = {
suffixColour = true,
showHints = true,
iconset = "NONE",
iconcolor = {1,1,1,1},
goldColor = "white",
goldCoins = true,
usePrefix = false,
maxTooltipHeight = 60,
scm = false,
ttModifierKey1 = "NONE",
ttModifierKey2 = "NONE",
goldHide = "0",
separateThousands = true,
showAddOnLoaded = true,
chatCommands = true
}
}
};
ns.showCharsFrom_Values = { -- used in xp.lua to display current mode in tooltip
["1"] = ns.realm,
["2"] = L["Connected realms"],
["4"] = L["All realms"]
};
local goldHideValues = {
["0"]=ADDON_DISABLED,
["1"]=L["HideMoneyCopper"],
["2"]=L["HideMoneySilver"],
["3"]=L["HideMoneyZeros"],
["4"]=L["ShowHighestOnly"]
};
local nsProfileMT
-- some values tables and functions
local ttModifierValues = {NONE = L["ModKeyDefault"]};
for i,v in pairs(ns.tooltipModifiers) do ttModifierValues[i] = L["ModKey"..v.l]; end
local function calcDataSize(info,obj)
if info then
local key = info[#info];
return "~"..ns.FormatLargeNumber(true,calcDataSize(nil,Broker_Everything_CharacterDB[key])).."B";
end
local obj_t = type(obj);
if obj_t=="table" then
local sum = 0;
for k,v in pairs(obj) do
if type(k)=="string" then
sum = sum + 40 + strlen(k);
else
sum = sum + 16;
end
sum = sum + calcDataSize(nil,v);
end
return sum + 40;
elseif obj_t=="boolean" then
return 2;
elseif obj_t=="number" then
return (floor(obj/2147483647)+1)*8;
end
return strlen(tostring(obj));
end
local function getIconSets()
local t = {NONE=NONE}
local l = ns.LSM:List((addon.."_Iconsets"):lower())
if type(l)=="table" then
for i,v in pairs(l) do
t[v] = v
end
end
return t
end
local function toggleAllModules(info)
local state = info[#info];
if not (state=="enable" or state=="disable" or state=="default") then
return;
end
for modName,modObject in pairs(ns.modules) do
if not modObject.isHiddenModule then
local newValue
if state=="enable" and db.profile[modName].enabled==false then
newValue = true;
elseif state=="disable" and db.profile[modName].enabled==true then
newValue = false;
elseif state=="default" and db.profile[modName].enabled~=ns.modules[modName].config_defaults.enabled then
newValue = ns.modules[modName].config_defaults.enabled;
end
if newValue~=nil then
db.profile[modName].enabled = newValue;
if newValue then
ns.moduleInit(modName);
end
end
end
end
end
-- option set/get function
local function opt(info,value,...)
if not db then return end
-- section = GeneralOptions or module names
local key,section,isModEnable = info[#info],info[#info-2],(info[#info-1]=="modEnable");
if #info>=5 then
local modOptDepth = nil;
for i=#info, 1, -1 do
if info[i]=="modOptions" then
modOptDepth = i+1;
break;
end
end
if modOptDepth~=nil then
section = info[modOptDepth];
end
end
if value~=nil then
if isModEnable then
db.profile[key].enabled = value;
if value then
-- init module
ns.moduleInit(key);
end
elseif key=="minimap" then
db.profile[section][key].hide = not value;
ns.updateMinimapButton(section);
else
if ... then value={value,...}; end -- color table
db.profile[section][key]=value;
if section=="GeneralOptions" then
for modName,mod in pairs(ns.modules)do
if mod.isEnabled and mod.onevent then
mod.onevent(mod.eventFrame,"BE_UPDATE_CFG",key);
end
end
if key=="iconcolor" then
ns.updateIcons(true,"color");
elseif key=="iconset" then
ns.updateIcons(true,"icon");
end
elseif ns.modules[section].onevent then
ns.modules[section].onevent(ns.modules[section].eventFrame,"BE_UPDATE_CFG",key);
end
end
end
if isModEnable then
return (db and key and db.profile and db.profile[key] and db.profile[key].enabled);
elseif key=="minimap" then
return not db.profile[section][key].hide;
else
if type(db.profile[section][key])=="table" then
return unpack(db.profile[section][key]);
end
return db.profile[section][key];
end
end
ns.option=opt; -- used in shared.lua (EasyMenu wrapper)
local options = {
type = "group",
name = addon,
get=opt, set=opt,
childGroups = "tab",
args = {
GeneralOptions = {
type = "group", order = 1,
name = GENERAL,
args = {
misc = {
type = "group", order = 1, inline = true,
name = C("ff00aaff",AUCTION_SUBCATEGORY_OTHER),
args = {
showAddOnLoaded = { type="toggle",order=1,name=L["AddOnLoaded"],desc=L["AddOnLoadedDesc"].."|n|n|cff44ff44"..L["AddOnLoadedDescAlt"].."|r" },
suffixColour = { type="toggle",order=2,name=L["SuffixColor"],desc=L["SuffixColorDesc"] },
usePrefix = { type="toggle",order=3,name=L["Prefix"],desc=L["PrefixDesc"] },
chatCommands = { type="toggle",order=4,name=L["ChatCommands"],desc=L["ChatCommandsDesc"] },
}
},
gold = {
type = "group", order = 2, inline = true,
name = C("ff00aaff",BONUS_ROLL_REWARD_MONEY),
args = {
goldColor = {type="select",order=1,name=L["GoldColor"],desc=L["GoldColorDesc"],values={_none=ADDON_DISABLED,color=L["GoldColorCoin"],white=L["GoldColorWhite"]} },
goldCoins = {type="toggle",order=2,name=L["GoldCoins"],desc=L["GoldCoinsDesc"]},
separateThousands = {type="toggle",order=3,name=L["DigitGroup"],desc=L["DigitGroupDesc"]},
goldHide = {type="select",order=4,name=L["HideMoney"],desc=L["HideMoneyDescEverywhere"], width = "double", values= goldHideValues }
}
},
tooltip = {
type = "group", order = 3, inline = true,
name = C("ff00aaff",L["Tooltip"]),
args = {
scm = {type="toggle",order=1,name=L["OptSCM"],desc=L["OptSCMDesc"]},
showHints = {type="toggle",order=2,name=L["OptTTHints"],desc=L["OptTTHintsDesc"]},
maxTooltipHeight = {type="range", order=3,name=L["TTMaxHeight"],desc=L["TTMaxHeightDesc"],min=10, max=90},
ttModifierKey1 = {type="select",order=4,name=L["TTShowMod"],desc=L["TTShowModDesc"],values=ttModifierValues,width="double"},
ttModifierKey2 = {type="select",order=5,name=L["TTMouse"],desc=L["TTMouseDesc"],values=ttModifierValues,width="double"},
}
},
icons = {
type = "group", order = 4, inline = true,
name = C("ff00aaff",L["Icons"]),
args = {
iconcolor = {type="color", order=1,name=L["IconColor"],desc=L["IconColorDesc"]},
iconset = {type="select",order=2,name=L["IconSets"],desc=L["IconSetsDesc"],values=getIconSets(),width="double"},
iconsetinfo = {
type = "description", order = 3, fontSize = "medium",
name = C("dkyellow",L["IconSetsInfo"])
},
iconsetlink = {
type = "input", order = 4, width = "full",
name = "",
get = function() return "http://www.wowinterface.com/downloads/info22790.html"; end,
set = function() end
}
}
},
}
},
modEnable = {
type = "group", order = 2,
name = L["ModsToggle"],
desc = L["ModsToggleDesc"],
childGroups = "tab",
args = {
info = {
type = "group", order = 0, inline = true,
name = "",
args = {
desc = { type="description", order=0, fontSize="medium", width="double", name=C("orange",L["ModsToggleInfo"]) },
reload = { type="execute", order=1, name=L["ReloadUI"], func=C_UI.Reload },
enable = { type="execute", order=2, name=ENABLE_ALL_ADDONS, func=toggleAllModules },
disable = { type="execute", order=3, name=DISABLE_ALL_ADDONS, func=toggleAllModules },
default = { type="execute", order=4, name=DEFAULT, func=toggleAllModules }
}
},
}
},
modOptions = { -- dummy group
type = "group", order = 3,
name = L["Modules"],
desc = L["ModulesDesc"],
childGroups="tree",
args = {},
},
chars = {
type = "group", order = 4, --fontSize="normal",
name = L["OptCharData"],
desc = L["OptCharDataDesc"],
childGroups="tab",
args = {
infoheader = { type = "description", order=1, name=C("dkyellow",L["OptCharInfoHeader"]), fontSize="medium" },
info1_2 = {
type = "description", order= 2,
name = C("ltgreen",L["OptCharInfo1"]) .. "\n" .. L["OptCharInfo1Desc"].. "\n\n" ..
C("ltgreen",L["OptCharInfo2"]) .. "\n" .. L["OptCharInfo2Desc"] .."\n "
},
info3 = { type="description", order=6, name=C("ltgreen",L["OptCharInfo3"]), width="normal"},
delete = {
type = "execute", order=7, width="double",
name = L["OptCharDelAll"], desc = L["OptCharDelAllDesc"]
},
list = {
type = "group", order=8,
name = L["OptCharList"],
childGroups="tab",
args = {
}
}
}
},
-- profiles = {}, -- created by AceDBOptions
}
}
ns.sharedOptions = {
shortNumbers = { type="toggle", name=L["ShortNum"], desc=L["ShortNumDesc"]},
showAllFactions = { type="toggle", name=L["AllFactions"], desc=L["AllFactionsDesc"]},
showRealmNames = { type="toggle", name=L["RealmNames"], desc=L["RealmNamesDesc"]},
showChars = { type="toggle", name=L["ShowChars"], desc=L["ShowCharsDesc"], customDescFormat="ShowCharsDesc-%s" }, -- TODO: translation ShowCharsDesc
showCharsFrom = { type="select", name=L["CharsFrom"], desc=L["CharsFromDesc"], values=ns.showCharsFrom_Values },
goldHideBB = { type="select", name=L["HideMoney"], desc=L["HideMoneyDescBrokerButton"], width = "double", values = goldHideValues },
goldHideTT = { type="select", name=L["HideMoney"], desc=L["HideMoneyDescTooltip"], width = "double", values = goldHideValues },
}
local sharedDefaults = {
shortNumbers = true,
showChars = true,
showAllFactions = true,
showRealmNames = true,
showCharsFrom = "2",
minimap = {hide=false}
}
local coords=nil;
local function Icon(info)
local key=info[#info];
if key=="modOptions" then return end
local icon = I[key..(ns.modules[key].icon_suffix or "")];
coords = icon.coords or {.1,.9,.1,.9};
return icon.iconfile;
end
function ns.getModOptionTable(modName)
if modName and options.args.modOptions.args[modName] then
return options.args.modOptions.args[modName].args;
end
return {};
end
local function IconCoords(info)
if info[#info]=="modOptions" then return end
return coords;
end
local function optionWalker(modName,group,lst)
for k, v in pairs(lst)do
local tV,customModDesc = type(v);
if tV=="table" and #v>0 then
-- short table {<order[number|bool]>, <customModDesc>}
customModDesc,v,tV = v[2],v[1],type(v[1]);
end
if tV=="number" or tV=="boolean" then
if ns.sharedOptions[k] then
local shared = CopyTable(ns.sharedOptions[k]);
if tV=="number" then
shared.order = v;
end
if customModDesc then
local LStr = "";
if customModDesc==true then
customModDesc = modName;
end
if shared.customDescFormat then
LStr = L[shared.customDescFormat:format(customModDesc)];
shared.customDescFormat = nil;
else
LStr = L[customModDesc];
end
if LStr~="" then
shared.desc = LStr;
end
end
lst[k] = shared;
dbDefaults.profile[modName][k] = sharedDefaults[k];
else
lst[k]=nil;
end
elseif tV=="table" then
if v.type=="separator" then
v.type = "description";
v.name = " ";
end
if v.type=="slider" or v.type=="desc" then
lst[k]=nil;
end
if (v.default or v.inMenuInvisible or v.text or v.isSubMenu or v.alpha or v.tooltip or v.label or v.format or v.rep or v.minText or v.maxText)~=nil then
lst[k]=nil;
end
end
end
if group=="broker" then
lst.minimap = {
type = "toggle", order = 0,
name = L["OptMinimap"], desc=L["OptMinimapDesc"]
}
end
end
local function ModName(info)
local key=info[#info];
if not ns.profile[key].enabled then
return C("gray",L[key]);
end
return L[key];
end
local function ModDesc(info)
local key=info[#info];
if not ns.profile[key].enabled then
return C("red","("..ADDON_DISABLED..")").."\n"..C("gray",L["ModDesc-"..key]);
end
return L["ModDesc-"..key];
end
function ns.Options_RegisterDefaults() -- re-registration for dbDefaults after 'db = LibStub("AceDB-3.0"):New("Broker_Everything_AceDB",dbDefaults,true);'
db:RegisterDefaults(dbDefaults);
end
function ns.Options_RegisterModule(modName)
local mod,modOptions = ns.modules[modName],{};
-- defaults
if nsProfileMT then -- namespace profile metatable for debugging; not present in normal release versions. ;-)
ns.profile[modName] = setmetatable({section=modName},nsProfileMT);
end
-- normal defaults
dbDefaults.profile[modName] = mod.config_defaults or {enabled=false};
if not mod.isHiddenModule then
if dbDefaults.profile[modName].minimap==nil then
dbDefaults.profile[modName].minimap = {hide=false};
end
-- add toggle to ModToggleTab
options.args.modEnable.args[modName] = {type="toggle",name=L[modName],desc=L["ModDesc-"..modName]};
-- add shared option defaults
if type(mod.options)=="function" then
modOptions = mod.options();
for _,group in pairs(modOptions)do
for key,value in pairs(group)do
if sharedDefaults[key]~=nil and dbDefaults.profile[modName][key]==nil then
dbDefaults.profile[modName][key] = sharedDefaults[key];
end
end
end
end
-- add own tree entry per module
options.args.modOptions.args[modName] = {
type = "group",
name = ModName, desc = ModDesc,
icon = Icon, iconCoords = IconCoords, -- currently ace ignore IconCoords
args = {
}
}
if mod.clickOptions then
ns.ClickOpts.createOptions(modName,modOptions);
end
local hasBrokerOpts = false;
for k in pairs(modOptions)do
if k:find("^broker") then
hasBrokerOpts = true;
break;
end
end
if not hasBrokerOpts then
modOptions.broker = {};
end
for k, v in pairs(modOptions)do
local name, order = v.name, v.order;
v.name,v.order = nil,nil;
if k:find("^broker") then
name = name or L["Broker"];
order = order or 1;
elseif k:find("^tooltip") then
name = name or L["Tooltip"];
order = order or 2;
elseif k:find("^misc") then
name = name or AUCTION_SUBCATEGORY_OTHER;
order = order or 98;
elseif k:find("^ClickOpts") then
name = name or L["ClickOptions"];
order = 99;
end
optionWalker(modName,k,v);
options.args.modOptions.args[modName].args[k] = {
type="group", name=C("ff00aaff",name), order=order, inline=true, args=v
}
end
end
end
local function buildCharDataOptions()
wipe(options.args.chars.args.list.args);
local lst = options.args.chars.args.list.args;
-- Broker_Everything_CharacterDB
-- Broker_Everything_CharacterDB.order
for order,name_realm in ipairs(Broker_Everything_CharacterDB.order)do
if Broker_Everything_CharacterDB[name_realm] then
local charName, realm = strsplit("%-",name_realm,2);
local label,hasError = "",false
if Broker_Everything_CharacterDB[name_realm].class and charName and realm then
label = C(Broker_Everything_CharacterDB[name_realm].class or "ffff0000",charName or "error").."\n"..C("gray",realm or "error");
else
label = C("ffff0000",charName) .. "\n" .. C("gray",realm);
hasError = true;
end
lst[name_realm] = {
type = "group", order = order, inline=true,
name = "",
args = {
label = {
type = "description", order=1, width="normal", fontSize = "medium",
name = label,
},
[name_realm] = {
type = "description", order = 2, width = "half",
name = calcDataSize,
},
up = {type="execute", order=3, width="half", name=L["Up"], desc=label, disabled=(order==1) },
down = {type="execute", order=4, width="half", name=L["Down"], desc=label, disabled=(order==#Broker_Everything_CharacterDB.order) },
del = {type="execute", order=5, width="half", name=DELETE, desc=label, disabled=(name_realm==ns.player.name_realm) },
error = {type = "description", order=6, fontSize = "medium", name = C("red",L["CharDataError"].." "..name_realm).."\n"..L["CharDataErrorTODO"], hidden=not hasError },
}
}
end
end
end
function options.args.chars.func(info) -- function for buttons 'Up', 'Down' and 'Delete' for single character and 'Delete all'
local key,char = info[#info],info[#info-1];
if key=="up" or key=="down" then
local cur
for i,v in ipairs(Broker_Everything_CharacterDB.order)do
if char==v then
cur = i;
break;
end
end
if key=="up" then
Broker_Everything_CharacterDB.order[cur],Broker_Everything_CharacterDB.order[cur-1] = Broker_Everything_CharacterDB.order[cur-1],Broker_Everything_CharacterDB.order[cur];
else -- down
Broker_Everything_CharacterDB.order[cur],Broker_Everything_CharacterDB.order[cur+1] = Broker_Everything_CharacterDB.order[cur+1],Broker_Everything_CharacterDB.order[cur];
end
buildCharDataOptions();
elseif key=="del" then -- delete single character
Broker_Everything_CharacterDB[char] = nil;
for i,v in ipairs(Broker_Everything_CharacterDB.order)do
if char==v then
tremove(Broker_Everything_CharacterDB.order,i);
break;
end
end
buildCharDataOptions();
elseif key=="delete" then -- delete all
Broker_Everything_CharacterDB = {};
C_UI.Reload();
end
end
function ns.RegisterOptions()
if Broker_Everything_AceDB==nil then
Broker_Everything_AceDB = {};
end
buildCharDataOptions();
db = LibStub("AceDB-3.0"):New("Broker_Everything_AceDB",dbDefaults,true);
if not nsProfileMT then
ns.profile = db.profile;
end
options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(db);
options.args.profiles.order=-1;
LibStub("AceConfig-3.0"):RegisterOptionsTable(addonLabel, options);
local opts = LibStub("AceConfigDialog-3.0"):AddToBlizOptions(addonLabel);
LibStub("HizurosSharedTools").BlizzOptions_ExpandOnShow(opts);
LibStub("HizurosSharedTools").AddCredit(addon);
local goldColor = ns.profile.GeneralOptions.goldColor;
if type(goldColor)~="string" then
ns.profile.GeneralOptions.goldColor = goldColor and "color" or "white";
end
end
function ns.ToggleBlizzOptionPanel()
InterfaceOptionsFrame_OpenToCategory(addon);
InterfaceOptionsFrame_OpenToCategory(addon);
end
if AddonCompartmentFrame then
AddonCompartmentFrame:RegisterAddon({
icon = 892831,
text = addon,
notCheckable = true,
func = ns.ToggleBlizzOptionPanel
})
end