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@74
|
324 end
|
Zerotorescue@74
|
325
|
Zerotorescue@74
|
326 if #(itemsCache[groupName]) == 0 then
|
Zerotorescue@74
|
327 -- If the item cache is empty
|
Zerotorescue@12
|
328 for itemId, _ in pairs(values.items) do
|
Zerotorescue@74
|
329 local newItemData = addon.ItemData:New(itemId);
|
Zerotorescue@1
|
330
|
Zerotorescue@74
|
331 -- 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
|
332 if priceThreshold == 0 and not alwaysGetAuctionValue then
|
Zerotorescue@74
|
333 newItemData.value = -4;
|
Zerotorescue@74
|
334 end
|
Zerotorescue@74
|
335
|
Zerotorescue@74
|
336 tinsert(itemsCache[groupName], newItemData);
|
Zerotorescue@74
|
337
|
Zerotorescue@1
|
338 CACHE_ITEMS_TOTAL = CACHE_ITEMS_TOTAL + 1;
|
Zerotorescue@1
|
339 end
|
Zerotorescue@0
|
340 end
|
Zerotorescue@0
|
341
|
Zerotorescue@10
|
342 groupTimes.init = ceil( ( GetTime() - groupStartTime ) * 1000 );
|
Zerotorescue@10
|
343
|
Zerotorescue@10
|
344
|
Zerotorescue@10
|
345
|
Zerotorescue@10
|
346 -- Sort items
|
Zerotorescue@1
|
347 table.sort(itemsCache[groupName], function(a, b)
|
Zerotorescue@73
|
348 local aRarity = a.rarity or 1;
|
Zerotorescue@73
|
349 local bRarity = b.rarity or 1;
|
Zerotorescue@73
|
350
|
Zerotorescue@73
|
351 if sortMethod == "item" and aRarity == bRarity then
|
Zerotorescue@1
|
352 -- Do a name-compare for items of the same rarity
|
Zerotorescue@1
|
353 -- Otherwise epics first, then junk
|
Zerotorescue@73
|
354
|
Zerotorescue@73
|
355 local aName = a.name or printf(unknownItemName, a.id);
|
Zerotorescue@73
|
356 local bName = b.name or printf(unknownItemName, b.id);
|
Zerotorescue@73
|
357
|
Zerotorescue@0
|
358 if sortDirectory == "ASC" then
|
Zerotorescue@73
|
359 return supper(aName) < supper(bName);
|
Zerotorescue@0
|
360 else
|
Zerotorescue@73
|
361 return supper(aName) > supper(bName);
|
Zerotorescue@1
|
362 end
|
Zerotorescue@1
|
363 elseif sortMethod == "item" then
|
Zerotorescue@1
|
364 if sortDirectory == "ASC" then
|
Zerotorescue@73
|
365 return aRarity > bRarity; -- the comparers were reversed because we want epics first
|
Zerotorescue@1
|
366 else
|
Zerotorescue@73
|
367 return aRarity < bRarity; -- the comparers were reversed because we want epics first
|
Zerotorescue@0
|
368 end
|
Zerotorescue@0
|
369 elseif sortMethod == "current" then
|
Zerotorescue@0
|
370 if sortDirectory == "ASC" then
|
Zerotorescue@74
|
371 return a.globalCount < b.globalCount;
|
Zerotorescue@0
|
372 else
|
Zerotorescue@74
|
373 return a.globalCount > b.globalCount;
|
Zerotorescue@0
|
374 end
|
Zerotorescue@50
|
375 elseif sortMethod == "local" then
|
Zerotorescue@50
|
376 if sortDirectory == "ASC" then
|
Zerotorescue@50
|
377 return a.localCount < b.localCount;
|
Zerotorescue@50
|
378 else
|
Zerotorescue@50
|
379 return a.localCount > b.localCount;
|
Zerotorescue@50
|
380 end
|
Zerotorescue@1
|
381 elseif sortMethod == "value" then
|
Zerotorescue@1
|
382 if sortDirectory == "ASC" then
|
Zerotorescue@1
|
383 return a.value < b.value;
|
Zerotorescue@1
|
384 else
|
Zerotorescue@1
|
385 return a.value > b.value;
|
Zerotorescue@1
|
386 end
|
Zerotorescue@0
|
387 end
|
Zerotorescue@0
|
388 end);
|
Zerotorescue@0
|
389
|
Zerotorescue@10
|
390 groupTimes.sorting = ceil( ( GetTime() - groupStartTime ) * 1000 );
|
Zerotorescue@10
|
391
|
Zerotorescue@10
|
392
|
Zerotorescue@10
|
393
|
Zerotorescue@10
|
394
|
Zerotorescue@10
|
395 -- Show itemslist
|
Zerotorescue@1
|
396 for i, item in pairs(itemsCache[groupName]) do
|
Zerotorescue@31
|
397 -- Go through all items for this group
|
Zerotorescue@31
|
398
|
Zerotorescue@74
|
399 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
|
400 -- 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
|
401
|
Zerotorescue@0
|
402 local btnItemLink = AceGUI:Create("ItemLinkButton");
|
Zerotorescue@23
|
403 btnItemLink:SetUserData("exec", function(_, itemId, _, buttonName)
|
Zerotorescue@23
|
404 local itemName, itemLink = GetItemInfo(itemId);
|
Zerotorescue@23
|
405
|
Zerotorescue@23
|
406 if buttonName == "LeftButton" and IsShiftKeyDown() and itemLink then
|
Zerotorescue@23
|
407 ChatEdit_InsertLink(itemLink);
|
Zerotorescue@23
|
408 elseif buttonName == "LeftButton" and IsAltKeyDown() and itemName and AuctionFrame and AuctionFrame:IsShown() and AuctionFrameBrowse then
|
Zerotorescue@23
|
409 -- Start search at page 0
|
Zerotorescue@23
|
410 AuctionFrameBrowse.page = 0;
|
Zerotorescue@23
|
411
|
Zerotorescue@23
|
412 -- Set the search field (even though we could use "ChatEdit_InsertLink", this ensures the right field is updated)
|
Zerotorescue@23
|
413 BrowseName:SetText(itemName)
|
Zerotorescue@23
|
414
|
Zerotorescue@23
|
415 QueryAuctionItems(itemName, nil, nil, 0, 0, 0, 0, 0, 0);
|
Zerotorescue@23
|
416 end
|
Zerotorescue@23
|
417 end);
|
Zerotorescue@57
|
418 btnItemLink:SetRelativeWidth(.7);
|
Zerotorescue@73
|
419 btnItemLink:SetItem(item);
|
Zerotorescue@0
|
420
|
Zerotorescue@0
|
421 iGroup:AddChild(btnItemLink);
|
Zerotorescue@0
|
422
|
Zerotorescue@50
|
423 -- Local quantity
|
Zerotorescue@50
|
424 local lblLocal = AceGUI:Create("Label");
|
Zerotorescue@57
|
425 lblLocal:SetText(self:DisplayItemCount(item.localCount, minLocalStock));
|
Zerotorescue@50
|
426 lblLocal:SetRelativeWidth(.099);
|
Zerotorescue@50
|
427
|
Zerotorescue@50
|
428 iGroup:AddChild(lblLocal);
|
Zerotorescue@50
|
429
|
Zerotorescue@0
|
430 -- Current quantity
|
Zerotorescue@0
|
431 local lblQuantity = AceGUI:Create("Label");
|
Zerotorescue@74
|
432 lblQuantity:SetText(self:DisplayItemCount(item.globalCount, minGlobalStock));
|
Zerotorescue@10
|
433 lblQuantity:SetRelativeWidth(.099);
|
Zerotorescue@0
|
434
|
Zerotorescue@0
|
435 iGroup:AddChild(lblQuantity);
|
Zerotorescue@0
|
436
|
Zerotorescue@1
|
437 -- Value
|
Zerotorescue@1
|
438 local lblValue = AceGUI:Create("Label");
|
Zerotorescue@1
|
439 lblValue:SetText(self:DisplayMoney(item.value, priceThreshold));
|
Zerotorescue@10
|
440 lblValue:SetRelativeWidth(.099);
|
Zerotorescue@1
|
441
|
Zerotorescue@1
|
442 iGroup:AddChild(lblValue);
|
Zerotorescue@1
|
443
|
Zerotorescue@1
|
444 -- Remember references to the value and current fields so we can fill them later
|
Zerotorescue@74
|
445 item.set.value = lblValue;
|
Zerotorescue@74
|
446 item.set.globalCount = lblQuantity;
|
Zerotorescue@74
|
447 item.set.localCount = lblLocal;
|
Zerotorescue@0
|
448 end
|
Zerotorescue@0
|
449 end
|
Zerotorescue@0
|
450
|
Zerotorescue@10
|
451 groupTimes.preparing = ceil( ( GetTime() - groupStartTime ) * 1000 );
|
Zerotorescue@10
|
452
|
Zerotorescue@1
|
453 iGroup:ResumeLayout();
|
Zerotorescue@1
|
454 mod.scrollFrame:AddChild(iGroup); -- this can take up to .5 seconds, might need to look into again at a later time
|
Zerotorescue@10
|
455
|
Zerotorescue@10
|
456 groupTimes.building = ceil( ( GetTime() - groupStartTime ) * 1000 );
|
Zerotorescue@0
|
457 end
|
Zerotorescue@10
|
458
|
Zerotorescue@13
|
459 if groupStartTime and groupTimes then
|
Zerotorescue@89
|
460 addon:Debug("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
|
461 end
|
Zerotorescue@0
|
462 end
|
Zerotorescue@1
|
463
|
Zerotorescue@1
|
464 mod.scrollFrame:ResumeLayout();
|
Zerotorescue@1
|
465 mod.scrollFrame:DoLayout();
|
Zerotorescue@1
|
466
|
Zerotorescue@89
|
467 addon:Debug("Done building summary after %d ms.", ceil( ( GetTime() - buildStartTime ) * 1000 ));
|
Zerotorescue@10
|
468
|
Zerotorescue@1
|
469 if CACHE_ITEMS_TOTAL > 0 then
|
Zerotorescue@1
|
470 cacheStart = GetTime();
|
Zerotorescue@7
|
471 self:CancelTimer(self.tmrUpdater, true);
|
Zerotorescue@1
|
472 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
|
473 end
|
Zerotorescue@1
|
474 end
|
Zerotorescue@1
|
475
|
Zerotorescue@1
|
476 function mod:UpdateNextItem()
|
Zerotorescue@1
|
477 local i = 0;
|
Zerotorescue@1
|
478
|
Zerotorescue@1
|
479 for groupName, items in pairs(itemsCache) do
|
Zerotorescue@61
|
480 local minGlobalStock = addon:GetOptionByKey(groupName, "minGlobalStock");
|
Zerotorescue@61
|
481 local minLocalStock = addon:GetOptionByKey(groupName, "minLocalStock");
|
Zerotorescue@1
|
482 local priceThreshold = addon:GetOptionByKey(groupName, "priceThreshold");
|
Zerotorescue@1
|
483
|
Zerotorescue@1
|
484 for _, item in pairs(items) do
|
Zerotorescue@74
|
485 if item.globalCount == -3 or item.localCount == -3 or item.value == -3 then
|
Zerotorescue@74
|
486 if item.globalCount == -3 then
|
Zerotorescue@10
|
487 -- Only if item count was queued, update it
|
Zerotorescue@74
|
488 item.globalCount = addon:GetItemCount(item.id, groupName);
|
Zerotorescue@74
|
489 if item.set.globalCount and item.set.globalCount.SetText then
|
Zerotorescue@74
|
490 item.set.globalCount:SetText(self:DisplayItemCount(item.globalCount, minGlobalStock));
|
Zerotorescue@10
|
491 end
|
Zerotorescue@1
|
492 end
|
Zerotorescue@1
|
493
|
Zerotorescue@50
|
494 if item.localCount == -3 then
|
Zerotorescue@50
|
495 -- Only if item count was queued, update it
|
Zerotorescue@54
|
496 item.localCount = addon:GetLocalItemCount(item.id, groupName);
|
Zerotorescue@50
|
497 if item.set.localCount and item.set.localCount.SetText then
|
Zerotorescue@57
|
498 item.set.localCount:SetText(self:DisplayItemCount(item.localCount, minLocalStock));
|
Zerotorescue@50
|
499 end
|
Zerotorescue@50
|
500 end
|
Zerotorescue@50
|
501
|
Zerotorescue@10
|
502 if item.value == -3 then
|
Zerotorescue@10
|
503 -- Only if item value was queued, update it
|
Zerotorescue@23
|
504
|
Zerotorescue@23
|
505 -- The itemlink might not have been loaded yet in which case we retry
|
Zerotorescue@23
|
506 item.link = item.link or select(2, GetItemInfo(item.id));
|
Zerotorescue@23
|
507
|
Zerotorescue@23
|
508 if item.link then
|
Zerotorescue@23
|
509 item.value = addon:GetAuctionValue(item.link, groupName);
|
Zerotorescue@23
|
510 if item.set.value and item.set.value.SetText then
|
Zerotorescue@23
|
511 item.set.value:SetText(self:DisplayMoney(item.value, priceThreshold));
|
Zerotorescue@23
|
512 end
|
Zerotorescue@10
|
513 end
|
Zerotorescue@1
|
514 end
|
Zerotorescue@1
|
515
|
Zerotorescue@1
|
516 i = i + 1;
|
Zerotorescue@1
|
517 CACHE_ITEMS_CURRENT = CACHE_ITEMS_CURRENT + 1;
|
Zerotorescue@1
|
518
|
Zerotorescue@9
|
519 if mod.frame then
|
Zerotorescue@62
|
520 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
|
521 end
|
Zerotorescue@1
|
522
|
Zerotorescue@61
|
523 if i >= addon.db.profile.defaults.summary.speed then
|
Zerotorescue@1
|
524 return;
|
Zerotorescue@1
|
525 end
|
Zerotorescue@1
|
526 end
|
Zerotorescue@1
|
527 end
|
Zerotorescue@1
|
528 end
|
Zerotorescue@1
|
529
|
Zerotorescue@1
|
530 -- Reset trackers
|
Zerotorescue@1
|
531 CACHE_ITEMS_TOTAL = 0;
|
Zerotorescue@1
|
532 CACHE_ITEMS_CURRENT = 0;
|
Zerotorescue@1
|
533
|
Zerotorescue@1
|
534 -- Stop timer
|
Zerotorescue@1
|
535 self:CancelTimer(self.tmrUpdater, true);
|
Zerotorescue@10
|
536
|
Zerotorescue@10
|
537 -- Rebuild list so hidden items due to too low prices get added
|
Zerotorescue@10
|
538 self:Build();
|
Zerotorescue@1
|
539
|
Zerotorescue@1
|
540 -- Announce
|
Zerotorescue@10
|
541 mod.frame:SetStatusText("All required prices and itemcounts have been cached. This process took " .. ceil(GetTime() - cacheStart) .. " seconds.");
|
Zerotorescue@1
|
542
|
Zerotorescue@1
|
543 -- Forget time
|
Zerotorescue@1
|
544 cacheStart = nil;
|
Zerotorescue@0
|
545 end
|
Zerotorescue@0
|
546
|
Zerotorescue@0
|
547 function mod:ColorCode(num, required)
|
Zerotorescue@0
|
548 local percentage = ( num / required );
|
Zerotorescue@0
|
549
|
Zerotorescue@61
|
550 if percentage >= addon.db.profile.defaults.colors.green then
|
Zerotorescue@62
|
551 return printf("|cff00ff00%d|r", num);
|
Zerotorescue@61
|
552 elseif percentage >= addon.db.profile.defaults.colors.yellow then
|
Zerotorescue@62
|
553 return printf("|cffffff00%d|r", num);
|
Zerotorescue@61
|
554 elseif percentage >= addon.db.profile.defaults.colors.orange then
|
Zerotorescue@62
|
555 return printf("|cffff9933%d|r", num);
|
Zerotorescue@61
|
556 elseif percentage >= addon.db.profile.defaults.colors.red then
|
Zerotorescue@62
|
557 return printf("|cffff0000%d|r", num);
|
Zerotorescue@72
|
558 else
|
Zerotorescue@72
|
559 return num;
|
Zerotorescue@0
|
560 end
|
Zerotorescue@0
|
561 end
|
Zerotorescue@0
|
562
|
Zerotorescue@1
|
563 function mod:DisplayMoney(value, priceThreshold)
|
Zerotorescue@7
|
564 if value == -1 then
|
Zerotorescue@7
|
565 return "|cff0000ffNone up|r";
|
Zerotorescue@7
|
566 elseif value == -2 then
|
Zerotorescue@7
|
567 return "|cff0000ffNo AH mod|r";
|
Zerotorescue@9
|
568 elseif value == -3 then
|
Zerotorescue@9
|
569 return "|cffffff00Unknown|r";
|
Zerotorescue@13
|
570 elseif value == -4 then
|
Zerotorescue@13
|
571 return "|cff00ff00-|r";
|
Zerotorescue@23
|
572 elseif value == -5 then
|
Zerotorescue@23
|
573 return "|cffff9933Error|r";
|
Zerotorescue@23
|
574 elseif priceThreshold and value < priceThreshold then
|
Zerotorescue@62
|
575 return printf("|cffaaaaaa%s|r", sgsub(addon:ReadableMoney(value or 0, true), "|([a-fA-F0-9]+)([gsc]+)|r", "%2"));
|
Zerotorescue@1
|
576 else
|
Zerotorescue@1
|
577 return addon:ReadableMoney(value or 0, true);
|
Zerotorescue@1
|
578 end
|
Zerotorescue@1
|
579 end
|
Zerotorescue@1
|
580
|
Zerotorescue@9
|
581 function mod:DisplayItemCount(value, minimumStock)
|
Zerotorescue@13
|
582 if value == -1 then
|
Zerotorescue@13
|
583 return "|cffffff00Unknown|r";
|
Zerotorescue@13
|
584 elseif value == -3 then
|
Zerotorescue@9
|
585 return "|cffffff00Unknown|r";
|
Zerotorescue@9
|
586 else
|
Zerotorescue@62
|
587 return printf("%s / %d", self:ColorCode(value, minimumStock), minimumStock);
|
Zerotorescue@9
|
588 end
|
Zerotorescue@9
|
589 end
|
Zerotorescue@9
|
590
|
Zerotorescue@0
|
591 function mod:NumberFormat(num)
|
Zerotorescue@62
|
592 local formatted = sgsub(num, "(%d)(%d%d%d)$", "%1,%2", 1);
|
Zerotorescue@0
|
593
|
Zerotorescue@0
|
594 while true do
|
Zerotorescue@62
|
595 formatted, matches = sgsub(formatted, "(%d)(%d%d%d),", "%1,%2,", 1);
|
Zerotorescue@0
|
596
|
Zerotorescue@0
|
597 if matches == 0 then
|
Zerotorescue@0
|
598 break;
|
Zerotorescue@0
|
599 end
|
Zerotorescue@0
|
600 end
|
Zerotorescue@0
|
601
|
Zerotorescue@0
|
602 return formatted;
|
Zerotorescue@1
|
603 end
|