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