annotate Config.lua @ 62:fee06221176f

Seperated the config from Core.lua. Many other code cleaning up for readability. Added local references for much used globals. Moved widgets to a different file for readability. Re-added global function for slash command handling since we do need it for our chat-hyperlinks. Fixed queueing to properly use the track at property of virtual groups. Fixed queueing to display the item id instead of the item link if the item link could not be loaded. Speed slider at the summary now has an interval of 1% down from 5% and rounds rather than ceils it?s value so 101% will become 100% rather than 105%. Now using the right stock properties at the summary. Added a help group to the config.
author Zerotorescue
date Wed, 22 Dec 2010 19:56:55 +0100
parents
children ac1189599769
rev   line source
Zerotorescue@62 1 local addon = select(2, ...);
Zerotorescue@62 2 local mod = addon:NewModule("Config");
Zerotorescue@62 3
Zerotorescue@62 4 local options, groupIdToName, groupIsVirtual, temp, count, includeTradeSkillItems, currentGroupType = {}, {}, {}, {}, 0, 500, "Normal";
Zerotorescue@62 5 local AceConfigDialog, AceConfigRegistry, AceSerializer;
Zerotorescue@62 6
Zerotorescue@62 7 -- Private functions and tables
Zerotorescue@62 8
Zerotorescue@62 9 local function SetOption(info, value, multiSelectEnabled)
Zerotorescue@62 10 local groupName = groupIdToName[info[2]];
Zerotorescue@62 11 local optionName = info[#info];
Zerotorescue@62 12
Zerotorescue@62 13 -- Special treatment for override toggle boxes
Zerotorescue@62 14 if optionName:find("override") then
Zerotorescue@62 15 if not value and info.arg then
Zerotorescue@62 16 -- If this override was disabled and a saved variable name was provided, set it to nil rather than false
Zerotorescue@62 17
Zerotorescue@62 18 value = nil;
Zerotorescue@62 19
Zerotorescue@62 20 -- If this is an override toggler then also set the related field to nil
Zerotorescue@62 21 addon.db.profile.groups[groupName][info.arg] = nil;
Zerotorescue@62 22 elseif value and info.arg then
Zerotorescue@62 23 -- If this override is now enabled, we need to copy the default into this field (unless it is not nil (which is supposed to be impossible), in which case we'll use the already selected value)
Zerotorescue@62 24
Zerotorescue@62 25 addon.db.profile.groups[groupName][info.arg] = addon:GetOptionByKey(groupName, info.arg);
Zerotorescue@62 26 end
Zerotorescue@62 27 end
Zerotorescue@62 28
Zerotorescue@62 29 if multiSelectEnabled ~= nil then
Zerotorescue@62 30 -- The saved vars for a multiselect will always be an array, it may not yet exist in which case it must be created.
Zerotorescue@62 31 if not addon.db.profile.groups[groupName][optionName] then
Zerotorescue@62 32 addon.db.profile.groups[groupName][optionName] = {};
Zerotorescue@62 33 end
Zerotorescue@62 34
Zerotorescue@62 35 addon.db.profile.groups[groupName][optionName][value] = multiSelectEnabled or nil;
Zerotorescue@62 36 else
Zerotorescue@62 37 addon.db.profile.groups[groupName][optionName] = value;
Zerotorescue@62 38 end
Zerotorescue@62 39 end
Zerotorescue@62 40
Zerotorescue@62 41 local function GetOption(info)
Zerotorescue@62 42 local groupName = groupIdToName[info[2]];
Zerotorescue@62 43 local optionName = info[#info];
Zerotorescue@62 44
Zerotorescue@62 45 local noDefault;
Zerotorescue@62 46
Zerotorescue@62 47 if optionName:find("override") then
Zerotorescue@62 48 noDefault = true;
Zerotorescue@62 49 end
Zerotorescue@62 50
Zerotorescue@62 51 return addon:GetOptionByKey(groupName, optionName, noDefault);
Zerotorescue@62 52 end
Zerotorescue@62 53
Zerotorescue@62 54 local function GetMultiOption(info, value)
Zerotorescue@62 55 local groupName = groupIdToName[info[2]];
Zerotorescue@62 56 local optionName = info[#info];
Zerotorescue@62 57
Zerotorescue@62 58 if addon.db.profile.groups[groupName][optionName] ~= nil then
Zerotorescue@62 59 return addon.db.profile.groups[groupName][optionName][value];
Zerotorescue@62 60 elseif addon.db.profile.defaults[optionName] then
Zerotorescue@62 61 return addon.db.profile.defaults[optionName][value];
Zerotorescue@62 62 else
Zerotorescue@62 63 return nil;
Zerotorescue@62 64 end
Zerotorescue@62 65 end
Zerotorescue@62 66
Zerotorescue@62 67 local function GetDisabled(info)
Zerotorescue@62 68 local groupName = groupIdToName[info[2]];
Zerotorescue@62 69 local optionName = info[#info];
Zerotorescue@62 70
Zerotorescue@62 71 if optionName:find("override") or not info.arg then
Zerotorescue@62 72 return false;
Zerotorescue@62 73 end
Zerotorescue@62 74
Zerotorescue@62 75 return (addon:GetOptionByKey(groupName, info.arg, true) == nil);
Zerotorescue@62 76 end
Zerotorescue@62 77
Zerotorescue@62 78 local function ValidateGroupName(_, value)
Zerotorescue@62 79 value = string.lower(string.trim(value or ""));
Zerotorescue@62 80
Zerotorescue@62 81 for name, _ in pairs(addon.db.profile.groups) do
Zerotorescue@62 82 if string.lower(name) == value then
Zerotorescue@62 83 return ("A group named \"%s\" already exists."):format(name);
Zerotorescue@62 84 end
Zerotorescue@62 85 end
Zerotorescue@62 86
Zerotorescue@62 87 return true;
Zerotorescue@62 88 end
Zerotorescue@62 89
Zerotorescue@62 90 local tblAddItemTemplate = {
Zerotorescue@62 91 order = 0,
Zerotorescue@62 92 type = "input",
Zerotorescue@62 93 name = function(info)
Zerotorescue@62 94 local itemName, _, itemRarity = GetItemInfo(info[#info]);
Zerotorescue@62 95 return tostring( 7 - (itemRarity or 0) ) .. (itemName or "");
Zerotorescue@62 96 end,
Zerotorescue@62 97 get = function(info)
Zerotorescue@62 98 return tostring(info[#info]); -- Ace is going to be anal about this if it's a numeric value, so we transmute it into a string here then back to a number on the other side
Zerotorescue@62 99 end,
Zerotorescue@62 100 set = function(groupId, itemId)
Zerotorescue@62 101 -- This is NOT a real "set", we pass the widget reference to this function which contains similar, but not the same, info.
Zerotorescue@62 102
Zerotorescue@62 103 if itemId then
Zerotorescue@62 104 local groupName = groupIdToName[groupId];
Zerotorescue@62 105
Zerotorescue@62 106 if not addon:AddItemToGroup(groupName, itemId) then
Zerotorescue@62 107 print("|cffff0000Couldn't add the item with itemId (" .. itemId .. ") because it is already in a group.|r");
Zerotorescue@62 108 end
Zerotorescue@62 109 end
Zerotorescue@62 110 end,
Zerotorescue@62 111 width = "double",
Zerotorescue@62 112 dialogControl = "ConfigItemLinkButton",
Zerotorescue@62 113 };
Zerotorescue@62 114
Zerotorescue@62 115 local tblRemoveItemTemplate = {
Zerotorescue@62 116 order = 0,
Zerotorescue@62 117 type = "input",
Zerotorescue@62 118 name = function(info)
Zerotorescue@62 119 local itemName, _, itemRarity = GetItemInfo(info[#info]);
Zerotorescue@62 120 return tostring( 7 - (itemRarity or 0) ) .. (itemName or "");
Zerotorescue@62 121 end,
Zerotorescue@62 122 get = function(info)
Zerotorescue@62 123 return tostring(info[#info]); -- Ace is going to be anal about this if it's a numeric value, so we transmute it into a string here then back to a number on the other side
Zerotorescue@62 124 end,
Zerotorescue@62 125 set = function(groupId, itemId)
Zerotorescue@62 126 -- This is NOT a real "set", we pass the widget reference to this function which contains similar, but not the same, info.
Zerotorescue@62 127
Zerotorescue@62 128 if itemId then
Zerotorescue@62 129 local groupName = groupIdToName[groupId];
Zerotorescue@62 130
Zerotorescue@62 131 addon:RemoveItemFromGroup(groupName, itemId);
Zerotorescue@62 132
Zerotorescue@62 133 -- Now rebuild the list
Zerotorescue@62 134 AceConfigRegistry:NotifyChange("InventoriumOptions");
Zerotorescue@62 135 end
Zerotorescue@62 136 end,
Zerotorescue@62 137 width = "double",
Zerotorescue@62 138 dialogControl = "ConfigItemLinkButton",
Zerotorescue@62 139 };
Zerotorescue@62 140
Zerotorescue@62 141 local function UpdateAddItemList(info)
Zerotorescue@62 142 local groupName = groupIdToName[info[2]];
Zerotorescue@62 143
Zerotorescue@62 144 if not addon.db.profile.groups[groupName].items then
Zerotorescue@62 145 addon.db.profile.groups[groupName].items = {};
Zerotorescue@62 146 end
Zerotorescue@62 147
Zerotorescue@62 148 -- Merge all items from all groups together
Zerotorescue@62 149 local items = {};
Zerotorescue@62 150 for groupName, values in pairs(addon.db.profile.groups) do
Zerotorescue@62 151 if values.items then
Zerotorescue@62 152 for itemId, _ in pairs(values.items) do
Zerotorescue@62 153 items[itemId] = true;
Zerotorescue@62 154 end
Zerotorescue@62 155 end
Zerotorescue@62 156 end
Zerotorescue@62 157
Zerotorescue@62 158 local ref = options.args.groups.args[info[2]].args.add.args.list.args;
Zerotorescue@62 159
Zerotorescue@62 160 -- Remaking the list, so out with the old, in with the new
Zerotorescue@62 161 table.wipe(ref);
Zerotorescue@62 162
Zerotorescue@62 163 -- Parse bags and show these
Zerotorescue@62 164 for bagID = 4, 0, -1 do
Zerotorescue@62 165 for slot = 1, GetContainerNumSlots(bagID) do
Zerotorescue@62 166 local itemId = addon:GetItemId(GetContainerItemLink(bagID, slot));
Zerotorescue@62 167
Zerotorescue@62 168 if itemId then
Zerotorescue@62 169 if not items[itemId] then
Zerotorescue@62 170 -- If this item isn't used in any group yet
Zerotorescue@62 171 ref[itemId] = tblAddItemTemplate;
Zerotorescue@62 172 else
Zerotorescue@62 173 -- It's already used in a group, don't show it
Zerotorescue@62 174 ref[itemId] = nil;
Zerotorescue@62 175 end
Zerotorescue@62 176 end
Zerotorescue@62 177 end
Zerotorescue@62 178 end
Zerotorescue@62 179
Zerotorescue@62 180 if includeTradeSkillItems ~= 500 then
Zerotorescue@62 181 -- Include tradeskill items
Zerotorescue@62 182
Zerotorescue@62 183 -- Go through all trade skills for the profession
Zerotorescue@62 184 for i = 1, GetNumTradeSkills() do
Zerotorescue@62 185 -- Try to retrieve the itemlink, this will be nil if current item is a group instead
Zerotorescue@62 186 local itemLink = GetTradeSkillItemLink(i);
Zerotorescue@62 187
Zerotorescue@62 188 if itemLink then
Zerotorescue@62 189 local itemId = addon:GetItemId(itemLink);
Zerotorescue@62 190 if not itemId then
Zerotorescue@62 191 -- If this isn't an item, it can only be an enchant instead
Zerotorescue@62 192 itemId = tonumber(itemLink:match("|Henchant:([-0-9]+)|h"));
Zerotorescue@62 193
Zerotorescue@62 194 itemId = addon.scrollIds[itemId]; -- change enchantIds into scrollIds
Zerotorescue@62 195 end
Zerotorescue@62 196
Zerotorescue@62 197 if itemId then
Zerotorescue@62 198 local itemLevel = select(4, GetItemInfo(itemId)) or 0;
Zerotorescue@62 199
Zerotorescue@62 200 if includeTradeSkillItems == 0 or itemLevel >= includeTradeSkillItems then
Zerotorescue@62 201 if not items[itemId] then
Zerotorescue@62 202 -- If this item isn't used in any group yet
Zerotorescue@62 203 ref[itemId] = tblAddItemTemplate;
Zerotorescue@62 204 else
Zerotorescue@62 205 -- It's already used in a group, don't show it
Zerotorescue@62 206 ref[itemId] = nil;
Zerotorescue@62 207 end
Zerotorescue@62 208 end
Zerotorescue@62 209 else
Zerotorescue@62 210 addon:Debug("|cffff0000ERROR|r: Couldn't find proper item id for " .. itemLink);
Zerotorescue@62 211 end
Zerotorescue@62 212 end
Zerotorescue@62 213 end
Zerotorescue@62 214 end
Zerotorescue@62 215 end
Zerotorescue@62 216
Zerotorescue@62 217 local function UpdateRemoveItemList(info)
Zerotorescue@62 218 local groupName = groupIdToName[info[2]];
Zerotorescue@62 219
Zerotorescue@62 220 if not addon.db.profile.groups[groupName].items then
Zerotorescue@62 221 addon.db.profile.groups[groupName].items = {};
Zerotorescue@62 222 end
Zerotorescue@62 223
Zerotorescue@62 224 local ref = options.args.groups.args[info[2]].args.remove.args.list.args;
Zerotorescue@62 225
Zerotorescue@62 226 -- Unset all
Zerotorescue@62 227 for itemId, _ in pairs(ref) do
Zerotorescue@62 228 ref[itemId] = nil;
Zerotorescue@62 229 end
Zerotorescue@62 230
Zerotorescue@62 231 -- Parse items in group and show these
Zerotorescue@62 232 for itemId, _ in pairs(addon.db.profile.groups[groupName].items) do
Zerotorescue@62 233 ref[itemId] = tblRemoveItemTemplate;
Zerotorescue@62 234 end
Zerotorescue@62 235 end
Zerotorescue@62 236
Zerotorescue@62 237 -- Default group
Zerotorescue@62 238 local defaultGroup = {
Zerotorescue@62 239 order = 0,
Zerotorescue@62 240 type = "group",
Zerotorescue@62 241 childGroups = "tab",
Zerotorescue@62 242 name = function(info)
Zerotorescue@62 243 local groupId = info[#info];
Zerotorescue@62 244 if groupIsVirtual[groupId] then
Zerotorescue@62 245 return ("%s |cfffed000Virtual|r"):format(groupIdToName[groupId]);
Zerotorescue@62 246 else
Zerotorescue@62 247 return groupIdToName[groupId];
Zerotorescue@62 248 end
Zerotorescue@62 249 end,
Zerotorescue@62 250 desc = function(info)
Zerotorescue@62 251 local groupId = info[#info];
Zerotorescue@62 252 if groupIsVirtual[groupId] then
Zerotorescue@62 253 return "This is a virtual group, you can use it to override the defaults for other groups.";
Zerotorescue@62 254 end
Zerotorescue@62 255 end,
Zerotorescue@62 256 args = {
Zerotorescue@62 257 general = {
Zerotorescue@62 258 order = 10,
Zerotorescue@62 259 type = "group",
Zerotorescue@62 260 name = "General",
Zerotorescue@62 261 desc = "Change the general settings for just this group.",
Zerotorescue@62 262 args = {
Zerotorescue@62 263 general = {
Zerotorescue@62 264 order = 0,
Zerotorescue@62 265 type = "group",
Zerotorescue@62 266 inline = true,
Zerotorescue@62 267 name = "General",
Zerotorescue@62 268 set = SetOption,
Zerotorescue@62 269 get = GetOption,
Zerotorescue@62 270 disabled = GetDisabled,
Zerotorescue@62 271 args = {
Zerotorescue@62 272 description = {
Zerotorescue@62 273 order = 0,
Zerotorescue@62 274 type = "description",
Zerotorescue@62 275 name = function(info)
Zerotorescue@62 276 local groupName = groupIdToName[info[2]];
Zerotorescue@62 277
Zerotorescue@62 278 local t = "Here you can set general settings for the currently selected group. If you do not wish to override a setting, the default setting specified in the general group will be used.\n\n";
Zerotorescue@62 279
Zerotorescue@62 280 local currentAddon, selectedAddonName = addon:GetItemCountAddon(groupName);
Zerotorescue@62 281 local preferedAddon = addon:GetOptionByKey(groupName, "itemCountAddon");
Zerotorescue@62 282
Zerotorescue@62 283 if currentAddon then
Zerotorescue@62 284 --GetCharacterCount
Zerotorescue@62 285 --addon.supportedAddons.itemCount[selectedExternalAddon]
Zerotorescue@62 286 t = t .. "Currently using |cfffed000" .. selectedAddonName .. "|r as your item count addon. This addon is " .. ((currentAddon.IsEnabled() and "|cff00ff00enabled|r") or "|cffff0000disabled|r") .. ".";
Zerotorescue@62 287
Zerotorescue@62 288 if currentAddon.GetTotalCount and currentAddon.GetCharacterCount then
Zerotorescue@62 289 t = t .. " This addon supports |cfffed000both total as local|r item counts.";
Zerotorescue@62 290 elseif currentAddon.GetTotalCount then
Zerotorescue@62 291 t = t .. " This addon supports |cfffed000only total|r item counts.";
Zerotorescue@62 292 elseif currentAddon.GetCharacterCount then
Zerotorescue@62 293 t = t .. " This addon supports |cfffed000only local|r item counts.";
Zerotorescue@62 294 end
Zerotorescue@62 295
Zerotorescue@62 296 if preferedAddon ~= selectedAddonName then
Zerotorescue@62 297 t = t .. "\n\n|cffff0000You have selected |cfffed000" .. preferedAddon .. "|r|cffff0000 as your item count addon, but this appears to be disabled and thus a random alternative was selected.|r";
Zerotorescue@62 298 end
Zerotorescue@62 299 end
Zerotorescue@62 300
Zerotorescue@62 301 return t;
Zerotorescue@62 302 end,
Zerotorescue@62 303 },
Zerotorescue@62 304 header = {
Zerotorescue@62 305 order = 5,
Zerotorescue@62 306 type = "header",
Zerotorescue@62 307 name = "",
Zerotorescue@62 308 },
Zerotorescue@62 309 overrideAuctionPricingAddon = {
Zerotorescue@62 310 order = 9,
Zerotorescue@62 311 type = "toggle",
Zerotorescue@62 312 name = "Override pricing addon",
Zerotorescue@62 313 desc = "Allows you to override the pricing addon setting for this group.",
Zerotorescue@62 314 arg = "auctionPricingAddon",
Zerotorescue@62 315 },
Zerotorescue@62 316 auctionPricingAddon = {
Zerotorescue@62 317 order = 10,
Zerotorescue@62 318 type = "select",
Zerotorescue@62 319 name = "Prefered pricing addon",
Zerotorescue@62 320 desc = "Select the addon you prefer data for this group to be retrieved from. A random supported addon will be used if the selected addon can not be found.",
Zerotorescue@62 321 values = function()
Zerotorescue@62 322 local temp = {};
Zerotorescue@62 323 for name, value in pairs(addon.supportedAddons.auctionPricing) do
Zerotorescue@62 324 temp[name] = name;
Zerotorescue@62 325 end
Zerotorescue@62 326
Zerotorescue@62 327 return temp;
Zerotorescue@62 328 end,
Zerotorescue@62 329 set = function(info, value)
Zerotorescue@62 330 local groupName = groupIdToName[info[2]];
Zerotorescue@62 331 local optionName = info[#info];
Zerotorescue@62 332
Zerotorescue@62 333 addon.db.profile.groups[groupName][optionName] = value ~= "" and value;
Zerotorescue@62 334
Zerotorescue@62 335 if addon.supportedAddons.auctionPricing[value].OnSelect then
Zerotorescue@62 336 addon.supportedAddons.auctionPricing[value].OnSelect();
Zerotorescue@62 337 end
Zerotorescue@62 338 end,
Zerotorescue@62 339 arg = "overrideAuctionPricingAddon",
Zerotorescue@62 340 },
Zerotorescue@62 341 overrideItemCountAddon = {
Zerotorescue@62 342 order = 19,
Zerotorescue@62 343 type = "toggle",
Zerotorescue@62 344 name = "Override item count addon",
Zerotorescue@62 345 desc = "Allows you to override the item count addon setting for this group.",
Zerotorescue@62 346 arg = "itemCountAddon",
Zerotorescue@62 347 },
Zerotorescue@62 348 itemCountAddon = {
Zerotorescue@62 349 order = 20,
Zerotorescue@62 350 type = "select",
Zerotorescue@62 351 name = "Prefered item count addon",
Zerotorescue@62 352 desc = "Select the addon you prefer data for this group to be retrieved from. A random supported addon will be used if the selected addon can not be found.",
Zerotorescue@62 353 values = function()
Zerotorescue@62 354 local temp = {};
Zerotorescue@62 355 for name, value in pairs(addon.supportedAddons.itemCount) do
Zerotorescue@62 356 temp[name] = name;
Zerotorescue@62 357 end
Zerotorescue@62 358
Zerotorescue@62 359 return temp;
Zerotorescue@62 360 end,
Zerotorescue@62 361 set = function(info, value)
Zerotorescue@62 362 local groupName = groupIdToName[info[2]];
Zerotorescue@62 363 local optionName = info[#info];
Zerotorescue@62 364
Zerotorescue@62 365 addon.db.profile.groups[groupName][optionName] = value ~= "" and value;
Zerotorescue@62 366
Zerotorescue@62 367 if addon.supportedAddons.itemCount[value].OnSelect then
Zerotorescue@62 368 addon.supportedAddons.itemCount[value].OnSelect();
Zerotorescue@62 369 end
Zerotorescue@62 370 end,
Zerotorescue@62 371 arg = "overrideItemCountAddon",
Zerotorescue@62 372 },
Zerotorescue@62 373 overrideCraftingAddon = {
Zerotorescue@62 374 order = 29,
Zerotorescue@62 375 type = "toggle",
Zerotorescue@62 376 name = "Override crafting addon",
Zerotorescue@62 377 desc = "Allows you to override the crafting addon setting for this group.",
Zerotorescue@62 378 arg = "craftingAddon",
Zerotorescue@62 379 },
Zerotorescue@62 380 craftingAddon = {
Zerotorescue@62 381 order = 30,
Zerotorescue@62 382 type = "select",
Zerotorescue@62 383 name = "Prefered crafting addon",
Zerotorescue@62 384 desc = "Select the addon you prefer data from this group to be queued into. A random supported addon will be used if the selected addon can not be found.",
Zerotorescue@62 385 values = function()
Zerotorescue@62 386 local temp = {};
Zerotorescue@62 387 for name, value in pairs(addon.supportedAddons.crafting) do
Zerotorescue@62 388 temp[name] = name;
Zerotorescue@62 389 end
Zerotorescue@62 390
Zerotorescue@62 391 return temp;
Zerotorescue@62 392 end,
Zerotorescue@62 393 set = function(info, value)
Zerotorescue@62 394 local groupName = groupIdToName[info[2]];
Zerotorescue@62 395 local optionName = info[#info];
Zerotorescue@62 396
Zerotorescue@62 397 addon.db.profile.groups[groupName][optionName] = value ~= "" and value;
Zerotorescue@62 398
Zerotorescue@62 399 if addon.supportedAddons.crafting[value].OnSelect then
Zerotorescue@62 400 addon.supportedAddons.crafting[value].OnSelect();
Zerotorescue@62 401 end
Zerotorescue@62 402 end,
Zerotorescue@62 403 arg = "overrideCraftingAddon",
Zerotorescue@62 404 },
Zerotorescue@62 405 overrideLocalItemData = {
Zerotorescue@62 406 order = 39,
Zerotorescue@62 407 type = "toggle",
Zerotorescue@62 408 name = "Override local item data",
Zerotorescue@62 409 desc = "Allows you to override the local item data setting for this group.",
Zerotorescue@62 410 arg = "localItemData",
Zerotorescue@62 411 },
Zerotorescue@62 412 localItemData = {
Zerotorescue@62 413 order = 40,
Zerotorescue@62 414 type = "multiselect",
Zerotorescue@62 415 name = "Include in local item data",
Zerotorescue@62 416 desc = "Select which data should be included in the local item data.",
Zerotorescue@62 417 values = {
Zerotorescue@62 418 ["Bag"] = "Bag",
Zerotorescue@62 419 ["Bank"] = "Bank",
Zerotorescue@62 420 ["Auction House"] = "Auction House",
Zerotorescue@62 421 ["Mailbox"] = "Mailbox",
Zerotorescue@62 422 },
Zerotorescue@62 423 get = GetMultiOption,
Zerotorescue@62 424 --dialogControl = "Dropdown", -- this is not standard, normal multiselect control gives us a list of all chars with toggle-boxes. UGLY! We want a multiselect-box instead.
Zerotorescue@62 425 arg = "overrideLocalItemData",
Zerotorescue@62 426 },
Zerotorescue@62 427 virtualGroup = {
Zerotorescue@62 428 order = 50,
Zerotorescue@62 429 type = "select",
Zerotorescue@62 430 name = "Use virtual group settings",
Zerotorescue@62 431 desc = "Use the settings from a virtual group before using the general defaults.\n\n|cffff9933This is an advanced option, you will probably not need it unless you manage a lot of groups.|r\n\n|cfffed000Off|r: Use the overridden options in this group and then the defaults.\n\n|cfffed000On|r: Use the overridden options in this group, then the ones in the selected virtual group and then the defaults.",
Zerotorescue@62 432 values = function(info)
Zerotorescue@62 433 local groupName = groupIdToName[info[2]];
Zerotorescue@62 434
Zerotorescue@62 435 local temp = {};
Zerotorescue@62 436
Zerotorescue@62 437 temp[""] = "";
Zerotorescue@62 438 for name, values in pairs(addon.db.profile.groups) do
Zerotorescue@62 439 if values.isVirtual and name ~= groupName then
Zerotorescue@62 440 temp[name] = name;
Zerotorescue@62 441 end
Zerotorescue@62 442 end
Zerotorescue@62 443
Zerotorescue@62 444 return temp;
Zerotorescue@62 445 end,
Zerotorescue@62 446 set = function(info, value)
Zerotorescue@62 447 local groupName = groupIdToName[info[2]];
Zerotorescue@62 448 local optionName = info[#info];
Zerotorescue@62 449
Zerotorescue@62 450 addon.db.profile.groups[groupName][optionName] = value ~= "" and value;
Zerotorescue@62 451 end,
Zerotorescue@62 452 disabled = false,
Zerotorescue@62 453 },
Zerotorescue@62 454 },
Zerotorescue@62 455 },
Zerotorescue@62 456 minimumStock = {
Zerotorescue@62 457 order = 10,
Zerotorescue@62 458 type = "group",
Zerotorescue@62 459 inline = true,
Zerotorescue@62 460 name = "Minimum stock",
Zerotorescue@62 461 set = SetOption,
Zerotorescue@62 462 get = GetOption,
Zerotorescue@62 463 disabled = GetDisabled,
Zerotorescue@62 464 args = {
Zerotorescue@62 465 description = {
Zerotorescue@62 466 order = 0,
Zerotorescue@62 467 type = "description",
Zerotorescue@62 468 name = "Here you can specify the minimum amount of items you wish to keep in stock and related settings for the currently selected group. Please note the values entered here do not affect the queued quantities, you must set settings for that in the area below.",
Zerotorescue@62 469 },
Zerotorescue@62 470 header = {
Zerotorescue@62 471 order = 5,
Zerotorescue@62 472 type = "header",
Zerotorescue@62 473 name = "",
Zerotorescue@62 474 },
Zerotorescue@62 475
Zerotorescue@62 476 overrideMinLocalStock = {
Zerotorescue@62 477 order = 10,
Zerotorescue@62 478 type = "toggle",
Zerotorescue@62 479 name = "Override min local stock",
Zerotorescue@62 480 desc = "Allows you to override the minimum local stock setting for this group.",
Zerotorescue@62 481 arg = "minLocalStock",
Zerotorescue@62 482 },
Zerotorescue@62 483 minLocalStock = {
Zerotorescue@62 484 order = 11,
Zerotorescue@62 485 type = "range",
Zerotorescue@62 486 min = 0,
Zerotorescue@62 487 max = 100000,
Zerotorescue@62 488 softMax = 100,
Zerotorescue@62 489 step = 1,
Zerotorescue@62 490 name = "Minimum local stock",
Zerotorescue@62 491 desc = "You can manually enter a value between 100 and 100.000 in the text box below if the provided range is insufficient.",
Zerotorescue@62 492 arg = "overrideMinLocalStock",
Zerotorescue@62 493 },
Zerotorescue@62 494 overrideAlertBelowLocalMinimum = {
Zerotorescue@62 495 order = 15,
Zerotorescue@62 496 type = "toggle",
Zerotorescue@62 497 name = "Override local minimum alert",
Zerotorescue@62 498 desc = "Allows you to override wether an alert should be shown when an item in this group gets below the local minimum stock threshold.",
Zerotorescue@62 499 arg = "alertBelowLocalMinimum",
Zerotorescue@62 500 },
Zerotorescue@62 501 alertBelowLocalMinimum = {
Zerotorescue@62 502 order = 16,
Zerotorescue@62 503 type = "toggle",
Zerotorescue@62 504 name = "Alert when below local minimum (NYI)",
Zerotorescue@62 505 desc = "Show an alert when an item in this group gets below the local minimum stock threshold.",
Zerotorescue@62 506 arg = "overrideAlertBelowLocalMinimum",
Zerotorescue@62 507 },
Zerotorescue@62 508
Zerotorescue@62 509 overrideMinGlobalStock = {
Zerotorescue@62 510 order = 20,
Zerotorescue@62 511 type = "toggle",
Zerotorescue@62 512 name = "Override min global stock",
Zerotorescue@62 513 desc = "Allows you to override the minimum global stock setting for this group.",
Zerotorescue@62 514 arg = "minGlobalStock",
Zerotorescue@62 515 },
Zerotorescue@62 516 minGlobalStock = {
Zerotorescue@62 517 order = 21,
Zerotorescue@62 518 type = "range",
Zerotorescue@62 519 min = 0,
Zerotorescue@62 520 max = 100000,
Zerotorescue@62 521 softMax = 100,
Zerotorescue@62 522 step = 1,
Zerotorescue@62 523 name = "Minimum global stock",
Zerotorescue@62 524 desc = "You can manually enter a value between 100 and 100.000 in the text box below if the provided range is insufficient.",
Zerotorescue@62 525 arg = "overrideMinGlobalStock",
Zerotorescue@62 526 },
Zerotorescue@62 527 overrideAlertBelowGlobalMinimum = {
Zerotorescue@62 528 order = 25,
Zerotorescue@62 529 type = "toggle",
Zerotorescue@62 530 name = "Override global minimum alert",
Zerotorescue@62 531 desc = "Allows you to override wether an alert should be shown when an item in this group gets below the global minimum stock threshold.",
Zerotorescue@62 532 arg = "alertBelowGlobalMinimum",
Zerotorescue@62 533 },
Zerotorescue@62 534 alertBelowGlobalMinimum = {
Zerotorescue@62 535 order = 26,
Zerotorescue@62 536 type = "toggle",
Zerotorescue@62 537 name = "Alert when below global minimum (NYI)",
Zerotorescue@62 538 desc = "Show an alert when an item in this group gets below the global minimum stock threshold.",
Zerotorescue@62 539 arg = "overrideAlertBelowGlobalMinimum",
Zerotorescue@62 540 },
Zerotorescue@62 541
Zerotorescue@62 542 overrideSummaryThresholdShow = {
Zerotorescue@62 543 order = 34,
Zerotorescue@62 544 type = "toggle",
Zerotorescue@62 545 name = "Override summary showing",
Zerotorescue@62 546 desc = "Allows you to override when this group should appear in the summary.",
Zerotorescue@62 547 arg = "summaryThresholdShow",
Zerotorescue@62 548 },
Zerotorescue@62 549 summaryThresholdShow = {
Zerotorescue@62 550 order = 35,
Zerotorescue@62 551 type = "range",
Zerotorescue@62 552 min = 0,
Zerotorescue@62 553 max = 10,
Zerotorescue@62 554 softMax = 100,
Zerotorescue@62 555 step = 0.05,
Zerotorescue@62 556 isPercent = true,
Zerotorescue@62 557 name = "Show in summary when below",
Zerotorescue@62 558 desc = "Show items in the summary when below the specified percentage of the minimum stock.\n\nYou can manually enter a value between 1.000% and 10.000% in the edit box if the provided range is insufficient.",
Zerotorescue@62 559 arg = "overrideSummaryThresholdShow",
Zerotorescue@62 560 },
Zerotorescue@62 561 overrideTrackAtCharacters = {
Zerotorescue@62 562 order = 39,
Zerotorescue@62 563 type = "toggle",
Zerotorescue@62 564 name = "Override track at",
Zerotorescue@62 565 desc = "Allows you to override at which characters items in this group should appear in the summary and generate alerts.",
Zerotorescue@62 566 arg = "trackAtCharacters",
Zerotorescue@62 567 },
Zerotorescue@62 568 trackAtCharacters = {
Zerotorescue@62 569 order = 40,
Zerotorescue@62 570 type = "multiselect",
Zerotorescue@62 571 name = "Track at",
Zerotorescue@62 572 desc = "Select at which characters this should appear in the summary and generate alerts.",
Zerotorescue@62 573 values = function()
Zerotorescue@62 574 local temp = {};
Zerotorescue@62 575 for charName in pairs(addon.db.factionrealm.characters) do
Zerotorescue@62 576 temp[charName] = charName;
Zerotorescue@62 577 end
Zerotorescue@62 578
Zerotorescue@62 579 return temp;
Zerotorescue@62 580 end,
Zerotorescue@62 581 get = GetMultiOption,
Zerotorescue@62 582 --dialogControl = "Dropdown", -- this is not standard, normal multiselect control gives us a list of all chars with toggle-boxes. UGLY! We want a multiselect-box instead.
Zerotorescue@62 583 arg = "overrideTrackAtCharacters",
Zerotorescue@62 584 },
Zerotorescue@62 585 },
Zerotorescue@62 586 },
Zerotorescue@62 587 refill = {
Zerotorescue@62 588 order = 20,
Zerotorescue@62 589 type = "group",
Zerotorescue@62 590 inline = true,
Zerotorescue@62 591 name = "Replenishing stock",
Zerotorescue@62 592 set = SetOption,
Zerotorescue@62 593 get = GetOption,
Zerotorescue@62 594 disabled = GetDisabled,
Zerotorescue@62 595 args = {
Zerotorescue@62 596 description = {
Zerotorescue@62 597 order = 0,
Zerotorescue@62 598 type = "description",
Zerotorescue@62 599 name = function(info)
Zerotorescue@62 600 local groupName = groupIdToName[info[2]];
Zerotorescue@62 601 local r = "Here you can specify the amount of items to which you wish to restock when you are collecting new items for the currently selected group. This may be higher than the minimum stock.\n\n";
Zerotorescue@62 602
Zerotorescue@62 603 r = r .. "When restocking the target amount is |cfffed000" .. addon:GetOptionByKey(groupName, "restockTarget") .. "|r of every item. Not queueing craftable items when only missing |cfffed000" .. floor( addon:GetOptionByKey(groupName, "minCraftingQueue") * addon:GetOptionByKey(groupName, "restockTarget") ) .. "|r (|cfffed000" .. ( addon:GetOptionByKey(groupName, "minCraftingQueue") * 100 ) .. "%|r) of the restock target and making |cfffed000" .. floor( ( addon:GetOptionByKey(groupName, "bonusQueue") * addon:GetOptionByKey(groupName, "restockTarget") ) + .5 ) .. "|r (|cfffed000" .. ( addon:GetOptionByKey(groupName, "bonusQueue") * 100 ) .. "%|r) extra items when you completely ran out. ";
Zerotorescue@62 604
Zerotorescue@62 605 if addon:GetOptionByKey(groupName, "priceThreshold") == 0 then
Zerotorescue@62 606 r = r .. "Queueing items at |cfffed000any|r auction value.";
Zerotorescue@62 607 else
Zerotorescue@62 608 r = r .. "Queueing items worth |cfffed000" .. addon:ReadableMoney(addon:GetOptionByKey(groupName, "priceThreshold")) .. "|r or more.";
Zerotorescue@62 609 end
Zerotorescue@62 610
Zerotorescue@62 611 return r;
Zerotorescue@62 612 end,
Zerotorescue@62 613 },
Zerotorescue@62 614 header = {
Zerotorescue@62 615 order = 5,
Zerotorescue@62 616 type = "header",
Zerotorescue@62 617 name = "",
Zerotorescue@62 618 },
Zerotorescue@62 619 overrideRestockTarget = {
Zerotorescue@62 620 order = 9,
Zerotorescue@62 621 type = "toggle",
Zerotorescue@62 622 name = "Override restock target",
Zerotorescue@62 623 desc = "Allows you to override the restock target setting for this group.",
Zerotorescue@62 624 arg = "restockTarget",
Zerotorescue@62 625 },
Zerotorescue@62 626 restockTarget = {
Zerotorescue@62 627 order = 10,
Zerotorescue@62 628 type = "range",
Zerotorescue@62 629 min = 0,
Zerotorescue@62 630 max = 100000,
Zerotorescue@62 631 softMax = 100,
Zerotorescue@62 632 step = 1,
Zerotorescue@62 633 name = "Restock target",
Zerotorescue@62 634 desc = "You can manually enter a value between 100 and 100.000 in the edit box if the provided range is insufficient.",
Zerotorescue@62 635 arg = "overrideRestockTarget",
Zerotorescue@62 636 },
Zerotorescue@62 637 overrideMinCraftingQueue = {
Zerotorescue@62 638 order = 19,
Zerotorescue@62 639 type = "toggle",
Zerotorescue@62 640 name = "Override min queue",
Zerotorescue@62 641 desc = "Allows you to override the minimum craftable items queue setting for this group.",
Zerotorescue@62 642 arg = "minCraftingQueue",
Zerotorescue@62 643 },
Zerotorescue@62 644 minCraftingQueue = {
Zerotorescue@62 645 order = 20,
Zerotorescue@62 646 type = "range",
Zerotorescue@62 647 min = 0,
Zerotorescue@62 648 max = 1,
Zerotorescue@62 649 step = 0.01,
Zerotorescue@62 650 isPercent = true,
Zerotorescue@62 651 name = "Don't queue if I only miss",
Zerotorescue@62 652 desc = "Don't add a craftable item to the queue if I only miss this much or less of the restock target.\n\nExample: if your restock target is set to 60 and this is set to 5%, an item won't be queued unless you are missing more than 3 of it.",
Zerotorescue@62 653 arg = "overrideMinCraftingQueue",
Zerotorescue@62 654 },
Zerotorescue@62 655 overrideBonusQueue = {
Zerotorescue@62 656 order = 29,
Zerotorescue@62 657 type = "toggle",
Zerotorescue@62 658 name = "Override bonus queue",
Zerotorescue@62 659 desc = "Allows you to override the bonus craftable items queue setting for this group.",
Zerotorescue@62 660 arg = "bonusQueue",
Zerotorescue@62 661 },
Zerotorescue@62 662 bonusQueue = {
Zerotorescue@62 663 order = 30,
Zerotorescue@62 664 type = "range",
Zerotorescue@62 665 min = 0,
Zerotorescue@62 666 max = 10, -- 1000%
Zerotorescue@62 667 step = 0.01, -- 1%
Zerotorescue@62 668 isPercent = true,
Zerotorescue@62 669 name = "Bonus queue",
Zerotorescue@62 670 desc = "Get additional items when there are none left.\n\nExample: if your restock target is set to 60 and this is set to 10%, you will get 66 items instead of just 60 if you end up with none left while queueing.",
Zerotorescue@62 671 arg = "overrideBonusQueue",
Zerotorescue@62 672 },
Zerotorescue@62 673 overridePriceThreshold = {
Zerotorescue@62 674 order = 39,
Zerotorescue@62 675 type = "toggle",
Zerotorescue@62 676 name = "Override price threshold",
Zerotorescue@62 677 desc = "Allows you to override the price threshold setting for this group.",
Zerotorescue@62 678 arg = "priceThreshold",
Zerotorescue@62 679 },
Zerotorescue@62 680 priceThreshold = {
Zerotorescue@62 681 order = 40,
Zerotorescue@62 682 type = "input",
Zerotorescue@62 683 name = "Price threshold",
Zerotorescue@62 684 desc = "Only queue craftable items when they are worth at least this much according to your auction house addon.\n\nSet to 0 to ignore auction prices.",
Zerotorescue@62 685 validate = function(info, value) return addon:ValidateReadableMoney(info, value); end,
Zerotorescue@62 686 get = function(i) return addon:ReadableMoney(GetOption(i)); end,
Zerotorescue@62 687 set = function(i, v) SetOption(i, addon:ReadableMoneyToCopper(v)); end,
Zerotorescue@62 688 arg = "overridePriceThreshold",
Zerotorescue@62 689 },
Zerotorescue@62 690 overrideSummaryHidePriceThreshold = {
Zerotorescue@62 691 order = 49,
Zerotorescue@62 692 type = "toggle",
Zerotorescue@62 693 name = "Override summary showing",
Zerotorescue@62 694 desc = "Allows you to override if items in this group should be hidden from the summary while their value is below the price threshold.",
Zerotorescue@62 695 arg = "summaryHidePriceThreshold",
Zerotorescue@62 696 },
Zerotorescue@62 697 summaryHidePriceThreshold = {
Zerotorescue@62 698 order = 50,
Zerotorescue@62 699 type = "toggle",
Zerotorescue@62 700 name = "Hide when below threshold",
Zerotorescue@62 701 desc = "Hide items from the summary when their value is below the set price threshold.",
Zerotorescue@62 702 arg = "overrideSummaryHidePriceThreshold",
Zerotorescue@62 703 },
Zerotorescue@62 704 overrideAlwaysGetAuctionValue = {
Zerotorescue@62 705 order = 59,
Zerotorescue@62 706 type = "toggle",
Zerotorescue@62 707 name = "Override auction value showing",
Zerotorescue@62 708 desc = "Allows you to override if the auction value of items in this group should be cached and displayed even when the price threshold is set to 0|cffeda55fc|r.",
Zerotorescue@62 709 arg = "alwaysGetAuctionValue",
Zerotorescue@62 710 },
Zerotorescue@62 711 alwaysGetAuctionValue = {
Zerotorescue@62 712 order = 60,
Zerotorescue@62 713 type = "toggle",
Zerotorescue@62 714 name = "Always show auction value",
Zerotorescue@62 715 desc = "Always cache and show the auction value of items in this group, even if the price threshold is set to 0|cffeda55fc|r.",
Zerotorescue@62 716 arg = "overrideAlwaysGetAuctionValue",
Zerotorescue@62 717 },
Zerotorescue@62 718 },
Zerotorescue@62 719 },
Zerotorescue@62 720 },
Zerotorescue@62 721 },
Zerotorescue@62 722 group = {
Zerotorescue@62 723 order = 20,
Zerotorescue@62 724 type = "group",
Zerotorescue@62 725 name = "Management",
Zerotorescue@62 726 desc = "Rename, delete, duplicate or export this group.",
Zerotorescue@62 727 args = {
Zerotorescue@62 728 actions = {
Zerotorescue@62 729 order = 10,
Zerotorescue@62 730 type = "group",
Zerotorescue@62 731 name = "Actions",
Zerotorescue@62 732 inline = true,
Zerotorescue@62 733 args = {
Zerotorescue@62 734 rename = {
Zerotorescue@62 735 order = 10,
Zerotorescue@62 736 type = "input",
Zerotorescue@62 737 name = "Rename group - New name",
Zerotorescue@62 738 desc = "Change the name of this group to something else. You can also use item links here as you wish.",
Zerotorescue@62 739 validate = ValidateGroupName,
Zerotorescue@62 740 set = function(info, value)
Zerotorescue@62 741 local oldGroupName = groupIdToName[info[2]];
Zerotorescue@62 742
Zerotorescue@62 743 addon.db.profile.groups[value] = CopyTable(addon.db.profile.groups[oldGroupName]);
Zerotorescue@62 744 addon.db.profile.groups[oldGroupName] = nil;
Zerotorescue@62 745
Zerotorescue@62 746 groupIdToName[info[2]] = value;
Zerotorescue@62 747 groupIdToName[value] = true;
Zerotorescue@62 748 groupIdToName[oldGroupName] = nil;
Zerotorescue@62 749
Zerotorescue@62 750 mod:FillGroupOptions();
Zerotorescue@62 751 end,
Zerotorescue@62 752 get = function(info)
Zerotorescue@62 753 return groupIdToName[info[2]];
Zerotorescue@62 754 end,
Zerotorescue@62 755 },
Zerotorescue@62 756 duplicate = {
Zerotorescue@62 757 order = 20,
Zerotorescue@62 758 type = "input",
Zerotorescue@62 759 name = "Duplicate group - New name",
Zerotorescue@62 760 desc = "Duplicate this group. You can also use item links here as you wish.\n\nAll item data will be erased.",
Zerotorescue@62 761 validate = ValidateGroupName,
Zerotorescue@62 762 set = function(info, value)
Zerotorescue@62 763 local oldGroupName = groupIdToName[info[2]];
Zerotorescue@62 764
Zerotorescue@62 765 addon.db.profile.groups[value] = CopyTable(addon.db.profile.groups[oldGroupName]);
Zerotorescue@62 766
Zerotorescue@62 767 -- Reset item data (duplicate items me no want)
Zerotorescue@62 768 addon.db.profile.groups[value].items = nil;
Zerotorescue@62 769
Zerotorescue@62 770 mod:FillGroupOptions();
Zerotorescue@62 771 end,
Zerotorescue@62 772 get = false,
Zerotorescue@62 773 },
Zerotorescue@62 774 delete = {
Zerotorescue@62 775 order = 30,
Zerotorescue@62 776 type = "execute",
Zerotorescue@62 777 name = "Delete group",
Zerotorescue@62 778 desc = "Delete the currently selected group.",
Zerotorescue@62 779 confirm = true,
Zerotorescue@62 780 confirmText = "Are you sure you wish to |cffff0000DELETE|r this group? This action is not reversable!",
Zerotorescue@62 781 func = function(info)
Zerotorescue@62 782 local groupName = groupIdToName[info[2]];
Zerotorescue@62 783
Zerotorescue@62 784 addon.db.profile.groups[groupName] = nil;
Zerotorescue@62 785
Zerotorescue@62 786 mod:FillGroupOptions();
Zerotorescue@62 787 end,
Zerotorescue@62 788 },
Zerotorescue@62 789 },
Zerotorescue@62 790 },
Zerotorescue@62 791 export = {
Zerotorescue@62 792 order = 40,
Zerotorescue@62 793 type = "group",
Zerotorescue@62 794 name = "Export",
Zerotorescue@62 795 inline = true,
Zerotorescue@62 796 args = {
Zerotorescue@62 797 input = {
Zerotorescue@62 798 order = 10,
Zerotorescue@62 799 type = "input",
Zerotorescue@62 800 multiline = true,
Zerotorescue@62 801 name = "Group data",
Zerotorescue@62 802 width = "full",
Zerotorescue@62 803 desc = "Export the group data for the currently selected group. Press CTRL-A to select all and CTRL-C to copy the text.",
Zerotorescue@62 804 set = false,
Zerotorescue@62 805 get = function(info)
Zerotorescue@62 806 local groupName = groupIdToName[info[2]];
Zerotorescue@62 807
Zerotorescue@62 808 -- We want to include the group name, so we copy the table then set another value
Zerotorescue@62 809 local temp = CopyTable(addon.db.profile.groups[groupName]);
Zerotorescue@62 810 temp.name = groupName;
Zerotorescue@62 811 temp.trackAtCharacters = nil;
Zerotorescue@62 812 temp.overrideTrackAtCharacters = nil;
Zerotorescue@62 813
Zerotorescue@62 814 if not AceSerializer then
Zerotorescue@62 815 AceSerializer = LibStub("AceSerializer-3.0");
Zerotorescue@62 816 end
Zerotorescue@62 817
Zerotorescue@62 818 return AceSerializer:Serialize(temp);
Zerotorescue@62 819 end,
Zerotorescue@62 820 },
Zerotorescue@62 821 },
Zerotorescue@62 822 },
Zerotorescue@62 823 },
Zerotorescue@62 824 },
Zerotorescue@62 825 add = {
Zerotorescue@62 826 order = 30,
Zerotorescue@62 827 type = "group",
Zerotorescue@62 828 name = "Add items",
Zerotorescue@62 829 desc = "Add new items to this group.",
Zerotorescue@62 830 hidden = function(info) return groupIsVirtual[info[2]]; end,
Zerotorescue@62 831 args = {
Zerotorescue@62 832 singleAdd = {
Zerotorescue@62 833 order = 10,
Zerotorescue@62 834 type = "group",
Zerotorescue@62 835 inline = true,
Zerotorescue@62 836 name = "Add items",
Zerotorescue@62 837 args = {
Zerotorescue@62 838 help = {
Zerotorescue@62 839 order = 10,
Zerotorescue@62 840 type = "description",
Zerotorescue@62 841 name = "You can add a single item to this group at a time by pasting the item-id or an item-link in the field to the left or you can also import multiple items at once by pasting exported item data in the field to the right. Scroll further down to add items based on your inventory contents.",
Zerotorescue@62 842 },
Zerotorescue@62 843 itemLink = {
Zerotorescue@62 844 order = 20,
Zerotorescue@62 845 type = "input",
Zerotorescue@62 846 name = "Single item add (item-link or item-id)",
Zerotorescue@62 847 desc = "Shift-click an item-link or enter an item-id to add the related item to this group. You can only add one item link or item id at a time.",
Zerotorescue@62 848 validate = function(info, value)
Zerotorescue@62 849 -- If the value is empty we'll allow passing to clear the carret
Zerotorescue@62 850 if value == "" then return true; end
Zerotorescue@62 851
Zerotorescue@62 852 local groupName = groupIdToName[info[2]];
Zerotorescue@62 853
Zerotorescue@62 854 local itemId = addon:GetItemId(string.trim(value or "")) or tonumber(string.trim(value or ""));
Zerotorescue@62 855
Zerotorescue@62 856 if not itemId then
Zerotorescue@62 857 return "This is not a valid item link.";
Zerotorescue@62 858 elseif addon:InGroup(itemId) then
Zerotorescue@62 859 return ("This item is already in the group \"%s\"."):format(addon:InGroup(itemId));
Zerotorescue@62 860 end
Zerotorescue@62 861
Zerotorescue@62 862 return true;
Zerotorescue@62 863 end,
Zerotorescue@62 864 set = function(info, value)
Zerotorescue@62 865 if value and value ~= "" then
Zerotorescue@62 866 local groupName = groupIdToName[info[2]];
Zerotorescue@62 867
Zerotorescue@62 868 local itemId = addon:GetItemId(string.trim(value or "")) or tonumber(string.trim(value or ""));
Zerotorescue@62 869
Zerotorescue@62 870 addon:AddItemToGroup(groupName, itemId);
Zerotorescue@62 871
Zerotorescue@62 872 print(("Added %s"):format(select(2, GetItemInfo(itemId)) or ("Unknown (#%d)"):format(itemId)));
Zerotorescue@62 873 end
Zerotorescue@62 874 end,
Zerotorescue@62 875 get = false,
Zerotorescue@62 876 },
Zerotorescue@62 877 importItemData = {
Zerotorescue@62 878 order = 30,
Zerotorescue@62 879 type = "input",
Zerotorescue@62 880 name = "Import item data",
Zerotorescue@62 881 desc = "Import item data from an exported item data-string. Any items already grouped will be skipped.",
Zerotorescue@62 882 set = function(info, value)
Zerotorescue@62 883 local groupName = groupIdToName[info[2]];
Zerotorescue@62 884
Zerotorescue@62 885 local allItemIds = { string.split(";", value or "") };
Zerotorescue@62 886
Zerotorescue@62 887 for _, value in pairs(allItemIds) do
Zerotorescue@62 888 local itemId = tonumber(value);
Zerotorescue@62 889
Zerotorescue@62 890 if not itemId then
Zerotorescue@62 891 print(("\"%s\" is not a number."):format(value));
Zerotorescue@62 892 elseif addon:InGroup(itemId) then
Zerotorescue@62 893 print(("Skipping %s (#%d) as it is already in the group |cfffed000%s|r."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, addon:InGroup(itemId)));
Zerotorescue@62 894 else
Zerotorescue@62 895 addon:AddItemToGroup(groupName, itemId);
Zerotorescue@62 896 end
Zerotorescue@62 897 end
Zerotorescue@62 898 end,
Zerotorescue@62 899 get = false,
Zerotorescue@62 900 },
Zerotorescue@62 901 importPremadeData = {
Zerotorescue@62 902 order = 40,
Zerotorescue@62 903 type = "select",
Zerotorescue@62 904 name = "Import premade data",
Zerotorescue@62 905 desc = "Import item data from a premade item-group. Any items already grouped will be skipped.",
Zerotorescue@62 906 values = function()
Zerotorescue@62 907 local temp = {};
Zerotorescue@62 908 for key, group in pairs(addon.defaultGroups) do
Zerotorescue@62 909 temp[key] = key;
Zerotorescue@62 910 end
Zerotorescue@62 911
Zerotorescue@62 912 return temp;
Zerotorescue@62 913 end,
Zerotorescue@62 914 set = function(info, value)
Zerotorescue@62 915 local groupName = groupIdToName[info[2]];
Zerotorescue@62 916
Zerotorescue@62 917 print(("Importing items from the premade group \"|cfffed000%s|r\"."):format(value));
Zerotorescue@62 918
Zerotorescue@62 919 -- Remember we imported this group and it's version so if it is ever changed, people can be notified
Zerotorescue@62 920 if not addon.db.profile.groups[groupName].premadeGroups then
Zerotorescue@62 921 addon.db.profile.groups[groupName].premadeGroups = {};
Zerotorescue@62 922 end
Zerotorescue@62 923 addon.db.profile.groups[groupName].premadeGroups[value] = addon.defaultGroups[value].version;
Zerotorescue@62 924
Zerotorescue@62 925 for itemId, version in pairs(addon.defaultGroups[value].items) do
Zerotorescue@62 926 if version > 0 then
Zerotorescue@62 927 itemId = itemId and tonumber(itemId);
Zerotorescue@62 928
Zerotorescue@62 929 if not itemId then
Zerotorescue@62 930 print(("\"|cfffed000%s|r\" is not a number."):format(value));
Zerotorescue@62 931 elseif addon:InGroup(itemId) then
Zerotorescue@62 932 print(("|cffff0000Skipping|r |cfffed000%s|r (#%d) as it is already in the group |cfffed000%s|r."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, addon:InGroup(itemId)));
Zerotorescue@62 933 else
Zerotorescue@62 934 addon:AddItemToGroup(groupName, itemId);
Zerotorescue@62 935 print(("|cff00ff00Added|r |cfffed000%s|r (#%d) to the group |cfffed000%s|r."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, groupName));
Zerotorescue@62 936 end
Zerotorescue@62 937 end
Zerotorescue@62 938 end
Zerotorescue@62 939 end,
Zerotorescue@62 940 get = false,
Zerotorescue@62 941 },
Zerotorescue@62 942 },
Zerotorescue@62 943 },
Zerotorescue@62 944 massAdd = {
Zerotorescue@62 945 order = 20,
Zerotorescue@62 946 type = "group",
Zerotorescue@62 947 inline = true,
Zerotorescue@62 948 name = "Mass add",
Zerotorescue@62 949 args = {
Zerotorescue@62 950 help = {
Zerotorescue@62 951 order = 10,
Zerotorescue@62 952 type = "description",
Zerotorescue@62 953 name = "Click the items you wish to add to this group or add multiple of these items at once by providing a name filter in the field below.",
Zerotorescue@62 954 },
Zerotorescue@62 955 massAdd = {
Zerotorescue@62 956 order = 20,
Zerotorescue@62 957 type = "input",
Zerotorescue@62 958 name = "Add all items matching...",
Zerotorescue@62 959 desc = "Add every item in your inventory matching the name entered in this field. If you enter \"Glyph\" as a filter, any items in your inventory containing this in their name will be added to this group.",
Zerotorescue@62 960 set = function(info, value)
Zerotorescue@62 961 local groupName = groupIdToName[info[2]];
Zerotorescue@62 962
Zerotorescue@62 963 if not value then return; end
Zerotorescue@62 964
Zerotorescue@62 965 value = value:lower();
Zerotorescue@62 966
Zerotorescue@62 967 local ref = options.args.groups.args[info[2]].args.add.args.list.args;
Zerotorescue@62 968
Zerotorescue@62 969 for itemId, test in pairs(ref) do
Zerotorescue@62 970 if test then
Zerotorescue@62 971 local itemName = GetItemInfo(itemId);
Zerotorescue@62 972
Zerotorescue@62 973 if itemName:lower():find(value) then
Zerotorescue@62 974 if not addon:AddItemToGroup(groupName, itemId) then
Zerotorescue@62 975 print("|cffff0000Couldn't add the item with itemId (" .. itemId .. ") because it is already in a group.|r");
Zerotorescue@62 976 end
Zerotorescue@62 977 end
Zerotorescue@62 978 end
Zerotorescue@62 979 end
Zerotorescue@62 980 end,
Zerotorescue@62 981 get = false,
Zerotorescue@62 982 },
Zerotorescue@62 983 minItemLevel = {
Zerotorescue@62 984 order = 40,
Zerotorescue@62 985 type = "select",
Zerotorescue@62 986 values = function()
Zerotorescue@62 987 local temp = {};
Zerotorescue@62 988
Zerotorescue@62 989 temp[0] = "Include everything";
Zerotorescue@62 990
Zerotorescue@62 991 local itemLevelTemplate = "Itemlevel >= %d";
Zerotorescue@62 992
Zerotorescue@62 993 for i = 1, 49 do
Zerotorescue@62 994 temp[( i * 10 )] = itemLevelTemplate:format(( i * 10 ));
Zerotorescue@62 995 end
Zerotorescue@62 996
Zerotorescue@62 997 temp[500] = "Include nothing";
Zerotorescue@62 998
Zerotorescue@62 999 return temp;
Zerotorescue@62 1000 end,
Zerotorescue@62 1001 name = "Include tradeskill items",
Zerotorescue@62 1002 desc = "Include all items above this item level from the currently opened tradeskill window in the below item list.\n\nSetting this very low this might considerably slow down this config window.\n\nSet to 500 to disable showing of items completely.",
Zerotorescue@62 1003 set = function(i, v) includeTradeSkillItems = v; end,
Zerotorescue@62 1004 get = function() return includeTradeSkillItems; end,
Zerotorescue@62 1005 disabled = function()
Zerotorescue@62 1006 if GetTradeSkillLine() == "UNKNOWN" then
Zerotorescue@62 1007 includeTradeSkillItems = 500;
Zerotorescue@62 1008 return true; -- disabled
Zerotorescue@62 1009 else
Zerotorescue@62 1010 return false;
Zerotorescue@62 1011 end
Zerotorescue@62 1012 end,
Zerotorescue@62 1013 },
Zerotorescue@62 1014 },
Zerotorescue@62 1015 },
Zerotorescue@62 1016 list = {
Zerotorescue@62 1017 order = 30,
Zerotorescue@62 1018 type = "group",
Zerotorescue@62 1019 inline = true,
Zerotorescue@62 1020 name = "Item list",
Zerotorescue@62 1021 hidden = UpdateAddItemList,
Zerotorescue@62 1022 args = {
Zerotorescue@62 1023
Zerotorescue@62 1024 },
Zerotorescue@62 1025 },
Zerotorescue@62 1026 },
Zerotorescue@62 1027 },
Zerotorescue@62 1028 remove = {
Zerotorescue@62 1029 order = 40,
Zerotorescue@62 1030 type = "group",
Zerotorescue@62 1031 name = "Current items",
Zerotorescue@62 1032 desc = "View, export or remove items from this group.",
Zerotorescue@62 1033 hidden = function(info) return groupIsVirtual[info[2]]; end,
Zerotorescue@62 1034 args = {
Zerotorescue@62 1035 help = {
Zerotorescue@62 1036 order = 10,
Zerotorescue@62 1037 type = "group",
Zerotorescue@62 1038 inline = true,
Zerotorescue@62 1039 name = "Help",
Zerotorescue@62 1040 hidden = false,
Zerotorescue@62 1041 args = {
Zerotorescue@62 1042 help = {
Zerotorescue@62 1043 order = 10,
Zerotorescue@62 1044 type = "description",
Zerotorescue@62 1045 name = "Click the items you wish to remove from this group.",
Zerotorescue@62 1046 },
Zerotorescue@62 1047 massRemove = {
Zerotorescue@62 1048 order = 20,
Zerotorescue@62 1049 type = "input",
Zerotorescue@62 1050 name = "Remove all items matching...",
Zerotorescue@62 1051 desc = "Remove every item in this group matching the name entered in this field. If you enter \"Glyph\" as a filter, any items in this group containing this in their name will be removed from this group.",
Zerotorescue@62 1052 set = function(info, value)
Zerotorescue@62 1053 local groupName = groupIdToName[info[2]];
Zerotorescue@62 1054
Zerotorescue@62 1055 if not value then return; end
Zerotorescue@62 1056
Zerotorescue@62 1057 value = value:lower();
Zerotorescue@62 1058
Zerotorescue@62 1059 local ref = options.args.groups.args[info[2]].args.remove.args.list.args;
Zerotorescue@62 1060
Zerotorescue@62 1061 for itemId, test in pairs(ref) do
Zerotorescue@62 1062 if test then
Zerotorescue@62 1063 local itemName = GetItemInfo(itemId);
Zerotorescue@62 1064
Zerotorescue@62 1065 if itemName:lower():find(value) then
Zerotorescue@62 1066 addon:RemoveItemFromGroup(groupName, itemId);
Zerotorescue@62 1067 print(("|cffff0000Removed|r %s (#%d)."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId));
Zerotorescue@62 1068 end
Zerotorescue@62 1069 end
Zerotorescue@62 1070 end
Zerotorescue@62 1071
Zerotorescue@62 1072 -- Now rebuild the list
Zerotorescue@62 1073 AceConfigRegistry:NotifyChange("InventoriumOptions");
Zerotorescue@62 1074 end,
Zerotorescue@62 1075 get = false,
Zerotorescue@62 1076 },
Zerotorescue@62 1077 premadeGroups = {
Zerotorescue@62 1078 order = 30,
Zerotorescue@62 1079 type = "select",
Zerotorescue@62 1080 name = "Imported premade groups",
Zerotorescue@62 1081 desc = "This is a list of all premade groups that were imported into this group. You will be notified when any of these premade groups have changed and you will be able to import these changes.\n\nSelect a group to stop reminding you of changes to the premade group (the item list will be unaffected). Doing so will require you to manually update this when new items are added to the game.",
Zerotorescue@62 1082 values = function(info)
Zerotorescue@62 1083 local groupName = groupIdToName[info[2]];
Zerotorescue@62 1084
Zerotorescue@62 1085 local temp = {};
Zerotorescue@62 1086 if addon.db.profile.groups[groupName].premadeGroups then
Zerotorescue@62 1087 for name, version in pairs(addon.db.profile.groups[groupName].premadeGroups) do
Zerotorescue@62 1088 temp[name] = name;
Zerotorescue@62 1089 end
Zerotorescue@62 1090 end
Zerotorescue@62 1091
Zerotorescue@62 1092 return temp;
Zerotorescue@62 1093 end,
Zerotorescue@62 1094 set = function(info, value)
Zerotorescue@62 1095 -- Remove premade group from this group
Zerotorescue@62 1096 local groupName = groupIdToName[info[2]];
Zerotorescue@62 1097
Zerotorescue@62 1098 addon.db.profile.groups[groupName].premadeGroups[value] = nil;
Zerotorescue@62 1099
Zerotorescue@62 1100 print(("No longer notifying you about changes made to the premade group named \"|cfffed000%s|r\"."):format(value));
Zerotorescue@62 1101 end,
Zerotorescue@62 1102 get = false,
Zerotorescue@62 1103 disabled = function(info)
Zerotorescue@62 1104 local groupName = groupIdToName[info[2]];
Zerotorescue@62 1105
Zerotorescue@62 1106 return (not addon.db.profile.groups[groupName].premadeGroups);
Zerotorescue@62 1107 end,
Zerotorescue@62 1108 },
Zerotorescue@62 1109 },
Zerotorescue@62 1110 },
Zerotorescue@62 1111 list = {
Zerotorescue@62 1112 order = 20,
Zerotorescue@62 1113 type = "group",
Zerotorescue@62 1114 inline = true,
Zerotorescue@62 1115 name = "Item list",
Zerotorescue@62 1116 hidden = UpdateRemoveItemList,
Zerotorescue@62 1117 args = {
Zerotorescue@62 1118
Zerotorescue@62 1119 },
Zerotorescue@62 1120 },
Zerotorescue@62 1121 export = {
Zerotorescue@62 1122 order = 30,
Zerotorescue@62 1123 type = "group",
Zerotorescue@62 1124 name = "Export",
Zerotorescue@62 1125 inline = true,
Zerotorescue@62 1126 args = {
Zerotorescue@62 1127 input = {
Zerotorescue@62 1128 order = 10,
Zerotorescue@62 1129 type = "input",
Zerotorescue@62 1130 name = "Item data",
Zerotorescue@62 1131 width = "full",
Zerotorescue@62 1132 desc = "Export the item data for the currently selected group. Press CTRL-A to select all and CTRL-C to copy the text.",
Zerotorescue@62 1133 set = false,
Zerotorescue@62 1134 get = function(info)
Zerotorescue@62 1135 local groupName = groupIdToName[info[2]];
Zerotorescue@62 1136
Zerotorescue@62 1137 local combinedItemIds;
Zerotorescue@62 1138 -- Parse items in group and show these
Zerotorescue@62 1139 for itemId, _ in pairs(addon.db.profile.groups[groupName].items) do
Zerotorescue@62 1140 if not combinedItemIds then
Zerotorescue@62 1141 combinedItemIds = tostring(itemId);
Zerotorescue@62 1142 else
Zerotorescue@62 1143 combinedItemIds = combinedItemIds .. (";%d"):format(itemId);
Zerotorescue@62 1144 end
Zerotorescue@62 1145 end
Zerotorescue@62 1146
Zerotorescue@62 1147 return combinedItemIds; -- We don't serialize this because we actually DO want people to be able to manually modify it - besides, parsing it isn't going to be hard
Zerotorescue@62 1148 end,
Zerotorescue@62 1149 },
Zerotorescue@62 1150 },
Zerotorescue@62 1151 },
Zerotorescue@62 1152 },
Zerotorescue@62 1153 },
Zerotorescue@62 1154 },
Zerotorescue@62 1155 };
Zerotorescue@62 1156
Zerotorescue@62 1157
Zerotorescue@62 1158
Zerotorescue@62 1159
Zerotorescue@62 1160
Zerotorescue@62 1161
Zerotorescue@62 1162
Zerotorescue@62 1163
Zerotorescue@62 1164
Zerotorescue@62 1165 -- Object functions
Zerotorescue@62 1166
Zerotorescue@62 1167 function mod:OnEnable()
Zerotorescue@62 1168 -- Register our config slash command
Zerotorescue@62 1169 -- /im config
Zerotorescue@62 1170 addon:RegisterSlash(function(this)
Zerotorescue@62 1171 -- We don't want any other windows open at this time.
Zerotorescue@62 1172 for name, module in this:IterateModules() do
Zerotorescue@62 1173 if module.CloseFrame then
Zerotorescue@62 1174 module:CloseFrame();
Zerotorescue@62 1175 end
Zerotorescue@62 1176 end
Zerotorescue@62 1177
Zerotorescue@62 1178 this:GetModule("Config"):Show();
Zerotorescue@62 1179 end, { "c", "config", "conf", "option", "options", "opt", "setting", "settings" }, "|Hfunction:InventoriumCommandHandler:config|h|cff00fff7/im config|r|h (or /im c) - Open the config window to change the settings and manage groups.");
Zerotorescue@62 1180
Zerotorescue@62 1181 -- Whenever the profile is changed, update the groups | args: (object for the functionName, eventName, functionName)
Zerotorescue@62 1182 addon.db.RegisterCallback(self, "OnProfileChanged", "RefreshConfig");
Zerotorescue@62 1183 addon.db.RegisterCallback(self, "OnProfileCopied", "RefreshConfig");
Zerotorescue@62 1184 addon.db.RegisterCallback(self, "OnProfileReset", "RefreshConfig");
Zerotorescue@62 1185
Zerotorescue@62 1186 -- Register our custom widgets
Zerotorescue@62 1187 local Widgets = addon:GetModule("Widgets");
Zerotorescue@62 1188 Widgets:ItemLinkButton();
Zerotorescue@62 1189 Widgets:ConfigItemLinkButton();
Zerotorescue@62 1190 end
Zerotorescue@62 1191
Zerotorescue@62 1192 function mod:RefreshConfig()
Zerotorescue@62 1193 self:FillGroupOptions();
Zerotorescue@62 1194 end
Zerotorescue@62 1195
Zerotorescue@62 1196 function mod:Load()
Zerotorescue@62 1197 if not AceConfigDialog and not AceConfigRegistry then
Zerotorescue@62 1198 self:FillOptions();
Zerotorescue@62 1199
Zerotorescue@62 1200 -- Build options dialog
Zerotorescue@62 1201 AceConfigDialog = LibStub("AceConfigDialog-3.0");
Zerotorescue@62 1202 AceConfigRegistry = LibStub("AceConfigRegistry-3.0");
Zerotorescue@62 1203 -- Register options table
Zerotorescue@62 1204 LibStub("AceConfig-3.0"):RegisterOptionsTable("InventoriumOptions", options);
Zerotorescue@62 1205 -- Set a nice default size (so that 4 normal sized elements fit next to eachother)
Zerotorescue@62 1206 AceConfigDialog:SetDefaultSize("InventoriumOptions", 975, 600);
Zerotorescue@62 1207
Zerotorescue@62 1208 -- In case the addon is loaded from another condition, always call the remove interface options
Zerotorescue@62 1209 if AddonLoader and AddonLoader.RemoveInterfaceOptions then
Zerotorescue@62 1210 AddonLoader:RemoveInterfaceOptions("Inventorium");
Zerotorescue@62 1211 end
Zerotorescue@62 1212
Zerotorescue@62 1213 -- Add to the blizzard addons options thing
Zerotorescue@62 1214 AceConfigDialog:AddToBlizOptions("InventoriumOptions");
Zerotorescue@62 1215 end
Zerotorescue@62 1216 end
Zerotorescue@62 1217
Zerotorescue@62 1218 function mod:Show()
Zerotorescue@62 1219 self:Load();
Zerotorescue@62 1220
Zerotorescue@62 1221 AceConfigDialog:Open("InventoriumOptions");
Zerotorescue@62 1222 end
Zerotorescue@62 1223
Zerotorescue@62 1224 function mod:FillOptions()
Zerotorescue@62 1225 options = {
Zerotorescue@62 1226 type = "group",
Zerotorescue@62 1227 name = "Inventorium Config",
Zerotorescue@62 1228 childGroups = "tree",
Zerotorescue@62 1229 args = {
Zerotorescue@62 1230 },
Zerotorescue@62 1231 };
Zerotorescue@62 1232
Zerotorescue@62 1233 -- General
Zerotorescue@62 1234 self:FillGeneralOptions();
Zerotorescue@62 1235
Zerotorescue@62 1236 -- Help
Zerotorescue@62 1237 self:FillHelpOptions();
Zerotorescue@62 1238
Zerotorescue@62 1239 -- Profile
Zerotorescue@62 1240 options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(addon.db, true);
Zerotorescue@62 1241 options.args.profiles.order = 200;
Zerotorescue@62 1242
Zerotorescue@62 1243 -- Groups
Zerotorescue@62 1244 self:MakeGroupOptions();
Zerotorescue@62 1245
Zerotorescue@62 1246 -- Groups-contents
Zerotorescue@62 1247 self:FillGroupOptions();
Zerotorescue@62 1248 end
Zerotorescue@62 1249
Zerotorescue@62 1250 function mod:FillGeneralOptions()
Zerotorescue@62 1251 options.args.general = {
Zerotorescue@62 1252 order = 100,
Zerotorescue@62 1253 type = "group",
Zerotorescue@62 1254 name = "General",
Zerotorescue@62 1255 desc = "Change general Inventorium settings.",
Zerotorescue@62 1256 args = {
Zerotorescue@62 1257 general = {
Zerotorescue@62 1258 order = 1,
Zerotorescue@62 1259 type = "group",
Zerotorescue@62 1260 inline = true,
Zerotorescue@62 1261 name = "General",
Zerotorescue@62 1262 args = {
Zerotorescue@62 1263 description = {
Zerotorescue@62 1264 order = 0,
Zerotorescue@62 1265 type = "description",
Zerotorescue@62 1266 name = function()
Zerotorescue@62 1267 local t = "Here you can set general settings. The settings entered here will be used when you choose not to override the settings within an individual group.\n\n";
Zerotorescue@62 1268
Zerotorescue@62 1269 local currentAddon, selectedAddonName = addon:GetItemCountAddon();
Zerotorescue@62 1270 local preferedAddon = addon.db.profile.defaults.itemCountAddon;
Zerotorescue@62 1271
Zerotorescue@62 1272 if currentAddon then
Zerotorescue@62 1273 t = t .. "Currently using |cfffed000" .. selectedAddonName .. "|r as your item count addon. This addon is " .. ((currentAddon.IsEnabled() and "|cff00ff00enabled|r") or "|cffff0000disabled|r") .. ".";
Zerotorescue@62 1274
Zerotorescue@62 1275 if currentAddon.GetTotalCount and currentAddon.GetCharacterCount then
Zerotorescue@62 1276 t = t .. " This addon supports |cfffed000both total as local|r item counts.";
Zerotorescue@62 1277 elseif currentAddon.GetTotalCount then
Zerotorescue@62 1278 t = t .. " This addon supports |cfffed000only total|r item counts.";
Zerotorescue@62 1279 elseif currentAddon.GetCharacterCount then
Zerotorescue@62 1280 t = t .. " This addon supports |cfffed000only local|r item counts.";
Zerotorescue@62 1281 end
Zerotorescue@62 1282
Zerotorescue@62 1283 if preferedAddon ~= selectedAddonName then
Zerotorescue@62 1284 t = t .. "\n\n|cffff0000You have selected |cfffed000" .. preferedAddon .. "|r|cffff0000 as your item count addon, but this appears to be disabled and thus a random alternative was selected.|r";
Zerotorescue@62 1285 end
Zerotorescue@62 1286 end
Zerotorescue@62 1287
Zerotorescue@62 1288 return t;
Zerotorescue@62 1289 end,
Zerotorescue@62 1290 },
Zerotorescue@62 1291 header = {
Zerotorescue@62 1292 order = 5,
Zerotorescue@62 1293 type = "header",
Zerotorescue@62 1294 name = "",
Zerotorescue@62 1295 },
Zerotorescue@62 1296 auctionPricingAddon = {
Zerotorescue@62 1297 order = 10,
Zerotorescue@62 1298 type = "select",
Zerotorescue@62 1299 name = "Prefered pricing addon",
Zerotorescue@62 1300 desc = "Select the addon you prefer data to be retrieved from. A random supported addon will be used if the selected addon can not be found.",
Zerotorescue@62 1301 values = function()
Zerotorescue@62 1302 local temp = {};
Zerotorescue@62 1303 for name, value in pairs(addon.supportedAddons.auctionPricing) do
Zerotorescue@62 1304 temp[name] = name;
Zerotorescue@62 1305 end
Zerotorescue@62 1306
Zerotorescue@62 1307 return temp;
Zerotorescue@62 1308 end,
Zerotorescue@62 1309 get = function() return addon.db.profile.defaults.auctionPricingAddon; end,
Zerotorescue@62 1310 set = function(i, v)
Zerotorescue@62 1311 addon.db.profile.defaults.auctionPricingAddon = v;
Zerotorescue@62 1312
Zerotorescue@62 1313 if addon.supportedAddons.auctionPricing[v].OnSelect then
Zerotorescue@62 1314 addon.supportedAddons.auctionPricing[v].OnSelect();
Zerotorescue@62 1315 end
Zerotorescue@62 1316 end,
Zerotorescue@62 1317 },
Zerotorescue@62 1318 itemCountAddon = {
Zerotorescue@62 1319 order = 20,
Zerotorescue@62 1320 type = "select",
Zerotorescue@62 1321 name = "Prefered item count addon",
Zerotorescue@62 1322 desc = "Select the addon you prefer data to be retrieved from. A random supported addon will be used if the selected addon can not be found.",
Zerotorescue@62 1323 values = function()
Zerotorescue@62 1324 local temp = {};
Zerotorescue@62 1325 for name, value in pairs(addon.supportedAddons.itemCount) do
Zerotorescue@62 1326 temp[name] = name;
Zerotorescue@62 1327 end
Zerotorescue@62 1328
Zerotorescue@62 1329 return temp;
Zerotorescue@62 1330 end,
Zerotorescue@62 1331 get = function() return addon.db.profile.defaults.itemCountAddon; end,
Zerotorescue@62 1332 set = function(i, v)
Zerotorescue@62 1333 addon.db.profile.defaults.itemCountAddon = v;
Zerotorescue@62 1334
Zerotorescue@62 1335 if addon.supportedAddons.itemCount[v].OnSelect then
Zerotorescue@62 1336 addon.supportedAddons.itemCount[v].OnSelect();
Zerotorescue@62 1337 end
Zerotorescue@62 1338 end,
Zerotorescue@62 1339 },
Zerotorescue@62 1340 craftingAddon = {
Zerotorescue@62 1341 order = 30,
Zerotorescue@62 1342 type = "select",
Zerotorescue@62 1343 name = "Prefered crafting addon",
Zerotorescue@62 1344 desc = "Select the addon you prefer data to be queued into. A random supported addon will be used if the selected addon can not be found.",
Zerotorescue@62 1345 values = function()
Zerotorescue@62 1346 local temp = {};
Zerotorescue@62 1347 for name, value in pairs(addon.supportedAddons.crafting) do
Zerotorescue@62 1348 temp[name] = name;
Zerotorescue@62 1349 end
Zerotorescue@62 1350
Zerotorescue@62 1351 return temp;
Zerotorescue@62 1352 end,
Zerotorescue@62 1353 get = function() return addon.db.profile.defaults.craftingAddon; end,
Zerotorescue@62 1354 set = function(i, v)
Zerotorescue@62 1355 addon.db.profile.defaults.craftingAddon = v;
Zerotorescue@62 1356
Zerotorescue@62 1357 if addon.supportedAddons.crafting[v].OnSelect then
Zerotorescue@62 1358 addon.supportedAddons.crafting[v].OnSelect();
Zerotorescue@62 1359 end
Zerotorescue@62 1360 end,
Zerotorescue@62 1361 },
Zerotorescue@62 1362 localItemData = {
Zerotorescue@62 1363 order = 40,
Zerotorescue@62 1364 type = "multiselect",
Zerotorescue@62 1365 name = "Include in local item data",
Zerotorescue@62 1366 desc = "Select which data should be included in the local item data.",
Zerotorescue@62 1367 values = {
Zerotorescue@62 1368 ["Bag"] = "Bag",
Zerotorescue@62 1369 ["Bank"] = "Bank",
Zerotorescue@62 1370 ["Auction House"] = "Auction House",
Zerotorescue@62 1371 ["Mailbox"] = "Mailbox",
Zerotorescue@62 1372 },
Zerotorescue@62 1373 get = function(i, v) return addon.db.profile.defaults.localItemData and addon.db.profile.defaults.localItemData[v]; end,
Zerotorescue@62 1374 set = function(i, v, e) addon.db.profile.defaults.localItemData[v] = e or nil; end,
Zerotorescue@62 1375 --dialogControl = "Dropdown", -- this is not standard, normal multiselect control gives us a list of all chars with toggle-boxes. UGLY! We want a multiselect-box instead.
Zerotorescue@62 1376 },
Zerotorescue@62 1377 },
Zerotorescue@62 1378 },
Zerotorescue@62 1379 minimumStock = {
Zerotorescue@62 1380 order = 10,
Zerotorescue@62 1381 type = "group",
Zerotorescue@62 1382 inline = true,
Zerotorescue@62 1383 name = "Minimum stock",
Zerotorescue@62 1384 args = {
Zerotorescue@62 1385 description = {
Zerotorescue@62 1386 order = 0,
Zerotorescue@62 1387 type = "description",
Zerotorescue@62 1388 name = "Here you can specify the default minimum amount of items you wish to keep in stock and related settings. The settings entered here will be used when you choose not to override the settings within an individual group.",
Zerotorescue@62 1389 },
Zerotorescue@62 1390 header = {
Zerotorescue@62 1391 order = 5,
Zerotorescue@62 1392 type = "header",
Zerotorescue@62 1393 name = "",
Zerotorescue@62 1394 },
Zerotorescue@62 1395 minLocalStock = {
Zerotorescue@62 1396 order = 10,
Zerotorescue@62 1397 type = "range",
Zerotorescue@62 1398 min = 0,
Zerotorescue@62 1399 max = 100000,
Zerotorescue@62 1400 softMax = 100,
Zerotorescue@62 1401 step = 1,
Zerotorescue@62 1402 name = "Minimum local stock",
Zerotorescue@62 1403 desc = "You can manually enter a value between 100 and 100.000 in the text box below if the provided range is insufficient.",
Zerotorescue@62 1404 get = function() return addon.db.profile.defaults.minLocalStock; end,
Zerotorescue@62 1405 set = function(i, v) addon.db.profile.defaults.minLocalStock = v; end,
Zerotorescue@62 1406 },
Zerotorescue@62 1407 alertBelowLocalMinimum = {
Zerotorescue@62 1408 order = 11,
Zerotorescue@62 1409 type = "toggle",
Zerotorescue@62 1410 name = "Alert when below local minimum (NYI)",
Zerotorescue@62 1411 desc = "Show an alert when this item gets below this threshold.",
Zerotorescue@62 1412 get = function() return addon.db.profile.defaults.alertBelowLocalMinimum; end,
Zerotorescue@62 1413 set = function(i, v) addon.db.profile.defaults.alertBelowLocalMinimum = v; end,
Zerotorescue@62 1414 },
Zerotorescue@62 1415 minGlobalStock = {
Zerotorescue@62 1416 order = 20,
Zerotorescue@62 1417 type = "range",
Zerotorescue@62 1418 min = 0,
Zerotorescue@62 1419 max = 100000,
Zerotorescue@62 1420 softMax = 100,
Zerotorescue@62 1421 step = 1,
Zerotorescue@62 1422 name = "Minimum global stock",
Zerotorescue@62 1423 desc = "You can manually enter a value between 100 and 100.000 in the text box below if the provided range is insufficient.",
Zerotorescue@62 1424 get = function() return addon.db.profile.defaults.minGlobalStock; end,
Zerotorescue@62 1425 set = function(i, v) addon.db.profile.defaults.minGlobalStock = v; end,
Zerotorescue@62 1426 },
Zerotorescue@62 1427 alertBelowGlobalMinimum = {
Zerotorescue@62 1428 order = 21,
Zerotorescue@62 1429 type = "toggle",
Zerotorescue@62 1430 name = "Alert when below global minimum (NYI)",
Zerotorescue@62 1431 desc = "Show an alert when this item gets below this threshold.",
Zerotorescue@62 1432 get = function() return addon.db.profile.defaults.alertBelowGlobalMinimum; end,
Zerotorescue@62 1433 set = function(i, v) addon.db.profile.defaults.alertBelowGlobalMinimum = v; end,
Zerotorescue@62 1434 },
Zerotorescue@62 1435 summaryThresholdShow = {
Zerotorescue@62 1436 order = 30,
Zerotorescue@62 1437 type = "range",
Zerotorescue@62 1438 min = 0,
Zerotorescue@62 1439 max = 10,
Zerotorescue@62 1440 softMax = 100,
Zerotorescue@62 1441 step = 0.05,
Zerotorescue@62 1442 isPercent = true,
Zerotorescue@62 1443 name = "Show in summary when below",
Zerotorescue@62 1444 desc = "Show items in the summary when below this percentage of the minimum stock. This can be either below the minimum or the global stock.\n\nYou can manually enter a value between 1.000% and 10.000% in the edit box if the provided range is insufficient.",
Zerotorescue@62 1445 get = function() return addon.db.profile.defaults.summaryThresholdShow; end,
Zerotorescue@62 1446 set = function(i, v) addon.db.profile.defaults.summaryThresholdShow = v; end,
Zerotorescue@62 1447 },
Zerotorescue@62 1448 trackAtCharacters = {
Zerotorescue@62 1449 order = 40,
Zerotorescue@62 1450 type = "multiselect",
Zerotorescue@62 1451 name = "Track at",
Zerotorescue@62 1452 desc = "Select at which characters this should appear in the summary and generate alerts.",
Zerotorescue@62 1453 values = function()
Zerotorescue@62 1454 local temp = {};
Zerotorescue@62 1455 for charName in pairs(addon.db.factionrealm.characters) do
Zerotorescue@62 1456 temp[charName] = charName;
Zerotorescue@62 1457 end
Zerotorescue@62 1458
Zerotorescue@62 1459 return temp;
Zerotorescue@62 1460 end,
Zerotorescue@62 1461 get = function(i, v) return addon.db.profile.defaults.trackAtCharacters[v]; end,
Zerotorescue@62 1462 set = function(i, v, e) addon.db.profile.defaults.trackAtCharacters[v] = e or nil; end,
Zerotorescue@62 1463 --dialogControl = "Dropdown", -- this is not standard, normal multiselect control gives us a list of all chars with toggle-boxes. UGLY! We want a multiselect-box instead.
Zerotorescue@62 1464 },
Zerotorescue@62 1465 },
Zerotorescue@62 1466 },
Zerotorescue@62 1467 refill = {
Zerotorescue@62 1468 order = 20,
Zerotorescue@62 1469 type = "group",
Zerotorescue@62 1470 inline = true,
Zerotorescue@62 1471 name = "Replenishing stock",
Zerotorescue@62 1472 args = {
Zerotorescue@62 1473 description = {
Zerotorescue@62 1474 order = 0,
Zerotorescue@62 1475 type = "description",
Zerotorescue@62 1476 name = function()
Zerotorescue@62 1477 local r = "Here you can specify the default amount of items to which you wish to restock when you are collecting new items. This may be higher than the minimum stock. The settings entered here will be used when you choose not to override the settings within an individual group.\n\n";
Zerotorescue@62 1478
Zerotorescue@62 1479 r = r .. "When restocking the target amount is |cfffed000" .. addon.db.profile.defaults.restockTarget .. "|r of every item. Not queueing craftable items when only missing |cfffed000" .. floor( addon.db.profile.defaults.minCraftingQueue * addon.db.profile.defaults.restockTarget ) .. "|r (|cfffed000" .. ( addon.db.profile.defaults.minCraftingQueue * 100 ) .. "%|r) of the restock target.";
Zerotorescue@62 1480
Zerotorescue@62 1481 return r;
Zerotorescue@62 1482 end,
Zerotorescue@62 1483 },
Zerotorescue@62 1484 header = {
Zerotorescue@62 1485 order = 5,
Zerotorescue@62 1486 type = "header",
Zerotorescue@62 1487 name = "",
Zerotorescue@62 1488 },
Zerotorescue@62 1489 restockTarget = {
Zerotorescue@62 1490 order = 10,
Zerotorescue@62 1491 type = "range",
Zerotorescue@62 1492 min = 0,
Zerotorescue@62 1493 max = 100000,
Zerotorescue@62 1494 softMax = 100,
Zerotorescue@62 1495 step = 1,
Zerotorescue@62 1496 name = "Restock target",
Zerotorescue@62 1497 desc = "You can manually enter a value between 100 and 100.000 in the edit box if the provided range is insufficient.",
Zerotorescue@62 1498 get = function() return addon.db.profile.defaults.restockTarget; end,
Zerotorescue@62 1499 set = function(i, v) addon.db.profile.defaults.restockTarget = v; end,
Zerotorescue@62 1500 },
Zerotorescue@62 1501 minCraftingQueue = {
Zerotorescue@62 1502 order = 20,
Zerotorescue@62 1503 type = "range",
Zerotorescue@62 1504 min = 0,
Zerotorescue@62 1505 max = 1,
Zerotorescue@62 1506 step = 0.01, -- 1%
Zerotorescue@62 1507 isPercent = true,
Zerotorescue@62 1508 name = "Don't queue if I only miss",
Zerotorescue@62 1509 desc = "Don't add a craftable item to the queue if I only miss this much or less of the restock target.\n\nExample: if your restock target is set to 60 and this is set to 5%, an item won't be queued unless you are missing more than 3 of it.",
Zerotorescue@62 1510 get = function() return addon.db.profile.defaults.minCraftingQueue; end,
Zerotorescue@62 1511 set = function(i, v) addon.db.profile.defaults.minCraftingQueue = v; end,
Zerotorescue@62 1512 },
Zerotorescue@62 1513 bonusQueue = {
Zerotorescue@62 1514 order = 30,
Zerotorescue@62 1515 type = "range",
Zerotorescue@62 1516 min = 0,
Zerotorescue@62 1517 max = 10, -- 1000%
Zerotorescue@62 1518 step = 0.01, -- 1%
Zerotorescue@62 1519 isPercent = true,
Zerotorescue@62 1520 name = "Bonus queue",
Zerotorescue@62 1521 desc = "Get additional items when there are none left.\n\nExample: if your restock target is set to 60 and this is set to 10%, you will get 66 items instead of just 60 if you end up with none left while queueing.",
Zerotorescue@62 1522 get = function() return addon.db.profile.defaults.bonusQueue; end,
Zerotorescue@62 1523 set = function(i, v) addon.db.profile.defaults.bonusQueue = v; end,
Zerotorescue@62 1524 },
Zerotorescue@62 1525 priceThreshold = {
Zerotorescue@62 1526 order = 40,
Zerotorescue@62 1527 type = "input",
Zerotorescue@62 1528 name = "Price threshold",
Zerotorescue@62 1529 desc = "Only queue craftable items when they are worth at least this much according to your auction house addon.\n\nSet to 0 to ignore auction prices.",
Zerotorescue@62 1530 validate = function(info, value) return addon:ValidateReadableMoney(info, value); end,
Zerotorescue@62 1531 get = function() return addon:ReadableMoney(addon.db.profile.defaults.priceThreshold); end,
Zerotorescue@62 1532 set = function(i, v) addon.db.profile.defaults.priceThreshold = addon:ReadableMoneyToCopper(v); end,
Zerotorescue@62 1533 },
Zerotorescue@62 1534 summaryHidePriceThreshold = {
Zerotorescue@62 1535 order = 50,
Zerotorescue@62 1536 type = "toggle",
Zerotorescue@62 1537 name = "Hide when below threshold",
Zerotorescue@62 1538 desc = "Hide items from the summary when their value is below the set price threshold.",
Zerotorescue@62 1539 get = function() return addon.db.profile.defaults.summaryHidePriceThreshold; end,
Zerotorescue@62 1540 set = function(i, v) addon.db.profile.defaults.summaryHidePriceThreshold = v; end,
Zerotorescue@62 1541 },
Zerotorescue@62 1542 alwaysGetAuctionValue = {
Zerotorescue@62 1543 order = 60,
Zerotorescue@62 1544 type = "toggle",
Zerotorescue@62 1545 name = "Always show auction value",
Zerotorescue@62 1546 desc = "Always cache and show the auction value of items, even if the price threshold is set to 0|cffeda55fc|r.",
Zerotorescue@62 1547 get = function() return addon.db.profile.defaults.alwaysGetAuctionValue; end,
Zerotorescue@62 1548 set = function(i, v) addon.db.profile.defaults.alwaysGetAuctionValue = v; end,
Zerotorescue@62 1549 },
Zerotorescue@62 1550 },
Zerotorescue@62 1551 },
Zerotorescue@62 1552 colorCodes = {
Zerotorescue@62 1553 order = 30,
Zerotorescue@62 1554 type = "group",
Zerotorescue@62 1555 inline = true,
Zerotorescue@62 1556 name = "Color codes",
Zerotorescue@62 1557 args = {
Zerotorescue@62 1558 description = {
Zerotorescue@62 1559 order = 0,
Zerotorescue@62 1560 type = "description",
Zerotorescue@62 1561 name = "Change the color code thresholds based on the current stock remaining of the required minimum stock.",
Zerotorescue@62 1562 },
Zerotorescue@62 1563 header = {
Zerotorescue@62 1564 order = 5,
Zerotorescue@62 1565 type = "header",
Zerotorescue@62 1566 name = "",
Zerotorescue@62 1567 },
Zerotorescue@62 1568 green = {
Zerotorescue@62 1569 order = 10,
Zerotorescue@62 1570 type = "range",
Zerotorescue@62 1571 min = 0,
Zerotorescue@62 1572 max = 1,
Zerotorescue@62 1573 step = 0.01,
Zerotorescue@62 1574 isPercent = true,
Zerotorescue@62 1575 name = "|cff00ff00Green|r",
Zerotorescue@62 1576 desc = "Show quantity in green when at least this much of the minimum stock is available.",
Zerotorescue@62 1577 get = function() return addon.db.profile.defaults.colors.green; end,
Zerotorescue@62 1578 set = function(i, v) addon.db.profile.defaults.colors.green = v; end,
Zerotorescue@62 1579 },
Zerotorescue@62 1580 yellow = {
Zerotorescue@62 1581 order = 20,
Zerotorescue@62 1582 type = "range",
Zerotorescue@62 1583 min = 0,
Zerotorescue@62 1584 max = 1,
Zerotorescue@62 1585 step = 0.01,
Zerotorescue@62 1586 isPercent = true,
Zerotorescue@62 1587 name = "|cffffff00Yellow|r",
Zerotorescue@62 1588 desc = "Show quantity in yellow when at least this much of the minimum stock is available.",
Zerotorescue@62 1589 get = function() return addon.db.profile.defaults.colors.yellow; end,
Zerotorescue@62 1590 set = function(i, v) addon.db.profile.defaults.colors.yellow = v; end,
Zerotorescue@62 1591 },
Zerotorescue@62 1592 orange = {
Zerotorescue@62 1593 order = 30,
Zerotorescue@62 1594 type = "range",
Zerotorescue@62 1595 min = 0,
Zerotorescue@62 1596 max = 1,
Zerotorescue@62 1597 step = 0.01,
Zerotorescue@62 1598 isPercent = true,
Zerotorescue@62 1599 name = "|cffff9933Orange|r",
Zerotorescue@62 1600 desc = "Show quantity in orange when at least this much of the minimum stock is available.",
Zerotorescue@62 1601 get = function() return addon.db.profile.defaults.colors.orange; end,
Zerotorescue@62 1602 set = function(i, v) addon.db.profile.defaults.colors.orange = v; end,
Zerotorescue@62 1603 },
Zerotorescue@62 1604 red = {
Zerotorescue@62 1605 order = 40,
Zerotorescue@62 1606 type = "range",
Zerotorescue@62 1607 min = 0,
Zerotorescue@62 1608 max = 1,
Zerotorescue@62 1609 step = 0.01,
Zerotorescue@62 1610 isPercent = true,
Zerotorescue@62 1611 name = "|cffff0000Red|r",
Zerotorescue@62 1612 desc = "Show quantity in red when at least this much of the minimum stock is available.",
Zerotorescue@62 1613 get = function() return addon.db.profile.defaults.colors.red; end,
Zerotorescue@62 1614 set = function(i, v) addon.db.profile.defaults.colors.red = v; end,
Zerotorescue@62 1615 },
Zerotorescue@62 1616 },
Zerotorescue@62 1617 },
Zerotorescue@62 1618 },
Zerotorescue@62 1619 };
Zerotorescue@62 1620 end
Zerotorescue@62 1621
Zerotorescue@62 1622 function mod:FillHelpOptions()
Zerotorescue@62 1623 options.args.help = {
Zerotorescue@62 1624 order = 150,
Zerotorescue@62 1625 type = "group",
Zerotorescue@62 1626 childGroups = "tab",
Zerotorescue@62 1627 name = "Help",
Zerotorescue@62 1628 desc = "Useful information for if you're unfamiliar with a part of the addon.",
Zerotorescue@62 1629 args = {
Zerotorescue@62 1630 general = {
Zerotorescue@62 1631 order = 1,
Zerotorescue@62 1632 type = "group",
Zerotorescue@62 1633 name = "General",
Zerotorescue@62 1634 args = {
Zerotorescue@62 1635 description = {
Zerotorescue@62 1636 order = 0,
Zerotorescue@62 1637 type = "description",
Zerotorescue@62 1638 name = "Please note that all multi-select |cfffed000dropdown|r boxes were turned into multi-select |cfffed000toggle|r boxes. I do not intend to keep it this way, however it can not yet be reverted due to a major bug in one of the libraries used by Inventorium. The layout of this config may look terribly organized in it's current state.\n\n" ..
Zerotorescue@62 1639 "Since this is a beta some functionality might not be implemented yet while the options are available (usually - but not always - tagged as \"NYI\"). These options are used to indicate a feature is on the way and will be implemented before Inventorium is tagged as a release.\n\n" ..
Zerotorescue@62 1640 "Please request things you want and report anything that's clunky, weird, vague or otherwise buggy at |cfffed000the Inventorium development addon page|r. You can find this by searching for \"|cfffed000Inventorium|r\" at |cfffed000CurseForge.com|r.\n\n" ..
Zerotorescue@62 1641 "Tutorials for Inventorium will be created after the first stable release. If you require any help before that you can always contact me in the |cfffed000#JMTC|r IRC channel at |cfffed000QuakeNet.org|r. You may also report issues and request things there if you wish.\n\n" ..
Zerotorescue@62 1642 "You might notice the summary window currently gets very slow when refreshed once you get over 100-200 items in the list, this is a known issue and will be fixed in |cfffed000version 1.1|r or a little later (which is after the initial release).",
Zerotorescue@62 1643 },
Zerotorescue@62 1644 },
Zerotorescue@62 1645 },
Zerotorescue@62 1646 manual = {
Zerotorescue@62 1647 order = 2,
Zerotorescue@62 1648 type = "group",
Zerotorescue@62 1649 name = "Manual",
Zerotorescue@62 1650 args = {
Zerotorescue@62 1651 intro = {
Zerotorescue@62 1652 order = 1,
Zerotorescue@62 1653 type = "group",
Zerotorescue@62 1654 inline = true,
Zerotorescue@62 1655 name = "Intro",
Zerotorescue@62 1656 args = {
Zerotorescue@62 1657 description = {
Zerotorescue@62 1658 order = 0,
Zerotorescue@62 1659 type = "description",
Zerotorescue@62 1660 name = "|cfffed000Inventorium|r is an inventory tracking and restocking addon aimed towards making it extremely easy to keep enough stock of specific items at your characters. It provides a quick overview where you can see your current stock compared to the required stock and the current item value at the auction house whenever you find this relevant. From this overview you can queue craftable items into your favorite crafting profession addon and even restock from a vendor.",
Zerotorescue@62 1661 },
Zerotorescue@62 1662 },
Zerotorescue@62 1663 },
Zerotorescue@62 1664 Overview = {
Zerotorescue@62 1665 order = 2,
Zerotorescue@62 1666 type = "group",
Zerotorescue@62 1667 inline = true,
Zerotorescue@62 1668 name = "Overview",
Zerotorescue@62 1669 args = {
Zerotorescue@62 1670 description = {
Zerotorescue@62 1671 order = 0,
Zerotorescue@62 1672 type = "description",
Zerotorescue@62 1673 name = "In the stock overview, which is called the summary, you can view a list with all items relevant to your current character with their updated stock and auction house values. You can sort this list on item quality, current stock, percentage of stock missing, and item values and this way easily manually find the items you wish to process. If you prefer to automate the process, you can also configure the groups exactly as you wish and hit the queue button to process everything in that group.\n\n" ..
Zerotorescue@62 1674
Zerotorescue@62 1675 "The item count data can be retrieved from most popular item count addons. This includes |cfffed000ItemCount|r and |cfffed000DataStore|r, but also |cfffed000Altoholic|r (even though this is not really a proper item count addon).\n" ..
Zerotorescue@62 1676 "The auction house values data can also be retrieved from most popular auction house addons. This includes |cfffed000Auctionator|r, |cfffed000Auctioneer|r, |cfffed000AuctionLite|r, |cfffed000AuctionMaster|r and any other addon implementing the standard for retrieving item values. Item values from the summary windows of |cfffed000AuctionProfitMaster|r and |cfffed000ZeroAuctions|r are also supported, but not recommended.",
Zerotorescue@62 1677 },
Zerotorescue@62 1678 },
Zerotorescue@62 1679 },
Zerotorescue@62 1680 Groups = {
Zerotorescue@62 1681 order = 3,
Zerotorescue@62 1682 type = "group",
Zerotorescue@62 1683 inline = true,
Zerotorescue@62 1684 name = "Groups",
Zerotorescue@62 1685 args = {
Zerotorescue@62 1686 description = {
Zerotorescue@62 1687 order = 0,
Zerotorescue@62 1688 type = "description",
Zerotorescue@62 1689 name = "All items can be distributed over multiple groups to configure them exactly as you want. You can put all your glyphs in one group, gems in another and scrolls in a third with every single one of them having it's own set of unique settings. Per group you can set a price threshold, required item count, relevant characters and much more. The setup will feel very familiar to anyone that has used Quick Auctions to some extend as it uses a similar standard (though with many enhancements).",
Zerotorescue@62 1690 },
Zerotorescue@62 1691 },
Zerotorescue@62 1692 },
Zerotorescue@62 1693 Queueing = {
Zerotorescue@62 1694 order = 4,
Zerotorescue@62 1695 type = "group",
Zerotorescue@62 1696 inline = true,
Zerotorescue@62 1697 name = "Queueing",
Zerotorescue@62 1698 args = {
Zerotorescue@62 1699 description = {
Zerotorescue@62 1700 order = 0,
Zerotorescue@62 1701 type = "description",
Zerotorescue@62 1702 name = "Queueing items into your crafting profession addon can be done per group or for all visible groups at once. This requires the relevant profession window to be open. All queueing is done based on the filters set in the config for the related group, any items falling outside will be ignored.\n\n" ..
Zerotorescue@62 1703
Zerotorescue@62 1704 "The queueing can be done into most popular crafting profession window replacing addons. This includes |cfffed000AdvancedTradeSkillWindow|r, |cfffed000GnomeWorks|r and |cfffed000Skillet|r.",
Zerotorescue@62 1705 },
Zerotorescue@62 1706 },
Zerotorescue@62 1707 },
Zerotorescue@62 1708 Configuring = {
Zerotorescue@62 1709 order = 5,
Zerotorescue@62 1710 type = "group",
Zerotorescue@62 1711 inline = true,
Zerotorescue@62 1712 name = "Configuring",
Zerotorescue@62 1713 args = {
Zerotorescue@62 1714 description = {
Zerotorescue@62 1715 order = 0,
Zerotorescue@62 1716 type = "description",
Zerotorescue@62 1717 name = "The system resources used by this addon while it is stand-by are at a minimum, so you can just leave it enabled for all your characters unless you wish otherwise.\n\n" ..
Zerotorescue@62 1718
Zerotorescue@62 1719 "To start using Inventorium write |cfffed000/im|r in your chat. This will show a list of all available commands; |cfffed000/im config|r, |cfffed000summary|r and some others. Tip: Most of these commands have short alternatives, such as |cfffed000c|r for |cfffed000config|r and |cfffed000s|r for |cfffed000summary|r.\n\n" ..
Zerotorescue@62 1720
Zerotorescue@62 1721 "Write |cfffed000/im c|r to open the config window to start configuring your groups. The first tab you will find opened is the |cfffed000General|r config. Go ahead and select your prefered item count, crafting and pricing addons. Scroll down and quickly take note of all other options there, you won't really need everything (yet) but knowing it is available will save you from searching later on.\n\n" ..
Zerotorescue@62 1722
Zerotorescue@62 1723 "Click on the |cfffed000Groups|r tab. Here you will see a view handy options, in the future you might be able to find complete groups to import at popular blogs or forums making Inventorium very easy to import and initially setup, but for now we will have to make one manually. Quickly think about an easy-to-use and handy naming pattern and enter a name for your new group (e.g. |cfffed000Glyphs (Hunter)|r) and hit enter (leave the group type to the default). This group will be created and added to the list under the groups tab. Open the config for this group by clicking the group name.\n\n" ..
Zerotorescue@62 1724
Zerotorescue@62 1725 "You are now seeing a copy of the general config with override boxes next to everything. Configure this as you wish, for example override the |cfffed000minimum global stock|r to 20, |cfffed000track at|r to your banker and crafter (ensure your current char is also included) and the |cfffed000price threshold|r to 5g or so. Once done go to the \"add items\" tab to add items to this group so this group manages them. Again observice the available functionality so you know what you can do. Based on our previous example of Hunter glyphs we have three possibilities: one is to get all Hunter glyphs in our bags and add these, the second is to open the profession window and include everything above or equal to an item level of 0 and the third and in this case best possibility is to add items from a premade group. Select |cfffed000Glyphs (Hunter)|r from the |cfffed000premade groups|r select box to import all Hunter glyphs into this group. After doing so you can close the config window to check the results. Write |cfffed000/im s|r to view the summary window.\n\n" ..
Zerotorescue@62 1726
Zerotorescue@62 1727 "You can now copy this group and repeat the same steps to add all other groups you require. Think of things like one group per class for glyphs, one group per color for gems, one group per type of scroll (e.g. Heirloom, Twinks and Popular), one group for craftable epics, one group for flasks, one group for inks, one for parchments, etc.",
Zerotorescue@62 1728 },
Zerotorescue@62 1729 },
Zerotorescue@62 1730 },
Zerotorescue@62 1731 VirtualGroups = {
Zerotorescue@62 1732 order = 6,
Zerotorescue@62 1733 type = "group",
Zerotorescue@62 1734 inline = true,
Zerotorescue@62 1735 name = "Virtual groups",
Zerotorescue@62 1736 args = {
Zerotorescue@62 1737 description = {
Zerotorescue@62 1738 order = 0,
Zerotorescue@62 1739 type = "description",
Zerotorescue@62 1740 name = "|cffccccccThis is advanced optional functionality. I recommend skipping this paragraph if you are new to Inventorium.|r\n\n" ..
Zerotorescue@62 1741
Zerotorescue@62 1742 "To allow changing the settings of multiple groups at once you can make virtual groups. These groups are basically like the general tab as their values are used when you aren't overriding a setting in a more specific group. After making a virtual group you still have to select it in all the \"child\"-groups so these groups know where to look for their settings when they are empty. Going back to our |cfffed000Glyphs (Hunter)|r group, we could make a virtual group called |cfffed000Glyphs|r which contained info like a default price threshold of 5g and a minimum crafting queue for all glyph groups. In each specific group you can then further specify that you would - for example - want 20 Hunter glyphs but 40 Druid glyphs as these might just sell a lot more often.",
Zerotorescue@62 1743 },
Zerotorescue@62 1744 },
Zerotorescue@62 1745 },
Zerotorescue@62 1746 },
Zerotorescue@62 1747 },
Zerotorescue@62 1748 FAQ = {
Zerotorescue@62 1749 order = 3,
Zerotorescue@62 1750 type = "group",
Zerotorescue@62 1751 name = "FAQ",
Zerotorescue@62 1752 args = {
Zerotorescue@62 1753 description = {
Zerotorescue@62 1754 order = 0,
Zerotorescue@62 1755 type = "description",
Zerotorescue@62 1756 name = "|cfffed000My groups don't appear in the summary window.|r\nPlease ensure your current character is toggled on at the \"track at\" option beneath the \"minimum stock\" category within a group or the defaults.\n\n" ..
Zerotorescue@62 1757 "|cfffed000The auction value collumn always shows a \"-\".|r\nThe auction value will not be cached when you set the \"price threshold\" beneath the \"replenishing stock\" category to |cfffed0000c|r. You can change this behavior by adjusting this value or toggling the \"Always show auction value\" option on.\n\n" ..
Zerotorescue@62 1758 "|cfffed000What relation does Inventorium have to ZeroAuctions or AuctionProfitMaster?|r\nNone. ZA/APM and IM are two completely seperate addons and do not interfere with eachother. At best you can use the auction pricing data displayed at the ZA/APM summary window as pricing source by selecting either addon as pricing addon, but neither IM nor ZA/APM will adjust any settings nor execute any other actions at one another. ZA/APM is an auction house addon. IM is a stock management addon. We are not related. We do not work together. We probably never will.\n\n" ..
Zerotorescue@62 1759 "|cfffed000What use do profiles have?|r\nBecause there is already the \"track at\" option, profiles may not be useful to anyone. Nevertheless someone might find a use for it in some way and thus it is left available. You can use it to test certain things for example without the risk of your main groups being destroyed (although this should never be an excuse not to back up your settings from time to time).\n\n" ..
Zerotorescue@62 1760 "|cfffed000Can you provide me with a sample scenario for virtual groups?|r\nNot really. If you are just getting to know Inventorium then I suggest leaving this functionality for the moment. It only makes things more complicated.\n\nAnyway, the simplest (and possibly most popular) setup to imagine are glyphs. There are over 300 glyphs available distributed over 10 classes. Glyphs for certain classes (such as the tribrids; Druids & Paladins) might sell a lot more often than those for others (such as pure DPS; Hunters, etc.).\n\nTo get an easily adjustable setup you can make one virtual group, called \"Glyphs\" and override all your prefered settings in there. After you are done, make a glyph-group for each class (such as \"Glyphs (Death Knight)\" etc.) and select \"Glyphs\" as virtual group for every one of them (you can easily insert item data to these class specific groups by selecting premade data).\n\nNow, to change the settings for all glyph groups you can just change the settings within the virtual \"Glyph\" group. To change the settings for one class in particular, such as Paladins because they sell more often than others, you can click this group and override the appropriate settings for just that group. There are many more possibilities for you to find out.\n\n" ..
Zerotorescue@62 1761 "",
Zerotorescue@62 1762 },
Zerotorescue@62 1763 },
Zerotorescue@62 1764 },
Zerotorescue@62 1765 },
Zerotorescue@62 1766 };
Zerotorescue@62 1767 end
Zerotorescue@62 1768
Zerotorescue@62 1769 function mod:MakeGroupOptions()
Zerotorescue@62 1770 options.args.groups = {
Zerotorescue@62 1771 order = 1100,
Zerotorescue@62 1772 type = "group",
Zerotorescue@62 1773 name = "Groups",
Zerotorescue@62 1774 desc = "Change a group.",
Zerotorescue@62 1775 args = {
Zerotorescue@62 1776 create = {
Zerotorescue@62 1777 order = 10,
Zerotorescue@62 1778 type = "group",
Zerotorescue@62 1779 inline = true,
Zerotorescue@62 1780 name = "Create a brand new group",
Zerotorescue@62 1781 args = {
Zerotorescue@62 1782 name = {
Zerotorescue@62 1783 order = 10,
Zerotorescue@62 1784 type = "input",
Zerotorescue@62 1785 name = "Group name",
Zerotorescue@62 1786 desc = "The name of the group. You can also use item links as you wish.",
Zerotorescue@62 1787 validate = ValidateGroupName,
Zerotorescue@62 1788 set = function(_, value)
Zerotorescue@62 1789 addon.db.profile.groups[value] = {};
Zerotorescue@62 1790 if currentGroupType == "Virtual" then
Zerotorescue@62 1791 addon.db.profile.groups[value].isVirtual = true;
Zerotorescue@62 1792 end
Zerotorescue@62 1793
Zerotorescue@62 1794 mod:FillGroupOptions();
Zerotorescue@62 1795 end,
Zerotorescue@62 1796 get = false,
Zerotorescue@62 1797 width = "double",
Zerotorescue@62 1798 },
Zerotorescue@62 1799 type = {
Zerotorescue@62 1800 order = 20,
Zerotorescue@62 1801 type = "select",
Zerotorescue@62 1802 name = "Type (advanced)",
Zerotorescue@62 1803 desc = "The type of the new group. This can not be changed at a later time.\n\n|cffff9933This is an advanced option, you will probably not need it unless you manage a lot of groups.|r\n\n|cfffed000Normal|r: A normal group with complete functionality.\n\n|cfffed000Virtual|r: A virtual group which you can use to override the defaults for a set of groups. You can not add items to virtual groups.",
Zerotorescue@62 1804 values = {
Zerotorescue@62 1805 ["Normal"] = "Normal",
Zerotorescue@62 1806 ["Virtual"] = "Virtual",
Zerotorescue@62 1807 },
Zerotorescue@62 1808 set = function(_, value) currentGroupType = value; end,
Zerotorescue@62 1809 get = function() return currentGroupType; end,
Zerotorescue@62 1810 },
Zerotorescue@62 1811 },
Zerotorescue@62 1812 },
Zerotorescue@62 1813 import = {
Zerotorescue@62 1814 order = 20,
Zerotorescue@62 1815 type = "group",
Zerotorescue@62 1816 inline = true,
Zerotorescue@62 1817 name = "Import a group",
Zerotorescue@62 1818 args = {
Zerotorescue@62 1819 input = {
Zerotorescue@62 1820 order = 10,
Zerotorescue@62 1821 type = "input",
Zerotorescue@62 1822 multiline = true,
Zerotorescue@62 1823 name = "Group data",
Zerotorescue@62 1824 desc = "Paste the group data as provided by a group export. If you are trying to import multiple groups at the same time, make sure to use newlines to seperate them.",
Zerotorescue@62 1825 set = function(info, value)
Zerotorescue@62 1826 local data = { string.split("\n", value or "") };
Zerotorescue@62 1827
Zerotorescue@62 1828 for _, current in pairs(data) do
Zerotorescue@62 1829 if not AceSerializer then
Zerotorescue@62 1830 AceSerializer = LibStub("AceSerializer-3.0");
Zerotorescue@62 1831 end
Zerotorescue@62 1832
Zerotorescue@62 1833 local result, temp = AceSerializer:Deserialize(current);
Zerotorescue@62 1834
Zerotorescue@62 1835 if not temp.name then
Zerotorescue@62 1836 print("|cffff0000The provided data is not supported.|r");
Zerotorescue@62 1837 elseif ValidateGroupName(nil, temp.name) ~= true then
Zerotorescue@62 1838 print(("|cffff0000Aborting: A group named \"%s\" already exists.|r"):format(temp.name));
Zerotorescue@62 1839 else
Zerotorescue@62 1840 local name = temp.name;
Zerotorescue@62 1841 temp.name = nil;
Zerotorescue@62 1842 print(("Importing %s..."):format(name));
Zerotorescue@62 1843
Zerotorescue@62 1844 if temp.items then
Zerotorescue@62 1845 -- Remove items that are already in another group
Zerotorescue@62 1846 for value, _ in pairs(temp.items) do
Zerotorescue@62 1847 local itemId = tonumber(value);
Zerotorescue@62 1848
Zerotorescue@62 1849 if not itemId then
Zerotorescue@62 1850 print(("\"%s\" is not a number."):format(value));
Zerotorescue@62 1851 temp.items[value] = nil;
Zerotorescue@62 1852 elseif addon:InGroup(itemId) then
Zerotorescue@62 1853 print(("Skipping %s (#%d) as it is already in the group |cfffed000%s|r."):format(select(2, GetItemInfo(itemId)) or "Unknown", itemId, addon:InGroup(itemId)));
Zerotorescue@62 1854 temp.items[value] = nil;
Zerotorescue@62 1855 else
Zerotorescue@62 1856 -- Ensure the keys are numeric
Zerotorescue@62 1857 temp.items[value] = nil;
Zerotorescue@62 1858 temp.items[itemId] = true;
Zerotorescue@62 1859 end
Zerotorescue@62 1860 end
Zerotorescue@62 1861 end
Zerotorescue@62 1862
Zerotorescue@62 1863 -- Ensure this data isn't received (this would be silly/buggy as exports from other accounts - with different characters - won't know what to do with this)
Zerotorescue@62 1864 temp.trackAtCharacters = nil;
Zerotorescue@62 1865 temp.overrideTrackAtCharacters = nil;
Zerotorescue@62 1866
Zerotorescue@62 1867 addon.db.profile.groups[name] = temp;
Zerotorescue@62 1868 end
Zerotorescue@62 1869 end
Zerotorescue@62 1870
Zerotorescue@62 1871 self:FillGroupOptions();
Zerotorescue@62 1872 end,
Zerotorescue@62 1873 get = false,
Zerotorescue@62 1874 width = "full",
Zerotorescue@62 1875 },
Zerotorescue@62 1876 },
Zerotorescue@62 1877 },
Zerotorescue@62 1878 },
Zerotorescue@62 1879 };
Zerotorescue@62 1880 end
Zerotorescue@62 1881
Zerotorescue@62 1882 function mod:FillGroupOptions()
Zerotorescue@62 1883 for id, name in pairs(groupIdToName) do
Zerotorescue@62 1884 if type(name) == "string" and not addon.db.profile.groups[name] then
Zerotorescue@62 1885 options.args.groups.args[id] = nil;
Zerotorescue@62 1886 groupIdToName[id] = nil;
Zerotorescue@62 1887 groupIdToName[name] = nil;
Zerotorescue@62 1888 groupIsVirtual[id] = nil;
Zerotorescue@62 1889 end
Zerotorescue@62 1890 end
Zerotorescue@62 1891
Zerotorescue@62 1892 for name, values in pairs(addon.db.profile.groups) do
Zerotorescue@62 1893 if not groupIdToName[name] then
Zerotorescue@62 1894 options.args.groups.args[tostring(count)] = defaultGroup;
Zerotorescue@62 1895
Zerotorescue@62 1896 groupIdToName[tostring(count)] = name;
Zerotorescue@62 1897 groupIdToName[name] = true;
Zerotorescue@62 1898 if values.isVirtual then
Zerotorescue@62 1899 groupIsVirtual[tostring(count)] = true;
Zerotorescue@62 1900 end
Zerotorescue@62 1901
Zerotorescue@62 1902 count = ( count + 1 );
Zerotorescue@62 1903 end
Zerotorescue@62 1904 end
Zerotorescue@62 1905 end