annotate Modules/Summary.lua @ 131:a27948591159

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