annotate Summary.lua @ 73:6216b754350d

Default size for the summary window increase to 700 pixels (from 650). Cached item name and rarity no longer have a default and will be nil if the value is unknown. Cached item name, rarity and link can now be updated when the itemlink element is build. Item element now gets the item table passed rather than just the item id. If the item link is already known, this prevent an additional GetItemInfo call.
author Zerotorescue
date Fri, 24 Dec 2010 16:10:20 +0100
parents 7ca83ad9d67a
children 8d11fc88ecab
rev   line source
Zerotorescue@62 1 local addon = select(2, ...); -- Get a reference to the main addon object
Zerotorescue@62 2 local mod = addon:NewModule("Summary", "AceEvent-3.0", "AceTimer-3.0"); -- register a new module, Summary: resposible for building the summary window
Zerotorescue@0 3
Zerotorescue@23 4 local unknownItemName = "Unknown (#%d)";
Zerotorescue@23 5
Zerotorescue@62 6 local CACHE_ITEMS_TOTAL, CACHE_ITEMS_CURRENT, itemsCache = 0, 0, {};
Zerotorescue@62 7 local AceGUI, cacheStart;
Zerotorescue@23 8
Zerotorescue@62 9 local _G = _G; -- prevent looking up of the global table
Zerotorescue@62 10 local printf, sgsub, supper, tinsert, pairs, ceil, GetItemInfo = _G.string.format, _G.string.gsub, _G.string.upper, _G.table.insert, _G.pairs, _G.ceil, _G.GetItemInfo; -- prevent looking up of the most used globals all the time
Zerotorescue@23 11
Zerotorescue@0 12 function mod:OnEnable()
Zerotorescue@62 13 -- Register the summary specific widget
Zerotorescue@62 14 addon:GetModule("Widgets"):InlineGroupWithButton();
Zerotorescue@62 15
Zerotorescue@62 16 AceGUI = LibStub("AceGUI-3.0");
Zerotorescue@0 17
Zerotorescue@1 18 -- Register our own slash commands
Zerotorescue@62 19 -- /im summary
Zerotorescue@1 20 addon:RegisterSlash(function()
Zerotorescue@1 21 mod:BuildMain();
Zerotorescue@1 22 mod:Build();
Zerotorescue@36 23 end, { "s", "sum", "summary" }, "|Hfunction:InventoriumCommandHandler:summary|h|cff00fff7/im summary|r|h (or /im s) - Show the summary window containing an overview of all items within the groups tracked at this current character.");
Zerotorescue@62 24
Zerotorescue@62 25 -- /im reset
Zerotorescue@23 26 addon:RegisterSlash(function()
Zerotorescue@23 27 if mod.frame then
Zerotorescue@73 28 mod.frame:SetWidth(700);
Zerotorescue@23 29 mod.frame:SetHeight(600);
Zerotorescue@23 30
Zerotorescue@23 31 print("Resetting width and height of the summary frame.");
Zerotorescue@23 32 end
Zerotorescue@36 33 end, { "r", "reset" }, "|Hfunction:InventoriumCommandHandler:reset|h|cff00fff7/im reset|r|h (or /im r) - Reset the size of the summary frame.");
Zerotorescue@0 34 end
Zerotorescue@0 35
Zerotorescue@13 36 local function ShowTooltip(self)
Zerotorescue@13 37 -- If this function is called from a widget, self is the widget and self.frame the actual frame
Zerotorescue@13 38 local this = self.frame or self;
Zerotorescue@13 39
Zerotorescue@13 40 GameTooltip:SetOwner(this, "ANCHOR_NONE");
Zerotorescue@13 41 GameTooltip:SetPoint("BOTTOM", this, "TOP");
Zerotorescue@13 42 GameTooltip:SetText(this.tooltipTitle, 1, .82, 0, 1);
Zerotorescue@13 43
Zerotorescue@13 44 if type(this.tooltip) == "string" then
Zerotorescue@13 45 GameTooltip:AddLine(this.tooltip, 1, 1, 1, 1);
Zerotorescue@13 46 end
Zerotorescue@13 47
Zerotorescue@13 48 GameTooltip:Show();
Zerotorescue@13 49 end
Zerotorescue@13 50
Zerotorescue@13 51 local function HideTooltip()
Zerotorescue@13 52 GameTooltip:Hide();
Zerotorescue@13 53 end
Zerotorescue@13 54
Zerotorescue@0 55 function mod:BuildMain()
Zerotorescue@11 56 LibStub("AceConfigDialog-3.0"):Close("InventoriumOptions");
Zerotorescue@0 57
Zerotorescue@10 58 self:CloseFrame();
Zerotorescue@10 59
Zerotorescue@1 60 -- Main Window
Zerotorescue@1 61 mod.frame = AceGUI:Create("Frame");
Zerotorescue@23 62 _G["InventoriumSummary"] = mod.frame; -- name the global frame so it can be put in the UISpecialFrames
Zerotorescue@57 63 mod.frame:SetTitle("Inventory Summary");
Zerotorescue@1 64 mod.frame:SetLayout("Fill");
Zerotorescue@1 65 mod.frame:SetCallback("OnClose", function(widget)
Zerotorescue@7 66 mod:CancelTimer(self.tmrUpdater, true);
Zerotorescue@9 67 mod:CloseFrame();
Zerotorescue@1 68 end);
Zerotorescue@61 69 mod.frame:SetWidth(addon.db.profile.defaults.summary.width);
Zerotorescue@61 70 mod.frame:SetHeight(addon.db.profile.defaults.summary.height);
Zerotorescue@13 71 mod.frame.OnWidthSet = function(_, width)
Zerotorescue@61 72 addon.db.profile.defaults.summary.width = width;
Zerotorescue@13 73 end;
Zerotorescue@13 74 mod.frame.OnHeightSet = function(_, height)
Zerotorescue@61 75 addon.db.profile.defaults.summary.height = height;
Zerotorescue@13 76 end;
Zerotorescue@0 77
Zerotorescue@23 78 -- Close on escape
Zerotorescue@23 79 tinsert(UISpecialFrames, "InventoriumSummary");
Zerotorescue@23 80
Zerotorescue@1 81 -- ScrollFrame child
Zerotorescue@1 82 mod.scrollFrame = AceGUI:Create("ScrollFrame");
Zerotorescue@1 83 mod.scrollFrame:SetLayout("Flow");
Zerotorescue@0 84
Zerotorescue@1 85 mod.frame:AddChild(mod.scrollFrame);
Zerotorescue@1 86
Zerotorescue@1 87 -- Reset items cache
Zerotorescue@1 88 table.wipe(itemsCache);
Zerotorescue@0 89 end
Zerotorescue@0 90
Zerotorescue@9 91 function mod:CloseFrame()
Zerotorescue@9 92 if mod.frame then
Zerotorescue@9 93 mod.frame:Release();
Zerotorescue@9 94 mod.frame = nil;
Zerotorescue@10 95
Zerotorescue@10 96 -- Stop caching
Zerotorescue@10 97
Zerotorescue@10 98 -- Stop timer
Zerotorescue@10 99 self:CancelTimer(self.tmrUpdater, true);
Zerotorescue@10 100
Zerotorescue@10 101 -- Reset trackers
Zerotorescue@10 102 CACHE_ITEMS_TOTAL = 0;
Zerotorescue@10 103 CACHE_ITEMS_CURRENT = 0;
Zerotorescue@9 104 end
Zerotorescue@9 105 end
Zerotorescue@9 106
Zerotorescue@0 107 local sortMethod = "item";
Zerotorescue@0 108 local sortDirectory = "ASC";
Zerotorescue@0 109 local function ReSort(subject)
Zerotorescue@0 110 if sortMethod == subject then
Zerotorescue@0 111 sortDirectory = (sortDirectory == "ASC" and "DESC") or "ASC";
Zerotorescue@0 112 else
Zerotorescue@0 113 sortDirectory = "ASC";
Zerotorescue@0 114 end
Zerotorescue@0 115 sortMethod = subject;
Zerotorescue@0 116
Zerotorescue@0 117 mod:Build();
Zerotorescue@0 118 end
Zerotorescue@57 119
Zerotorescue@10 120 -- From http://www.wowwiki.com/API_sort
Zerotorescue@10 121 local function pairsByKeys (t, f)
Zerotorescue@10 122 local a = {}
Zerotorescue@62 123 for n in pairs(t) do tinsert(a, n) end
Zerotorescue@10 124 table.sort(a, f)
Zerotorescue@10 125 local i = 0 -- iterator variable
Zerotorescue@10 126 local iter = function () -- iterator function
Zerotorescue@10 127 i = i + 1
Zerotorescue@10 128 if a[i] == nil then return nil
Zerotorescue@10 129 else return a[i], t[a[i]]
Zerotorescue@10 130 end
Zerotorescue@10 131 end
Zerotorescue@10 132 return iter
Zerotorescue@10 133 end
Zerotorescue@0 134
Zerotorescue@0 135 function mod:Build()
Zerotorescue@10 136 local buildStartTime, times = GetTime(), {};
Zerotorescue@0 137
Zerotorescue@1 138 -- We are going to add hunderds of widgets to this container, but don't want it to also cause hunderds of reflows, thus pause reflowing and just do it once when everything is prepared
Zerotorescue@1 139 -- This appears to be required for each container we wish to pause, so also do this for the contents
Zerotorescue@1 140 mod.scrollFrame:PauseLayout();
Zerotorescue@1 141
Zerotorescue@10 142 mod.scrollFrame:ReleaseChildren();
Zerotorescue@10 143
Zerotorescue@10 144 -- Refresh button
Zerotorescue@10 145 local btnRefresh = AceGUI:Create("Button");
Zerotorescue@10 146 btnRefresh:SetText("Refresh");
Zerotorescue@10 147 btnRefresh:SetRelativeWidth(.2);
Zerotorescue@10 148 btnRefresh:SetCallback("OnClick", function()
Zerotorescue@10 149 -- Reset items cache
Zerotorescue@10 150 table.wipe(itemsCache);
Zerotorescue@10 151
Zerotorescue@10 152 -- Rebuild itemlist and start caching
Zerotorescue@10 153 mod:Build();
Zerotorescue@10 154 end);
Zerotorescue@13 155 btnRefresh:SetCallback("OnEnter", ShowTooltip);
Zerotorescue@13 156 btnRefresh:SetCallback("OnLeave", HideTooltip);
Zerotorescue@13 157 btnRefresh.frame.tooltipTitle = "Refresh Cache";
Zerotorescue@13 158 btnRefresh.frame.tooltip = "Refresh the list and recache the item counts and auction values.";
Zerotorescue@10 159
Zerotorescue@10 160 mod.scrollFrame:AddChild(btnRefresh);
Zerotorescue@10 161
Zerotorescue@13 162 local lblSpacer = AceGUI:Create("Label");
Zerotorescue@13 163 lblSpacer:SetRelativeWidth(.03);
Zerotorescue@13 164
Zerotorescue@13 165 mod.scrollFrame:AddChild(lblSpacer);
Zerotorescue@13 166
Zerotorescue@10 167 -- Speed slider
Zerotorescue@13 168 local sdrSpeed = AceGUI:Create("Slider");
Zerotorescue@13 169 sdrSpeed:SetLabel("Processing speed");
Zerotorescue@62 170 sdrSpeed:SetSliderValues(0.01, 5, 0.01); -- min, max, interval
Zerotorescue@13 171 sdrSpeed:SetIsPercent(true);
Zerotorescue@13 172 sdrSpeed:SetRelativeWidth(.3);
Zerotorescue@13 173 sdrSpeed:SetCallback("OnMouseUp", function(self, event, value)
Zerotorescue@62 174 addon.db.profile.defaults.summary.speed = ceil( ( ( value * 100 ) / 5) - .5 );
Zerotorescue@13 175
Zerotorescue@61 176 CACHE_ITEMS_PER_UPDATE = addon.db.profile.defaults.summary.speed; -- max = 20, min = 1
Zerotorescue@10 177 end);
Zerotorescue@61 178 sdrSpeed:SetValue( addon.db.profile.defaults.summary.speed * 5 / 100 );
Zerotorescue@13 179 sdrSpeed:SetCallback("OnEnter", ShowTooltip);
Zerotorescue@13 180 sdrSpeed:SetCallback("OnLeave", HideTooltip);
Zerotorescue@13 181 sdrSpeed.frame.tooltipTitle = "Caching Processing Speed";
Zerotorescue@13 182 sdrSpeed.frame.tooltip = "Change the speed at which item counts and auction values are being cached. Higher is faster but may drastically reduce your FPS while caching.\n\nAnything above 100% will probably become uncomfortable.";
Zerotorescue@10 183
Zerotorescue@13 184 mod.scrollFrame:AddChild(sdrSpeed);
Zerotorescue@13 185
Zerotorescue@13 186 local lblSpacer = AceGUI:Create("Label");
Zerotorescue@13 187 lblSpacer:SetRelativeWidth(.23);
Zerotorescue@13 188
Zerotorescue@13 189 mod.scrollFrame:AddChild(lblSpacer);
Zerotorescue@13 190
Zerotorescue@13 191 -- Config button
Zerotorescue@13 192 --[[local btnConfig = AceGUI:Create("Button");
Zerotorescue@13 193 btnConfig:SetText("Config");
Zerotorescue@13 194 btnConfig:SetRelativeWidth(.2);
Zerotorescue@13 195 btnConfig:SetCallback("OnClick", function()
Zerotorescue@13 196 --TODO: Tidy up
Zerotorescue@13 197 SlashCmdList["INVENTORIUM"]("config");
Zerotorescue@13 198 end);
Zerotorescue@13 199 btnConfig:SetCallback("OnEnter", ShowTooltip);
Zerotorescue@13 200 btnConfig:SetCallback("OnLeave", HideTooltip);
Zerotorescue@13 201 btnConfig.frame.tooltipTitle = "Config";
Zerotorescue@13 202 btnConfig.frame.tooltip = "Click to open the config window. This will close the current window.";
Zerotorescue@13 203
Zerotorescue@13 204 mod.scrollFrame:AddChild(btnConfig);]]
Zerotorescue@13 205
Zerotorescue@13 206 local lblSpacer = AceGUI:Create("Label");
Zerotorescue@13 207 lblSpacer:SetRelativeWidth(.03);
Zerotorescue@13 208
Zerotorescue@13 209 mod.scrollFrame:AddChild(lblSpacer);
Zerotorescue@13 210
Zerotorescue@13 211 -- Queue all button
Zerotorescue@13 212 local btnQueueAll = AceGUI:Create("Button");
Zerotorescue@13 213 btnQueueAll:SetText("Queue All");
Zerotorescue@13 214 btnQueueAll:SetRelativeWidth(.2);
Zerotorescue@13 215 btnQueueAll:SetCallback("OnClick", function()
Zerotorescue@14 216 self:SendMessage("IM_QUEUE_ALL");
Zerotorescue@13 217 end);
Zerotorescue@13 218 btnQueueAll:SetCallback("OnEnter", ShowTooltip);
Zerotorescue@13 219 btnQueueAll:SetCallback("OnLeave", HideTooltip);
Zerotorescue@13 220 btnQueueAll.frame.tooltipTitle = "Queue all";
Zerotorescue@13 221 btnQueueAll.frame.tooltip = "Queue everything that requires restocking within every single visible group.";
Zerotorescue@13 222
Zerotorescue@13 223 mod.scrollFrame:AddChild(btnQueueAll);
Zerotorescue@10 224
Zerotorescue@10 225 times.init = ceil( ( GetTime() - buildStartTime ) * 1000 );
Zerotorescue@10 226 addon:Debug("Time spent legend: (init / sorting / preparing / building / all).");
Zerotorescue@10 227
Zerotorescue@1 228 local playerName = UnitName("player");
Zerotorescue@1 229
Zerotorescue@1 230 -- Go through all our stored groups
Zerotorescue@61 231 for groupName, values in pairsByKeys(addon.db.profile.groups, function(a, b) return a:lower() < b:lower(); end) do
Zerotorescue@10 232 local groupStartTime, groupTimes = GetTime(), {};
Zerotorescue@10 233
Zerotorescue@50 234 local trackAt = addon:GetOptionByKey(groupName, "trackAtCharacters");
Zerotorescue@50 235
Zerotorescue@1 236
Zerotorescue@1 237 -- Does this group have any items and do we want to track it at this char?
Zerotorescue@1 238 if values.items and trackAt[playerName] then
Zerotorescue@10 239
Zerotorescue@10 240
Zerotorescue@0 241 -- Get group settings
Zerotorescue@62 242 local minLocalStock = addon:GetOptionByKey(groupName, "minLocalStock");
Zerotorescue@62 243 local minGlobalStock = addon:GetOptionByKey(groupName, "minGlobalStock");
Zerotorescue@50 244 local showWhenBelow = addon:GetOptionByKey(groupName, "summaryThresholdShow");
Zerotorescue@50 245 local priceThreshold = addon:GetOptionByKey(groupName, "priceThreshold");
Zerotorescue@50 246 local hideWhenBelowPriceThreshold = addon:GetOptionByKey(groupName, "summaryHidePriceThreshold");
Zerotorescue@50 247 local alwaysGetAuctionValue = addon:GetOptionByKey(groupName, "alwaysGetAuctionValue");
Zerotorescue@10 248
Zerotorescue@0 249 -- Make group container
Zerotorescue@0 250 local iGroup = AceGUI:Create("InlineGroupWithButton");
Zerotorescue@1 251 iGroup:PauseLayout();
Zerotorescue@0 252 iGroup:SetTitle(groupName);
Zerotorescue@0 253 iGroup:SetFullWidth(true);
Zerotorescue@0 254 iGroup:SetLayout("Flow");
Zerotorescue@0 255 iGroup:MakeButton({
Zerotorescue@0 256 name = "Queue",
Zerotorescue@0 257 desc = "Queue all items in this group.",
Zerotorescue@0 258 exec = function()
Zerotorescue@14 259 print("Queueing all items within " .. groupName .. " craftable by the currently open profession.");
Zerotorescue@14 260 self:SendMessage("IM_QUEUE_GROUP", groupName);
Zerotorescue@0 261 end,
Zerotorescue@0 262 });
Zerotorescue@0 263
Zerotorescue@10 264
Zerotorescue@10 265
Zerotorescue@0 266 -- Headers
Zerotorescue@1 267
Zerotorescue@0 268 -- Itemlink
Zerotorescue@0 269 local lblItem = AceGUI:Create("InteractiveLabel");
Zerotorescue@0 270 lblItem:SetText("|cfffed000Item|r");
Zerotorescue@0 271 lblItem:SetFontObject(GameFontHighlight);
Zerotorescue@57 272 lblItem:SetRelativeWidth(.7);
Zerotorescue@0 273 lblItem:SetCallback("OnClick", function() ReSort("item"); end);
Zerotorescue@13 274 lblItem:SetCallback("OnEnter", ShowTooltip);
Zerotorescue@13 275 lblItem:SetCallback("OnLeave", HideTooltip);
Zerotorescue@13 276 lblItem.frame.tooltipTitle = "Item";
Zerotorescue@13 277 lblItem.frame.tooltip = "Sort on the item quality, then name.";
Zerotorescue@0 278
Zerotorescue@0 279 iGroup:AddChild(lblItem);
Zerotorescue@0 280
Zerotorescue@50 281 -- Local quantity
Zerotorescue@50 282 local lblLocal = AceGUI:Create("InteractiveLabel");
Zerotorescue@50 283 lblLocal:SetText("|cfffed000Loc.|r");
Zerotorescue@50 284 lblLocal:SetFontObject(GameFontHighlight);
Zerotorescue@50 285 lblLocal:SetRelativeWidth(.099);
Zerotorescue@50 286 lblLocal:SetCallback("OnClick", function() ReSort("local"); end);
Zerotorescue@50 287 lblLocal:SetCallback("OnEnter", ShowTooltip);
Zerotorescue@50 288 lblLocal:SetCallback("OnLeave", HideTooltip);
Zerotorescue@50 289 lblLocal.frame.tooltipTitle = "Local stock";
Zerotorescue@50 290 lblLocal.frame.tooltip = "Sort on the amount of items currently in local stock.";
Zerotorescue@50 291
Zerotorescue@50 292 iGroup:AddChild(lblLocal);
Zerotorescue@50 293
Zerotorescue@0 294 -- Current quantity
Zerotorescue@0 295 local lblQuantity = AceGUI:Create("InteractiveLabel");
Zerotorescue@0 296 lblQuantity:SetText("|cfffed000Cur.|r");
Zerotorescue@0 297 lblQuantity:SetFontObject(GameFontHighlight);
Zerotorescue@10 298 lblQuantity:SetRelativeWidth(.099);
Zerotorescue@0 299 lblQuantity:SetCallback("OnClick", function() ReSort("current"); end);
Zerotorescue@13 300 lblQuantity:SetCallback("OnEnter", ShowTooltip);
Zerotorescue@13 301 lblQuantity:SetCallback("OnLeave", HideTooltip);
Zerotorescue@13 302 lblQuantity.frame.tooltipTitle = "Current stock";
Zerotorescue@13 303 lblQuantity.frame.tooltip = "Sort on the amount of items currently in stock.";
Zerotorescue@0 304
Zerotorescue@0 305 iGroup:AddChild(lblQuantity);
Zerotorescue@0 306
Zerotorescue@1 307 -- Lowest value
Zerotorescue@1 308 local lblValue = AceGUI:Create("InteractiveLabel");
Zerotorescue@1 309 lblValue:SetText("|cfffed000Value|r");
Zerotorescue@1 310 lblValue:SetFontObject(GameFontHighlight);
Zerotorescue@10 311 lblValue:SetRelativeWidth(.099);
Zerotorescue@1 312 lblValue:SetCallback("OnClick", function() ReSort("value"); end);
Zerotorescue@13 313 lblValue:SetCallback("OnEnter", ShowTooltip);
Zerotorescue@13 314 lblValue:SetCallback("OnLeave", HideTooltip);
Zerotorescue@13 315 lblValue.frame.tooltipTitle = "Value";
Zerotorescue@13 316 lblValue.frame.tooltip = "Sort on the item auction value.";
Zerotorescue@1 317
Zerotorescue@1 318 iGroup:AddChild(lblValue);
Zerotorescue@1 319
Zerotorescue@10 320
Zerotorescue@10 321 -- Retrieve items list
Zerotorescue@1 322 if not itemsCache[groupName] then
Zerotorescue@1 323 itemsCache[groupName] = {};
Zerotorescue@0 324
Zerotorescue@1 325 -- Sort item list
Zerotorescue@12 326 for itemId, _ in pairs(values.items) do
Zerotorescue@1 327 local itemName, itemLink, itemRarity = GetItemInfo(itemId);
Zerotorescue@1 328
Zerotorescue@62 329 tinsert(itemsCache[groupName], {
Zerotorescue@1 330 id = itemId,
Zerotorescue@73 331 name = itemName, -- may be nil
Zerotorescue@73 332 link = itemLink, -- may be nil
Zerotorescue@23 333 value = ((priceThreshold == 0 and not alwaysGetAuctionValue) and -4) or -3,-- if (no price threshold is set for this item and you don't want to always get auction value), then don't look it up either --addon:GetAuctionValue(itemLink),
Zerotorescue@73 334 rarity = itemRarity, -- may be nil
Zerotorescue@23 335 count = -3,--addon:GetItemCount(itemId, groupName),
Zerotorescue@50 336 localCount = -3,
Zerotorescue@1 337 set = {},
Zerotorescue@1 338 });
Zerotorescue@1 339 CACHE_ITEMS_TOTAL = CACHE_ITEMS_TOTAL + 1;
Zerotorescue@1 340 end
Zerotorescue@0 341 end
Zerotorescue@0 342
Zerotorescue@10 343 groupTimes.init = ceil( ( GetTime() - groupStartTime ) * 1000 );
Zerotorescue@10 344
Zerotorescue@10 345
Zerotorescue@10 346
Zerotorescue@10 347 -- Sort items
Zerotorescue@1 348 table.sort(itemsCache[groupName], function(a, b)
Zerotorescue@73 349 local aRarity = a.rarity or 1;
Zerotorescue@73 350 local bRarity = b.rarity or 1;
Zerotorescue@73 351
Zerotorescue@73 352 if sortMethod == "item" and aRarity == bRarity then
Zerotorescue@1 353 -- Do a name-compare for items of the same rarity
Zerotorescue@1 354 -- Otherwise epics first, then junk
Zerotorescue@73 355
Zerotorescue@73 356 local aName = a.name or printf(unknownItemName, a.id);
Zerotorescue@73 357 local bName = b.name or printf(unknownItemName, b.id);
Zerotorescue@73 358
Zerotorescue@0 359 if sortDirectory == "ASC" then
Zerotorescue@73 360 return supper(aName) < supper(bName);
Zerotorescue@0 361 else
Zerotorescue@73 362 return supper(aName) > supper(bName);
Zerotorescue@1 363 end
Zerotorescue@1 364 elseif sortMethod == "item" then
Zerotorescue@1 365 if sortDirectory == "ASC" then
Zerotorescue@73 366 return aRarity > bRarity; -- the comparers were reversed because we want epics first
Zerotorescue@1 367 else
Zerotorescue@73 368 return aRarity < bRarity; -- the comparers were reversed because we want epics first
Zerotorescue@0 369 end
Zerotorescue@0 370 elseif sortMethod == "current" then
Zerotorescue@0 371 if sortDirectory == "ASC" then
Zerotorescue@0 372 return a.count < b.count;
Zerotorescue@0 373 else
Zerotorescue@0 374 return a.count > b.count;
Zerotorescue@0 375 end
Zerotorescue@50 376 elseif sortMethod == "local" then
Zerotorescue@50 377 if sortDirectory == "ASC" then
Zerotorescue@50 378 return a.localCount < b.localCount;
Zerotorescue@50 379 else
Zerotorescue@50 380 return a.localCount > b.localCount;
Zerotorescue@50 381 end
Zerotorescue@1 382 elseif sortMethod == "value" then
Zerotorescue@1 383 if sortDirectory == "ASC" then
Zerotorescue@1 384 return a.value < b.value;
Zerotorescue@1 385 else
Zerotorescue@1 386 return a.value > b.value;
Zerotorescue@1 387 end
Zerotorescue@0 388 end
Zerotorescue@0 389 end);
Zerotorescue@0 390
Zerotorescue@10 391 groupTimes.sorting = ceil( ( GetTime() - groupStartTime ) * 1000 );
Zerotorescue@10 392
Zerotorescue@10 393
Zerotorescue@10 394
Zerotorescue@10 395
Zerotorescue@10 396 -- Show itemslist
Zerotorescue@1 397 for i, item in pairs(itemsCache[groupName]) do
Zerotorescue@31 398 -- Go through all items for this group
Zerotorescue@31 399
Zerotorescue@57 400 if (( item.count / minGlobalStock ) < showWhenBelow or ( item.localCount / minLocalStock ) < showWhenBelow) and (not hideWhenBelowPriceThreshold or priceThreshold == 0 or item.value < 0 or item.value >= priceThreshold) then
Zerotorescue@31 401 -- if the option "hide when below threshold" is disabled or no price threshold is set or the value is above the price threshold or the value could not be determined, proceed
Zerotorescue@62 402
Zerotorescue@0 403 local btnItemLink = AceGUI:Create("ItemLinkButton");
Zerotorescue@23 404 btnItemLink:SetUserData("exec", function(_, itemId, _, buttonName)
Zerotorescue@23 405 local itemName, itemLink = GetItemInfo(itemId);
Zerotorescue@23 406
Zerotorescue@23 407 if buttonName == "LeftButton" and IsShiftKeyDown() and itemLink then
Zerotorescue@23 408 ChatEdit_InsertLink(itemLink);
Zerotorescue@23 409 elseif buttonName == "LeftButton" and IsAltKeyDown() and itemName and AuctionFrame and AuctionFrame:IsShown() and AuctionFrameBrowse then
Zerotorescue@23 410 -- Start search at page 0
Zerotorescue@23 411 AuctionFrameBrowse.page = 0;
Zerotorescue@23 412
Zerotorescue@23 413 -- Set the search field (even though we could use "ChatEdit_InsertLink", this ensures the right field is updated)
Zerotorescue@23 414 BrowseName:SetText(itemName)
Zerotorescue@23 415
Zerotorescue@23 416 QueryAuctionItems(itemName, nil, nil, 0, 0, 0, 0, 0, 0);
Zerotorescue@23 417 end
Zerotorescue@23 418 end);
Zerotorescue@57 419 btnItemLink:SetRelativeWidth(.7);
Zerotorescue@73 420 btnItemLink:SetItem(item);
Zerotorescue@0 421
Zerotorescue@0 422 iGroup:AddChild(btnItemLink);
Zerotorescue@0 423
Zerotorescue@50 424 -- Local quantity
Zerotorescue@50 425 local lblLocal = AceGUI:Create("Label");
Zerotorescue@57 426 lblLocal:SetText(self:DisplayItemCount(item.localCount, minLocalStock));
Zerotorescue@50 427 lblLocal:SetRelativeWidth(.099);
Zerotorescue@50 428
Zerotorescue@50 429 iGroup:AddChild(lblLocal);
Zerotorescue@50 430
Zerotorescue@0 431 -- Current quantity
Zerotorescue@0 432 local lblQuantity = AceGUI:Create("Label");
Zerotorescue@57 433 lblQuantity:SetText(self:DisplayItemCount(item.count, minGlobalStock));
Zerotorescue@10 434 lblQuantity:SetRelativeWidth(.099);
Zerotorescue@0 435
Zerotorescue@0 436 iGroup:AddChild(lblQuantity);
Zerotorescue@0 437
Zerotorescue@1 438 -- Value
Zerotorescue@1 439 local lblValue = AceGUI:Create("Label");
Zerotorescue@1 440 lblValue:SetText(self:DisplayMoney(item.value, priceThreshold));
Zerotorescue@10 441 lblValue:SetRelativeWidth(.099);
Zerotorescue@1 442
Zerotorescue@1 443 iGroup:AddChild(lblValue);
Zerotorescue@1 444
Zerotorescue@1 445 -- Remember references to the value and current fields so we can fill them later
Zerotorescue@1 446 if item.set then
Zerotorescue@10 447 -- -3 means the price is unknown, queue look up
Zerotorescue@10 448 if item.value == -3 then
Zerotorescue@10 449 item.set.value = lblValue;
Zerotorescue@10 450 end
Zerotorescue@10 451 if item.count == -3 then
Zerotorescue@10 452 item.set.current = lblQuantity;
Zerotorescue@10 453 end
Zerotorescue@50 454 if item.localCount == -3 then
Zerotorescue@50 455 item.set.localCount = lblLocal;
Zerotorescue@50 456 end
Zerotorescue@10 457
Zerotorescue@10 458 -- Don't queue if we already know everything we want to know
Zerotorescue@50 459 if item.value ~= -3 and item.count ~= -3 and item.localCount ~= -3 then
Zerotorescue@10 460 item.set = nil;
Zerotorescue@10 461 end
Zerotorescue@1 462 end
Zerotorescue@0 463 end
Zerotorescue@0 464 end
Zerotorescue@0 465
Zerotorescue@10 466 groupTimes.preparing = ceil( ( GetTime() - groupStartTime ) * 1000 );
Zerotorescue@10 467
Zerotorescue@1 468 iGroup:ResumeLayout();
Zerotorescue@1 469 mod.scrollFrame:AddChild(iGroup); -- this can take up to .5 seconds, might need to look into again at a later time
Zerotorescue@10 470
Zerotorescue@10 471 groupTimes.building = ceil( ( GetTime() - groupStartTime ) * 1000 );
Zerotorescue@0 472 end
Zerotorescue@10 473
Zerotorescue@13 474 if groupStartTime and groupTimes then
Zerotorescue@62 475 addon:Debug(printf("Building of %s took %d ms (%d / %d / %d / %d / %d).", groupName, ceil( ( GetTime() - groupStartTime ) * 1000 ), groupTimes.init or 0, groupTimes.sorting or 0, groupTimes.preparing or 0, groupTimes.building or 0, ceil( ( GetTime() - buildStartTime ) * 1000 )));
Zerotorescue@13 476 end
Zerotorescue@0 477 end
Zerotorescue@1 478
Zerotorescue@1 479 mod.scrollFrame:ResumeLayout();
Zerotorescue@1 480 mod.scrollFrame:DoLayout();
Zerotorescue@1 481
Zerotorescue@62 482 addon:Debug(printf("Done building summary after %d ms.", ceil( ( GetTime() - buildStartTime ) * 1000 )));
Zerotorescue@10 483
Zerotorescue@1 484 if CACHE_ITEMS_TOTAL > 0 then
Zerotorescue@1 485 cacheStart = GetTime();
Zerotorescue@7 486 self:CancelTimer(self.tmrUpdater, true);
Zerotorescue@1 487 self.tmrUpdater = self:ScheduleRepeatingTimer("UpdateNextItem", .01); -- Once every 100 frames (or once every x frames if you have less than 100 FPS, basically, once every frame)
Zerotorescue@1 488 end
Zerotorescue@1 489 end
Zerotorescue@1 490
Zerotorescue@1 491 function mod:UpdateNextItem()
Zerotorescue@1 492 local i = 0;
Zerotorescue@1 493
Zerotorescue@1 494 for groupName, items in pairs(itemsCache) do
Zerotorescue@61 495 local minGlobalStock = addon:GetOptionByKey(groupName, "minGlobalStock");
Zerotorescue@61 496 local minLocalStock = addon:GetOptionByKey(groupName, "minLocalStock");
Zerotorescue@1 497 local priceThreshold = addon:GetOptionByKey(groupName, "priceThreshold");
Zerotorescue@1 498
Zerotorescue@1 499 for _, item in pairs(items) do
Zerotorescue@1 500 if item.set then
Zerotorescue@10 501 if item.count == -3 then
Zerotorescue@10 502 -- Only if item count was queued, update it
Zerotorescue@23 503 item.count = addon:GetItemCount(item.id, groupName);
Zerotorescue@10 504 if item.set.current and item.set.current.SetText then
Zerotorescue@57 505 item.set.current:SetText(self:DisplayItemCount(item.count, minGlobalStock));
Zerotorescue@10 506 end
Zerotorescue@1 507 end
Zerotorescue@1 508
Zerotorescue@50 509 if item.localCount == -3 then
Zerotorescue@50 510 -- Only if item count was queued, update it
Zerotorescue@54 511 item.localCount = addon:GetLocalItemCount(item.id, groupName);
Zerotorescue@50 512 if item.set.localCount and item.set.localCount.SetText then
Zerotorescue@57 513 item.set.localCount:SetText(self:DisplayItemCount(item.localCount, minLocalStock));
Zerotorescue@50 514 end
Zerotorescue@50 515 end
Zerotorescue@50 516
Zerotorescue@10 517 if item.value == -3 then
Zerotorescue@10 518 -- Only if item value was queued, update it
Zerotorescue@23 519
Zerotorescue@23 520 -- The itemlink might not have been loaded yet in which case we retry
Zerotorescue@23 521 item.link = item.link or select(2, GetItemInfo(item.id));
Zerotorescue@23 522
Zerotorescue@23 523 if item.link then
Zerotorescue@23 524 item.value = addon:GetAuctionValue(item.link, groupName);
Zerotorescue@23 525 if item.set.value and item.set.value.SetText then
Zerotorescue@23 526 item.set.value:SetText(self:DisplayMoney(item.value, priceThreshold));
Zerotorescue@23 527 end
Zerotorescue@10 528 end
Zerotorescue@1 529 end
Zerotorescue@1 530
Zerotorescue@1 531 item.set = nil;
Zerotorescue@1 532
Zerotorescue@1 533 i = i + 1;
Zerotorescue@1 534 CACHE_ITEMS_CURRENT = CACHE_ITEMS_CURRENT + 1;
Zerotorescue@1 535
Zerotorescue@9 536 if mod.frame then
Zerotorescue@62 537 mod.frame:SetStatusText(printf("Caching auction values and item-counts... %d%% has already been processed.", floor(CACHE_ITEMS_CURRENT / CACHE_ITEMS_TOTAL * 100)));
Zerotorescue@9 538 end
Zerotorescue@1 539
Zerotorescue@61 540 if i >= addon.db.profile.defaults.summary.speed then
Zerotorescue@1 541 return;
Zerotorescue@1 542 end
Zerotorescue@1 543 end
Zerotorescue@1 544 end
Zerotorescue@1 545 end
Zerotorescue@1 546
Zerotorescue@1 547 -- Reset trackers
Zerotorescue@1 548 CACHE_ITEMS_TOTAL = 0;
Zerotorescue@1 549 CACHE_ITEMS_CURRENT = 0;
Zerotorescue@1 550
Zerotorescue@1 551 -- Stop timer
Zerotorescue@1 552 self:CancelTimer(self.tmrUpdater, true);
Zerotorescue@10 553
Zerotorescue@10 554 -- Rebuild list so hidden items due to too low prices get added
Zerotorescue@10 555 self:Build();
Zerotorescue@1 556
Zerotorescue@1 557 -- Announce
Zerotorescue@10 558 mod.frame:SetStatusText("All required prices and itemcounts have been cached. This process took " .. ceil(GetTime() - cacheStart) .. " seconds.");
Zerotorescue@1 559
Zerotorescue@1 560 -- Forget time
Zerotorescue@1 561 cacheStart = nil;
Zerotorescue@0 562 end
Zerotorescue@0 563
Zerotorescue@0 564 function mod:ColorCode(num, required)
Zerotorescue@0 565 local percentage = ( num / required );
Zerotorescue@0 566
Zerotorescue@61 567 if percentage >= addon.db.profile.defaults.colors.green then
Zerotorescue@62 568 return printf("|cff00ff00%d|r", num);
Zerotorescue@61 569 elseif percentage >= addon.db.profile.defaults.colors.yellow then
Zerotorescue@62 570 return printf("|cffffff00%d|r", num);
Zerotorescue@61 571 elseif percentage >= addon.db.profile.defaults.colors.orange then
Zerotorescue@62 572 return printf("|cffff9933%d|r", num);
Zerotorescue@61 573 elseif percentage >= addon.db.profile.defaults.colors.red then
Zerotorescue@62 574 return printf("|cffff0000%d|r", num);
Zerotorescue@72 575 else
Zerotorescue@72 576 return num;
Zerotorescue@0 577 end
Zerotorescue@0 578 end
Zerotorescue@0 579
Zerotorescue@1 580 function mod:DisplayMoney(value, priceThreshold)
Zerotorescue@7 581 if value == -1 then
Zerotorescue@7 582 return "|cff0000ffNone up|r";
Zerotorescue@7 583 elseif value == -2 then
Zerotorescue@7 584 return "|cff0000ffNo AH mod|r";
Zerotorescue@9 585 elseif value == -3 then
Zerotorescue@9 586 return "|cffffff00Unknown|r";
Zerotorescue@13 587 elseif value == -4 then
Zerotorescue@13 588 return "|cff00ff00-|r";
Zerotorescue@23 589 elseif value == -5 then
Zerotorescue@23 590 return "|cffff9933Error|r";
Zerotorescue@23 591 elseif priceThreshold and value < priceThreshold then
Zerotorescue@62 592 return printf("|cffaaaaaa%s|r", sgsub(addon:ReadableMoney(value or 0, true), "|([a-fA-F0-9]+)([gsc]+)|r", "%2"));
Zerotorescue@1 593 else
Zerotorescue@1 594 return addon:ReadableMoney(value or 0, true);
Zerotorescue@1 595 end
Zerotorescue@1 596 end
Zerotorescue@1 597
Zerotorescue@9 598 function mod:DisplayItemCount(value, minimumStock)
Zerotorescue@13 599 if value == -1 then
Zerotorescue@13 600 return "|cffffff00Unknown|r";
Zerotorescue@13 601 elseif value == -3 then
Zerotorescue@9 602 return "|cffffff00Unknown|r";
Zerotorescue@9 603 else
Zerotorescue@62 604 return printf("%s / %d", self:ColorCode(value, minimumStock), minimumStock);
Zerotorescue@9 605 end
Zerotorescue@9 606 end
Zerotorescue@9 607
Zerotorescue@0 608 function mod:NumberFormat(num)
Zerotorescue@62 609 local formatted = sgsub(num, "(%d)(%d%d%d)$", "%1,%2", 1);
Zerotorescue@0 610
Zerotorescue@0 611 while true do
Zerotorescue@62 612 formatted, matches = sgsub(formatted, "(%d)(%d%d%d),", "%1,%2,", 1);
Zerotorescue@0 613
Zerotorescue@0 614 if matches == 0 then
Zerotorescue@0 615 break;
Zerotorescue@0 616 end
Zerotorescue@0 617 end
Zerotorescue@0 618
Zerotorescue@0 619 return formatted;
Zerotorescue@1 620 end