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@136
|
258 addon:Print(("Queuing 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
|