farmbuyer@1
|
1 local addon = select(2,...)
|
farmbuyer@1
|
2
|
farmbuyer@1
|
3 --[[
|
farmbuyer@1
|
4 Purely the AceGUI-related routines, and the subroutines needed for support.
|
farmbuyer@1
|
5 ------ Constants
|
farmbuyer@6
|
6 ------ Globals
|
farmbuyer@1
|
7 ------ Behind the scenes routines
|
farmbuyer@1
|
8 ------ Main GUI Window
|
farmbuyer@1
|
9 ------ Popup dialogs
|
farmbuyer@1
|
10 ]]
|
farmbuyer@1
|
11
|
farmbuyer@1
|
12 ------ Constants
|
farmbuyer@1
|
13 local eoi_st_rowheight = 20
|
farmbuyer@16
|
14 local eoi_st_displayed_rows = math.floor(416/eoi_st_rowheight) --math.floor(366/eoi_st_rowheight)
|
farmbuyer@1
|
15 local eoi_st_textured_item_format = "|T%s:"..(eoi_st_rowheight-2).."|t %s[%s]|r%s"
|
farmbuyer@1
|
16 local eoi_st_otherrow_bgcolortable = {
|
farmbuyer@1
|
17 wipe = { ["r"] = 0.3, ["g"] = 0.3, ["b"] = 0.3},
|
farmbuyer@1
|
18 kill = { ["r"] = 0.2, ["g"] = 0.2, ["b"] = 0.2},
|
farmbuyer@1
|
19 time = { ["r"] = 0x0/255, ["g"] = 0x0/255, ["b"] = 1, ["a"] = 0.3},
|
farmbuyer@1
|
20 }
|
farmbuyer@1
|
21 eoi_st_otherrow_bgcolortable[""] = eoi_st_otherrow_bgcolortable["kill"]
|
farmbuyer@4
|
22 --eoi_st_otherrow_bgcolortable["realm"] = eoi_st_otherrow_bgcolortable["time"]
|
farmbuyer@1
|
23 local eoi_st_otherrow_bgcolortable_default
|
farmbuyer@1
|
24 local eoi_st_lootrow_col3_colortable = {
|
farmbuyer@1
|
25 [""] = { text = "", r = 1.0, g = 1.0, b = 1.0, a = 1.0 },
|
farmbuyer@1
|
26 shard = { text = "shard", r = 0xa3/255, g = 0x35/255, b = 0xee/255, a = 1.0 },
|
farmbuyer@1
|
27 offspec = { text = "offspec", r = 0.78, g = 0.61, b = 0.43, a = 1.0 },
|
farmbuyer@1
|
28 gvault = { text = "guild vault", r = 0x33/255, g = 1.0, b = 0x99/255, a = 1.0 },
|
farmbuyer@1
|
29 }
|
farmbuyer@1
|
30 local function eoi_st_lootrow_col3_colortable_func (data, cols, realrow, column, table)
|
farmbuyer@1
|
31 local disp = data[realrow].disposition
|
farmbuyer@1
|
32 return eoi_st_lootrow_col3_colortable[disp or ""]
|
farmbuyer@1
|
33 end
|
farmbuyer@1
|
34 addon.time_column1_used_mt = { __index = {
|
farmbuyer@1
|
35 [2] = {value=""},
|
farmbuyer@1
|
36 [3] = {value=""},
|
farmbuyer@1
|
37 } }
|
farmbuyer@1
|
38 local time_column1_used_mt = addon.time_column1_used_mt
|
farmbuyer@1
|
39
|
farmbuyer@1
|
40
|
farmbuyer@6
|
41 ------ Globals
|
farmbuyer@1
|
42 local GUI = LibStub("AceGUI-3.0")
|
farmbuyer@1
|
43 local flib = LibStub("LibFarmbuyer")
|
farmbuyer@1
|
44
|
farmbuyer@1
|
45 local g_loot = nil
|
farmbuyer@1
|
46 local g_generated = nil
|
farmbuyer@17
|
47 local window_title = "Ouro Loot"
|
farmbuyer@1
|
48
|
farmbuyer@1
|
49 local pairs, ipairs, tinsert, tremove, tonumber = pairs, ipairs, table.insert, table.remove, tonumber
|
farmbuyer@1
|
50
|
farmbuyer@1
|
51 local pprint, tabledump = addon.pprint, flib.tabledump
|
farmbuyer@11
|
52 local GetItemInfo, ITEM_QUALITY_COLORS = GetItemInfo, ITEM_QUALITY_COLORS
|
farmbuyer@1
|
53
|
farmbuyer@1
|
54 -- En masse forward decls of symbols defined inside local blocks
|
farmbuyer@1
|
55 local _generate_text, _populate_text_specials
|
farmbuyer@1
|
56 local _tabtexts, _taborder -- filled out in gui block scope
|
farmbuyer@1
|
57
|
farmbuyer@1
|
58 -- Working around this bug:
|
farmbuyer@1
|
59 -- http://forums.wowace.com/showpost.php?p=295202&postcount=31
|
farmbuyer@1
|
60 do
|
farmbuyer@37
|
61 local function fix_frame_level (level, ...)
|
farmbuyer@1
|
62 for i = 1, select("#", ...) do
|
farmbuyer@1
|
63 local button = select(i, ...)
|
farmbuyer@1
|
64 button:SetFrameLevel(level)
|
farmbuyer@1
|
65 end
|
farmbuyer@1
|
66 end
|
farmbuyer@1
|
67
|
farmbuyer@37
|
68 local function fix_menu_frame_levels()
|
farmbuyer@37
|
69 local f = _G.DropDownList1
|
farmbuyer@1
|
70 local i = 1
|
farmbuyer@1
|
71 while f do
|
farmbuyer@37
|
72 fix_frame_level (f:GetFrameLevel() + 2, f:GetChildren())
|
farmbuyer@1
|
73 i = i + 1
|
farmbuyer@1
|
74 f = _G["DropDownList"..i]
|
farmbuyer@1
|
75 end
|
farmbuyer@1
|
76 end
|
farmbuyer@1
|
77
|
farmbuyer@1
|
78 -- To fix Blizzard's bug caused by the new "self:SetFrameLevel(2);"
|
farmbuyer@37
|
79 hooksecurefunc("UIDropDownMenu_CreateFrames", fix_menu_frame_levels)
|
farmbuyer@1
|
80 end
|
farmbuyer@1
|
81
|
farmbuyer@1
|
82
|
farmbuyer@1
|
83 ------ Behind the scenes routines
|
farmbuyer@1
|
84 -- Text generation
|
farmbuyer@1
|
85 do
|
farmbuyer@1
|
86 local next_insertion_position = 2 -- position in _taborder
|
farmbuyer@1
|
87 local text_gen_funcs, specials_gen_funcs = {}, {}
|
farmbuyer@1
|
88 local accumulator = {}
|
farmbuyer@1
|
89
|
farmbuyer@1
|
90 -- Can do clever things by passing other halting points as zero
|
farmbuyer@1
|
91 function addon:zero_printed_fenceposts(zero)
|
farmbuyer@1
|
92 for t in pairs(text_gen_funcs) do
|
farmbuyer@1
|
93 g_loot.printed[t] = zero or g_loot.printed[t] or 0
|
farmbuyer@1
|
94 end
|
farmbuyer@1
|
95 end
|
farmbuyer@1
|
96
|
farmbuyer@10
|
97 function addon:registered_textgen_iter()
|
farmbuyer@10
|
98 return pairs(text_gen_funcs)
|
farmbuyer@10
|
99 end
|
farmbuyer@10
|
100
|
farmbuyer@1
|
101 -- This function is called during load, so be careful!
|
farmbuyer@1
|
102 function addon:register_text_generator (text_type, title, description, generator, opt_specgen)
|
farmbuyer@1
|
103 if type(generator) ~= 'function' then
|
farmbuyer@1
|
104 error(("Generator for text type '%s' must be a function!"):format(text_type))
|
farmbuyer@1
|
105 end
|
farmbuyer@1
|
106 _tabtexts[text_type] = { title=title, desc=description }
|
farmbuyer@1
|
107 tinsert (_taborder, next_insertion_position, text_type)
|
farmbuyer@1
|
108 next_insertion_position = next_insertion_position + 1
|
farmbuyer@1
|
109 text_gen_funcs[text_type] = generator
|
farmbuyer@1
|
110 specials_gen_funcs[text_type] = opt_specgen
|
farmbuyer@1
|
111 end
|
farmbuyer@1
|
112
|
farmbuyer@1
|
113 -- Called by tabs_generated_text_OGS
|
farmbuyer@1
|
114 function _generate_text (text_type)
|
farmbuyer@1
|
115 local f = text_gen_funcs[text_type]
|
farmbuyer@1
|
116 if not f then
|
farmbuyer@1
|
117 error(("Generator called for unregistered text type '%s'."):format(text_type))
|
farmbuyer@1
|
118 end
|
farmbuyer@1
|
119 g_generated = g_generated or {}
|
farmbuyer@1
|
120 g_loot[text_type] = g_loot[text_type] or ""
|
farmbuyer@1
|
121
|
farmbuyer@1
|
122 if g_loot.printed[text_type] >= #g_loot then return false end
|
farmbuyer@1
|
123 assert(addon.loot_clean == #g_loot, tostring(addon.loot_clean) .. " ~= " .. #g_loot)
|
farmbuyer@1
|
124 -- if glc is nil, #==0 test already returned
|
farmbuyer@1
|
125
|
farmbuyer@1
|
126 local ok,ret = pcall (f, text_type, g_loot, g_loot.printed[text_type], g_generated, accumulator)
|
farmbuyer@1
|
127 if not ok then
|
farmbuyer@1
|
128 error(("ERROR: text generator '%s' failed: %s"):format(text_type, ret))
|
farmbuyer@1
|
129 return false
|
farmbuyer@1
|
130 end
|
farmbuyer@1
|
131 if ret then
|
farmbuyer@1
|
132 g_loot.printed[text_type] = #g_loot
|
farmbuyer@1
|
133 g_generated[text_type] = (g_generated[text_type] or "") .. table.concat(accumulator,'\n') .. '\n'
|
farmbuyer@1
|
134 end
|
farmbuyer@1
|
135 wipe(accumulator)
|
farmbuyer@1
|
136 return ret
|
farmbuyer@1
|
137 end
|
farmbuyer@1
|
138 function _populate_text_specials (editbox, specials, mkb, text_type)
|
farmbuyer@1
|
139 local f = specials_gen_funcs[text_type]
|
farmbuyer@1
|
140 if not f then return end
|
farmbuyer@1
|
141 pcall (f, text_type, editbox, specials, mkb)
|
farmbuyer@1
|
142 end
|
farmbuyer@1
|
143 end
|
farmbuyer@1
|
144
|
farmbuyer@1
|
145 --[[
|
farmbuyer@1
|
146 The g_loot table is populated only with "behavior-relevant" data (names,
|
farmbuyer@1
|
147 links, etc). This function runs through it and fills out the "display-
|
farmbuyer@1
|
148 relevant" bits (icons, user-friendly labels, etc). Everything from the
|
farmbuyer@1
|
149 loot_clean index to the end of the table is filled out, loot_clean is
|
farmbuyer@1
|
150 updated. Override the starting point with the argument.
|
farmbuyer@1
|
151
|
farmbuyer@1
|
152 XXX blizzard's scrolling update and lib-st keep finding some way of displaying
|
farmbuyer@1
|
153 the grid without ever calling the hooked refresh, thereby skipping this
|
farmbuyer@1
|
154 function and erroring on missing columnar data. fuckit. from now on
|
farmbuyer@1
|
155 this function gets called everywhere, all the time, and loops over the
|
farmbuyer@1
|
156 entire goddamn table each time. If we can't find blizz's scrollframe bugs,
|
farmbuyer@1
|
157 we'll just work around them. Sorry for your smoking CPU.
|
farmbuyer@1
|
158
|
farmbuyer@1
|
159 FIXME just move this functionality to a per-entry function and call it once
|
farmbuyer@1
|
160 in _addlootentry. --actually no, then the columnar data won't be updated once
|
farmbuyer@1
|
161 the backend data is changed on the fly.
|
farmbuyer@1
|
162 ]]
|
farmbuyer@1
|
163 do
|
farmbuyer@1
|
164 local grammar = { -- not worth making a mt for this
|
farmbuyer@1
|
165 [2] = "nd",
|
farmbuyer@1
|
166 [3] = "rd",
|
farmbuyer@1
|
167 }
|
farmbuyer@1
|
168
|
farmbuyer@1
|
169 function addon:_fill_out_eoi_data (opt_starting_index)
|
farmbuyer@1
|
170 if #g_loot < 1 then
|
farmbuyer@1
|
171 --pprint('_f_o_e_d', "#g_loot<1")
|
farmbuyer@1
|
172 self.loot_clean = nil
|
farmbuyer@1
|
173 opt_starting_index = nil
|
farmbuyer@1
|
174 end
|
farmbuyer@1
|
175 for i = (opt_starting_index or self.loot_clean or 1), #g_loot do
|
farmbuyer@1
|
176 local e = g_loot[i]
|
farmbuyer@1
|
177 if e == nil then
|
farmbuyer@1
|
178 self.loot_clean = nil
|
farmbuyer@1
|
179 pprint('_f_o_e_d', "index",i,"somehow still in loop past",#g_loot,"bailing")
|
farmbuyer@1
|
180 return
|
farmbuyer@1
|
181 end
|
farmbuyer@1
|
182
|
farmbuyer@1
|
183 -- XXX FIXME a major weakness here is that we're constantly replacing
|
farmbuyer@1
|
184 -- what's already been created. Lots of garbage. Trying to detect what
|
farmbuyer@1
|
185 -- actually needs to be replaced is even worse. We'll live with
|
farmbuyer@1
|
186 -- garbage for now.
|
farmbuyer@1
|
187 if e.kind == 'loot' then
|
farmbuyer@11
|
188 local textured = eoi_st_textured_item_format:format (e.itexture, ITEM_QUALITY_COLORS[e.quality].hex, e.itemname, e.count or "")
|
farmbuyer@1
|
189 e.cols = {
|
farmbuyer@1
|
190 {value = textured},
|
farmbuyer@1
|
191 {value = e.person},
|
farmbuyer@1
|
192 { color = eoi_st_lootrow_col3_colortable_func }
|
farmbuyer@1
|
193 }
|
farmbuyer@1
|
194 -- This is horrible. Must do better.
|
farmbuyer@1
|
195 if e.extratext then for k,v in pairs(eoi_st_lootrow_col3_colortable) do
|
farmbuyer@1
|
196 if v.text == e.extratext then
|
farmbuyer@1
|
197 e.disposition = k
|
farmbuyer@1
|
198 --e.extratext = nil, not feasible
|
farmbuyer@1
|
199 break
|
farmbuyer@1
|
200 end
|
farmbuyer@1
|
201 end end
|
farmbuyer@1
|
202 local ex = eoi_st_lootrow_col3_colortable[e.disposition or ""].text
|
farmbuyer@1
|
203 if e.bcast_from and e.extratext then
|
farmbuyer@1
|
204 ex = e.extratext .. " (from " .. e.bcast_from .. ")"
|
farmbuyer@1
|
205 elseif e.bcast_from then
|
farmbuyer@1
|
206 ex = "(from " .. e.bcast_from .. ")"
|
farmbuyer@1
|
207 elseif e.extratext then
|
farmbuyer@1
|
208 ex = e.extratext
|
farmbuyer@1
|
209 end
|
farmbuyer@1
|
210 e.cols[3].value = ex
|
farmbuyer@1
|
211
|
farmbuyer@1
|
212 elseif e.kind == 'boss' then
|
farmbuyer@1
|
213 local v
|
farmbuyer@1
|
214 if e.reason == 'kill' then
|
farmbuyer@1
|
215 if e.attempts == 1 then
|
farmbuyer@1
|
216 v = "one-shot"
|
farmbuyer@1
|
217 else
|
farmbuyer@16
|
218 v = ("kill on %d%s attempt"):format(e.attempts or 0, grammar[e.attempts] or "th")
|
farmbuyer@1
|
219 end
|
farmbuyer@1
|
220 v = ("%s (%d:%.2d)"):format(v, math.floor(e.duration/60), math.floor(e.duration%60))
|
farmbuyer@1
|
221 elseif e.reason == 'wipe' then
|
farmbuyer@1
|
222 v = ("wipe (%d:%.2d)"):format(math.floor(e.duration/60), math.floor(e.duration%60))
|
farmbuyer@1
|
223 end
|
farmbuyer@1
|
224 e.cols = {
|
farmbuyer@1
|
225 {value = e.bosskill},
|
farmbuyer@1
|
226 {value = e.instance},
|
farmbuyer@1
|
227 {value = v or ""},
|
farmbuyer@1
|
228 }
|
farmbuyer@1
|
229
|
farmbuyer@1
|
230 elseif e.kind == 'time' then
|
farmbuyer@1
|
231 e.cols = setmetatable({
|
farmbuyer@1
|
232 {value=e.startday.text},
|
farmbuyer@1
|
233 }, time_column1_used_mt)
|
farmbuyer@1
|
234 --[[e.cols = {
|
farmbuyer@1
|
235 {value=e.startday.text},
|
farmbuyer@1
|
236 {value=""},
|
farmbuyer@1
|
237 {value=""},
|
farmbuyer@1
|
238 }]]
|
farmbuyer@1
|
239
|
farmbuyer@1
|
240 end
|
farmbuyer@1
|
241 end
|
farmbuyer@1
|
242 self.loot_clean = #g_loot
|
farmbuyer@1
|
243 end
|
farmbuyer@1
|
244 end
|
farmbuyer@1
|
245
|
farmbuyer@1
|
246 do
|
farmbuyer@1
|
247 function addon:_fill_out_hist_data (opt_starting_index)
|
farmbuyer@6
|
248 local new, del = flib.new, flib.del
|
farmbuyer@6
|
249
|
farmbuyer@1
|
250 -- Clearing history finishes this function with #hist==0 and hist_clean==0.
|
farmbuyer@1
|
251 -- The next call typically detects this (#<1) and handles it. If loot is
|
farmbuyer@1
|
252 -- recorded before then, it results in hist_clean==0 and #hist==1, which
|
farmbuyer@1
|
253 -- breaks the first iteration of the loop. Thus, the "extra" test here:
|
farmbuyer@1
|
254 if #self.history < 1 or self.hist_clean == 0 then
|
farmbuyer@1
|
255 self.hist_clean = nil
|
farmbuyer@1
|
256 opt_starting_index = nil
|
farmbuyer@1
|
257 end
|
farmbuyer@1
|
258 if not self.history.st then
|
farmbuyer@6
|
259 --print"creating ST!"
|
farmbuyer@1
|
260 self.history.st = {
|
farmbuyer@4
|
261 --[[{ kind = "realm",
|
farmbuyer@1
|
262 cols = setmetatable({
|
farmbuyer@1
|
263 { value = self.history.realm },
|
farmbuyer@1
|
264 }, time_column1_used_mt)
|
farmbuyer@4
|
265 }]]
|
farmbuyer@1
|
266 }
|
farmbuyer@1
|
267 end
|
farmbuyer@6
|
268
|
farmbuyer@6
|
269 -- for now
|
farmbuyer@6
|
270 if self.hist_clean == #self.history then return end
|
farmbuyer@6
|
271
|
farmbuyer@1
|
272 local st = self.history.st
|
farmbuyer@6
|
273 --print("starting history loop, #st ==", #st, "#history ==", #self.history)
|
farmbuyer@6
|
274 for i,t in ipairs(st) do
|
farmbuyer@6
|
275 del(t.cols[1])
|
farmbuyer@6
|
276 del(t.cols[2])
|
farmbuyer@6
|
277 del(t.cols[3])
|
farmbuyer@6
|
278 del(t.cols)
|
farmbuyer@6
|
279 del(t)
|
farmbuyer@6
|
280 st[i] = nil
|
farmbuyer@6
|
281 end
|
farmbuyer@1
|
282
|
farmbuyer@6
|
283 --for i = (opt_starting_index or self.hist_clean or 1), #self.history do
|
farmbuyer@6
|
284 local cache_okay = true
|
farmbuyer@6
|
285 for pi,player in ipairs(self.history) do
|
farmbuyer@6
|
286 local col1 = new()
|
farmbuyer@6
|
287 col1.OLi = pi
|
farmbuyer@6
|
288 col1.OLn = #player
|
farmbuyer@6
|
289 col1.value = player.name -- may spiffy this up in future
|
farmbuyer@1
|
290
|
farmbuyer@6
|
291 for li,loot in ipairs(player) do
|
farmbuyer@6
|
292 local col2 = new()
|
farmbuyer@6
|
293 col2.OLi = li
|
farmbuyer@6
|
294 local col3 = new()
|
farmbuyer@6
|
295 col3.value = loot.when
|
farmbuyer@6
|
296
|
farmbuyer@6
|
297 local itexture = GetItemIcon(loot.id)
|
farmbuyer@6
|
298 local iname, ilink, iquality = GetItemInfo(loot.id)
|
farmbuyer@4
|
299 local textured
|
farmbuyer@4
|
300 if itexture and iname then
|
farmbuyer@6
|
301 textured = eoi_st_textured_item_format:format (itexture,
|
farmbuyer@11
|
302 ITEM_QUALITY_COLORS[iquality].hex, iname, loot.count or "")
|
farmbuyer@4
|
303 else
|
farmbuyer@6
|
304 textured = eoi_st_textured_item_format:format ([[ICONS\INV_Misc_QuestionMark]],
|
farmbuyer@19
|
305 ITEM_QUALITY_COLORS[ITEM_QUALITY_COMMON].hex, 'UNKNOWN - REDISPLAY LATER', "")
|
farmbuyer@6
|
306 cache_okay = false
|
farmbuyer@4
|
307 end
|
farmbuyer@6
|
308 col2.value = textured
|
farmbuyer@6
|
309
|
farmbuyer@6
|
310 local dotcols = new (col1, col2, col3)
|
farmbuyer@6
|
311 local st_entry = new()
|
farmbuyer@6
|
312 st_entry.kind = 'history'
|
farmbuyer@6
|
313 st_entry.OLwho = player.name
|
farmbuyer@6
|
314 st_entry.cols = dotcols
|
farmbuyer@16
|
315 st_entry.itemlink = ilink -- for onenter and onclick
|
farmbuyer@6
|
316 tinsert (st, st_entry)
|
farmbuyer@1
|
317 end
|
farmbuyer@6
|
318 end
|
farmbuyer@1
|
319
|
farmbuyer@6
|
320 --print("finished history loop, #st ==", #st)
|
farmbuyer@6
|
321 self.hist_clean = cache_okay and #self.history or nil
|
farmbuyer@1
|
322 end
|
farmbuyer@6
|
323
|
farmbuyer@6
|
324
|
farmbuyer@1
|
325 end
|
farmbuyer@1
|
326
|
farmbuyer@1
|
327
|
farmbuyer@1
|
328 ------ Main GUI Window
|
farmbuyer@37
|
329 local _d -- display when it's open, eoiST when it's not
|
farmbuyer@1
|
330 local function setstatus(txt) _d:SetStatusText(txt) end
|
farmbuyer@1
|
331 local function statusy_OnLeave() setstatus("") end
|
farmbuyer@1
|
332 local tabgroup_tabs
|
farmbuyer@1
|
333
|
farmbuyer@1
|
334 --[[
|
farmbuyer@1
|
335 Controls for the tabs on the left side of the main display.
|
farmbuyer@1
|
336 ]]
|
farmbuyer@1
|
337 _tabtexts = {
|
farmbuyer@1
|
338 ["eoi"] = {title=[[Loot]], desc=[[Observed loot, plus boss kills and other events of interest]]},
|
farmbuyer@1
|
339 ["hist"] = {title=[[History]], desc=[[A short semi-permanent record]]},
|
farmbuyer@1
|
340 ["help"] = {title=[[Help]], desc=[[Instructions, reminders, and tips for non-obvious features]]},
|
farmbuyer@1
|
341 ["opt"] = {title=[[Options]], desc=[[Options for fine-tuning behavior]]},
|
farmbuyer@1
|
342 --["adv"] = {title=[[Advanced]], desc=[[Debugging and testing]]},
|
farmbuyer@1
|
343 }
|
farmbuyer@6
|
344 --if addon.author_debug then
|
farmbuyer@1
|
345 _taborder = { "eoi", "hist", "help", "opt" }
|
farmbuyer@6
|
346 --else _taborder = { "eoi", "help", "opt" } end
|
farmbuyer@1
|
347
|
farmbuyer@1
|
348 --[[
|
farmbuyer@1
|
349 This is a table of callback functions, each responsible for drawing a tab
|
farmbuyer@1
|
350 into the container passed in the first argument. Special-purpose buttons
|
farmbuyer@1
|
351 can optionally be created (mkbutton) and added to the container in the second
|
farmbuyer@1
|
352 argument.
|
farmbuyer@1
|
353 ]]
|
farmbuyer@1
|
354 local tabs_OnGroupSelected = {}
|
farmbuyer@1
|
355 local mkbutton
|
farmbuyer@1
|
356 local tabs_OnGroupSelected_func, tabs_generated_text_OGS
|
farmbuyer@1
|
357
|
farmbuyer@1
|
358 function addon:gui_init (loot_pointer)
|
farmbuyer@1
|
359 g_loot = loot_pointer
|
farmbuyer@1
|
360 g_generated = nil
|
farmbuyer@1
|
361 tabgroup_tabs = {}
|
farmbuyer@17
|
362 window_title = "Ouro Loot " .. self.revision
|
farmbuyer@1
|
363 for _,v in ipairs(_taborder) do
|
farmbuyer@1
|
364 tinsert (tabgroup_tabs, {value=v, text=_tabtexts[v].title})
|
farmbuyer@1
|
365 -- By default, tabs are editboxes with generated text
|
farmbuyer@1
|
366 if not tabs_OnGroupSelected[v] then
|
farmbuyer@1
|
367 tabs_OnGroupSelected[v] = tabs_generated_text_OGS
|
farmbuyer@1
|
368 end
|
farmbuyer@1
|
369 end
|
farmbuyer@1
|
370 end
|
farmbuyer@1
|
371
|
farmbuyer@37
|
372 --[[
|
farmbuyer@37
|
373 Dropdown menu handling
|
farmbuyer@37
|
374 ]]
|
farmbuyer@37
|
375 -- forward decls
|
farmbuyer@1
|
376 local eoi_editcell
|
farmbuyer@1
|
377
|
farmbuyer@37
|
378 local dropdownfuncs
|
farmbuyer@37
|
379 do
|
farmbuyer@37
|
380 local ddf_mt = {
|
farmbuyer@37
|
381 __index = {
|
farmbuyer@37
|
382 -- more stuff should be moved into this table
|
farmbuyer@37
|
383 [CLOSE] = function() CloseDropDownMenus() end,
|
farmbuyer@37
|
384 }
|
farmbuyer@37
|
385 }
|
farmbuyer@37
|
386 dropdownfuncs = function(t)
|
farmbuyer@37
|
387 return setmetatable(t, ddf_mt)
|
farmbuyer@37
|
388 end
|
farmbuyer@37
|
389 end
|
farmbuyer@37
|
390
|
farmbuyer@1
|
391 local function dropdownmenu_handler (ddbutton, subfunc, arg)
|
farmbuyer@26
|
392 local i = _d and _d.GetUserData and _d:GetUserData("DD loot index")
|
farmbuyer@26
|
393 if i then
|
farmbuyer@26
|
394 subfunc(i,arg)
|
farmbuyer@26
|
395 _d:GetUserData("eoiST"):OuroLoot_Refresh(i)
|
farmbuyer@26
|
396 end
|
farmbuyer@1
|
397 end
|
farmbuyer@1
|
398
|
farmbuyer@1
|
399 local function gen_easymenu_table (initial, list, funcs)
|
farmbuyer@1
|
400 for _,tag in ipairs(list) do
|
farmbuyer@1
|
401 local name, arg, tiptext
|
farmbuyer@1
|
402 name, tiptext = strsplit('|',tag)
|
farmbuyer@1
|
403 name, arg = strsplit('%',name)
|
farmbuyer@1
|
404 if name == "--" then
|
farmbuyer@1
|
405 tinsert (initial, {
|
farmbuyer@6
|
406 disabled = true, notCheckable = true, text = "",
|
farmbuyer@1
|
407 })
|
farmbuyer@1
|
408 else
|
farmbuyer@1
|
409 if not funcs[name] then
|
farmbuyer@1
|
410 error(("'%s' not defined as a dropdown function"):format(name))
|
farmbuyer@1
|
411 end
|
farmbuyer@1
|
412 tinsert (initial, {
|
farmbuyer@1
|
413 text = name,
|
farmbuyer@1
|
414 func = dropdownmenu_handler,
|
farmbuyer@1
|
415 arg1 = funcs[name],
|
farmbuyer@1
|
416 arg2 = arg,
|
farmbuyer@1
|
417 notCheckable = true,
|
farmbuyer@25
|
418 tooltipOnButton = true,
|
farmbuyer@25
|
419 tooltipWhileDisabled = true,
|
farmbuyer@1
|
420 tooltipTitle = tiptext and name or nil,
|
farmbuyer@1
|
421 tooltipText = tiptext,
|
farmbuyer@1
|
422 })
|
farmbuyer@1
|
423 end
|
farmbuyer@1
|
424 end
|
farmbuyer@1
|
425 return initial
|
farmbuyer@1
|
426 end
|
farmbuyer@1
|
427
|
farmbuyer@1
|
428 local dropdownmenuframe = CreateFrame("Frame", "OuroLootDropDownMenu", nil, "UIDropDownMenuTemplate")
|
farmbuyer@1
|
429
|
farmbuyer@37
|
430
|
farmbuyer@37
|
431 -- Tab 1: Events Of Interest
|
farmbuyer@37
|
432 -- This actually takes up quite a bit of the file.
|
farmbuyer@37
|
433 local eoi_dropdownfuncs
|
farmbuyer@37
|
434 eoi_dropdownfuncs = dropdownfuncs{
|
farmbuyer@1
|
435 df_INSERT = function(rowi,text)
|
farmbuyer@1
|
436 local which = (text == 'loot') and "OUROL_EOI_INSERT_LOOT" or "OUROL_EOI_INSERT"
|
farmbuyer@1
|
437 local dialog = StaticPopup_Show(which,text)
|
farmbuyer@16
|
438 dialog.editBox:SetScript("OnTextChanged",StaticPopup_EditBoxOnTextChanged)
|
farmbuyer@1
|
439 dialog.data = {rowindex=rowi, display=_d, kind=text}
|
farmbuyer@1
|
440 end,
|
farmbuyer@1
|
441
|
farmbuyer@1
|
442 df_DELETE = function(rowi)
|
farmbuyer@1
|
443 local gone = tremove(g_loot,rowi)
|
farmbuyer@1
|
444 addon:Print("Removed %s.",
|
farmbuyer@1
|
445 gone.itemlink or gone.bosskill or gone.startday.text)
|
farmbuyer@36
|
446 if gone.kind == 'loot' and IsShiftKeyDown() then
|
farmbuyer@36
|
447 addon:_delHistoryEntry (rowi, gone)
|
farmbuyer@36
|
448 end
|
farmbuyer@1
|
449 end,
|
farmbuyer@1
|
450
|
farmbuyer@1
|
451 ["Delete remaining entries for this day"] = function(rowi,kind)
|
farmbuyer@28
|
452 -- if kind is boss, also need to stop at new timestamp
|
farmbuyer@28
|
453 local fencepost = addon._find_timeboss_fencepost (kind, rowi)
|
farmbuyer@1
|
454 local count = fencepost and (fencepost-rowi) or (#g_loot-rowi+1)
|
farmbuyer@1
|
455 repeat
|
farmbuyer@37
|
456 eoi_dropdownfuncs.df_DELETE(rowi)
|
farmbuyer@1
|
457 count = count - 1
|
farmbuyer@1
|
458 until count < 1
|
farmbuyer@1
|
459 end,
|
farmbuyer@1
|
460
|
farmbuyer@1
|
461 ["Rebroadcast this loot entry"] = function(rowi)
|
farmbuyer@1
|
462 local e = g_loot[rowi]
|
farmbuyer@1
|
463 -- This only works because GetItemInfo accepts multiple argument formats
|
farmbuyer@1
|
464 addon:broadcast('loot', e.person, e.itemlink, e.count, e.cols[3].value)
|
farmbuyer@28
|
465 addon:Print("Rebroadcast entry", rowi, e.itemlink)
|
farmbuyer@1
|
466 end,
|
farmbuyer@1
|
467
|
farmbuyer@1
|
468 ["Rebroadcast this boss"] = function(rowi,kind)
|
farmbuyer@28
|
469 -- if kind is boss, also need to stop at new timestamp
|
farmbuyer@28
|
470 local fencepost = addon._find_timeboss_fencepost (kind, rowi) or #g_loot
|
farmbuyer@28
|
471 -- this could be a lot of traffic, but frankly it's counterproductive
|
farmbuyer@28
|
472 -- to try to micromanage when ChatThrottleLib is already doing so
|
farmbuyer@28
|
473 repeat
|
farmbuyer@28
|
474 local e = g_loot[rowi]
|
farmbuyer@28
|
475 if e.kind == 'boss' then
|
farmbuyer@28
|
476 addon:broadcast('boss', e.reason, e.bosskill, e.instance)
|
farmbuyer@28
|
477 elseif e.kind == 'loot' then
|
farmbuyer@28
|
478 -- This only works because GetItemInfo accepts multiple argument formats
|
farmbuyer@28
|
479 addon:broadcast('loot', e.person, e.itemlink, e.count, e.cols[3].value)
|
farmbuyer@28
|
480 end
|
farmbuyer@28
|
481 addon:Print("Rebroadcast entry", rowi, e.itemlink or e.bosskill or UNKNOWN)
|
farmbuyer@28
|
482 rowi = rowi + 1
|
farmbuyer@28
|
483 until rowi >= fencepost
|
farmbuyer@1
|
484 end,
|
farmbuyer@1
|
485
|
farmbuyer@1
|
486 ["Mark as normal"] = function(rowi,disp) -- broadcast the change? ugh
|
farmbuyer@25
|
487 local olddisp = g_loot[rowi].disposition
|
farmbuyer@1
|
488 g_loot[rowi].disposition = disp
|
farmbuyer@1
|
489 g_loot[rowi].bcast_from = nil
|
farmbuyer@1
|
490 g_loot[rowi].extratext = nil
|
farmbuyer@25
|
491 addon:history_handle_disposition (rowi, olddisp)
|
farmbuyer@1
|
492 end,
|
farmbuyer@1
|
493
|
farmbuyer@1
|
494 ["Show only this player"] = function(rowi)
|
farmbuyer@1
|
495 local st = _d:GetUserData("eoiST")
|
farmbuyer@1
|
496 _d:SetUserData("player filter name", g_loot[rowi].person)
|
farmbuyer@1
|
497 st:SetFilter(_d:GetUserData("player filter by name"))
|
farmbuyer@1
|
498 _d:GetUserData("eoi_filter_reset"):SetDisabled(false)
|
farmbuyer@1
|
499 end,
|
farmbuyer@1
|
500
|
farmbuyer@1
|
501 ["Change from 'wipe' to 'kill'"] = function(rowi)
|
farmbuyer@1
|
502 addon:_mark_boss_kill(rowi)
|
farmbuyer@1
|
503 -- the fillout function called automatically will start too far down the list
|
farmbuyer@1
|
504 _d:GetUserData("eoiST"):OuroLoot_Refresh()
|
farmbuyer@1
|
505 end,
|
farmbuyer@1
|
506
|
farmbuyer@1
|
507 ["Edit note"] = function(rowi)
|
farmbuyer@1
|
508 eoi_editcell (rowi, _d:GetUserData("DD loot cell"))
|
farmbuyer@1
|
509 end,
|
farmbuyer@1
|
510
|
farmbuyer@1
|
511 df_REASSIGN = function(rowi,to_whom)
|
farmbuyer@24
|
512 addon:reassign_loot (rowi, to_whom)
|
farmbuyer@1
|
513 CloseDropDownMenus() -- also need to close parent menu
|
farmbuyer@1
|
514 end,
|
farmbuyer@1
|
515 ["Enter name..."] = function(rowi)
|
farmbuyer@25
|
516 CloseDropDownMenus() -- also need to close parent menu
|
farmbuyer@1
|
517 local dialog = StaticPopup_Show "OUROL_REASSIGN_ENTER"
|
farmbuyer@1
|
518 dialog.data = {index=rowi, display=_d}
|
farmbuyer@1
|
519 end,
|
farmbuyer@1
|
520 }
|
farmbuyer@1
|
521 -- Would be better to move the %arg to this list rather than below, but
|
farmbuyer@1
|
522 -- that's a lot of extra effort that doesn't buy much in return.
|
farmbuyer@37
|
523 eoi_dropdownfuncs["Delete this loot event"] = eoi_dropdownfuncs.df_DELETE
|
farmbuyer@37
|
524 eoi_dropdownfuncs["Delete this boss event"] = eoi_dropdownfuncs.df_DELETE
|
farmbuyer@37
|
525 eoi_dropdownfuncs["Insert new loot entry"] = eoi_dropdownfuncs.df_INSERT
|
farmbuyer@37
|
526 eoi_dropdownfuncs["Insert new boss kill event"] = eoi_dropdownfuncs.df_INSERT
|
farmbuyer@37
|
527 eoi_dropdownfuncs["Mark as disenchanted"] = eoi_dropdownfuncs["Mark as normal"]
|
farmbuyer@37
|
528 eoi_dropdownfuncs["Mark as guild vault"] = eoi_dropdownfuncs["Mark as normal"]
|
farmbuyer@37
|
529 eoi_dropdownfuncs["Mark as offspec"] = eoi_dropdownfuncs["Mark as normal"]
|
farmbuyer@37
|
530 eoi_dropdownfuncs["Delete remaining entries for this boss"] =
|
farmbuyer@37
|
531 eoi_dropdownfuncs["Delete remaining entries for this day"]
|
farmbuyer@37
|
532 eoi_dropdownfuncs["Rebroadcast this day"] = eoi_dropdownfuncs["Rebroadcast this boss"]
|
farmbuyer@1
|
533 local eoi_time_dropdown = gen_easymenu_table(
|
farmbuyer@1
|
534 {{
|
farmbuyer@1
|
535 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@1
|
536 isTitle = true,
|
farmbuyer@1
|
537 notClickable = true,
|
farmbuyer@1
|
538 notCheckable = true,
|
farmbuyer@1
|
539 }},
|
farmbuyer@1
|
540 {
|
farmbuyer@25
|
541 "Rebroadcast this day%time|Broadcasts everything from here down until a new day.",
|
farmbuyer@43
|
542 "Delete remaining entries for this day%time|Erases everything from here down until a new day.\n\nHold down the Shift key to also delete the players' corresponding History entry.",
|
farmbuyer@25
|
543 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
|
farmbuyer@25
|
544 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
|
farmbuyer@1
|
545 CLOSE
|
farmbuyer@37
|
546 }, eoi_dropdownfuncs)
|
farmbuyer@1
|
547 local eoi_loot_dropdown = gen_easymenu_table(
|
farmbuyer@1
|
548 {{
|
farmbuyer@1
|
549 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@1
|
550 notClickable = true,
|
farmbuyer@1
|
551 notCheckable = true,
|
farmbuyer@1
|
552 }},
|
farmbuyer@1
|
553 {
|
farmbuyer@1
|
554 "Mark as disenchanted%shard",
|
farmbuyer@1
|
555 "Mark as offspec%offspec",
|
farmbuyer@1
|
556 "Mark as guild vault%gvault",
|
farmbuyer@25
|
557 "Mark as normal|This is the default. Selecting any 'Mark as <x>' action blanks out extra notes about who broadcast this entry, etc.",
|
farmbuyer@1
|
558 "--",
|
farmbuyer@1
|
559 "Rebroadcast this loot entry|Sends this loot event, including special notes, as if it just happened.",
|
farmbuyer@36
|
560 "Delete this loot event|Permanent, no going back!\n\nHold down the Shift key to also delete the player's corresponding History entry.",
|
farmbuyer@43
|
561 "Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day.\n\nHold down the Shift key to also delete the players' corresponding History entry.",
|
farmbuyer@25
|
562 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
|
farmbuyer@25
|
563 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
|
farmbuyer@25
|
564 "Edit note|Same as double-clicking in the notes column.",
|
farmbuyer@1
|
565 "--",
|
farmbuyer@1
|
566 CLOSE
|
farmbuyer@37
|
567 }, eoi_dropdownfuncs)
|
farmbuyer@1
|
568 local eoi_player_dropdown = gen_easymenu_table(
|
farmbuyer@1
|
569 {
|
farmbuyer@1
|
570 {
|
farmbuyer@1
|
571 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@1
|
572 isTitle = true,
|
farmbuyer@1
|
573 notClickable = true,
|
farmbuyer@1
|
574 notCheckable = true,
|
farmbuyer@1
|
575 },
|
farmbuyer@1
|
576 {
|
farmbuyer@1
|
577 text = "Reassign to...",
|
farmbuyer@1
|
578 hasArrow = true,
|
farmbuyer@1
|
579 --menuList = filled in in the fly,
|
farmbuyer@25
|
580 tooltipOnButton = true,
|
farmbuyer@25
|
581 tooltipWhileDisabled = true,
|
farmbuyer@1
|
582 },
|
farmbuyer@1
|
583 },
|
farmbuyer@1
|
584 {
|
farmbuyer@1
|
585 "Show only this player",
|
farmbuyer@1
|
586 CLOSE
|
farmbuyer@37
|
587 }, eoi_dropdownfuncs)
|
farmbuyer@1
|
588 local eoi_boss_dropdown = gen_easymenu_table(
|
farmbuyer@1
|
589 {{
|
farmbuyer@1
|
590 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@1
|
591 isTitle = true,
|
farmbuyer@1
|
592 notClickable = true,
|
farmbuyer@1
|
593 notCheckable = true,
|
farmbuyer@1
|
594 }},
|
farmbuyer@1
|
595 {
|
farmbuyer@25
|
596 "Change from 'wipe' to 'kill'|Also collapses other wipe entries.",
|
farmbuyer@28
|
597 "Rebroadcast this boss%boss|Broadcasts the kill event and all subsequent loot until next boss.",
|
farmbuyer@1
|
598 "Delete this boss event|Permanent, no going back!",
|
farmbuyer@43
|
599 "Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day.\n\nHold down the Shift key to also delete the player's corresponding History entry.",
|
farmbuyer@25
|
600 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
|
farmbuyer@25
|
601 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
|
farmbuyer@1
|
602 "--",
|
farmbuyer@1
|
603 CLOSE
|
farmbuyer@37
|
604 }, eoi_dropdownfuncs)
|
farmbuyer@1
|
605
|
farmbuyer@1
|
606 --[[ quoted verbatim from lib-st docs:
|
farmbuyer@1
|
607 rowFrame This is the UI Frame table for the row.
|
farmbuyer@1
|
608 cellFrame This is the UI Frame table for the cell in the row.
|
farmbuyer@1
|
609 data This is the data table supplied to the scrolling table (in case you lost it :) )
|
farmbuyer@1
|
610 cols This is the cols table supplied to the scrolling table (again, in case you lost it :) )
|
farmbuyer@1
|
611 row This is the number of the UI row that the event was triggered for.<br/> ex. If your scrolling table only shows ten rows, this number will be a number between 1 and 10.
|
farmbuyer@1
|
612 realrow This is the exact row index (after sorting and filtering) in the data table of what data is displayed in the row you triggered the event in. (NOT the UI row!)
|
farmbuyer@1
|
613 column This is the index of which column the event was triggered in.
|
farmbuyer@1
|
614 table This is a reference to the scrollingtable table.
|
farmbuyer@1
|
615 ... Any arguments generated by the '''NORMAL''' Blizzard event triggered by the frame are passed as is.
|
farmbuyer@1
|
616 ]]
|
farmbuyer@1
|
617 local function eoi_st_OnEnter (rowFrame, cellFrame, data, cols, row, realrow, column, table, button, ...)
|
farmbuyer@1
|
618 if (row == nil) or (realrow == nil) then return end -- mouseover column header
|
farmbuyer@1
|
619 local e = data[realrow]
|
farmbuyer@1
|
620 local kind = e.kind
|
farmbuyer@1
|
621
|
farmbuyer@16
|
622 if (kind == 'loot' and column == 1) or (kind == 'history' and column == 2) then
|
farmbuyer@19
|
623 GameTooltip:SetOwner (cellFrame, "ANCHOR_RIGHT", -20, 0)
|
farmbuyer@19
|
624 if e.cache_miss then
|
farmbuyer@19
|
625 GameTooltip:ClearLines()
|
farmbuyer@19
|
626 GameTooltip:AddLine("Missing Cache Data")
|
farmbuyer@19
|
627 GameTooltip:AddLine([[Wait a few seconds, then type]], 0.8, 0.8, 0.8, 1)
|
farmbuyer@19
|
628 GameTooltip:AddLine([[/ouroloot fixcache]], 0, 1, 64/255, nil)
|
farmbuyer@19
|
629 GameTooltip:AddLine([[and redisplay this window.]], 0.8, 0.8, 0.8, 1)
|
farmbuyer@19
|
630 GameTooltip:Show()
|
farmbuyer@19
|
631 elseif e.itemlink then
|
farmbuyer@16
|
632 GameTooltip:SetHyperlink (e.itemlink)
|
farmbuyer@16
|
633 end
|
farmbuyer@1
|
634
|
farmbuyer@1
|
635 elseif kind == 'loot' and column == 2 then
|
farmbuyer@1
|
636 GameTooltip:SetOwner (cellFrame, "ANCHOR_BOTTOMRIGHT", -50, 5)
|
farmbuyer@1
|
637 GameTooltip:ClearLines()
|
farmbuyer@1
|
638 GameTooltip:AddLine(e.person.." Loot:")
|
farmbuyer@1
|
639 local counter = 0
|
farmbuyer@1
|
640 for i,e2 in ipairs(data) do
|
farmbuyer@1
|
641 if e2.person == e.person then -- would be awesome to test for alts
|
farmbuyer@1
|
642 if counter > 10 then
|
farmbuyer@1
|
643 GameTooltip:AddLine("...")
|
farmbuyer@1
|
644 break
|
farmbuyer@1
|
645 else
|
farmbuyer@1
|
646 -- textures screw up too badly, strip them
|
farmbuyer@1
|
647 local textured = e2.cols[1].value
|
farmbuyer@1
|
648 local space = textured:find(" ")
|
farmbuyer@1
|
649 GameTooltip:AddLine(textured:sub(space+1))
|
farmbuyer@1
|
650 counter = counter + 1
|
farmbuyer@1
|
651 end
|
farmbuyer@1
|
652 end
|
farmbuyer@1
|
653 end
|
farmbuyer@1
|
654 GameTooltip:Show()
|
farmbuyer@1
|
655
|
farmbuyer@1
|
656 elseif kind == 'loot' and column == 3 then
|
farmbuyer@1
|
657 setstatus(e.cols[column].value)
|
farmbuyer@1
|
658
|
farmbuyer@1
|
659 end
|
farmbuyer@1
|
660
|
farmbuyer@1
|
661 return false -- continue with default highlighting behavior
|
farmbuyer@1
|
662 end
|
farmbuyer@1
|
663 local function eoi_st_OnLeave (rowFrame, cellFrame, data, cols, row, realrow, column, table, button, ...)
|
farmbuyer@1
|
664 GameTooltip:Hide()
|
farmbuyer@1
|
665 if row and realrow and data[realrow].kind ~= 'loot' then
|
farmbuyer@1
|
666 table:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[data[realrow].reason or data[realrow].kind])
|
farmbuyer@1
|
667 return true -- do not do anything further
|
farmbuyer@1
|
668 else
|
farmbuyer@1
|
669 --setstatus("")
|
farmbuyer@1
|
670 return false -- continue with default un-highlighting behavior
|
farmbuyer@1
|
671 end
|
farmbuyer@1
|
672 end
|
farmbuyer@1
|
673
|
farmbuyer@1
|
674 local function eoi_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
|
farmbuyer@1
|
675 if (row == nil) or (realrow == nil) then return true end -- click column header, suppress reordering
|
farmbuyer@1
|
676 local e = data[realrow]
|
farmbuyer@1
|
677 local kind = e.kind
|
farmbuyer@1
|
678
|
farmbuyer@1
|
679 -- Check for shift-clicking a loot line
|
farmbuyer@16
|
680 if IsModifiedClick("CHATLINK") and
|
farmbuyer@16
|
681 ((kind == 'loot' and column == 1) or (kind == 'history' and column == 2))
|
farmbuyer@16
|
682 then
|
farmbuyer@1
|
683 ChatEdit_InsertLink (e.itemlink)
|
farmbuyer@1
|
684 return true -- do not do anything further
|
farmbuyer@1
|
685 end
|
farmbuyer@1
|
686
|
farmbuyer@1
|
687 -- Remaining actions are all right-click
|
farmbuyer@1
|
688 if button ~= "RightButton" then return true end
|
farmbuyer@1
|
689 _d:SetUserData("DD loot index", realrow)
|
farmbuyer@1
|
690
|
farmbuyer@1
|
691 if kind == 'loot' and (column == 1 or column == 3) then
|
farmbuyer@1
|
692 _d:SetUserData("DD loot cell", cellFrame)
|
farmbuyer@1
|
693 eoi_loot_dropdown[1].text = e.itemlink
|
farmbuyer@1
|
694 EasyMenu (eoi_loot_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
695
|
farmbuyer@1
|
696 elseif kind == 'loot' and column == 2 then
|
farmbuyer@1
|
697 eoi_player_dropdown[1].text = e.person
|
farmbuyer@1
|
698 local raiders = {}
|
farmbuyer@1
|
699 for i = 1, GetNumRaidMembers() do
|
farmbuyer@1
|
700 tinsert (raiders, (GetRaidRosterInfo(i)))
|
farmbuyer@1
|
701 end
|
farmbuyer@1
|
702 table.sort(raiders)
|
farmbuyer@1
|
703 for i = 1, #raiders do
|
farmbuyer@1
|
704 local name = raiders[i]
|
farmbuyer@1
|
705 raiders[i] = {
|
farmbuyer@1
|
706 text = name,
|
farmbuyer@1
|
707 func = dropdownmenu_handler,
|
farmbuyer@37
|
708 arg1 = eoi_dropdownfuncs.df_REASSIGN,
|
farmbuyer@1
|
709 arg2 = name,
|
farmbuyer@1
|
710 notCheckable = true,
|
farmbuyer@1
|
711 }
|
farmbuyer@1
|
712 end
|
farmbuyer@1
|
713 eoi_player_dropdown[2].menuList =
|
farmbuyer@37
|
714 gen_easymenu_table (raiders, {"Enter name...",CLOSE}, eoi_dropdownfuncs)
|
farmbuyer@25
|
715 if e.disposition == 'shard' or e.disposition == 'gvault' then
|
farmbuyer@25
|
716 eoi_player_dropdown[2].disabled = true
|
farmbuyer@25
|
717 eoi_player_dropdown[2].tooltipTitle = "Cannot Reassign"
|
farmbuyer@25
|
718 eoi_player_dropdown[2].tooltipText = "You must first mark this item as 'normal' or 'offspec' before reassignment."
|
farmbuyer@25
|
719 else
|
farmbuyer@25
|
720 eoi_player_dropdown[2].disabled = nil
|
farmbuyer@25
|
721 eoi_player_dropdown[2].tooltipTitle = nil
|
farmbuyer@25
|
722 eoi_player_dropdown[2].tooltipText = nil
|
farmbuyer@25
|
723 end
|
farmbuyer@1
|
724 EasyMenu (eoi_player_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
725
|
farmbuyer@1
|
726 elseif kind == 'boss' then
|
farmbuyer@1
|
727 eoi_boss_dropdown[1].text = e.bosskill
|
farmbuyer@1
|
728 EasyMenu (eoi_boss_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
729
|
farmbuyer@1
|
730 elseif kind == 'time' then
|
farmbuyer@1
|
731 eoi_time_dropdown[1].text = e.startday.text
|
farmbuyer@1
|
732 EasyMenu (eoi_time_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
733
|
farmbuyer@16
|
734 elseif kind == 'history' then -- XXX need to move this into new onclick handler
|
farmbuyer@16
|
735 _d:SetUserData("DD loot cell", cellFrame)
|
farmbuyer@16
|
736 hist_dropdown[1].text = e.itemlink
|
farmbuyer@16
|
737 EasyMenu (hist_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
738 end
|
farmbuyer@1
|
739
|
farmbuyer@1
|
740 return true -- do not do anything further
|
farmbuyer@1
|
741 end
|
farmbuyer@1
|
742
|
farmbuyer@1
|
743 function eoi_editcell (row_index, cell_frame)
|
farmbuyer@1
|
744 local e = g_loot[row_index]
|
farmbuyer@1
|
745 if not e then return end -- how the hell could we get this far?
|
farmbuyer@1
|
746 local celldata = e.cols[3]
|
farmbuyer@1
|
747 local box = GUI:Create("EditBox")
|
farmbuyer@1
|
748 box:SetText(celldata.value)
|
farmbuyer@1
|
749 box:SetUserData("old show", box.editbox:GetScript("OnShow"))
|
farmbuyer@1
|
750 box:SetUserData("old escape", box.editbox:GetScript("OnEscapePressed"))
|
farmbuyer@1
|
751 box.editbox:SetScript("OnShow", box.editbox.SetFocus)
|
farmbuyer@1
|
752 box.editbox:SetScript("OnEscapePressed", function(_be)
|
farmbuyer@1
|
753 _be:ClearFocus()
|
farmbuyer@1
|
754 _be.obj:Release()
|
farmbuyer@1
|
755 end)
|
farmbuyer@1
|
756 box:SetCallback("OnEnterPressed", function(_b,event,value)
|
farmbuyer@1
|
757 e.extratext = value
|
farmbuyer@1
|
758 celldata.value = value
|
farmbuyer@1
|
759 e.bcast_from = nil -- things get screwy if this field is still present. sigh.
|
farmbuyer@1
|
760 e.extratext_byhand = true
|
farmbuyer@1
|
761 value = value and value:match("^(x%d+)")
|
farmbuyer@1
|
762 if value then e.count = value end
|
farmbuyer@1
|
763 _b:Release()
|
farmbuyer@1
|
764 return _d:GetUserData("eoiST"):OuroLoot_Refresh(row_index)
|
farmbuyer@1
|
765 end)
|
farmbuyer@1
|
766 box:SetCallback("OnRelease", function(_b)
|
farmbuyer@1
|
767 _b.editbox:ClearFocus()
|
farmbuyer@1
|
768 _b.editbox:SetScript("OnShow", _b:GetUserData("old show"))
|
farmbuyer@1
|
769 _b.editbox:SetScript("OnEscapePressed", _b:GetUserData("old escape"))
|
farmbuyer@1
|
770 setstatus("")
|
farmbuyer@1
|
771 end)
|
farmbuyer@1
|
772 box.frame:SetAllPoints(cell_frame)
|
farmbuyer@1
|
773 box.frame:SetParent(cell_frame)
|
farmbuyer@1
|
774 box.frame:SetFrameLevel(cell_frame:GetFrameLevel()+1)
|
farmbuyer@1
|
775 box.frame:Show()
|
farmbuyer@1
|
776 setstatus("Press Enter or click Okay to accept changes, or press Escape to cancel them.")
|
farmbuyer@1
|
777 end
|
farmbuyer@1
|
778
|
farmbuyer@1
|
779 local function eoi_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
|
farmbuyer@1
|
780 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
|
farmbuyer@1
|
781 local e = data[realrow]
|
farmbuyer@1
|
782 local kind = e.kind
|
farmbuyer@1
|
783
|
farmbuyer@1
|
784 --_d:SetUserData("DD loot index", realrow)
|
farmbuyer@1
|
785 if kind == 'loot' and column == 3 and button == "LeftButton" then
|
farmbuyer@1
|
786 eoi_editcell (realrow, cellFrame)
|
farmbuyer@1
|
787 end
|
farmbuyer@1
|
788
|
farmbuyer@1
|
789 return true -- do not do anything further
|
farmbuyer@1
|
790 end
|
farmbuyer@1
|
791
|
farmbuyer@1
|
792 -- Used for EOI column 2 and Hist column 1. Both are player name columns.
|
farmbuyer@6
|
793 local function eoi_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
|
farmbuyer@1
|
794 if not fShow then
|
farmbuyer@1
|
795 cellFrame.text:SetText("")
|
farmbuyer@1
|
796 if cellFrame.icontexture then
|
farmbuyer@1
|
797 cellFrame.icontexture:Hide()
|
farmbuyer@1
|
798 end
|
farmbuyer@1
|
799 return
|
farmbuyer@1
|
800 end
|
farmbuyer@1
|
801
|
farmbuyer@1
|
802 local e = data[realrow]
|
farmbuyer@1
|
803 local cell = e.cols[column]
|
farmbuyer@1
|
804
|
farmbuyer@1
|
805 cellFrame.text:SetText(cell.value)
|
farmbuyer@1
|
806 cellFrame.text:SetTextColor(1,1,1,1)
|
farmbuyer@1
|
807
|
farmbuyer@1
|
808 if e.person_class then
|
farmbuyer@1
|
809 local icon
|
farmbuyer@1
|
810 if cellFrame.icontexture then
|
farmbuyer@1
|
811 icon = cellFrame.icontexture
|
farmbuyer@1
|
812 else
|
farmbuyer@1
|
813 icon = cellFrame:CreateTexture(nil,"BACKGROUND")
|
farmbuyer@1
|
814 icon:SetPoint("LEFT", cellFrame, "LEFT")
|
farmbuyer@1
|
815 icon:SetHeight(eoi_st_rowheight-4)
|
farmbuyer@1
|
816 icon:SetWidth(eoi_st_rowheight-4)
|
farmbuyer@1
|
817 icon:SetTexture("Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes")
|
farmbuyer@1
|
818 cellFrame.icontexture = icon
|
farmbuyer@1
|
819 end
|
farmbuyer@1
|
820 icon:SetTexCoord(unpack(CLASS_ICON_TCOORDS[e.person_class]))
|
farmbuyer@1
|
821 icon:Show()
|
farmbuyer@1
|
822 cellFrame.text:SetPoint("LEFT", icon, "RIGHT", 1, 0)
|
farmbuyer@1
|
823 else
|
farmbuyer@1
|
824 if cellFrame.icontexture then
|
farmbuyer@1
|
825 cellFrame.icontexture:Hide()
|
farmbuyer@1
|
826 cellFrame.text:SetPoint("LEFT", cellFrame, "LEFT")
|
farmbuyer@1
|
827 end
|
farmbuyer@1
|
828 end
|
farmbuyer@1
|
829
|
farmbuyer@1
|
830 --if e.kind ~= 'loot' then
|
farmbuyer@1
|
831 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[e.reason or e.kind or ""])
|
farmbuyer@1
|
832 --else
|
farmbuyer@1
|
833 -- table:SetHighLightColor (rowFrame, table:GetDefaultHighlightBlank())
|
farmbuyer@1
|
834 --end
|
farmbuyer@1
|
835 end
|
farmbuyer@1
|
836
|
farmbuyer@1
|
837 local eoi_st_cols = {
|
farmbuyer@1
|
838 { -- col 1
|
farmbuyer@1
|
839 name = "Item",
|
farmbuyer@1
|
840 width = 250,
|
farmbuyer@1
|
841 },
|
farmbuyer@1
|
842 { -- col 2
|
farmbuyer@1
|
843 name = "Player",
|
farmbuyer@1
|
844 width = 130,
|
farmbuyer@1
|
845 DoCellUpdate = eoi_st_col2_DoCellUpdate,
|
farmbuyer@1
|
846 },
|
farmbuyer@1
|
847 { -- col 3
|
farmbuyer@1
|
848 name = "Notes",
|
farmbuyer@3
|
849 width = 250,
|
farmbuyer@1
|
850 },
|
farmbuyer@1
|
851 }
|
farmbuyer@1
|
852
|
farmbuyer@6
|
853 local player_filter_all
|
farmbuyer@6
|
854 local player_filter_by_name = function (st, e)
|
farmbuyer@1
|
855 if e.kind ~= 'loot' then return true end
|
farmbuyer@1
|
856 return e.person == _d:GetUserData("player filter name")
|
farmbuyer@1
|
857 end
|
farmbuyer@1
|
858
|
farmbuyer@1
|
859 -- Tab 1: Events Of Interest (implementation)
|
farmbuyer@1
|
860 tabs_OnGroupSelected["eoi"] = function(ocontainer,specials)
|
farmbuyer@1
|
861 if (not addon.rebroadcast) and (not addon.enabled) and (#g_loot < 1) then
|
farmbuyer@40
|
862 addon.dprint('flow', "Nothing to show in first tab, skipping creation")
|
farmbuyer@40
|
863 return
|
farmbuyer@1
|
864 end
|
farmbuyer@1
|
865
|
farmbuyer@1
|
866 -- The first time this function is called, we set up a persistent ST
|
farmbuyer@1
|
867 -- object and store it. Any other delayed setup work is done, and then
|
farmbuyer@1
|
868 -- this function replaces itself with a smaller, sleeker, sexier one.
|
farmbuyer@1
|
869 -- This function will later be garbage collected.
|
farmbuyer@1
|
870 local ST = LibStub("ScrollingTable"):CreateST(eoi_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
|
farmbuyer@1
|
871 _d:SetUserData("eoiST",ST)
|
farmbuyer@1
|
872 if addon.author_debug then
|
farmbuyer@1
|
873 _G.OLST = ST
|
farmbuyer@1
|
874 end
|
farmbuyer@1
|
875
|
farmbuyer@1
|
876 if not eoi_st_otherrow_bgcolortable_default then
|
farmbuyer@1
|
877 eoi_st_otherrow_bgcolortable_default = ST:GetDefaultHighlightBlank()
|
farmbuyer@1
|
878 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
|
farmbuyer@1
|
879 return eoi_st_otherrow_bgcolortable_default
|
farmbuyer@1
|
880 end})
|
farmbuyer@1
|
881 end
|
farmbuyer@1
|
882
|
farmbuyer@1
|
883 -- Calling SetData breaks (trying to call Refresh) if g_loot hasn't gone
|
farmbuyer@1
|
884 -- through this loop.
|
farmbuyer@1
|
885 addon:_fill_out_eoi_data(1)
|
farmbuyer@1
|
886 -- safety check begin
|
farmbuyer@1
|
887 for i,e in ipairs(g_loot) do
|
farmbuyer@1
|
888 if type(e.cols) ~= 'table' then
|
farmbuyer@1
|
889 addon:Print("ARGH, index",i,"bad in eoi_OGS, type",type(e.cols),
|
farmbuyer@1
|
890 "entry kind", e.kind, "data", e.itemname or e.bosskill or e.startday.text,
|
farmbuyer@1
|
891 "-- please take a screenshot and send to Farmbuyer.")
|
farmbuyer@1
|
892 tabledump(e)
|
farmbuyer@1
|
893 end
|
farmbuyer@1
|
894 end
|
farmbuyer@1
|
895 -- safety check end
|
farmbuyer@1
|
896 ST:SetData(g_loot)
|
farmbuyer@1
|
897 ST:RegisterEvents{
|
farmbuyer@1
|
898 OnEnter = eoi_st_OnEnter,
|
farmbuyer@1
|
899 OnLeave = eoi_st_OnLeave,
|
farmbuyer@1
|
900 OnClick = eoi_st_OnClick,
|
farmbuyer@1
|
901 OnDoubleClick = eoi_st_OnDoubleClick,
|
farmbuyer@1
|
902 }
|
farmbuyer@1
|
903
|
farmbuyer@1
|
904 -- We want a single "update and redraw" function for the ST. Also, the
|
farmbuyer@1
|
905 -- given refresh function is badly named and does nothing; the actual
|
farmbuyer@1
|
906 -- function is SortData (also badly named when no sorting is being done),
|
farmbuyer@1
|
907 -- which unconditionally calls the *hooked* Refresh.
|
farmbuyer@1
|
908 local oldrefresh = ST.Refresh
|
farmbuyer@1
|
909 ST.Refresh = function (self, opt_index)
|
farmbuyer@1
|
910 addon:_fill_out_eoi_data(opt_index)
|
farmbuyer@1
|
911 return oldrefresh(self)
|
farmbuyer@1
|
912 end
|
farmbuyer@1
|
913 ST.OuroLoot_Refresh = function (self, opt_index)
|
farmbuyer@1
|
914 addon:_fill_out_eoi_data(opt_index)
|
farmbuyer@1
|
915 -- safety check begin
|
farmbuyer@1
|
916 for i,e in ipairs(g_loot) do
|
farmbuyer@1
|
917 if type(e.cols) ~= 'table' then
|
farmbuyer@4
|
918 addon:Print("ARGH, index",i,"bad in eoi refresh, refreshed at", opt_index, "type",type(e.cols),
|
farmbuyer@1
|
919 "entry kind", e.kind, "data", e.itemname or e.bosskill or e.startday.text,
|
farmbuyer@1
|
920 "-- please take a screenshot and send to Farmbuyer.")
|
farmbuyer@1
|
921 tabledump(e)
|
farmbuyer@1
|
922 end
|
farmbuyer@1
|
923 end
|
farmbuyer@1
|
924 -- safety check end
|
farmbuyer@1
|
925 self:SortData() -- calls hooked refresh
|
farmbuyer@1
|
926 end
|
farmbuyer@1
|
927
|
farmbuyer@1
|
928 -- No need to keep creating function closures that all just "return true",
|
farmbuyer@1
|
929 -- instead we grab the one made inside lib-st. There's no "get filter" API
|
farmbuyer@1
|
930 -- so we just reach inside.
|
farmbuyer@6
|
931 player_filter_all = ST.Filter
|
farmbuyer@1
|
932
|
farmbuyer@1
|
933 -- Now set up the future drawing function...
|
farmbuyer@1
|
934 tabs_OnGroupSelected["eoi"] = function(container,specials)
|
farmbuyer@1
|
935 local st_widget = GUI:Create("lib-st")
|
farmbuyer@1
|
936 local st = _d:GetUserData("eoiST")
|
farmbuyer@1
|
937
|
farmbuyer@1
|
938 -- This is actually required each time
|
farmbuyer@6
|
939 _d:SetUserData ("player filter clear", player_filter_all)
|
farmbuyer@6
|
940 _d:SetUserData ("player filter by name", player_filter_by_name)
|
farmbuyer@1
|
941
|
farmbuyer@1
|
942 st:OuroLoot_Refresh()
|
farmbuyer@1
|
943 st_widget:WrapST(st)
|
farmbuyer@3
|
944 st_widget.head_offset = 15
|
farmbuyer@3
|
945 st_widget.tail_offset = 0
|
farmbuyer@1
|
946
|
farmbuyer@1
|
947 if OuroLootSV_opts.scroll_to_bottom then
|
farmbuyer@1
|
948 local scrollbar = _G[st.scrollframe:GetName().."ScrollBar"]
|
farmbuyer@1
|
949 if scrollbar then
|
farmbuyer@1
|
950 local _,max = scrollbar:GetMinMaxValues()
|
farmbuyer@1
|
951 scrollbar:SetValue(max) -- also calls hooked Refresh
|
farmbuyer@1
|
952 end
|
farmbuyer@1
|
953 end
|
farmbuyer@1
|
954
|
farmbuyer@1
|
955 container:SetLayout("Fill")
|
farmbuyer@1
|
956 container:AddChild(st_widget)
|
farmbuyer@1
|
957
|
farmbuyer@42
|
958 local b
|
farmbuyer@42
|
959 --[===[ b = mkbutton("Generate Header",
|
farmbuyer@42
|
960 [[]])
|
farmbuyer@42
|
961 b:SetFullWidth(true)
|
farmbuyer@42
|
962 b:SetCallback("OnClick", function (_b)
|
farmbuyer@42
|
963 end)
|
farmbuyer@42
|
964 specials:AddChild(b) ]===]
|
farmbuyer@42
|
965
|
farmbuyer@42
|
966 b = mkbutton('eoi_filter_reset', "Reset Player Filter",
|
farmbuyer@1
|
967 [[Return to showing complete loot information.]])
|
farmbuyer@1
|
968 b:SetFullWidth(true)
|
farmbuyer@1
|
969 b:SetCallback("OnClick", function (_b)
|
farmbuyer@1
|
970 local st = _d:GetUserData("eoiST")
|
farmbuyer@6
|
971 st:SetFilter(player_filter_all)
|
farmbuyer@1
|
972 _b:SetDisabled(true)
|
farmbuyer@1
|
973 end)
|
farmbuyer@6
|
974 b:SetDisabled(st.Filter == player_filter_all)
|
farmbuyer@1
|
975 specials:AddChild(b)
|
farmbuyer@1
|
976
|
farmbuyer@1
|
977 local people = { "<nobody>" }
|
farmbuyer@1
|
978 for i=1,GetNumRaidMembers() do
|
farmbuyer@1
|
979 tinsert(people,(GetRaidRosterInfo(i)))
|
farmbuyer@1
|
980 end
|
farmbuyer@1
|
981 table.sort(people)
|
farmbuyer@1
|
982 local initial
|
farmbuyer@1
|
983 for i,n in ipairs(people) do
|
farmbuyer@1
|
984 if n == addon.sharder then initial = i end
|
farmbuyer@1
|
985 end
|
farmbuyer@1
|
986 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
987 [[If set, items received by this person will be automatically marked as disenchanted.]])
|
farmbuyer@1
|
988 b:SetFullWidth(true)
|
farmbuyer@1
|
989 b:SetLabel("Auto-mark as shard:")
|
farmbuyer@1
|
990 b:SetList(people)
|
farmbuyer@1
|
991 b:SetValue(initial or 1)
|
farmbuyer@1
|
992 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
993 addon.sharder = (choice ~= 1) and people[choice] or nil
|
farmbuyer@1
|
994 end)
|
farmbuyer@1
|
995 specials:AddChild(b)
|
farmbuyer@1
|
996
|
farmbuyer@42
|
997 b = mkbutton('eoi_bcast_req', "Request B'casters",
|
farmbuyer@1
|
998 [[Sends out a request for others to enable loot rebroadcasting if they have not already done so.]])
|
farmbuyer@1
|
999 b:SetFullWidth(true)
|
farmbuyer@1
|
1000 b:SetCallback("OnClick", function ()
|
farmbuyer@1
|
1001 addon:Print("Sending request!")
|
farmbuyer@1
|
1002 addon.requesting = true
|
farmbuyer@1
|
1003 addon:broadcast('bcast_req')
|
farmbuyer@1
|
1004 end)
|
farmbuyer@1
|
1005 b:SetDisabled(not addon.enabled)
|
farmbuyer@1
|
1006 specials:AddChild(b)
|
farmbuyer@1
|
1007 end
|
farmbuyer@1
|
1008 -- ...and call it.
|
farmbuyer@1
|
1009 return tabs_OnGroupSelected["eoi"](ocontainer,specials)
|
farmbuyer@1
|
1010 end
|
farmbuyer@1
|
1011
|
farmbuyer@37
|
1012
|
farmbuyer@1
|
1013 -- Tab 2/3 (generated text)
|
farmbuyer@1
|
1014 function tabs_generated_text_OGS (container, specials, text_kind)
|
farmbuyer@1
|
1015 container:SetLayout("Fill")
|
farmbuyer@1
|
1016 local box = GUI:Create("MultiLineEditBox")
|
farmbuyer@1
|
1017 box:SetFullWidth(true)
|
farmbuyer@1
|
1018 box:SetFullHeight(true)
|
farmbuyer@1
|
1019 box:SetLabel("Pressing the Escape key while typing will return keystroke control to the usual chat window.")
|
farmbuyer@1
|
1020 box:DisableButton(true)
|
farmbuyer@1
|
1021 addon:_fill_out_eoi_data(1)
|
farmbuyer@1
|
1022
|
farmbuyer@1
|
1023 -- Update the savedvar copy of the text before presenting it for editing,
|
farmbuyer@1
|
1024 -- then save it again when editing finishes. This way if the user goes
|
farmbuyer@1
|
1025 -- offline while editing, at least the unedited version is saved instead
|
farmbuyer@1
|
1026 -- of all the new text being lost entirely. (Yes, it's happened.)
|
farmbuyer@1
|
1027 --
|
farmbuyer@1
|
1028 -- No good local-ish place to store the cursor position that will also
|
farmbuyer@1
|
1029 -- survive the entire display being released. Abuse the generated text
|
farmbuyer@1
|
1030 -- cache for this purpose.
|
farmbuyer@1
|
1031 local pos = text_kind.."_pos"
|
farmbuyer@1
|
1032 if _generate_text(text_kind) then
|
farmbuyer@1
|
1033 g_loot[text_kind] = g_loot[text_kind] .. g_generated[text_kind]
|
farmbuyer@1
|
1034 g_generated[text_kind] = nil
|
farmbuyer@1
|
1035 end
|
farmbuyer@1
|
1036 box:SetText(g_loot[text_kind])
|
farmbuyer@1
|
1037 box.editBox:SetCursorPosition(g_generated[pos] or 0)
|
farmbuyer@1
|
1038 box.editBox:SetScript("OnShow", box.editBox.SetFocus)
|
farmbuyer@1
|
1039 box:SetCallback("OnRelease", function(_box)
|
farmbuyer@1
|
1040 box.editBox:ClearFocus()
|
farmbuyer@1
|
1041 g_loot[text_kind] = _box:GetText()
|
farmbuyer@1
|
1042 g_generated[pos] = _box.editBox:GetCursorPosition()
|
farmbuyer@1
|
1043 end)
|
farmbuyer@1
|
1044 container:AddChild(box)
|
farmbuyer@1
|
1045
|
farmbuyer@1
|
1046 local w = mkbutton("Regenerate",
|
farmbuyer@1
|
1047 [[+DISCARD> all text in this tab, and regenerate it from the current loot information.]])
|
farmbuyer@1
|
1048 w:SetFullWidth(true)
|
farmbuyer@1
|
1049 w:SetDisabled ((#g_loot == 0) and (box:GetText() == ""))
|
farmbuyer@1
|
1050 w:SetCallback("OnClick", function(_w)
|
farmbuyer@1
|
1051 box:SetText("")
|
farmbuyer@1
|
1052 g_loot[text_kind] = ""
|
farmbuyer@1
|
1053 g_loot.printed[text_kind] = 0
|
farmbuyer@1
|
1054 g_generated.last_instance = nil
|
farmbuyer@1
|
1055 g_generated[pos] = nil
|
farmbuyer@1
|
1056 addon:Print("'%s' has been regenerated.", _tabtexts[text_kind].title)
|
farmbuyer@1
|
1057 return addon:redisplay()
|
farmbuyer@1
|
1058 --return tabs_OnGroupSelected_func(container,"OnGroupSelected",text_kind)
|
farmbuyer@1
|
1059 end)
|
farmbuyer@1
|
1060 specials:AddChild(w)
|
farmbuyer@1
|
1061 _populate_text_specials (box, specials, mkbutton, text_kind)
|
farmbuyer@1
|
1062 end
|
farmbuyer@1
|
1063
|
farmbuyer@37
|
1064
|
farmbuyer@1
|
1065 -- Tab 4: History
|
farmbuyer@1
|
1066 -- Much of the implementation here follows a similar desgin for the first
|
farmbuyer@4
|
1067 -- tab's handling of ST objects. We will even reuse its controlling tables
|
farmbuyer@4
|
1068 -- when feasible.
|
farmbuyer@37
|
1069 local histST, hist_dropdownfuncs
|
farmbuyer@1
|
1070
|
farmbuyer@37
|
1071 hist_dropdownfuncs = dropdownfuncs{
|
farmbuyer@37
|
1072 ["Delete this loot history"] = function(rowi)
|
farmbuyer@37
|
1073 --local gone = tremove(g_loot,rowi)
|
farmbuyer@37
|
1074 --addon:Print("Removed %s.",
|
farmbuyer@37
|
1075 --gone.itemlink or gone.bosskill or gone.startday.text)
|
farmbuyer@37
|
1076 end,
|
farmbuyer@37
|
1077 }
|
farmbuyer@37
|
1078 local hist_dropdown = gen_easymenu_table(
|
farmbuyer@37
|
1079 {{
|
farmbuyer@37
|
1080 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@37
|
1081 notClickable = true,
|
farmbuyer@37
|
1082 notCheckable = true,
|
farmbuyer@37
|
1083 }},
|
farmbuyer@37
|
1084 {
|
farmbuyer@37
|
1085 "Delete this loot history|Permanent, no going back!",
|
farmbuyer@37
|
1086 --"Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day",
|
farmbuyer@37
|
1087 "--",
|
farmbuyer@37
|
1088 CLOSE
|
farmbuyer@37
|
1089 }, hist_dropdownfuncs)
|
farmbuyer@6
|
1090
|
farmbuyer@37
|
1091 local hist_st_cols = {
|
farmbuyer@37
|
1092 { -- col 1
|
farmbuyer@37
|
1093 name = "Player",
|
farmbuyer@37
|
1094 width = 130,
|
farmbuyer@37
|
1095 DoCellUpdate = eoi_st_col2_DoCellUpdate,
|
farmbuyer@37
|
1096 },
|
farmbuyer@37
|
1097 { -- col 2
|
farmbuyer@37
|
1098 name = "Most Recent Loot",
|
farmbuyer@37
|
1099 width = 250,
|
farmbuyer@37
|
1100 DoCellUpdate = hist_st_col2_DoCellUpdate,
|
farmbuyer@37
|
1101 },
|
farmbuyer@37
|
1102 { -- col 3
|
farmbuyer@37
|
1103 name = "When",
|
farmbuyer@37
|
1104 width = 250,
|
farmbuyer@37
|
1105 DoCellUpdate = hist_st_col3_DoCellUpdate,
|
farmbuyer@37
|
1106 defaultsort = "asc",
|
farmbuyer@37
|
1107 sort = "asc",
|
farmbuyer@37
|
1108 sortnext = 1,
|
farmbuyer@37
|
1109 },
|
farmbuyer@37
|
1110 }
|
farmbuyer@37
|
1111
|
farmbuyer@37
|
1112 local hist_normal_status =
|
farmbuyer@37
|
1113 [[Click on a row to view all history for that player only. (Click column headers to re-sort.)]]
|
farmbuyer@37
|
1114 local hist_name_status =
|
farmbuyer@37
|
1115 [[Right-click on any row to return to normal history display.]]
|
farmbuyer@37
|
1116
|
farmbuyer@37
|
1117 local history_filter_by_recent = function (st, e)
|
farmbuyer@37
|
1118 if e.kind ~= 'history' then return true end
|
farmbuyer@37
|
1119 return e.cols[2].OLi == 1
|
farmbuyer@37
|
1120 end
|
farmbuyer@37
|
1121
|
farmbuyer@37
|
1122 local history_filter_who
|
farmbuyer@37
|
1123 local history_filter_by_name = function (st, e)
|
farmbuyer@37
|
1124 if e.kind ~= 'history' then return true end
|
farmbuyer@37
|
1125 return e.OLwho == history_filter_who
|
farmbuyer@37
|
1126 end
|
farmbuyer@37
|
1127
|
farmbuyer@37
|
1128 -- Loot column
|
farmbuyer@37
|
1129 local function hist_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
|
farmbuyer@37
|
1130 print("col2 DCU", realrow)
|
farmbuyer@37
|
1131 end
|
farmbuyer@37
|
1132
|
farmbuyer@37
|
1133 -- Formatted timestamp column
|
farmbuyer@37
|
1134 local function hist_st_col3_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
|
farmbuyer@37
|
1135 print("col3 DCU", realrow)
|
farmbuyer@37
|
1136 if not fShow then
|
farmbuyer@37
|
1137 cellFrame.text:SetText("")
|
farmbuyer@37
|
1138 return
|
farmbuyer@6
|
1139 end
|
farmbuyer@6
|
1140
|
farmbuyer@37
|
1141 local d = data[realrow]
|
farmbuyer@37
|
1142 local cell = d.cols[column]
|
farmbuyer@37
|
1143
|
farmbuyer@37
|
1144 cellFrame.text:SetText(cell.value)
|
farmbuyer@37
|
1145 cellFrame.text:SetTextColor(1,1,1,1)
|
farmbuyer@37
|
1146
|
farmbuyer@37
|
1147 --if d.kind ~= 'loot' then
|
farmbuyer@37
|
1148 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[d.kind])
|
farmbuyer@37
|
1149 --else
|
farmbuyer@37
|
1150 -- table:SetHighLightColor (rowFrame, table:GetDefaultHighlightBlank())
|
farmbuyer@37
|
1151 --end
|
farmbuyer@37
|
1152 end
|
farmbuyer@37
|
1153
|
farmbuyer@37
|
1154 local function hist_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
|
farmbuyer@37
|
1155 if (row == nil) or (realrow == nil) then return false end -- click column header, do default resorting
|
farmbuyer@37
|
1156 local h = data[realrow]
|
farmbuyer@37
|
1157 local kind = h.kind
|
farmbuyer@37
|
1158
|
farmbuyer@37
|
1159 if history_filter_who and button == "RightButton" then -- now filtering and wanting not to
|
farmbuyer@37
|
1160 history_filter_who = nil
|
farmbuyer@37
|
1161 stable:SetFilter(history_filter_by_recent)
|
farmbuyer@37
|
1162 setstatus(hist_normal_status)
|
farmbuyer@37
|
1163 elseif (not history_filter_who) and button == "LeftButton" then -- not filtering and wanting to
|
farmbuyer@37
|
1164 history_filter_who = h.OLwho
|
farmbuyer@37
|
1165 stable:SetFilter(history_filter_by_name)
|
farmbuyer@37
|
1166 setstatus(hist_name_status)
|
farmbuyer@6
|
1167 end
|
farmbuyer@6
|
1168
|
farmbuyer@37
|
1169 return true -- do not do anything further
|
farmbuyer@37
|
1170 end
|
farmbuyer@37
|
1171
|
farmbuyer@37
|
1172 --[[
|
farmbuyer@37
|
1173 local function hist_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
|
farmbuyer@37
|
1174 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
|
farmbuyer@37
|
1175 local h = data[realrow]
|
farmbuyer@37
|
1176 local kind = h.kind
|
farmbuyer@37
|
1177
|
farmbuyer@37
|
1178 return true -- do not do anything further
|
farmbuyer@37
|
1179 end]]
|
farmbuyer@37
|
1180
|
farmbuyer@37
|
1181 -- Tab 4: History (implementation)
|
farmbuyer@37
|
1182 tabs_OnGroupSelected["hist"] = function(container,specials)
|
farmbuyer@37
|
1183 histST = LibStub("ScrollingTable"):CreateST(hist_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
|
farmbuyer@37
|
1184 _d:SetUserData("histST",histST)
|
farmbuyer@37
|
1185 if addon.author_debug then
|
farmbuyer@37
|
1186 _G.OLHST = histST
|
farmbuyer@1
|
1187 end
|
farmbuyer@1
|
1188
|
farmbuyer@37
|
1189 if not eoi_st_otherrow_bgcolortable_default then
|
farmbuyer@37
|
1190 eoi_st_otherrow_bgcolortable_default = histST:GetDefaultHighlightBlank()
|
farmbuyer@37
|
1191 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
|
farmbuyer@37
|
1192 return eoi_st_otherrow_bgcolortable_default
|
farmbuyer@37
|
1193 end})
|
farmbuyer@1
|
1194 end
|
farmbuyer@1
|
1195
|
farmbuyer@37
|
1196 addon:_build_history_names()
|
farmbuyer@37
|
1197 addon:_fill_out_hist_data(1)
|
farmbuyer@37
|
1198 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1199 histST:RegisterEvents{
|
farmbuyer@37
|
1200 OnEnter = eoi_st_OnEnter,
|
farmbuyer@37
|
1201 OnLeave = eoi_st_OnLeave,
|
farmbuyer@37
|
1202 OnClick = hist_st_OnClick,
|
farmbuyer@37
|
1203 --OnDoubleClick = hist_st_OnDoubleClick,
|
farmbuyer@37
|
1204 }
|
farmbuyer@37
|
1205 local oldrefresh = histST.Refresh
|
farmbuyer@37
|
1206 histST.Refresh = function (self, opt_index)
|
farmbuyer@37
|
1207 addon:_fill_out_hist_data(opt_index)
|
farmbuyer@37
|
1208 return oldrefresh(self)
|
farmbuyer@37
|
1209 end
|
farmbuyer@37
|
1210 histST.OuroLoot_Refresh = function (self, opt_index)
|
farmbuyer@37
|
1211 addon:_fill_out_hist_data(opt_index)
|
farmbuyer@37
|
1212 self:SortData() -- calls hooked refresh
|
farmbuyer@6
|
1213 end
|
farmbuyer@6
|
1214
|
farmbuyer@37
|
1215 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@6
|
1216
|
farmbuyer@37
|
1217 -- Zaps history for the given realm, or the current (current-playing
|
farmbuyer@37
|
1218 -- realm, not currently-displayed realm) one if not specified.
|
farmbuyer@37
|
1219 local function reset_current_realm (opt_realmname)
|
farmbuyer@37
|
1220 local r = assert(opt_realmname or GetRealmName())
|
farmbuyer@37
|
1221 -- new .history table:
|
farmbuyer@37
|
1222 addon.history_all[r] = addon:_prep_new_history_category (nil, r)
|
farmbuyer@37
|
1223 addon.history = addon.history_all[r]
|
farmbuyer@37
|
1224 addon.hist_clean = nil
|
farmbuyer@37
|
1225 -- new .history.st table:
|
farmbuyer@37
|
1226 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1227 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1228 end
|
farmbuyer@6
|
1229
|
farmbuyer@1
|
1230 tabs_OnGroupSelected["hist"] = function(container,specials)
|
farmbuyer@37
|
1231 local st_widget = GUI:Create("lib-st")
|
farmbuyer@37
|
1232 -- don't need _d:GetUserData("histST") here, as it's already a local
|
farmbuyer@37
|
1233 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1234 st_widget:WrapST(histST)
|
farmbuyer@37
|
1235 st_widget.head_offset = 15
|
farmbuyer@37
|
1236 st_widget.tail_offset = 0
|
farmbuyer@37
|
1237 container:SetLayout("Fill")
|
farmbuyer@37
|
1238 container:AddChild(st_widget)
|
farmbuyer@37
|
1239 setstatus(hist_normal_status)
|
farmbuyer@1
|
1240
|
farmbuyer@37
|
1241 local b
|
farmbuyer@37
|
1242 do
|
farmbuyer@37
|
1243 local realms,current = {},1
|
farmbuyer@37
|
1244 for realmname,histtable in pairs(addon.history_all) do
|
farmbuyer@37
|
1245 if type(histtable) == 'table' then
|
farmbuyer@37
|
1246 tinsert(realms,realmname)
|
farmbuyer@37
|
1247 if addon.history == histtable then current = #realms end
|
farmbuyer@4
|
1248 end
|
farmbuyer@4
|
1249 end
|
farmbuyer@37
|
1250 b = mkbutton("Dropdown", nil, "", [[Which realm to display]])
|
farmbuyer@1
|
1251 b:SetFullWidth(true)
|
farmbuyer@37
|
1252 b:SetLabel() -- required even when empty, see ace3 ticket #234
|
farmbuyer@37
|
1253 b:SetList(realms)
|
farmbuyer@37
|
1254 b:SetValue(current)
|
farmbuyer@37
|
1255 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@37
|
1256 local r = realms[choice]
|
farmbuyer@37
|
1257 addon.history = addon:_prep_new_history_category (addon.history_all[r], r)
|
farmbuyer@37
|
1258 addon.hist_clean = nil
|
farmbuyer@6
|
1259 histST:OuroLoot_Refresh()
|
farmbuyer@6
|
1260 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1261 -- Reset filters to normal
|
farmbuyer@37
|
1262 history_filter_who = nil
|
farmbuyer@37
|
1263 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@37
|
1264 setstatus(hist_normal_status)
|
farmbuyer@1
|
1265 return addon:redisplay()
|
farmbuyer@1
|
1266 end)
|
farmbuyer@1
|
1267 specials:AddChild(b)
|
farmbuyer@37
|
1268 end
|
farmbuyer@1
|
1269
|
farmbuyer@37
|
1270 --[[ b = GUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]]
|
farmbuyer@4
|
1271
|
farmbuyer@37
|
1272 b = mkbutton("Regenerate",
|
farmbuyer@37
|
1273 [[Erases all history entries from the displayed realm, and regenerates it from current loot information.]])
|
farmbuyer@37
|
1274 b:SetFullWidth(true)
|
farmbuyer@37
|
1275 b:SetDisabled (#addon.history == 0)
|
farmbuyer@37
|
1276 b:SetCallback("OnClick", function(_b)
|
farmbuyer@37
|
1277 local dialog = StaticPopup_Show("OUROL_HIST_REGEN", addon.history.realm)
|
farmbuyer@37
|
1278 dialog.data = addon
|
farmbuyer@37
|
1279 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1280 _addon:rewrite_history (_addon.history.realm)
|
farmbuyer@37
|
1281 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1282 histST:SetData(_addon.history.st)
|
farmbuyer@37
|
1283 end
|
farmbuyer@37
|
1284 end)
|
farmbuyer@37
|
1285 specials:AddChild(b)
|
farmbuyer@1
|
1286
|
farmbuyer@37
|
1287 b = mkbutton('hist_clear', "Clear Realm History",
|
farmbuyer@37
|
1288 [[|cffff1010Erases absolutely all> history entries from the displayed realm.]])
|
farmbuyer@37
|
1289 b:SetFullWidth(true)
|
farmbuyer@37
|
1290 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1291 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", addon.history.realm)
|
farmbuyer@37
|
1292 dialog.data = addon
|
farmbuyer@37
|
1293 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1294 reset_current_realm(_addon.history.realm)
|
farmbuyer@37
|
1295 end
|
farmbuyer@37
|
1296 end)
|
farmbuyer@37
|
1297 specials:AddChild(b)
|
farmbuyer@37
|
1298
|
farmbuyer@37
|
1299 b = mkbutton('hist_clear_all', "Clear All History",
|
farmbuyer@37
|
1300 [[|cffff1010Erases absolutely all> history entries from ALL realms.]])
|
farmbuyer@37
|
1301 b:SetFullWidth(true)
|
farmbuyer@37
|
1302 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1303 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", "ALL realms")
|
farmbuyer@37
|
1304 dialog.data = addon
|
farmbuyer@37
|
1305 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1306 _addon.history_all = {}
|
farmbuyer@37
|
1307 reset_current_realm()
|
farmbuyer@37
|
1308 end
|
farmbuyer@37
|
1309 end)
|
farmbuyer@37
|
1310 specials:AddChild(b)
|
farmbuyer@37
|
1311
|
farmbuyer@37
|
1312 b = mkbutton('hist_clear_old', "Clear Older",
|
farmbuyer@37
|
1313 [[Preserves only the latest loot entry for each player on the displayed realm, removing all earlier ones.]])
|
farmbuyer@37
|
1314 b:SetFullWidth(true)
|
farmbuyer@37
|
1315 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1316 local dialog = StaticPopup_Show("OUROL_HIST_PREEN", addon.history.realm)
|
farmbuyer@37
|
1317 dialog.data = addon
|
farmbuyer@37
|
1318 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1319 _addon:preen_history(_addon.history.realm)
|
farmbuyer@37
|
1320 _addon.hist_clean = nil
|
farmbuyer@37
|
1321 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1322 end
|
farmbuyer@37
|
1323 end)
|
farmbuyer@37
|
1324 specials:AddChild(b)
|
farmbuyer@1
|
1325 end
|
farmbuyer@37
|
1326 return tabs_OnGroupSelected["hist"](container,specials)
|
farmbuyer@1
|
1327 end
|
farmbuyer@1
|
1328
|
farmbuyer@37
|
1329
|
farmbuyer@6
|
1330 -- Tab 5: Help (content in verbage.lua)
|
farmbuyer@1
|
1331 do
|
farmbuyer@1
|
1332 local tabs_help_OnGroupSelected_func = function (treeg,event,category)
|
farmbuyer@1
|
1333 treeg:ReleaseChildren()
|
farmbuyer@1
|
1334 local txt = GUI:Create("Label")
|
farmbuyer@1
|
1335 txt:SetFullWidth(true)
|
farmbuyer@1
|
1336 txt:SetFontObject(GameFontNormal)--Highlight)
|
farmbuyer@1
|
1337 txt:SetText(addon.helptext[category])
|
farmbuyer@1
|
1338 local sf = GUI:Create("ScrollFrame")
|
farmbuyer@1
|
1339 local sfstat = _d:GetUserData("help tab scroll status") or {}
|
farmbuyer@1
|
1340 sf:SetStatusTable(sfstat)
|
farmbuyer@1
|
1341 _d:SetUserData("help tab scroll status",sfstat)
|
farmbuyer@1
|
1342 sf:SetLayout("Fill")
|
farmbuyer@1
|
1343 -- This forces the scrolling area to be bigger than the visible area; else
|
farmbuyer@1
|
1344 -- some of the text gets cut off.
|
farmbuyer@1
|
1345 sf.content:SetHeight(700)
|
farmbuyer@1
|
1346 sf:AddChild(txt)
|
farmbuyer@1
|
1347 treeg:AddChild(sf)
|
farmbuyer@1
|
1348 if treeg:GetUserData("help restore scroll") then
|
farmbuyer@1
|
1349 sfstat = sfstat.scrollvalue
|
farmbuyer@1
|
1350 if sfstat then sf:SetScroll(sfstat) end
|
farmbuyer@1
|
1351 treeg:SetUserData("help restore scroll", false)
|
farmbuyer@1
|
1352 else
|
farmbuyer@1
|
1353 sf:SetScroll(0)
|
farmbuyer@1
|
1354 end
|
farmbuyer@1
|
1355 end
|
farmbuyer@1
|
1356 tabs_OnGroupSelected["help"] = function(container,specials)
|
farmbuyer@1
|
1357 container:SetLayout("Fill")
|
farmbuyer@1
|
1358 local left = GUI:Create("TreeGroup")
|
farmbuyer@1
|
1359 local leftstat = _d:GetUserData("help tab select status")
|
farmbuyer@1
|
1360 or {treewidth=145}
|
farmbuyer@1
|
1361 left:SetStatusTable(leftstat)
|
farmbuyer@1
|
1362 _d:SetUserData("help tab select status",leftstat)
|
farmbuyer@1
|
1363 left:SetLayout("Fill")
|
farmbuyer@1
|
1364 left:SetFullWidth(true)
|
farmbuyer@1
|
1365 left:SetFullHeight(true)
|
farmbuyer@1
|
1366 left:EnableButtonTooltips(false)
|
farmbuyer@1
|
1367 left:SetTree(addon.helptree)
|
farmbuyer@1
|
1368 left:SetCallback("OnGroupSelected", tabs_help_OnGroupSelected_func)
|
farmbuyer@1
|
1369 container:AddChild(left)
|
farmbuyer@1
|
1370 leftstat = leftstat.selected
|
farmbuyer@1
|
1371 if leftstat then
|
farmbuyer@1
|
1372 left:SetUserData("help restore scroll", true)
|
farmbuyer@1
|
1373 left:SelectByValue(leftstat)
|
farmbuyer@1
|
1374 else
|
farmbuyer@1
|
1375 left:SelectByValue("basic")
|
farmbuyer@1
|
1376 end
|
farmbuyer@1
|
1377 end
|
farmbuyer@1
|
1378 end
|
farmbuyer@1
|
1379
|
farmbuyer@37
|
1380
|
farmbuyer@1
|
1381 -- Tab 6: Options / Advanced
|
farmbuyer@1
|
1382 do
|
farmbuyer@1
|
1383 local function mkoption (opt, label, width, desc, opt_func)
|
farmbuyer@1
|
1384 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc)
|
farmbuyer@1
|
1385 w:SetRelativeWidth(width)
|
farmbuyer@1
|
1386 w:SetType("checkbox")
|
farmbuyer@1
|
1387 w:SetLabel(label)
|
farmbuyer@1
|
1388 if opt then
|
farmbuyer@1
|
1389 w:SetValue(OuroLootSV_opts[opt])
|
farmbuyer@1
|
1390 w:SetCallback("OnValueChanged", opt_func or (function(_w,event,value)
|
farmbuyer@1
|
1391 OuroLootSV_opts[opt] = value
|
farmbuyer@1
|
1392 end))
|
farmbuyer@1
|
1393 end
|
farmbuyer@1
|
1394 return w
|
farmbuyer@1
|
1395 end
|
farmbuyer@1
|
1396
|
farmbuyer@1
|
1397 local function adv_careful_OnTextChanged (ebox,event,value)
|
farmbuyer@1
|
1398 -- The EditBox widget's code will call an internal ShowButton routine
|
farmbuyer@1
|
1399 -- after this callback returns. ShowButton will test for this flag:
|
farmbuyer@1
|
1400 ebox:DisableButton (value == "")
|
farmbuyer@1
|
1401 end
|
farmbuyer@1
|
1402
|
farmbuyer@1
|
1403 -- Like the first tab, we use a pair of functions; first and repeating.
|
farmbuyer@1
|
1404 local function adv_real (container, specials)
|
farmbuyer@1
|
1405 local grp, w
|
farmbuyer@1
|
1406
|
farmbuyer@1
|
1407 grp = GUI:Create("InlineGroup")
|
farmbuyer@1
|
1408 grp:SetLayout("Flow")
|
farmbuyer@1
|
1409 grp:PauseLayout()
|
farmbuyer@1
|
1410 grp:SetFullWidth(true)
|
farmbuyer@1
|
1411 grp:SetTitle("Debugging/Testing Options [not saved across sessions]")
|
farmbuyer@1
|
1412
|
farmbuyer@1
|
1413 w = mkbutton("EditBox", 'comm_ident', addon.ident,
|
farmbuyer@1
|
1414 [[Disable the addon, change this field (click Okay or press Enter), then re-enable the addon.]])
|
farmbuyer@1
|
1415 w:SetRelativeWidth(0.2)
|
farmbuyer@1
|
1416 w:SetLabel("Addon channel ID")
|
farmbuyer@1
|
1417 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
|
farmbuyer@1
|
1418 w:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@1
|
1419 -- if they set it to blank spaces, they're boned. oh well.
|
farmbuyer@1
|
1420 -- Re-enabling will take care of propogating this new value.
|
farmbuyer@1
|
1421 addon.ident = (value == "") and "OuroLoot2" or value
|
farmbuyer@1
|
1422 _w:SetText(addon.ident)
|
farmbuyer@1
|
1423 addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.")
|
farmbuyer@1
|
1424 end)
|
farmbuyer@1
|
1425 w:SetDisabled(addon.enabled or addon.rebroadcast)
|
farmbuyer@1
|
1426 grp:AddChild(w)
|
farmbuyer@1
|
1427
|
farmbuyer@40
|
1428 w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache TTL]])
|
farmbuyer@1
|
1429 w:SetRelativeWidth(0.05)
|
farmbuyer@1
|
1430 w:SetLabel("ttl")
|
farmbuyer@1
|
1431 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
|
farmbuyer@1
|
1432 w:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@1
|
1433 value = tonumber(value) or addon.recent_messages.ttl
|
farmbuyer@1
|
1434 addon.recent_messages.ttl = value
|
farmbuyer@1
|
1435 _w:SetText(tostring(value))
|
farmbuyer@1
|
1436 end)
|
farmbuyer@1
|
1437 grp:AddChild(w)
|
farmbuyer@1
|
1438
|
farmbuyer@1
|
1439 w = mkbutton("load nsaab1548", [[Cursed Darkhound]])
|
farmbuyer@1
|
1440 w:SetRelativeWidth(0.25)
|
farmbuyer@1
|
1441 w:SetCallback("OnClick", function()
|
farmbuyer@1
|
1442 for i, v in ipairs(DBM.AddOns) do
|
farmbuyer@1
|
1443 if v.modId == "DBM-NotScaryAtAll" then
|
farmbuyer@1
|
1444 DBM:LoadMod(v)
|
farmbuyer@1
|
1445 break
|
farmbuyer@1
|
1446 end
|
farmbuyer@1
|
1447 end
|
farmbuyer@1
|
1448 local mod = DBM:GetModByName("NotScaryAtAll")
|
farmbuyer@1
|
1449 if mod then
|
farmbuyer@1
|
1450 mod:EnableMod()
|
farmbuyer@1
|
1451 addon:Print("Now tracking ID",mod.creatureId)
|
farmbuyer@1
|
1452 else addon:Print("Can do nothing; DBM testing mod wasn't loaded.") end
|
farmbuyer@1
|
1453 end)
|
farmbuyer@5
|
1454 w:SetDisabled(addon.bossmod_registered ~= 'DBM')
|
farmbuyer@1
|
1455 grp:AddChild(w)
|
farmbuyer@1
|
1456
|
farmbuyer@1
|
1457 w = mkbutton("GC", [[full GC cycle]])
|
farmbuyer@1
|
1458 w:SetRelativeWidth(0.1)
|
farmbuyer@1
|
1459 w:SetCallback("OnClick", function() collectgarbage() end)
|
farmbuyer@1
|
1460 grp:AddChild(w)
|
farmbuyer@1
|
1461
|
farmbuyer@20
|
1462 --[==[ this has been well and truly debugged by now
|
farmbuyer@1
|
1463 w = mkbutton("EditBox", nil, addon.loot_pattern:sub(17), [[]])
|
farmbuyer@1
|
1464 w:SetRelativeWidth(0.35)
|
farmbuyer@1
|
1465 w:SetLabel("CML pattern suffix")
|
farmbuyer@1
|
1466 w:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@1
|
1467 addon.loot_pattern = addon.loot_pattern:sub(1,16) .. value
|
farmbuyer@1
|
1468 end)
|
farmbuyer@20
|
1469 grp:AddChild(w) ]==]
|
farmbuyer@20
|
1470
|
farmbuyer@20
|
1471 w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(1) grp:AddChild(w)
|
farmbuyer@1
|
1472
|
farmbuyer@1
|
1473 local simple = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1474 simple:SetLayout("List")
|
farmbuyer@1
|
1475 simple:SetRelativeWidth(0.3)
|
farmbuyer@1
|
1476 w = GUI:Create("CheckBoxSmallLabel")
|
farmbuyer@1
|
1477 w:SetFullWidth(true)
|
farmbuyer@1
|
1478 w:SetType("checkbox")
|
farmbuyer@19
|
1479 w:SetLabel("debug toggle")
|
farmbuyer@1
|
1480 w:SetValue(addon.DEBUG_PRINT)
|
farmbuyer@19
|
1481 w:SetCallback("OnValueChanged", function(_w,event,value)
|
farmbuyer@19
|
1482 addon.DEBUG_PRINT = value
|
farmbuyer@19
|
1483 addon:redisplay()
|
farmbuyer@19
|
1484 end)
|
farmbuyer@19
|
1485 simple:AddChild(w)
|
farmbuyer@19
|
1486 w = GUI:Create("CheckBoxSmallLabel")
|
farmbuyer@19
|
1487 w:SetFullWidth(true)
|
farmbuyer@19
|
1488 w:SetType("checkbox")
|
farmbuyer@19
|
1489 w:SetLabel("GOP history mode")
|
farmbuyer@19
|
1490 w:SetValue(false)
|
farmbuyer@19
|
1491 w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end)
|
farmbuyer@1
|
1492 simple:AddChild(w)
|
farmbuyer@1
|
1493 w = mkbutton("Clear All & Reload",
|
farmbuyer@1
|
1494 [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and reloads the UI.]])
|
farmbuyer@1
|
1495 w:SetFullWidth(true)
|
farmbuyer@1
|
1496 w:SetCallback("OnClick", function()
|
farmbuyer@8
|
1497 addon:_clear_SVs() -- reloads
|
farmbuyer@1
|
1498 end)
|
farmbuyer@1
|
1499 simple:AddChild(w)
|
farmbuyer@1
|
1500 grp:AddChild(simple)
|
farmbuyer@1
|
1501
|
farmbuyer@1
|
1502 simple = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1503 simple:SetLayout("List")
|
farmbuyer@1
|
1504 simple:SetRelativeWidth(0.5)
|
farmbuyer@1
|
1505 for d,v in pairs(addon.debug) do
|
farmbuyer@1
|
1506 w = GUI:Create("CheckBoxSmallLabel")
|
farmbuyer@1
|
1507 w:SetFullWidth(true)
|
farmbuyer@1
|
1508 w:SetType("checkbox")
|
farmbuyer@1
|
1509 w:SetLabel(d)
|
farmbuyer@1
|
1510 if d == "notraid" then
|
farmbuyer@39
|
1511 w:SetDescription[[Tick this before enabling to make the addon work outside of raid groups]]
|
farmbuyer@19
|
1512 else
|
farmbuyer@40
|
1513 if d == "alsolog" then
|
farmbuyer@40
|
1514 w:SetDescription[[Also log all debug messages to disk. See print_log.lua in the addon folder for later viewing.]]
|
farmbuyer@40
|
1515 end
|
farmbuyer@19
|
1516 w:SetDisabled(not addon.DEBUG_PRINT)
|
farmbuyer@1
|
1517 end
|
farmbuyer@1
|
1518 w:SetValue(v)
|
farmbuyer@1
|
1519 w:SetCallback("OnValueChanged", function(_w,event,value) addon.debug[d] = value end)
|
farmbuyer@1
|
1520 simple:AddChild(w)
|
farmbuyer@1
|
1521 end
|
farmbuyer@1
|
1522 grp:AddChild(simple)
|
farmbuyer@10
|
1523
|
farmbuyer@10
|
1524 simple = GUI:Create("SimpleGroup")
|
farmbuyer@10
|
1525 simple:SetLayout("Flow")
|
farmbuyer@10
|
1526 simple:SetRelativeWidth(0.85)
|
farmbuyer@10
|
1527 w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]])
|
farmbuyer@10
|
1528 w:SetRelativeWidth(0.15)
|
farmbuyer@10
|
1529 w:SetCallback("OnClick", function()
|
farmbuyer@10
|
1530 PlaySoundFile[[Sound\Music\WorldEvents\HordeFirepole.mp3]]
|
farmbuyer@10
|
1531 end)
|
farmbuyer@10
|
1532 simple:AddChild(w)
|
farmbuyer@10
|
1533 w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]])
|
farmbuyer@10
|
1534 w:SetRelativeWidth(0.15)
|
farmbuyer@10
|
1535 w:SetCallback("OnClick", function()
|
farmbuyer@10
|
1536 PlaySoundFile[[Sound\Music\WorldEvents\AllianceFirepole.mp3]]
|
farmbuyer@10
|
1537 end)
|
farmbuyer@10
|
1538 simple:AddChild(w)
|
farmbuyer@10
|
1539 grp:AddChild(simple)
|
farmbuyer@10
|
1540
|
farmbuyer@1
|
1541 grp:ResumeLayout()
|
farmbuyer@1
|
1542 container:AddChild(grp)
|
farmbuyer@1
|
1543 GUI:ClearFocus()
|
farmbuyer@1
|
1544 end
|
farmbuyer@1
|
1545
|
farmbuyer@1
|
1546 -- Initial lower panel function
|
farmbuyer@1
|
1547 local function adv_lower (container, specials)
|
farmbuyer@1
|
1548 local speedbump = GUI:Create("InteractiveLabel")
|
farmbuyer@1
|
1549 speedbump:SetFullWidth(true)
|
farmbuyer@1
|
1550 speedbump:SetFontObject(GameFontHighlightLarge)
|
farmbuyer@1
|
1551 speedbump:SetImage("Interface\\DialogFrame\\DialogAlertIcon")
|
farmbuyer@1
|
1552 speedbump:SetImageSize(50,50)
|
farmbuyer@1
|
1553 speedbump:SetText("The debugging/testing settings on the rest of this panel can"
|
farmbuyer@1
|
1554 .." seriously bork up the addon if you make a mistake. If you're okay"
|
farmbuyer@1
|
1555 .." with the possibility of losing data, click this warning to load the panel.")
|
farmbuyer@1
|
1556 speedbump:SetCallback("OnClick", function (_sb)
|
farmbuyer@1
|
1557 adv_lower = adv_real
|
farmbuyer@1
|
1558 return addon:redisplay()
|
farmbuyer@1
|
1559 --return tabs_OnGroupSelected_func(container.parent,"OnGroupSelected","opt")
|
farmbuyer@1
|
1560 end)
|
farmbuyer@1
|
1561 container:AddChild(speedbump)
|
farmbuyer@1
|
1562 end
|
farmbuyer@1
|
1563
|
farmbuyer@1
|
1564 tabs_OnGroupSelected["opt"] = function(container,specials)
|
farmbuyer@1
|
1565 --container:SetLayout("List")
|
farmbuyer@1
|
1566 container:SetLayout("Fill")
|
farmbuyer@1
|
1567 local scroll, grp, w
|
farmbuyer@1
|
1568
|
farmbuyer@1
|
1569 scroll = GUI:Create("ScrollFrame")
|
farmbuyer@1
|
1570 scroll:SetLayout("Flow")
|
farmbuyer@1
|
1571
|
farmbuyer@1
|
1572 grp = GUI:Create("InlineGroup")
|
farmbuyer@1
|
1573 grp:SetLayout("Flow")
|
farmbuyer@1
|
1574 grp:SetFullWidth(true)
|
farmbuyer@1
|
1575 grp:SetTitle("User Options [these are saved across sessions]")
|
farmbuyer@1
|
1576
|
farmbuyer@10
|
1577 -- The relative width fields used to be done to take up less vertical space, but
|
farmbuyer@10
|
1578 -- that turned out to look messy. Now they're just a straight line for the most part.
|
farmbuyer@10
|
1579
|
farmbuyer@1
|
1580 -- reminder popup
|
farmbuyer@16
|
1581 w = mkoption ('popup_on_join', "Show reminder popup", 0.49,
|
farmbuyer@1
|
1582 [[When joining a raid and not already tracking, display a dialog asking for instructions.]])
|
farmbuyer@1
|
1583 grp:AddChild(w)
|
farmbuyer@1
|
1584
|
farmbuyer@1
|
1585 -- toggle scroll-to-bottom on first tab
|
farmbuyer@16
|
1586 w = mkoption('scroll_to_bottom', "Scroll to bottom when opening display", 0.49,
|
farmbuyer@1
|
1587 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]])
|
farmbuyer@1
|
1588 grp:AddChild(w)
|
farmbuyer@1
|
1589
|
farmbuyer@1
|
1590 -- /loot option
|
farmbuyer@16
|
1591 w = mkoption('register_slashloot', "Register /loot slash command on login", 0.49,
|
farmbuyer@1
|
1592 [[Register "/loot" as a slash command in addition to the normal "/ouroloot". Relog to take effect.]])
|
farmbuyer@1
|
1593 grp:AddChild(w)
|
farmbuyer@1
|
1594
|
farmbuyer@1
|
1595 -- chatty mode
|
farmbuyer@16
|
1596 w = mkoption('chatty_on_kill', "Be chatty on boss kill", 0.49,
|
farmbuyer@1
|
1597 [[Print something to chat output when DBM tells Ouro Loot about a successful boss kill.]])
|
farmbuyer@1
|
1598 grp:AddChild(w)
|
farmbuyer@1
|
1599
|
farmbuyer@1
|
1600 -- less noise in main panel
|
farmbuyer@16
|
1601 w = mkoption('no_tracking_wipes', "Do not track wipes", 0.49,
|
farmbuyer@1
|
1602 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]])
|
farmbuyer@1
|
1603 grp:AddChild(w)
|
farmbuyer@1
|
1604
|
farmbuyer@1
|
1605 -- cutesy abbrevs
|
farmbuyer@16
|
1606 w = mkoption('snarky_boss', "Use snarky boss names", 0.49,
|
farmbuyer@1
|
1607 [[Irreverent replacement names for boss events.]])
|
farmbuyer@1
|
1608 grp:AddChild(w)
|
farmbuyer@1
|
1609
|
farmbuyer@1
|
1610 -- possible keybindings
|
farmbuyer@1
|
1611 do
|
farmbuyer@1
|
1612 local pair = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1613 pair:SetLayout("Flow")
|
farmbuyer@10
|
1614 pair:SetRelativeWidth(0.95)
|
farmbuyer@1
|
1615 local editbox, checkbox
|
farmbuyer@1
|
1616 editbox = mkbutton("EditBox", nil, OuroLootSV_opts.keybinding_text,
|
farmbuyer@1
|
1617 [[Keybinding text format is fragile! Relog to take effect.]])
|
farmbuyer@1
|
1618 editbox:SetRelativeWidth(0.5)
|
farmbuyer@1
|
1619 editbox:SetLabel("Keybinding text")
|
farmbuyer@1
|
1620 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@1
|
1621 OuroLootSV_opts.keybinding_text = value
|
farmbuyer@1
|
1622 end)
|
farmbuyer@1
|
1623 editbox:SetDisabled(not OuroLootSV_opts.keybinding)
|
farmbuyer@1
|
1624 checkbox = mkoption('keybinding', "Register keybinding", 0.5,
|
farmbuyer@1
|
1625 [[Register a keybinding to toggle the loot display. Relog to take effect.]],
|
farmbuyer@1
|
1626 function (_w,_,value)
|
farmbuyer@1
|
1627 OuroLootSV_opts.keybinding = value
|
farmbuyer@1
|
1628 editbox:SetDisabled(not OuroLootSV_opts.keybinding)
|
farmbuyer@1
|
1629 end)
|
farmbuyer@1
|
1630 pair:AddChild(checkbox)
|
farmbuyer@1
|
1631 pair:AddChild(editbox)
|
farmbuyer@1
|
1632 grp:AddChild(pair)
|
farmbuyer@1
|
1633 end
|
farmbuyer@1
|
1634
|
farmbuyer@3
|
1635 -- boss mod selection
|
farmbuyer@3
|
1636 w = GUI:Create("Spacer")
|
farmbuyer@3
|
1637 w:SetFullWidth(true)
|
farmbuyer@3
|
1638 w:SetHeight(20)
|
farmbuyer@3
|
1639 grp:AddChild(w)
|
farmbuyer@3
|
1640 do
|
farmbuyer@3
|
1641 local list = {}
|
farmbuyer@3
|
1642 local current
|
farmbuyer@3
|
1643 for k,v in ipairs(addon.bossmods) do
|
farmbuyer@3
|
1644 list[k] = v.n
|
farmbuyer@3
|
1645 if v.n == OuroLootSV_opts.bossmod then
|
farmbuyer@3
|
1646 current = k
|
farmbuyer@3
|
1647 end
|
farmbuyer@3
|
1648 end
|
farmbuyer@3
|
1649 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
|
farmbuyer@3
|
1650 w:SetRelativeWidth(0.2)
|
farmbuyer@3
|
1651 w:SetLabel("Boss Mod:")
|
farmbuyer@3
|
1652 w:SetList(list)
|
farmbuyer@3
|
1653 w:SetValue(current)
|
farmbuyer@3
|
1654 w:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@3
|
1655 OuroLootSV_opts.bossmod = list[choice]
|
farmbuyer@3
|
1656 end)
|
farmbuyer@3
|
1657 grp:AddChild(w)
|
farmbuyer@3
|
1658 end
|
farmbuyer@3
|
1659
|
farmbuyer@1
|
1660 -- item filter
|
farmbuyer@1
|
1661 w = GUI:Create("Spacer")
|
farmbuyer@1
|
1662 w:SetFullWidth(true)
|
farmbuyer@1
|
1663 w:SetHeight(20)
|
farmbuyer@1
|
1664 grp:AddChild(w)
|
farmbuyer@1
|
1665 do
|
farmbuyer@1
|
1666 local list = {}
|
farmbuyer@1
|
1667 for id in pairs(OuroLootSV_opts.itemfilter) do
|
farmbuyer@1
|
1668 local iname, _, iquality = GetItemInfo(id)
|
farmbuyer@2
|
1669 if iname then
|
farmbuyer@11
|
1670 list[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@2
|
1671 end
|
farmbuyer@1
|
1672 end
|
farmbuyer@1
|
1673 w = GUI:Create("EditBoxDropDown")
|
farmbuyer@1
|
1674 w:SetRelativeWidth(0.4)
|
farmbuyer@1
|
1675 w:SetText("Item filter")
|
farmbuyer@1
|
1676 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
|
farmbuyer@1
|
1677 w:SetList(list)
|
farmbuyer@1
|
1678 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
|
farmbuyer@1
|
1679 local iname, ilink, iquality = GetItemInfo(strtrim(text))
|
farmbuyer@1
|
1680 if not iname then
|
farmbuyer@1
|
1681 return addon:Print("Error: %s is not a valid item name/link!", text)
|
farmbuyer@1
|
1682 end
|
farmbuyer@1
|
1683 local id = tonumber(ilink:match("item:(%d+)"))
|
farmbuyer@11
|
1684 list[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@1
|
1685 OuroLootSV_opts.itemfilter[id] = true
|
farmbuyer@1
|
1686 addon:Print("Now filtering out", ilink)
|
farmbuyer@1
|
1687 end)
|
farmbuyer@1
|
1688 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
|
farmbuyer@1
|
1689 --local ilink = select(2,GetItemInfo(key_id))
|
farmbuyer@1
|
1690 OuroLootSV_opts.itemfilter[tonumber(key_id)] = nil
|
farmbuyer@1
|
1691 --addon:Print("No longer filtering out", ilink)
|
farmbuyer@1
|
1692 addon:Print("No longer filtering out", val_name)
|
farmbuyer@1
|
1693 end)
|
farmbuyer@1
|
1694 grp:AddChild(w)
|
farmbuyer@1
|
1695 end
|
farmbuyer@1
|
1696
|
farmbuyer@1
|
1697 addon.sender_list.sort()
|
farmbuyer@1
|
1698 if #addon.sender_list.namesI > 0 then
|
farmbuyer@1
|
1699 local senders = table.concat(addon.sender_list.namesI,'\n') -- sigh
|
farmbuyer@1
|
1700 -- If 39 other people in the raid are running this, the label will
|
farmbuyer@1
|
1701 -- explode... is it likely enough to care about? No.
|
farmbuyer@1
|
1702 w = GUI:Create("Spacer")
|
farmbuyer@1
|
1703 w:SetFullWidth(true)
|
farmbuyer@1
|
1704 w:SetHeight(20)
|
farmbuyer@1
|
1705 grp:AddChild(w)
|
farmbuyer@1
|
1706 w = GUI:Create("Label")
|
farmbuyer@1
|
1707 w:SetRelativeWidth(0.4)
|
farmbuyer@11
|
1708 w:SetText(ITEM_QUALITY_COLORS[3].hex .."Echo from latest ping:|r\n"..senders)
|
farmbuyer@1
|
1709 grp:AddChild(w)
|
farmbuyer@1
|
1710 end
|
farmbuyer@1
|
1711
|
farmbuyer@6
|
1712 scroll:AddChild(grp)
|
farmbuyer@6
|
1713
|
farmbuyer@1
|
1714 w = mkbutton("ReloadUI", [[Does what you think it does. Loot information is written out and restored.]])
|
farmbuyer@1
|
1715 w:SetFullWidth(true)
|
farmbuyer@1
|
1716 w:SetCallback("OnClick", ReloadUI)
|
farmbuyer@1
|
1717 specials:AddChild(w)
|
farmbuyer@1
|
1718
|
farmbuyer@1
|
1719 w = mkbutton("Ping!",
|
farmbuyer@1
|
1720 [[Asks other raid users for their addon version and current status. Results displayed on User Options panel.]])
|
farmbuyer@1
|
1721 w:SetFullWidth(true)
|
farmbuyer@1
|
1722 w:SetCallback("OnClick", function(_w)
|
farmbuyer@1
|
1723 _w:SetText("5... 4... 3...")
|
farmbuyer@1
|
1724 _w:SetDisabled(true)
|
farmbuyer@23
|
1725 addon:DoPing()
|
farmbuyer@1
|
1726 addon:ScheduleTimer(function(b)
|
farmbuyer@1
|
1727 if b:IsVisible() then
|
farmbuyer@1
|
1728 return addon:redisplay()
|
farmbuyer@1
|
1729 --return tabs_OnGroupSelected_func(container,"OnGroupSelected","opt")
|
farmbuyer@1
|
1730 end
|
farmbuyer@1
|
1731 end, 5, _w)
|
farmbuyer@1
|
1732 end)
|
farmbuyer@1
|
1733 specials:AddChild(w)
|
farmbuyer@1
|
1734
|
farmbuyer@1
|
1735 -- Add appropriate lower panel
|
farmbuyer@1
|
1736 adv_lower (scroll, specials)
|
farmbuyer@1
|
1737
|
farmbuyer@1
|
1738 -- Finish up
|
farmbuyer@1
|
1739 container:AddChild(scroll)
|
farmbuyer@1
|
1740 end
|
farmbuyer@1
|
1741 end
|
farmbuyer@1
|
1742
|
farmbuyer@1
|
1743
|
farmbuyer@1
|
1744 -- Simply to avoid recreating the same function over and over
|
farmbuyer@1
|
1745 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
|
farmbuyer@1
|
1746 tabs_OnGroupSelected_func = function (tabs,event,group)
|
farmbuyer@1
|
1747 tabs_OnGroupSelected_func_args[1] = tabs
|
farmbuyer@1
|
1748 tabs_OnGroupSelected_func_args[3] = group
|
farmbuyer@1
|
1749 tabs:ReleaseChildren()
|
farmbuyer@1
|
1750 local spec = tabs:GetUserData("special buttons group")
|
farmbuyer@1
|
1751 spec:ReleaseChildren()
|
farmbuyer@1
|
1752 local h = GUI:Create("Heading")
|
farmbuyer@1
|
1753 h:SetFullWidth(true)
|
farmbuyer@1
|
1754 h:SetText(_tabtexts[group].title)
|
farmbuyer@1
|
1755 spec:AddChild(h)
|
farmbuyer@1
|
1756 return tabs_OnGroupSelected[group](tabs,spec,group)
|
farmbuyer@1
|
1757 --[====[
|
farmbuyer@1
|
1758 Unfortunately, :GetHeight() called on anything useful out of a TabGroup
|
farmbuyer@1
|
1759 returns the static default size (about 50 pixels) until the refresh
|
farmbuyer@1
|
1760 cycle *after* all the frames are shown. Trying to fix it up after a
|
farmbuyer@1
|
1761 single OnUpdate doesn't work either. So for now it's all hardcoded.
|
farmbuyer@1
|
1762
|
farmbuyer@1
|
1763 Using this to determine the actual height of the usable area.
|
farmbuyer@1
|
1764 366 pixels
|
farmbuyer@1
|
1765 if group == "eoi" then
|
farmbuyer@1
|
1766 local stframe = tabs.children[1].frame
|
farmbuyer@1
|
1767 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
|
farmbuyer@1
|
1768 stframe:GetTop()-stframe:GetBottom())
|
farmbuyer@1
|
1769 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
|
farmbuyer@1
|
1770 stframe:GetRight()-stframe:GetLeft())
|
farmbuyer@1
|
1771 end
|
farmbuyer@1
|
1772 ]====]
|
farmbuyer@1
|
1773 end
|
farmbuyer@1
|
1774
|
farmbuyer@1
|
1775 --[[
|
farmbuyer@1
|
1776 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1777 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1778 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1779 ]]
|
farmbuyer@1
|
1780 do
|
farmbuyer@1
|
1781 local replacement_colors = { ["+"]="|cffffffff", ["<"]="|cff00ff00", [">"]="|r" }
|
farmbuyer@1
|
1782 function mkbutton (opt_widget_type, opt_key, label, status)
|
farmbuyer@1
|
1783 if not label then
|
farmbuyer@1
|
1784 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
|
farmbuyer@1
|
1785 elseif not status then
|
farmbuyer@1
|
1786 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
|
farmbuyer@1
|
1787 end
|
farmbuyer@1
|
1788 local button = GUI:Create(opt_widget_type)
|
farmbuyer@1
|
1789 if button.SetText then button:SetText(tostring(label)) end
|
farmbuyer@1
|
1790 status = status:gsub("[%+<>]",replacement_colors)
|
farmbuyer@1
|
1791 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
|
farmbuyer@1
|
1792 button:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@1
|
1793 -- retrieval key may be specified as nil if all the parameters are given
|
farmbuyer@1
|
1794 if opt_key then _d:SetUserData (opt_key, button) end
|
farmbuyer@1
|
1795 return button
|
farmbuyer@1
|
1796 end
|
farmbuyer@1
|
1797 end
|
farmbuyer@1
|
1798
|
farmbuyer@1
|
1799 --[[
|
farmbuyer@1
|
1800 Creates the main window.
|
farmbuyer@1
|
1801 ]]
|
farmbuyer@1
|
1802 function addon:BuildMainDisplay (opt_tabselect)
|
farmbuyer@1
|
1803 if self.display then
|
farmbuyer@1
|
1804 -- try to get everything to update, rebuild, refresh... ugh, no
|
farmbuyer@1
|
1805 self.display:Hide()
|
farmbuyer@1
|
1806 end
|
farmbuyer@1
|
1807
|
farmbuyer@25
|
1808 -- This probably causes taint... hm.
|
farmbuyer@25
|
1809 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
|
farmbuyer@25
|
1810 UIDROPDOWNMENU_SHOW_TIME = 4
|
farmbuyer@25
|
1811
|
farmbuyer@1
|
1812 local display = GUI:Create("Frame")
|
farmbuyer@1
|
1813 if _d then
|
farmbuyer@1
|
1814 display:SetUserData("eoiST",_d) -- warning! warning! kludge detected!
|
farmbuyer@1
|
1815 end
|
farmbuyer@1
|
1816 _d = display
|
farmbuyer@1
|
1817 self.display = display
|
farmbuyer@17
|
1818 display:SetTitle(window_title)
|
farmbuyer@1
|
1819 display:SetStatusText(self.status_text)
|
farmbuyer@1
|
1820 display:SetLayout("Flow")
|
farmbuyer@16
|
1821 display:SetStatusTable{width=900,height=550} -- default height is 500
|
farmbuyer@36
|
1822 if display.EnableResize then -- FIXME after next Ace3 release, this can be assumed
|
farmbuyer@36
|
1823 display:EnableResize(false)
|
farmbuyer@36
|
1824 end
|
farmbuyer@1
|
1825 display:SetCallback("OnClose", function(_display)
|
farmbuyer@25
|
1826 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
|
farmbuyer@1
|
1827 _d = _display:GetUserData("eoiST")
|
farmbuyer@1
|
1828 self.display = nil
|
farmbuyer@1
|
1829 GUI:Release(_display)
|
farmbuyer@6
|
1830 flib.clear()
|
farmbuyer@1
|
1831 collectgarbage()
|
farmbuyer@1
|
1832 end)
|
farmbuyer@1
|
1833
|
farmbuyer@1
|
1834 ----- Right-hand panel
|
farmbuyer@1
|
1835 local rhs_width = 0.20
|
farmbuyer@1
|
1836 local control = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1837 control:SetLayout("Flow")
|
farmbuyer@1
|
1838 control:SetRelativeWidth(rhs_width)
|
farmbuyer@1
|
1839 control.alignoffset = 25
|
farmbuyer@1
|
1840 control:PauseLayout()
|
farmbuyer@1
|
1841 local h,b
|
farmbuyer@1
|
1842
|
farmbuyer@1
|
1843 --- Main ---
|
farmbuyer@1
|
1844 h = GUI:Create("Heading")
|
farmbuyer@1
|
1845 h:SetFullWidth(true)
|
farmbuyer@1
|
1846 h:SetText("Main")
|
farmbuyer@1
|
1847 control:AddChild(h)
|
farmbuyer@1
|
1848
|
farmbuyer@1
|
1849 do
|
farmbuyer@1
|
1850 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
1851 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
|
farmbuyer@1
|
1852 b:SetFullWidth(true)
|
farmbuyer@1
|
1853 b:SetLabel("On/Off:")
|
farmbuyer@1
|
1854 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
|
farmbuyer@1
|
1855 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
|
farmbuyer@1
|
1856 b:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@1
|
1857 if choice == 1 then self:Activate()
|
farmbuyer@1
|
1858 elseif choice == 2 then self:Activate(nil,true)
|
farmbuyer@1
|
1859 else self:Deactivate()
|
farmbuyer@1
|
1860 end
|
farmbuyer@1
|
1861 _w = display:GetUserData('comm_ident')
|
farmbuyer@1
|
1862 if _w and _w:IsVisible() then
|
farmbuyer@1
|
1863 _w:SetDisabled(self.enabled or self.rebroadcast)
|
farmbuyer@1
|
1864 end
|
farmbuyer@1
|
1865 _w = display:GetUserData('eoi_bcast_req')
|
farmbuyer@1
|
1866 if _w and _w:IsVisible() then
|
farmbuyer@1
|
1867 _w:SetDisabled(not self.enabled)
|
farmbuyer@1
|
1868 end
|
farmbuyer@1
|
1869 end)
|
farmbuyer@1
|
1870 control:AddChild(b)
|
farmbuyer@1
|
1871 end
|
farmbuyer@1
|
1872
|
farmbuyer@1
|
1873 b = mkbutton("Dropdown", 'threshold', "",
|
farmbuyer@1
|
1874 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
|
farmbuyer@1
|
1875 b:SetFullWidth(true)
|
farmbuyer@1
|
1876 b:SetLabel("Threshold:")
|
farmbuyer@1
|
1877 b:SetList(self.thresholds)
|
farmbuyer@1
|
1878 b:SetValue(self.threshold)
|
farmbuyer@1
|
1879 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
1880 self:SetThreshold(choice)
|
farmbuyer@1
|
1881 end)
|
farmbuyer@1
|
1882 control:AddChild(b)
|
farmbuyer@1
|
1883
|
farmbuyer@4
|
1884 b = mkbutton("Clear Loot",
|
farmbuyer@1
|
1885 [[+Erases> all current loot information and generated text (but not saved texts).]])
|
farmbuyer@1
|
1886 b:SetFullWidth(true)
|
farmbuyer@1
|
1887 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
1888 StaticPopup_Show("OUROL_CLEAR").data = self
|
farmbuyer@1
|
1889 end)
|
farmbuyer@1
|
1890 control:AddChild(b)
|
farmbuyer@1
|
1891
|
farmbuyer@1
|
1892 b = GUI:Create("Spacer")
|
farmbuyer@1
|
1893 b:SetFullWidth(true)
|
farmbuyer@16
|
1894 b:SetHeight(10)
|
farmbuyer@1
|
1895 control:AddChild(b)
|
farmbuyer@1
|
1896
|
farmbuyer@1
|
1897 --[[
|
farmbuyer@1
|
1898 --- Saved Texts ---
|
farmbuyer@1
|
1899 [ Save Current As... ]
|
farmbuyer@1
|
1900 saved1
|
farmbuyer@1
|
1901 saved2
|
farmbuyer@1
|
1902 ...
|
farmbuyer@1
|
1903 [ Load ] [ Delete ]
|
farmbuyer@1
|
1904 ]]
|
farmbuyer@1
|
1905 h = GUI:Create("Heading")
|
farmbuyer@1
|
1906 h:SetFullWidth(true)
|
farmbuyer@1
|
1907 h:SetText("Saved Texts")
|
farmbuyer@1
|
1908 control:AddChild(h)
|
farmbuyer@1
|
1909 b = mkbutton("Save Current As...",
|
farmbuyer@1
|
1910 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
|
farmbuyer@1
|
1911 b:SetFullWidth(true)
|
farmbuyer@1
|
1912 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
1913 StaticPopup_Show "OUROL_SAVE_SAVEAS"
|
farmbuyer@1
|
1914 _d:Hide()
|
farmbuyer@1
|
1915 end)
|
farmbuyer@1
|
1916 control:AddChild(b)
|
farmbuyer@1
|
1917
|
farmbuyer@16
|
1918 do
|
farmbuyer@16
|
1919 local scontainer = GUI:Create("SimpleGroup")
|
farmbuyer@16
|
1920 scontainer:SetFullWidth(true)
|
farmbuyer@16
|
1921 scontainer:SetFullHeight(false)
|
farmbuyer@16
|
1922 scontainer:SetAutoAdjustHeight(false)
|
farmbuyer@16
|
1923 scontainer:SetHeight(40) -- no relative height available anymore
|
farmbuyer@16
|
1924 scontainer:SetLayout("Fill")
|
farmbuyer@16
|
1925 local scroll = GUI:Create("ScrollFrame")
|
farmbuyer@16
|
1926 scroll:SetLayout("List")
|
farmbuyer@16
|
1927 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
|
farmbuyer@16
|
1928 if saved then for i,s in ipairs(saved) do
|
farmbuyer@16
|
1929 local il = GUI:Create("InteractiveLabel")
|
farmbuyer@16
|
1930 il:SetFullWidth(true)
|
farmbuyer@16
|
1931 il:SetText(s.name)
|
farmbuyer@16
|
1932 il:SetUserData("num",i)
|
farmbuyer@16
|
1933 il:SetHighlight(1,1,1,0.4)
|
farmbuyer@16
|
1934 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
|
farmbuyer@16
|
1935 il:SetCallback("OnEnter", function() setstatus(str) end)
|
farmbuyer@16
|
1936 il:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@16
|
1937 il:SetCallback("OnClick", function(_il)
|
farmbuyer@16
|
1938 local prev = _d:GetUserData("saved selection")
|
farmbuyer@16
|
1939 if prev then
|
farmbuyer@16
|
1940 prev.highlight:Hide()
|
farmbuyer@16
|
1941 prev:SetColor()
|
farmbuyer@16
|
1942 end
|
farmbuyer@16
|
1943 _il:SetColor(0,1,0)
|
farmbuyer@16
|
1944 _il.highlight:Show()
|
farmbuyer@16
|
1945 _d:SetUserData("saved selection",_il)
|
farmbuyer@16
|
1946 _d:GetUserData("Load"):SetDisabled(false)
|
farmbuyer@16
|
1947 _d:GetUserData("Delete"):SetDisabled(false)
|
farmbuyer@16
|
1948 end)
|
farmbuyer@16
|
1949 scroll:AddChild(il)
|
farmbuyer@16
|
1950 end end
|
farmbuyer@16
|
1951 scontainer:AddChild(scroll)
|
farmbuyer@16
|
1952 control:AddChild(scontainer)
|
farmbuyer@16
|
1953 end
|
farmbuyer@1
|
1954
|
farmbuyer@1
|
1955 b = mkbutton("Load",
|
farmbuyer@1
|
1956 [[Load previously saved text. +REPLACES> all current loot information!]])
|
farmbuyer@1
|
1957 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
1958 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
1959 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
1960 self:save_restore(num)
|
farmbuyer@1
|
1961 self:BuildMainDisplay()
|
farmbuyer@1
|
1962 end)
|
farmbuyer@1
|
1963 b:SetDisabled(true)
|
farmbuyer@1
|
1964 control:AddChild(b)
|
farmbuyer@1
|
1965 b = mkbutton("Delete",
|
farmbuyer@1
|
1966 [[Delete previously saved text.]])
|
farmbuyer@1
|
1967 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
1968 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
1969 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
1970 self:save_delete(num)
|
farmbuyer@1
|
1971 self:BuildMainDisplay()
|
farmbuyer@1
|
1972 end)
|
farmbuyer@1
|
1973 b:SetDisabled(true)
|
farmbuyer@1
|
1974 control:AddChild(b)
|
farmbuyer@1
|
1975
|
farmbuyer@1
|
1976 b = GUI:Create("Spacer")
|
farmbuyer@1
|
1977 b:SetFullWidth(true)
|
farmbuyer@16
|
1978 b:SetHeight(10)
|
farmbuyer@1
|
1979 control:AddChild(b)
|
farmbuyer@1
|
1980
|
farmbuyer@1
|
1981 -- Other stuff on right-hand side
|
farmbuyer@1
|
1982 local tab_specials = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1983 tab_specials:SetLayout("Flow")
|
farmbuyer@1
|
1984 tab_specials:SetFullWidth(true)
|
farmbuyer@1
|
1985 control:AddChild(tab_specials)
|
farmbuyer@1
|
1986 control:ResumeLayout()
|
farmbuyer@1
|
1987
|
farmbuyer@1
|
1988 ----- Left-hand group
|
farmbuyer@1
|
1989 local tabs = GUI:Create("TabGroup")
|
farmbuyer@1
|
1990 tabs:SetLayout("Flow")
|
farmbuyer@1
|
1991 tabs.alignoffset = 25
|
farmbuyer@1
|
1992 tabs.titletext:SetFontObject(GameFontNormalSmall) -- XXX
|
farmbuyer@1
|
1993 do
|
farmbuyer@1
|
1994 self.sender_list.sort()
|
farmbuyer@1
|
1995 tabs.titletext:SetFormattedText("Received broadcast data from %d |4player:players;.",
|
farmbuyer@1
|
1996 self.sender_list.activeI)
|
farmbuyer@1
|
1997 end
|
farmbuyer@1
|
1998 tabs:SetRelativeWidth(0.99-rhs_width)
|
farmbuyer@1
|
1999 tabs:SetFullHeight(true)
|
farmbuyer@1
|
2000 tabs:SetTabs(tabgroup_tabs)
|
farmbuyer@1
|
2001 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
|
farmbuyer@1
|
2002 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
|
farmbuyer@1
|
2003 setstatus(_tabtexts[value].desc)
|
farmbuyer@1
|
2004 end)
|
farmbuyer@1
|
2005 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
|
farmbuyer@1
|
2006 tabs:SetUserData("special buttons group",tab_specials)
|
farmbuyer@1
|
2007 tabs:SelectTab(opt_tabselect or "eoi")
|
farmbuyer@1
|
2008
|
farmbuyer@1
|
2009 display:AddChildren (tabs, control)
|
farmbuyer@1
|
2010 display:ApplyStatus()
|
farmbuyer@1
|
2011
|
farmbuyer@1
|
2012 display:Show() -- without this, only appears every *other* function call
|
farmbuyer@1
|
2013 return display
|
farmbuyer@1
|
2014 end
|
farmbuyer@1
|
2015
|
farmbuyer@1
|
2016 function addon:OpenMainDisplayToTab (text)
|
farmbuyer@44
|
2017 text = '^'..text:lower()
|
farmbuyer@1
|
2018 for tab,v in pairs(_tabtexts) do
|
farmbuyer@1
|
2019 if v.title:lower():find(text) then
|
farmbuyer@1
|
2020 self:BuildMainDisplay(tab)
|
farmbuyer@1
|
2021 return true
|
farmbuyer@1
|
2022 end
|
farmbuyer@1
|
2023 end
|
farmbuyer@1
|
2024 end
|
farmbuyer@1
|
2025
|
farmbuyer@1
|
2026 -- Essentially a re-click on the current tab (if the current tab were clickable).
|
farmbuyer@1
|
2027 function addon:redisplay ()
|
farmbuyer@1
|
2028 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
|
farmbuyer@1
|
2029 end
|
farmbuyer@1
|
2030
|
farmbuyer@1
|
2031
|
farmbuyer@1
|
2032 ------ Popup dialogs
|
farmbuyer@1
|
2033 -- Callback for each Next/Accept stage of inserting a new loot row via dropdown
|
farmbuyer@1
|
2034 local function eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@1
|
2035 if data.all_done then
|
farmbuyer@1
|
2036 -- It'll probably be the final entry in the table, but there might have
|
farmbuyer@1
|
2037 -- been real loot happening at the same time.
|
farmbuyer@1
|
2038 local boss_index = addon._addLootEntry{
|
farmbuyer@1
|
2039 kind = 'boss',
|
farmbuyer@1
|
2040 bosskill = (OuroLootSV_opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
|
farmbuyer@1
|
2041 reason = 'kill',
|
farmbuyer@1
|
2042 instance = data.instance,
|
farmbuyer@1
|
2043 duration = 0,
|
farmbuyer@1
|
2044 }
|
farmbuyer@1
|
2045 local entry = tremove(g_loot,boss_index)
|
farmbuyer@1
|
2046 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@1
|
2047 addon:_mark_boss_kill(data.rowindex)
|
farmbuyer@1
|
2048 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
|
farmbuyer@1
|
2049 dialog.data = nil -- free up memory
|
farmbuyer@1
|
2050 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
|
farmbuyer@1
|
2051 return
|
farmbuyer@1
|
2052 end
|
farmbuyer@1
|
2053
|
farmbuyer@16
|
2054 local text = dialog.editBox:GetText()
|
farmbuyer@1
|
2055
|
farmbuyer@1
|
2056 -- second click
|
farmbuyer@1
|
2057 if data.name and text then
|
farmbuyer@1
|
2058 data.instance = text
|
farmbuyer@1
|
2059 data.all_done = true
|
farmbuyer@1
|
2060 -- in future do one more thing, for now just jump to the check
|
farmbuyer@1
|
2061 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@1
|
2062 end
|
farmbuyer@1
|
2063
|
farmbuyer@1
|
2064 -- first click
|
farmbuyer@1
|
2065 if text then
|
farmbuyer@1
|
2066 data.name = text
|
farmbuyer@1
|
2067 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
|
farmbuyer@1
|
2068 getinstance.data = data
|
farmbuyer@16
|
2069 getinstance.editBox:SetText(addon.instance_tag())
|
farmbuyer@1
|
2070 -- This suppresses auto-hide (which would case the getinstance dialog
|
farmbuyer@1
|
2071 -- to go away), but only when mouse clicking. OnEnter is on its own.
|
farmbuyer@1
|
2072 return true
|
farmbuyer@1
|
2073 end
|
farmbuyer@1
|
2074 end
|
farmbuyer@1
|
2075
|
farmbuyer@1
|
2076 local function eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@1
|
2077 if data.all_done then
|
farmbuyer@1
|
2078 --local real_rebroadcast, real_enabled = addon.rebroadcast, addon.enabled
|
farmbuyer@1
|
2079 --g_rebroadcast, g_enabled = false, true
|
farmbuyer@1
|
2080 data.display:Hide()
|
farmbuyer@1
|
2081 local loot_index = addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes)
|
farmbuyer@1
|
2082 --g_rebroadcast, g_enabled = real_g_rebroadcast, real_g_enabled
|
farmbuyer@1
|
2083 local entry = tremove(g_loot,loot_index)
|
farmbuyer@1
|
2084 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@1
|
2085 --data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
|
farmbuyer@1
|
2086 addon:_fill_out_eoi_data(data.rowindex)
|
farmbuyer@1
|
2087 addon:BuildMainDisplay()
|
farmbuyer@1
|
2088 dialog.data = nil
|
farmbuyer@1
|
2089 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
|
farmbuyer@1
|
2090 return
|
farmbuyer@1
|
2091 end
|
farmbuyer@1
|
2092
|
farmbuyer@16
|
2093 local text = dialog.editBox:GetText():trim()
|
farmbuyer@1
|
2094
|
farmbuyer@1
|
2095 -- third click
|
farmbuyer@1
|
2096 if data.name and data.recipient and text then
|
farmbuyer@1
|
2097 data.notes = (text ~= "<none>") and text or nil
|
farmbuyer@1
|
2098 data.all_done = true
|
farmbuyer@1
|
2099 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@1
|
2100 end
|
farmbuyer@1
|
2101
|
farmbuyer@1
|
2102 -- second click
|
farmbuyer@1
|
2103 if data.name and text then
|
farmbuyer@1
|
2104 data.recipient = text
|
farmbuyer@1
|
2105 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
|
farmbuyer@1
|
2106 getnotes.data = data
|
farmbuyer@16
|
2107 getnotes.editBox:SetText("<none>")
|
farmbuyer@16
|
2108 getnotes.editBox:HighlightText()
|
farmbuyer@1
|
2109 return true
|
farmbuyer@1
|
2110 end
|
farmbuyer@1
|
2111
|
farmbuyer@1
|
2112 -- first click
|
farmbuyer@1
|
2113 if text then
|
farmbuyer@1
|
2114 data.name = text
|
farmbuyer@1
|
2115 dialog:Hide() -- technically a "different" one about to be shown
|
farmbuyer@1
|
2116 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
|
farmbuyer@1
|
2117 getrecipient.data = data
|
farmbuyer@16
|
2118 getrecipient.editBox:SetText("")
|
farmbuyer@1
|
2119 return true
|
farmbuyer@1
|
2120 end
|
farmbuyer@1
|
2121 end
|
farmbuyer@1
|
2122
|
farmbuyer@1
|
2123 local function eoi_st_insert_OnAccept (dialog, data)
|
farmbuyer@1
|
2124 if data.kind == 'boss' then
|
farmbuyer@1
|
2125 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@1
|
2126 elseif data.kind == 'loot' then
|
farmbuyer@1
|
2127 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@1
|
2128 end
|
farmbuyer@1
|
2129 end
|
farmbuyer@1
|
2130
|
farmbuyer@1
|
2131 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
|
farmbuyer@1
|
2132 text = "Clear current loot information and text?",
|
farmbuyer@16
|
2133 button1 = YES,
|
farmbuyer@16
|
2134 button2 = NO,
|
farmbuyer@1
|
2135 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2136 addon:Clear(--[[verbose_p=]]true)
|
farmbuyer@1
|
2137 end,
|
farmbuyer@1
|
2138 }
|
farmbuyer@1
|
2139
|
farmbuyer@37
|
2140 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2141 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2142 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r, and generate it anew from current loot?",
|
farmbuyer@37
|
2143 button1 = YES,
|
farmbuyer@37
|
2144 button2 = NO,
|
farmbuyer@37
|
2145 OnAccept = function (dialog, addon, data2)
|
farmbuyer@37
|
2146 data2(addon)
|
farmbuyer@37
|
2147 addon:Print("%s history has been regenerated.", addon.history.realm)
|
farmbuyer@37
|
2148 addon:redisplay()
|
farmbuyer@37
|
2149 end,
|
farmbuyer@37
|
2150 }
|
farmbuyer@37
|
2151
|
farmbuyer@16
|
2152 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
|
farmbuyer@37
|
2153 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2154 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2155 button1 = YES,
|
farmbuyer@16
|
2156 button2 = NO,
|
farmbuyer@16
|
2157 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2158 data2(addon)
|
farmbuyer@16
|
2159 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
|
farmbuyer@16
|
2160 addon:redisplay()
|
farmbuyer@16
|
2161 end,
|
farmbuyer@16
|
2162 }
|
farmbuyer@16
|
2163
|
farmbuyer@16
|
2164 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2165 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2166 text = "Erase all but the latest entry for players on " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2167 button1 = YES,
|
farmbuyer@16
|
2168 button2 = NO,
|
farmbuyer@16
|
2169 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2170 data2(addon)
|
farmbuyer@16
|
2171 addon:Print("All loot prior to the most recent entries has been erased.")
|
farmbuyer@16
|
2172 addon:redisplay()
|
farmbuyer@16
|
2173 end,
|
farmbuyer@16
|
2174 }
|
farmbuyer@16
|
2175
|
farmbuyer@27
|
2176 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
|
farmbuyer@27
|
2177 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
|
farmbuyer@27
|
2178 button1 = OKAY,
|
farmbuyer@27
|
2179 timeout = 0,
|
farmbuyer@27
|
2180 whileDead = true,
|
farmbuyer@27
|
2181 hideOnEscape = true,
|
farmbuyer@27
|
2182 enterClicksFirstButton = true,
|
farmbuyer@27
|
2183 hasEditBox = true,
|
farmbuyer@27
|
2184 editBoxWidth = 350,
|
farmbuyer@27
|
2185 OnShow = function (dialog, url)
|
farmbuyer@27
|
2186 dialog.editBox:SetText(url)
|
farmbuyer@27
|
2187 dialog.editBox:SetFocus()
|
farmbuyer@27
|
2188 dialog.editBox:HighlightText()
|
farmbuyer@27
|
2189 end,
|
farmbuyer@27
|
2190 }
|
farmbuyer@27
|
2191
|
farmbuyer@1
|
2192 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
|
farmbuyer@1
|
2193 text = "Do you wish to activate Ouro Loot?\n\n(Hit the Escape key to close this window without clicking)",
|
farmbuyer@1
|
2194 button1 = "Activate recording", -- "accept", left
|
farmbuyer@1
|
2195 button3 = "Broadcast only", -- "alt", middle
|
farmbuyer@1
|
2196 button2 = "Help", -- "cancel", right
|
farmbuyer@1
|
2197 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2198 addon:Activate()
|
farmbuyer@1
|
2199 end,
|
farmbuyer@1
|
2200 OnAlt = function (dialog, addon)
|
farmbuyer@1
|
2201 addon:Activate(nil,true)
|
farmbuyer@1
|
2202 end,
|
farmbuyer@1
|
2203 OnCancel = function (dialog, addon)
|
farmbuyer@1
|
2204 -- hitting escape also calls this, but the 3rd arg would be "clicked"
|
farmbuyer@1
|
2205 -- in both cases, not useful here.
|
farmbuyer@1
|
2206 local helpbutton = dialog.button2
|
farmbuyer@1
|
2207 local ismousing = MouseIsOver(helpbutton)
|
farmbuyer@1
|
2208 if ismousing then
|
farmbuyer@1
|
2209 -- they actually clicked the button (or at least the mouse was over "Help"
|
farmbuyer@1
|
2210 -- when they hit escape... sigh)
|
farmbuyer@1
|
2211 addon:BuildMainDisplay('help')
|
farmbuyer@1
|
2212 else
|
farmbuyer@1
|
2213 addon.popped = true
|
farmbuyer@1
|
2214 end
|
farmbuyer@1
|
2215 end,
|
farmbuyer@1
|
2216 }
|
farmbuyer@1
|
2217
|
farmbuyer@1
|
2218 -- The data member here is a table built with:
|
farmbuyer@1
|
2219 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
|
farmbuyer@1
|
2220 do
|
farmbuyer@1
|
2221 local t = flib.StaticPopup{
|
farmbuyer@1
|
2222 text = "Enter name of new %s, then click Next or press Enter:",
|
farmbuyer@1
|
2223 button1 = "Next >",
|
farmbuyer@1
|
2224 button2 = CANCEL,
|
farmbuyer@1
|
2225 hasEditBox = true,
|
farmbuyer@16
|
2226 editBoxWidth = 350,
|
farmbuyer@1
|
2227 maxLetters = 50,
|
farmbuyer@1
|
2228 noCancelOnReuse = true,
|
farmbuyer@1
|
2229 --[[ XXX still needed?
|
farmbuyer@1
|
2230 OnShow = function(dialog)
|
farmbuyer@1
|
2231 dialog.wideEditBox:SetText("")
|
farmbuyer@1
|
2232 dialog.wideEditBox:SetFocus()
|
farmbuyer@1
|
2233 end,]]
|
farmbuyer@1
|
2234 }
|
farmbuyer@1
|
2235 t.EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@39
|
2236 if editbox:GetText() == "" then return end
|
farmbuyer@1
|
2237 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2238 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
|
farmbuyer@1
|
2239 dialog:Hide() -- replicate OnAccept click behavior
|
farmbuyer@1
|
2240 end
|
farmbuyer@1
|
2241 end
|
farmbuyer@1
|
2242 t.enterClicksFirstButton = nil -- no effect with editbox focused
|
farmbuyer@1
|
2243 t.OnAccept = eoi_st_insert_OnAccept
|
farmbuyer@1
|
2244 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
|
farmbuyer@1
|
2245 end
|
farmbuyer@1
|
2246
|
farmbuyer@1
|
2247 -- This seems to be gratuitous use of metatables, really.
|
farmbuyer@1
|
2248 do
|
farmbuyer@1
|
2249 local OEIL = {
|
farmbuyer@1
|
2250 text = "Paste the new item into here, then click Next or press Enter:",
|
farmbuyer@1
|
2251 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
|
farmbuyer@1
|
2252 }
|
farmbuyer@1
|
2253 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
|
farmbuyer@1
|
2254
|
farmbuyer@1
|
2255 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
|
farmbuyer@1
|
2256 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
|
farmbuyer@1
|
2257 if dialogname then
|
farmbuyer@16
|
2258 _G[dialogname.."EditBox"]:SetText(link)
|
farmbuyer@1
|
2259 return true
|
farmbuyer@1
|
2260 end
|
farmbuyer@1
|
2261 end)
|
farmbuyer@1
|
2262 end
|
farmbuyer@1
|
2263
|
farmbuyer@1
|
2264 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
|
farmbuyer@1
|
2265 text = "Enter the player name:",
|
farmbuyer@1
|
2266 button1 = ACCEPT,
|
farmbuyer@1
|
2267 button2 = CANCEL,
|
farmbuyer@1
|
2268 hasEditBox = true,
|
farmbuyer@1
|
2269 --[[ XXX needed?
|
farmbuyer@1
|
2270 OnShow = function(dialog)
|
farmbuyer@1
|
2271 dialog.editBox:SetText("")
|
farmbuyer@1
|
2272 dialog.editBox:SetFocus()
|
farmbuyer@1
|
2273 end,]]
|
farmbuyer@1
|
2274 OnAccept = function(dialog, data)
|
farmbuyer@1
|
2275 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@24
|
2276 addon:reassign_loot (data.index, name)
|
farmbuyer@1
|
2277 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.index)
|
farmbuyer@1
|
2278 end,
|
farmbuyer@1
|
2279 }
|
farmbuyer@1
|
2280
|
farmbuyer@1
|
2281 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
|
farmbuyer@1
|
2282 text = "Enter a name for the loot collection:",
|
farmbuyer@1
|
2283 button1 = ACCEPT,
|
farmbuyer@1
|
2284 button2 = CANCEL,
|
farmbuyer@1
|
2285 hasEditBox = true,
|
farmbuyer@1
|
2286 maxLetters = 30,
|
farmbuyer@1
|
2287 --[[ XXX
|
farmbuyer@1
|
2288 OnShow = function(dialog)
|
farmbuyer@1
|
2289 dialog.editBox:SetText("")
|
farmbuyer@1
|
2290 dialog.editBox:SetFocus()
|
farmbuyer@1
|
2291 end,]]
|
farmbuyer@1
|
2292 OnAccept = function(dialog)--, data)
|
farmbuyer@1
|
2293 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@1
|
2294 addon:save_saveas(name)
|
farmbuyer@1
|
2295 addon:BuildMainDisplay()
|
farmbuyer@1
|
2296 end,
|
farmbuyer@1
|
2297 OnCancel = function(dialog)--, data, reason)
|
farmbuyer@1
|
2298 addon:BuildMainDisplay()
|
farmbuyer@1
|
2299 end,
|
farmbuyer@1
|
2300 --[[XXX
|
farmbuyer@1
|
2301 EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@1
|
2302 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2303 StaticPopupDialogs["OUROL_SAVE_SAVEAS"].OnAccept (dialog, dialog.data)
|
farmbuyer@1
|
2304 dialog:Hide()
|
farmbuyer@1
|
2305 end,]]
|
farmbuyer@1
|
2306 }
|
farmbuyer@1
|
2307
|
farmbuyer@25
|
2308
|
farmbuyer@25
|
2309 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
|
farmbuyer@25
|
2310 if true then
|
farmbuyer@25
|
2311 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
|
farmbuyer@25
|
2312 -- tagged with CHANGE.
|
farmbuyer@25
|
2313 local function onenter (self, motion)
|
farmbuyer@25
|
2314 if ( self.hasArrow ) then
|
farmbuyer@25
|
2315 local level = self:GetParent():GetID() + 1;
|
farmbuyer@25
|
2316 local listFrame = _G["DropDownList"..level];
|
farmbuyer@25
|
2317 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
|
farmbuyer@25
|
2318 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
|
farmbuyer@25
|
2319 end
|
farmbuyer@25
|
2320 else
|
farmbuyer@25
|
2321 CloseDropDownMenus(self:GetParent():GetID() + 1);
|
farmbuyer@25
|
2322 end
|
farmbuyer@25
|
2323 _G[self:GetName().."Highlight"]:Show();
|
farmbuyer@25
|
2324 UIDropDownMenu_StopCounting(self:GetParent());
|
farmbuyer@25
|
2325 if ( self.tooltipTitle ) then
|
farmbuyer@25
|
2326 if ( self.tooltipOnButton ) then
|
farmbuyer@25
|
2327 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
farmbuyer@25
|
2328 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
|
farmbuyer@25
|
2329 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
|
farmbuyer@25
|
2330 GameTooltip:Show();
|
farmbuyer@25
|
2331 else
|
farmbuyer@25
|
2332 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
|
farmbuyer@25
|
2333 end
|
farmbuyer@25
|
2334 end
|
farmbuyer@25
|
2335 end
|
farmbuyer@25
|
2336 -- end verbatime copy
|
farmbuyer@25
|
2337
|
farmbuyer@25
|
2338 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
|
farmbuyer@25
|
2339 local list = _G["DropDownList"..i]
|
farmbuyer@25
|
2340 if list then
|
farmbuyer@25
|
2341 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
|
farmbuyer@25
|
2342 local button = _G["DropDownList"..i.."Button"..j]
|
farmbuyer@25
|
2343 if button then
|
farmbuyer@25
|
2344 --print("button fixup",i,j)
|
farmbuyer@25
|
2345 button:SetScript("OnEnter",onenter)
|
farmbuyer@25
|
2346 end
|
farmbuyer@25
|
2347 end
|
farmbuyer@25
|
2348 end
|
farmbuyer@25
|
2349 end
|
farmbuyer@25
|
2350 end
|
farmbuyer@25
|
2351
|
farmbuyer@1
|
2352 -- vim:noet
|