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@25
|
542 "Delete remaining entries for this day%time|Erases everything from here down until a new day.",
|
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@25
|
561 "Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day.",
|
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@25
|
599 "Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day.",
|
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@1
|
862 return addon.dprint('flow', "Nothing to show in first tab, skipping creation")
|
farmbuyer@1
|
863 end
|
farmbuyer@1
|
864
|
farmbuyer@1
|
865 -- The first time this function is called, we set up a persistent ST
|
farmbuyer@1
|
866 -- object and store it. Any other delayed setup work is done, and then
|
farmbuyer@1
|
867 -- this function replaces itself with a smaller, sleeker, sexier one.
|
farmbuyer@1
|
868 -- This function will later be garbage collected.
|
farmbuyer@1
|
869 local ST = LibStub("ScrollingTable"):CreateST(eoi_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
|
farmbuyer@1
|
870 _d:SetUserData("eoiST",ST)
|
farmbuyer@1
|
871 if addon.author_debug then
|
farmbuyer@1
|
872 _G.OLST = ST
|
farmbuyer@1
|
873 end
|
farmbuyer@1
|
874
|
farmbuyer@1
|
875 if not eoi_st_otherrow_bgcolortable_default then
|
farmbuyer@1
|
876 eoi_st_otherrow_bgcolortable_default = ST:GetDefaultHighlightBlank()
|
farmbuyer@1
|
877 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
|
farmbuyer@1
|
878 return eoi_st_otherrow_bgcolortable_default
|
farmbuyer@1
|
879 end})
|
farmbuyer@1
|
880 end
|
farmbuyer@1
|
881
|
farmbuyer@1
|
882 -- Calling SetData breaks (trying to call Refresh) if g_loot hasn't gone
|
farmbuyer@1
|
883 -- through this loop.
|
farmbuyer@1
|
884 addon:_fill_out_eoi_data(1)
|
farmbuyer@1
|
885 -- safety check begin
|
farmbuyer@1
|
886 for i,e in ipairs(g_loot) do
|
farmbuyer@1
|
887 if type(e.cols) ~= 'table' then
|
farmbuyer@1
|
888 addon:Print("ARGH, index",i,"bad in eoi_OGS, type",type(e.cols),
|
farmbuyer@1
|
889 "entry kind", e.kind, "data", e.itemname or e.bosskill or e.startday.text,
|
farmbuyer@1
|
890 "-- please take a screenshot and send to Farmbuyer.")
|
farmbuyer@1
|
891 tabledump(e)
|
farmbuyer@1
|
892 end
|
farmbuyer@1
|
893 end
|
farmbuyer@1
|
894 -- safety check end
|
farmbuyer@1
|
895 ST:SetData(g_loot)
|
farmbuyer@1
|
896 ST:RegisterEvents{
|
farmbuyer@1
|
897 OnEnter = eoi_st_OnEnter,
|
farmbuyer@1
|
898 OnLeave = eoi_st_OnLeave,
|
farmbuyer@1
|
899 OnClick = eoi_st_OnClick,
|
farmbuyer@1
|
900 OnDoubleClick = eoi_st_OnDoubleClick,
|
farmbuyer@1
|
901 }
|
farmbuyer@1
|
902
|
farmbuyer@1
|
903 -- We want a single "update and redraw" function for the ST. Also, the
|
farmbuyer@1
|
904 -- given refresh function is badly named and does nothing; the actual
|
farmbuyer@1
|
905 -- function is SortData (also badly named when no sorting is being done),
|
farmbuyer@1
|
906 -- which unconditionally calls the *hooked* Refresh.
|
farmbuyer@1
|
907 local oldrefresh = ST.Refresh
|
farmbuyer@1
|
908 ST.Refresh = function (self, opt_index)
|
farmbuyer@1
|
909 addon:_fill_out_eoi_data(opt_index)
|
farmbuyer@1
|
910 return oldrefresh(self)
|
farmbuyer@1
|
911 end
|
farmbuyer@1
|
912 ST.OuroLoot_Refresh = function (self, opt_index)
|
farmbuyer@1
|
913 addon:_fill_out_eoi_data(opt_index)
|
farmbuyer@1
|
914 -- safety check begin
|
farmbuyer@1
|
915 for i,e in ipairs(g_loot) do
|
farmbuyer@1
|
916 if type(e.cols) ~= 'table' then
|
farmbuyer@4
|
917 addon:Print("ARGH, index",i,"bad in eoi refresh, refreshed at", opt_index, "type",type(e.cols),
|
farmbuyer@1
|
918 "entry kind", e.kind, "data", e.itemname or e.bosskill or e.startday.text,
|
farmbuyer@1
|
919 "-- please take a screenshot and send to Farmbuyer.")
|
farmbuyer@1
|
920 tabledump(e)
|
farmbuyer@1
|
921 end
|
farmbuyer@1
|
922 end
|
farmbuyer@1
|
923 -- safety check end
|
farmbuyer@1
|
924 self:SortData() -- calls hooked refresh
|
farmbuyer@1
|
925 end
|
farmbuyer@1
|
926
|
farmbuyer@1
|
927 -- No need to keep creating function closures that all just "return true",
|
farmbuyer@1
|
928 -- instead we grab the one made inside lib-st. There's no "get filter" API
|
farmbuyer@1
|
929 -- so we just reach inside.
|
farmbuyer@6
|
930 player_filter_all = ST.Filter
|
farmbuyer@1
|
931
|
farmbuyer@1
|
932 -- Now set up the future drawing function...
|
farmbuyer@1
|
933 tabs_OnGroupSelected["eoi"] = function(container,specials)
|
farmbuyer@1
|
934 local st_widget = GUI:Create("lib-st")
|
farmbuyer@1
|
935 local st = _d:GetUserData("eoiST")
|
farmbuyer@1
|
936
|
farmbuyer@1
|
937 -- This is actually required each time
|
farmbuyer@6
|
938 _d:SetUserData ("player filter clear", player_filter_all)
|
farmbuyer@6
|
939 _d:SetUserData ("player filter by name", player_filter_by_name)
|
farmbuyer@1
|
940
|
farmbuyer@1
|
941 st:OuroLoot_Refresh()
|
farmbuyer@1
|
942 st_widget:WrapST(st)
|
farmbuyer@3
|
943 st_widget.head_offset = 15
|
farmbuyer@3
|
944 st_widget.tail_offset = 0
|
farmbuyer@1
|
945
|
farmbuyer@1
|
946 if OuroLootSV_opts.scroll_to_bottom then
|
farmbuyer@1
|
947 local scrollbar = _G[st.scrollframe:GetName().."ScrollBar"]
|
farmbuyer@1
|
948 if scrollbar then
|
farmbuyer@1
|
949 local _,max = scrollbar:GetMinMaxValues()
|
farmbuyer@1
|
950 scrollbar:SetValue(max) -- also calls hooked Refresh
|
farmbuyer@1
|
951 end
|
farmbuyer@1
|
952 end
|
farmbuyer@1
|
953
|
farmbuyer@1
|
954 container:SetLayout("Fill")
|
farmbuyer@1
|
955 container:AddChild(st_widget)
|
farmbuyer@1
|
956
|
farmbuyer@1
|
957 local b = mkbutton('eoi_filter_reset', "Reset Player Filter",
|
farmbuyer@1
|
958 [[Return to showing complete loot information.]])
|
farmbuyer@1
|
959 b:SetFullWidth(true)
|
farmbuyer@1
|
960 b:SetCallback("OnClick", function (_b)
|
farmbuyer@1
|
961 local st = _d:GetUserData("eoiST")
|
farmbuyer@6
|
962 st:SetFilter(player_filter_all)
|
farmbuyer@1
|
963 _b:SetDisabled(true)
|
farmbuyer@1
|
964 end)
|
farmbuyer@6
|
965 b:SetDisabled(st.Filter == player_filter_all)
|
farmbuyer@1
|
966 specials:AddChild(b)
|
farmbuyer@1
|
967
|
farmbuyer@1
|
968 local people = { "<nobody>" }
|
farmbuyer@1
|
969 for i=1,GetNumRaidMembers() do
|
farmbuyer@1
|
970 tinsert(people,(GetRaidRosterInfo(i)))
|
farmbuyer@1
|
971 end
|
farmbuyer@1
|
972 table.sort(people)
|
farmbuyer@1
|
973 local initial
|
farmbuyer@1
|
974 for i,n in ipairs(people) do
|
farmbuyer@1
|
975 if n == addon.sharder then initial = i end
|
farmbuyer@1
|
976 end
|
farmbuyer@1
|
977 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
978 [[If set, items received by this person will be automatically marked as disenchanted.]])
|
farmbuyer@1
|
979 b:SetFullWidth(true)
|
farmbuyer@1
|
980 b:SetLabel("Auto-mark as shard:")
|
farmbuyer@1
|
981 b:SetList(people)
|
farmbuyer@1
|
982 b:SetValue(initial or 1)
|
farmbuyer@1
|
983 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
984 addon.sharder = (choice ~= 1) and people[choice] or nil
|
farmbuyer@1
|
985 end)
|
farmbuyer@1
|
986 specials:AddChild(b)
|
farmbuyer@1
|
987
|
farmbuyer@1
|
988 local b = mkbutton('eoi_bcast_req', "Request B'casters",
|
farmbuyer@1
|
989 [[Sends out a request for others to enable loot rebroadcasting if they have not already done so.]])
|
farmbuyer@1
|
990 b:SetFullWidth(true)
|
farmbuyer@1
|
991 b:SetCallback("OnClick", function ()
|
farmbuyer@1
|
992 addon:Print("Sending request!")
|
farmbuyer@1
|
993 addon.requesting = true
|
farmbuyer@1
|
994 addon:broadcast('bcast_req')
|
farmbuyer@1
|
995 end)
|
farmbuyer@1
|
996 b:SetDisabled(not addon.enabled)
|
farmbuyer@1
|
997 specials:AddChild(b)
|
farmbuyer@1
|
998 end
|
farmbuyer@1
|
999 -- ...and call it.
|
farmbuyer@1
|
1000 return tabs_OnGroupSelected["eoi"](ocontainer,specials)
|
farmbuyer@1
|
1001 end
|
farmbuyer@1
|
1002
|
farmbuyer@37
|
1003
|
farmbuyer@1
|
1004 -- Tab 2/3 (generated text)
|
farmbuyer@1
|
1005 function tabs_generated_text_OGS (container, specials, text_kind)
|
farmbuyer@1
|
1006 container:SetLayout("Fill")
|
farmbuyer@1
|
1007 local box = GUI:Create("MultiLineEditBox")
|
farmbuyer@1
|
1008 box:SetFullWidth(true)
|
farmbuyer@1
|
1009 box:SetFullHeight(true)
|
farmbuyer@1
|
1010 box:SetLabel("Pressing the Escape key while typing will return keystroke control to the usual chat window.")
|
farmbuyer@1
|
1011 box:DisableButton(true)
|
farmbuyer@1
|
1012 addon:_fill_out_eoi_data(1)
|
farmbuyer@1
|
1013
|
farmbuyer@1
|
1014 -- Update the savedvar copy of the text before presenting it for editing,
|
farmbuyer@1
|
1015 -- then save it again when editing finishes. This way if the user goes
|
farmbuyer@1
|
1016 -- offline while editing, at least the unedited version is saved instead
|
farmbuyer@1
|
1017 -- of all the new text being lost entirely. (Yes, it's happened.)
|
farmbuyer@1
|
1018 --
|
farmbuyer@1
|
1019 -- No good local-ish place to store the cursor position that will also
|
farmbuyer@1
|
1020 -- survive the entire display being released. Abuse the generated text
|
farmbuyer@1
|
1021 -- cache for this purpose.
|
farmbuyer@1
|
1022 local pos = text_kind.."_pos"
|
farmbuyer@1
|
1023 if _generate_text(text_kind) then
|
farmbuyer@1
|
1024 g_loot[text_kind] = g_loot[text_kind] .. g_generated[text_kind]
|
farmbuyer@1
|
1025 g_generated[text_kind] = nil
|
farmbuyer@1
|
1026 end
|
farmbuyer@1
|
1027 box:SetText(g_loot[text_kind])
|
farmbuyer@1
|
1028 box.editBox:SetCursorPosition(g_generated[pos] or 0)
|
farmbuyer@1
|
1029 box.editBox:SetScript("OnShow", box.editBox.SetFocus)
|
farmbuyer@1
|
1030 box:SetCallback("OnRelease", function(_box)
|
farmbuyer@1
|
1031 box.editBox:ClearFocus()
|
farmbuyer@1
|
1032 g_loot[text_kind] = _box:GetText()
|
farmbuyer@1
|
1033 g_generated[pos] = _box.editBox:GetCursorPosition()
|
farmbuyer@1
|
1034 end)
|
farmbuyer@1
|
1035 container:AddChild(box)
|
farmbuyer@1
|
1036
|
farmbuyer@1
|
1037 local w = mkbutton("Regenerate",
|
farmbuyer@1
|
1038 [[+DISCARD> all text in this tab, and regenerate it from the current loot information.]])
|
farmbuyer@1
|
1039 w:SetFullWidth(true)
|
farmbuyer@1
|
1040 w:SetDisabled ((#g_loot == 0) and (box:GetText() == ""))
|
farmbuyer@1
|
1041 w:SetCallback("OnClick", function(_w)
|
farmbuyer@1
|
1042 box:SetText("")
|
farmbuyer@1
|
1043 g_loot[text_kind] = ""
|
farmbuyer@1
|
1044 g_loot.printed[text_kind] = 0
|
farmbuyer@1
|
1045 g_generated.last_instance = nil
|
farmbuyer@1
|
1046 g_generated[pos] = nil
|
farmbuyer@1
|
1047 addon:Print("'%s' has been regenerated.", _tabtexts[text_kind].title)
|
farmbuyer@1
|
1048 return addon:redisplay()
|
farmbuyer@1
|
1049 --return tabs_OnGroupSelected_func(container,"OnGroupSelected",text_kind)
|
farmbuyer@1
|
1050 end)
|
farmbuyer@1
|
1051 specials:AddChild(w)
|
farmbuyer@1
|
1052 _populate_text_specials (box, specials, mkbutton, text_kind)
|
farmbuyer@1
|
1053 end
|
farmbuyer@1
|
1054
|
farmbuyer@37
|
1055
|
farmbuyer@1
|
1056 -- Tab 4: History
|
farmbuyer@1
|
1057 -- Much of the implementation here follows a similar desgin for the first
|
farmbuyer@4
|
1058 -- tab's handling of ST objects. We will even reuse its controlling tables
|
farmbuyer@4
|
1059 -- when feasible.
|
farmbuyer@37
|
1060 local histST, hist_dropdownfuncs
|
farmbuyer@1
|
1061
|
farmbuyer@37
|
1062 hist_dropdownfuncs = dropdownfuncs{
|
farmbuyer@37
|
1063 ["Delete this loot history"] = function(rowi)
|
farmbuyer@37
|
1064 --local gone = tremove(g_loot,rowi)
|
farmbuyer@37
|
1065 --addon:Print("Removed %s.",
|
farmbuyer@37
|
1066 --gone.itemlink or gone.bosskill or gone.startday.text)
|
farmbuyer@37
|
1067 end,
|
farmbuyer@37
|
1068 }
|
farmbuyer@37
|
1069 local hist_dropdown = gen_easymenu_table(
|
farmbuyer@37
|
1070 {{
|
farmbuyer@37
|
1071 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@37
|
1072 notClickable = true,
|
farmbuyer@37
|
1073 notCheckable = true,
|
farmbuyer@37
|
1074 }},
|
farmbuyer@37
|
1075 {
|
farmbuyer@37
|
1076 "Delete this loot history|Permanent, no going back!",
|
farmbuyer@37
|
1077 --"Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day",
|
farmbuyer@37
|
1078 "--",
|
farmbuyer@37
|
1079 CLOSE
|
farmbuyer@37
|
1080 }, hist_dropdownfuncs)
|
farmbuyer@6
|
1081
|
farmbuyer@37
|
1082 local hist_st_cols = {
|
farmbuyer@37
|
1083 { -- col 1
|
farmbuyer@37
|
1084 name = "Player",
|
farmbuyer@37
|
1085 width = 130,
|
farmbuyer@37
|
1086 DoCellUpdate = eoi_st_col2_DoCellUpdate,
|
farmbuyer@37
|
1087 },
|
farmbuyer@37
|
1088 { -- col 2
|
farmbuyer@37
|
1089 name = "Most Recent Loot",
|
farmbuyer@37
|
1090 width = 250,
|
farmbuyer@37
|
1091 DoCellUpdate = hist_st_col2_DoCellUpdate,
|
farmbuyer@37
|
1092 },
|
farmbuyer@37
|
1093 { -- col 3
|
farmbuyer@37
|
1094 name = "When",
|
farmbuyer@37
|
1095 width = 250,
|
farmbuyer@37
|
1096 DoCellUpdate = hist_st_col3_DoCellUpdate,
|
farmbuyer@37
|
1097 defaultsort = "asc",
|
farmbuyer@37
|
1098 sort = "asc",
|
farmbuyer@37
|
1099 sortnext = 1,
|
farmbuyer@37
|
1100 },
|
farmbuyer@37
|
1101 }
|
farmbuyer@37
|
1102
|
farmbuyer@37
|
1103 local hist_normal_status =
|
farmbuyer@37
|
1104 [[Click on a row to view all history for that player only. (Click column headers to re-sort.)]]
|
farmbuyer@37
|
1105 local hist_name_status =
|
farmbuyer@37
|
1106 [[Right-click on any row to return to normal history display.]]
|
farmbuyer@37
|
1107
|
farmbuyer@37
|
1108 local history_filter_by_recent = function (st, e)
|
farmbuyer@37
|
1109 if e.kind ~= 'history' then return true end
|
farmbuyer@37
|
1110 return e.cols[2].OLi == 1
|
farmbuyer@37
|
1111 end
|
farmbuyer@37
|
1112
|
farmbuyer@37
|
1113 local history_filter_who
|
farmbuyer@37
|
1114 local history_filter_by_name = function (st, e)
|
farmbuyer@37
|
1115 if e.kind ~= 'history' then return true end
|
farmbuyer@37
|
1116 return e.OLwho == history_filter_who
|
farmbuyer@37
|
1117 end
|
farmbuyer@37
|
1118
|
farmbuyer@37
|
1119 -- Loot column
|
farmbuyer@37
|
1120 local function hist_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
|
farmbuyer@37
|
1121 print("col2 DCU", realrow)
|
farmbuyer@37
|
1122 end
|
farmbuyer@37
|
1123
|
farmbuyer@37
|
1124 -- Formatted timestamp column
|
farmbuyer@37
|
1125 local function hist_st_col3_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
|
farmbuyer@37
|
1126 print("col3 DCU", realrow)
|
farmbuyer@37
|
1127 if not fShow then
|
farmbuyer@37
|
1128 cellFrame.text:SetText("")
|
farmbuyer@37
|
1129 return
|
farmbuyer@6
|
1130 end
|
farmbuyer@6
|
1131
|
farmbuyer@37
|
1132 local d = data[realrow]
|
farmbuyer@37
|
1133 local cell = d.cols[column]
|
farmbuyer@37
|
1134
|
farmbuyer@37
|
1135 cellFrame.text:SetText(cell.value)
|
farmbuyer@37
|
1136 cellFrame.text:SetTextColor(1,1,1,1)
|
farmbuyer@37
|
1137
|
farmbuyer@37
|
1138 --if d.kind ~= 'loot' then
|
farmbuyer@37
|
1139 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[d.kind])
|
farmbuyer@37
|
1140 --else
|
farmbuyer@37
|
1141 -- table:SetHighLightColor (rowFrame, table:GetDefaultHighlightBlank())
|
farmbuyer@37
|
1142 --end
|
farmbuyer@37
|
1143 end
|
farmbuyer@37
|
1144
|
farmbuyer@37
|
1145 local function hist_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
|
farmbuyer@37
|
1146 if (row == nil) or (realrow == nil) then return false end -- click column header, do default resorting
|
farmbuyer@37
|
1147 local h = data[realrow]
|
farmbuyer@37
|
1148 local kind = h.kind
|
farmbuyer@37
|
1149
|
farmbuyer@37
|
1150 if history_filter_who and button == "RightButton" then -- now filtering and wanting not to
|
farmbuyer@37
|
1151 history_filter_who = nil
|
farmbuyer@37
|
1152 stable:SetFilter(history_filter_by_recent)
|
farmbuyer@37
|
1153 setstatus(hist_normal_status)
|
farmbuyer@37
|
1154 elseif (not history_filter_who) and button == "LeftButton" then -- not filtering and wanting to
|
farmbuyer@37
|
1155 history_filter_who = h.OLwho
|
farmbuyer@37
|
1156 stable:SetFilter(history_filter_by_name)
|
farmbuyer@37
|
1157 setstatus(hist_name_status)
|
farmbuyer@6
|
1158 end
|
farmbuyer@6
|
1159
|
farmbuyer@37
|
1160 return true -- do not do anything further
|
farmbuyer@37
|
1161 end
|
farmbuyer@37
|
1162
|
farmbuyer@37
|
1163 --[[
|
farmbuyer@37
|
1164 local function hist_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
|
farmbuyer@37
|
1165 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
|
farmbuyer@37
|
1166 local h = data[realrow]
|
farmbuyer@37
|
1167 local kind = h.kind
|
farmbuyer@37
|
1168
|
farmbuyer@37
|
1169 return true -- do not do anything further
|
farmbuyer@37
|
1170 end]]
|
farmbuyer@37
|
1171
|
farmbuyer@37
|
1172 -- Tab 4: History (implementation)
|
farmbuyer@37
|
1173 tabs_OnGroupSelected["hist"] = function(container,specials)
|
farmbuyer@37
|
1174 histST = LibStub("ScrollingTable"):CreateST(hist_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
|
farmbuyer@37
|
1175 _d:SetUserData("histST",histST)
|
farmbuyer@37
|
1176 if addon.author_debug then
|
farmbuyer@37
|
1177 _G.OLHST = histST
|
farmbuyer@1
|
1178 end
|
farmbuyer@1
|
1179
|
farmbuyer@37
|
1180 if not eoi_st_otherrow_bgcolortable_default then
|
farmbuyer@37
|
1181 eoi_st_otherrow_bgcolortable_default = histST:GetDefaultHighlightBlank()
|
farmbuyer@37
|
1182 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
|
farmbuyer@37
|
1183 return eoi_st_otherrow_bgcolortable_default
|
farmbuyer@37
|
1184 end})
|
farmbuyer@1
|
1185 end
|
farmbuyer@1
|
1186
|
farmbuyer@37
|
1187 addon:_build_history_names()
|
farmbuyer@37
|
1188 addon:_fill_out_hist_data(1)
|
farmbuyer@37
|
1189 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1190 histST:RegisterEvents{
|
farmbuyer@37
|
1191 OnEnter = eoi_st_OnEnter,
|
farmbuyer@37
|
1192 OnLeave = eoi_st_OnLeave,
|
farmbuyer@37
|
1193 OnClick = hist_st_OnClick,
|
farmbuyer@37
|
1194 --OnDoubleClick = hist_st_OnDoubleClick,
|
farmbuyer@37
|
1195 }
|
farmbuyer@37
|
1196 local oldrefresh = histST.Refresh
|
farmbuyer@37
|
1197 histST.Refresh = function (self, opt_index)
|
farmbuyer@37
|
1198 addon:_fill_out_hist_data(opt_index)
|
farmbuyer@37
|
1199 return oldrefresh(self)
|
farmbuyer@37
|
1200 end
|
farmbuyer@37
|
1201 histST.OuroLoot_Refresh = function (self, opt_index)
|
farmbuyer@37
|
1202 addon:_fill_out_hist_data(opt_index)
|
farmbuyer@37
|
1203 self:SortData() -- calls hooked refresh
|
farmbuyer@6
|
1204 end
|
farmbuyer@6
|
1205
|
farmbuyer@37
|
1206 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@6
|
1207
|
farmbuyer@37
|
1208 -- Zaps history for the given realm, or the current (current-playing
|
farmbuyer@37
|
1209 -- realm, not currently-displayed realm) one if not specified.
|
farmbuyer@37
|
1210 local function reset_current_realm (opt_realmname)
|
farmbuyer@37
|
1211 local r = assert(opt_realmname or GetRealmName())
|
farmbuyer@37
|
1212 -- new .history table:
|
farmbuyer@37
|
1213 addon.history_all[r] = addon:_prep_new_history_category (nil, r)
|
farmbuyer@37
|
1214 addon.history = addon.history_all[r]
|
farmbuyer@37
|
1215 addon.hist_clean = nil
|
farmbuyer@37
|
1216 -- new .history.st table:
|
farmbuyer@37
|
1217 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1218 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1219 end
|
farmbuyer@6
|
1220
|
farmbuyer@1
|
1221 tabs_OnGroupSelected["hist"] = function(container,specials)
|
farmbuyer@37
|
1222 local st_widget = GUI:Create("lib-st")
|
farmbuyer@37
|
1223 -- don't need _d:GetUserData("histST") here, as it's already a local
|
farmbuyer@37
|
1224 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1225 st_widget:WrapST(histST)
|
farmbuyer@37
|
1226 st_widget.head_offset = 15
|
farmbuyer@37
|
1227 st_widget.tail_offset = 0
|
farmbuyer@37
|
1228 container:SetLayout("Fill")
|
farmbuyer@37
|
1229 container:AddChild(st_widget)
|
farmbuyer@37
|
1230 setstatus(hist_normal_status)
|
farmbuyer@1
|
1231
|
farmbuyer@37
|
1232 local b
|
farmbuyer@37
|
1233 do
|
farmbuyer@37
|
1234 local realms,current = {},1
|
farmbuyer@37
|
1235 for realmname,histtable in pairs(addon.history_all) do
|
farmbuyer@37
|
1236 if type(histtable) == 'table' then
|
farmbuyer@37
|
1237 tinsert(realms,realmname)
|
farmbuyer@37
|
1238 if addon.history == histtable then current = #realms end
|
farmbuyer@4
|
1239 end
|
farmbuyer@4
|
1240 end
|
farmbuyer@37
|
1241 b = mkbutton("Dropdown", nil, "", [[Which realm to display]])
|
farmbuyer@1
|
1242 b:SetFullWidth(true)
|
farmbuyer@37
|
1243 b:SetLabel() -- required even when empty, see ace3 ticket #234
|
farmbuyer@37
|
1244 b:SetList(realms)
|
farmbuyer@37
|
1245 b:SetValue(current)
|
farmbuyer@37
|
1246 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@37
|
1247 local r = realms[choice]
|
farmbuyer@37
|
1248 addon.history = addon:_prep_new_history_category (addon.history_all[r], r)
|
farmbuyer@37
|
1249 addon.hist_clean = nil
|
farmbuyer@6
|
1250 histST:OuroLoot_Refresh()
|
farmbuyer@6
|
1251 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1252 -- Reset filters to normal
|
farmbuyer@37
|
1253 history_filter_who = nil
|
farmbuyer@37
|
1254 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@37
|
1255 setstatus(hist_normal_status)
|
farmbuyer@1
|
1256 return addon:redisplay()
|
farmbuyer@1
|
1257 end)
|
farmbuyer@1
|
1258 specials:AddChild(b)
|
farmbuyer@37
|
1259 end
|
farmbuyer@1
|
1260
|
farmbuyer@37
|
1261 --[[ b = GUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]]
|
farmbuyer@4
|
1262
|
farmbuyer@37
|
1263 b = mkbutton("Regenerate",
|
farmbuyer@37
|
1264 [[Erases all history entries from the displayed realm, and regenerates it from current loot information.]])
|
farmbuyer@37
|
1265 b:SetFullWidth(true)
|
farmbuyer@37
|
1266 b:SetDisabled (#addon.history == 0)
|
farmbuyer@37
|
1267 b:SetCallback("OnClick", function(_b)
|
farmbuyer@37
|
1268 local dialog = StaticPopup_Show("OUROL_HIST_REGEN", addon.history.realm)
|
farmbuyer@37
|
1269 dialog.data = addon
|
farmbuyer@37
|
1270 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1271 _addon:rewrite_history (_addon.history.realm)
|
farmbuyer@37
|
1272 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1273 histST:SetData(_addon.history.st)
|
farmbuyer@37
|
1274 end
|
farmbuyer@37
|
1275 end)
|
farmbuyer@37
|
1276 specials:AddChild(b)
|
farmbuyer@1
|
1277
|
farmbuyer@37
|
1278 b = mkbutton('hist_clear', "Clear Realm History",
|
farmbuyer@37
|
1279 [[|cffff1010Erases absolutely all> history entries from the displayed realm.]])
|
farmbuyer@37
|
1280 b:SetFullWidth(true)
|
farmbuyer@37
|
1281 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1282 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", addon.history.realm)
|
farmbuyer@37
|
1283 dialog.data = addon
|
farmbuyer@37
|
1284 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1285 reset_current_realm(_addon.history.realm)
|
farmbuyer@37
|
1286 end
|
farmbuyer@37
|
1287 end)
|
farmbuyer@37
|
1288 specials:AddChild(b)
|
farmbuyer@37
|
1289
|
farmbuyer@37
|
1290 b = mkbutton('hist_clear_all', "Clear All History",
|
farmbuyer@37
|
1291 [[|cffff1010Erases absolutely all> history entries from ALL realms.]])
|
farmbuyer@37
|
1292 b:SetFullWidth(true)
|
farmbuyer@37
|
1293 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1294 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", "ALL realms")
|
farmbuyer@37
|
1295 dialog.data = addon
|
farmbuyer@37
|
1296 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1297 _addon.history_all = {}
|
farmbuyer@37
|
1298 reset_current_realm()
|
farmbuyer@37
|
1299 end
|
farmbuyer@37
|
1300 end)
|
farmbuyer@37
|
1301 specials:AddChild(b)
|
farmbuyer@37
|
1302
|
farmbuyer@37
|
1303 b = mkbutton('hist_clear_old', "Clear Older",
|
farmbuyer@37
|
1304 [[Preserves only the latest loot entry for each player on the displayed realm, removing all earlier ones.]])
|
farmbuyer@37
|
1305 b:SetFullWidth(true)
|
farmbuyer@37
|
1306 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1307 local dialog = StaticPopup_Show("OUROL_HIST_PREEN", addon.history.realm)
|
farmbuyer@37
|
1308 dialog.data = addon
|
farmbuyer@37
|
1309 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1310 _addon:preen_history(_addon.history.realm)
|
farmbuyer@37
|
1311 _addon.hist_clean = nil
|
farmbuyer@37
|
1312 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1313 end
|
farmbuyer@37
|
1314 end)
|
farmbuyer@37
|
1315 specials:AddChild(b)
|
farmbuyer@1
|
1316 end
|
farmbuyer@37
|
1317 return tabs_OnGroupSelected["hist"](container,specials)
|
farmbuyer@1
|
1318 end
|
farmbuyer@1
|
1319
|
farmbuyer@37
|
1320
|
farmbuyer@6
|
1321 -- Tab 5: Help (content in verbage.lua)
|
farmbuyer@1
|
1322 do
|
farmbuyer@1
|
1323 local tabs_help_OnGroupSelected_func = function (treeg,event,category)
|
farmbuyer@1
|
1324 treeg:ReleaseChildren()
|
farmbuyer@1
|
1325 local txt = GUI:Create("Label")
|
farmbuyer@1
|
1326 txt:SetFullWidth(true)
|
farmbuyer@1
|
1327 txt:SetFontObject(GameFontNormal)--Highlight)
|
farmbuyer@1
|
1328 txt:SetText(addon.helptext[category])
|
farmbuyer@1
|
1329 local sf = GUI:Create("ScrollFrame")
|
farmbuyer@1
|
1330 local sfstat = _d:GetUserData("help tab scroll status") or {}
|
farmbuyer@1
|
1331 sf:SetStatusTable(sfstat)
|
farmbuyer@1
|
1332 _d:SetUserData("help tab scroll status",sfstat)
|
farmbuyer@1
|
1333 sf:SetLayout("Fill")
|
farmbuyer@1
|
1334 -- This forces the scrolling area to be bigger than the visible area; else
|
farmbuyer@1
|
1335 -- some of the text gets cut off.
|
farmbuyer@1
|
1336 sf.content:SetHeight(700)
|
farmbuyer@1
|
1337 sf:AddChild(txt)
|
farmbuyer@1
|
1338 treeg:AddChild(sf)
|
farmbuyer@1
|
1339 if treeg:GetUserData("help restore scroll") then
|
farmbuyer@1
|
1340 sfstat = sfstat.scrollvalue
|
farmbuyer@1
|
1341 if sfstat then sf:SetScroll(sfstat) end
|
farmbuyer@1
|
1342 treeg:SetUserData("help restore scroll", false)
|
farmbuyer@1
|
1343 else
|
farmbuyer@1
|
1344 sf:SetScroll(0)
|
farmbuyer@1
|
1345 end
|
farmbuyer@1
|
1346 end
|
farmbuyer@1
|
1347 tabs_OnGroupSelected["help"] = function(container,specials)
|
farmbuyer@1
|
1348 container:SetLayout("Fill")
|
farmbuyer@1
|
1349 local left = GUI:Create("TreeGroup")
|
farmbuyer@1
|
1350 local leftstat = _d:GetUserData("help tab select status")
|
farmbuyer@1
|
1351 or {treewidth=145}
|
farmbuyer@1
|
1352 left:SetStatusTable(leftstat)
|
farmbuyer@1
|
1353 _d:SetUserData("help tab select status",leftstat)
|
farmbuyer@1
|
1354 left:SetLayout("Fill")
|
farmbuyer@1
|
1355 left:SetFullWidth(true)
|
farmbuyer@1
|
1356 left:SetFullHeight(true)
|
farmbuyer@1
|
1357 left:EnableButtonTooltips(false)
|
farmbuyer@1
|
1358 left:SetTree(addon.helptree)
|
farmbuyer@1
|
1359 left:SetCallback("OnGroupSelected", tabs_help_OnGroupSelected_func)
|
farmbuyer@1
|
1360 container:AddChild(left)
|
farmbuyer@1
|
1361 leftstat = leftstat.selected
|
farmbuyer@1
|
1362 if leftstat then
|
farmbuyer@1
|
1363 left:SetUserData("help restore scroll", true)
|
farmbuyer@1
|
1364 left:SelectByValue(leftstat)
|
farmbuyer@1
|
1365 else
|
farmbuyer@1
|
1366 left:SelectByValue("basic")
|
farmbuyer@1
|
1367 end
|
farmbuyer@1
|
1368 end
|
farmbuyer@1
|
1369 end
|
farmbuyer@1
|
1370
|
farmbuyer@37
|
1371
|
farmbuyer@1
|
1372 -- Tab 6: Options / Advanced
|
farmbuyer@1
|
1373 do
|
farmbuyer@1
|
1374 local function mkoption (opt, label, width, desc, opt_func)
|
farmbuyer@1
|
1375 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc)
|
farmbuyer@1
|
1376 w:SetRelativeWidth(width)
|
farmbuyer@1
|
1377 w:SetType("checkbox")
|
farmbuyer@1
|
1378 w:SetLabel(label)
|
farmbuyer@1
|
1379 if opt then
|
farmbuyer@1
|
1380 w:SetValue(OuroLootSV_opts[opt])
|
farmbuyer@1
|
1381 w:SetCallback("OnValueChanged", opt_func or (function(_w,event,value)
|
farmbuyer@1
|
1382 OuroLootSV_opts[opt] = value
|
farmbuyer@1
|
1383 end))
|
farmbuyer@1
|
1384 end
|
farmbuyer@1
|
1385 return w
|
farmbuyer@1
|
1386 end
|
farmbuyer@1
|
1387
|
farmbuyer@1
|
1388 local function adv_careful_OnTextChanged (ebox,event,value)
|
farmbuyer@1
|
1389 -- The EditBox widget's code will call an internal ShowButton routine
|
farmbuyer@1
|
1390 -- after this callback returns. ShowButton will test for this flag:
|
farmbuyer@1
|
1391 ebox:DisableButton (value == "")
|
farmbuyer@1
|
1392 end
|
farmbuyer@1
|
1393
|
farmbuyer@1
|
1394 -- Like the first tab, we use a pair of functions; first and repeating.
|
farmbuyer@1
|
1395 local function adv_real (container, specials)
|
farmbuyer@1
|
1396 local grp, w
|
farmbuyer@1
|
1397
|
farmbuyer@1
|
1398 grp = GUI:Create("InlineGroup")
|
farmbuyer@1
|
1399 grp:SetLayout("Flow")
|
farmbuyer@1
|
1400 grp:PauseLayout()
|
farmbuyer@1
|
1401 grp:SetFullWidth(true)
|
farmbuyer@1
|
1402 grp:SetTitle("Debugging/Testing Options [not saved across sessions]")
|
farmbuyer@1
|
1403
|
farmbuyer@1
|
1404 w = mkbutton("EditBox", 'comm_ident', addon.ident,
|
farmbuyer@1
|
1405 [[Disable the addon, change this field (click Okay or press Enter), then re-enable the addon.]])
|
farmbuyer@1
|
1406 w:SetRelativeWidth(0.2)
|
farmbuyer@1
|
1407 w:SetLabel("Addon channel ID")
|
farmbuyer@1
|
1408 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
|
farmbuyer@1
|
1409 w:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@1
|
1410 -- if they set it to blank spaces, they're boned. oh well.
|
farmbuyer@1
|
1411 -- Re-enabling will take care of propogating this new value.
|
farmbuyer@1
|
1412 addon.ident = (value == "") and "OuroLoot2" or value
|
farmbuyer@1
|
1413 _w:SetText(addon.ident)
|
farmbuyer@1
|
1414 addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.")
|
farmbuyer@1
|
1415 end)
|
farmbuyer@1
|
1416 w:SetDisabled(addon.enabled or addon.rebroadcast)
|
farmbuyer@1
|
1417 grp:AddChild(w)
|
farmbuyer@1
|
1418
|
farmbuyer@1
|
1419 w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache (only) ttl]])
|
farmbuyer@1
|
1420 w:SetRelativeWidth(0.05)
|
farmbuyer@1
|
1421 w:SetLabel("ttl")
|
farmbuyer@1
|
1422 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
|
farmbuyer@1
|
1423 w:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@1
|
1424 value = tonumber(value) or addon.recent_messages.ttl
|
farmbuyer@1
|
1425 addon.recent_messages.ttl = value
|
farmbuyer@1
|
1426 _w:SetText(tostring(value))
|
farmbuyer@1
|
1427 end)
|
farmbuyer@1
|
1428 grp:AddChild(w)
|
farmbuyer@1
|
1429
|
farmbuyer@1
|
1430 w = mkbutton("load nsaab1548", [[Cursed Darkhound]])
|
farmbuyer@1
|
1431 w:SetRelativeWidth(0.25)
|
farmbuyer@1
|
1432 w:SetCallback("OnClick", function()
|
farmbuyer@1
|
1433 for i, v in ipairs(DBM.AddOns) do
|
farmbuyer@1
|
1434 if v.modId == "DBM-NotScaryAtAll" then
|
farmbuyer@1
|
1435 DBM:LoadMod(v)
|
farmbuyer@1
|
1436 break
|
farmbuyer@1
|
1437 end
|
farmbuyer@1
|
1438 end
|
farmbuyer@1
|
1439 local mod = DBM:GetModByName("NotScaryAtAll")
|
farmbuyer@1
|
1440 if mod then
|
farmbuyer@1
|
1441 mod:EnableMod()
|
farmbuyer@1
|
1442 addon:Print("Now tracking ID",mod.creatureId)
|
farmbuyer@1
|
1443 else addon:Print("Can do nothing; DBM testing mod wasn't loaded.") end
|
farmbuyer@1
|
1444 end)
|
farmbuyer@5
|
1445 w:SetDisabled(addon.bossmod_registered ~= 'DBM')
|
farmbuyer@1
|
1446 grp:AddChild(w)
|
farmbuyer@1
|
1447
|
farmbuyer@1
|
1448 w = mkbutton("GC", [[full GC cycle]])
|
farmbuyer@1
|
1449 w:SetRelativeWidth(0.1)
|
farmbuyer@1
|
1450 w:SetCallback("OnClick", function() collectgarbage() end)
|
farmbuyer@1
|
1451 grp:AddChild(w)
|
farmbuyer@1
|
1452
|
farmbuyer@20
|
1453 --[==[ this has been well and truly debugged by now
|
farmbuyer@1
|
1454 w = mkbutton("EditBox", nil, addon.loot_pattern:sub(17), [[]])
|
farmbuyer@1
|
1455 w:SetRelativeWidth(0.35)
|
farmbuyer@1
|
1456 w:SetLabel("CML pattern suffix")
|
farmbuyer@1
|
1457 w:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@1
|
1458 addon.loot_pattern = addon.loot_pattern:sub(1,16) .. value
|
farmbuyer@1
|
1459 end)
|
farmbuyer@20
|
1460 grp:AddChild(w) ]==]
|
farmbuyer@20
|
1461
|
farmbuyer@20
|
1462 w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(1) grp:AddChild(w)
|
farmbuyer@1
|
1463
|
farmbuyer@1
|
1464 local simple = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1465 simple:SetLayout("List")
|
farmbuyer@1
|
1466 simple:SetRelativeWidth(0.3)
|
farmbuyer@1
|
1467 w = GUI:Create("CheckBoxSmallLabel")
|
farmbuyer@1
|
1468 w:SetFullWidth(true)
|
farmbuyer@1
|
1469 w:SetType("checkbox")
|
farmbuyer@19
|
1470 w:SetLabel("debug toggle")
|
farmbuyer@1
|
1471 w:SetValue(addon.DEBUG_PRINT)
|
farmbuyer@19
|
1472 w:SetCallback("OnValueChanged", function(_w,event,value)
|
farmbuyer@19
|
1473 addon.DEBUG_PRINT = value
|
farmbuyer@19
|
1474 addon:redisplay()
|
farmbuyer@19
|
1475 end)
|
farmbuyer@19
|
1476 simple:AddChild(w)
|
farmbuyer@19
|
1477 w = GUI:Create("CheckBoxSmallLabel")
|
farmbuyer@19
|
1478 w:SetFullWidth(true)
|
farmbuyer@19
|
1479 w:SetType("checkbox")
|
farmbuyer@19
|
1480 w:SetLabel("GOP history mode")
|
farmbuyer@19
|
1481 w:SetValue(false)
|
farmbuyer@19
|
1482 w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end)
|
farmbuyer@1
|
1483 simple:AddChild(w)
|
farmbuyer@1
|
1484 w = mkbutton("Clear All & Reload",
|
farmbuyer@1
|
1485 [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and reloads the UI.]])
|
farmbuyer@1
|
1486 w:SetFullWidth(true)
|
farmbuyer@1
|
1487 w:SetCallback("OnClick", function()
|
farmbuyer@8
|
1488 addon:_clear_SVs() -- reloads
|
farmbuyer@1
|
1489 end)
|
farmbuyer@1
|
1490 simple:AddChild(w)
|
farmbuyer@1
|
1491 grp:AddChild(simple)
|
farmbuyer@1
|
1492
|
farmbuyer@1
|
1493 simple = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1494 simple:SetLayout("List")
|
farmbuyer@1
|
1495 simple:SetRelativeWidth(0.5)
|
farmbuyer@1
|
1496 for d,v in pairs(addon.debug) do
|
farmbuyer@1
|
1497 w = GUI:Create("CheckBoxSmallLabel")
|
farmbuyer@1
|
1498 w:SetFullWidth(true)
|
farmbuyer@1
|
1499 w:SetType("checkbox")
|
farmbuyer@1
|
1500 w:SetLabel(d)
|
farmbuyer@1
|
1501 if d == "notraid" then
|
farmbuyer@39
|
1502 w:SetDescription[[Tick this before enabling to make the addon work outside of raid groups]]
|
farmbuyer@39
|
1503 elseif d == "alsolog" then
|
farmbuyer@39
|
1504 w:SetDescription[[Also log all debug messages to disk. See print_log.lua in the addon folder for later viewing.]]
|
farmbuyer@19
|
1505 else
|
farmbuyer@19
|
1506 w:SetDisabled(not addon.DEBUG_PRINT)
|
farmbuyer@1
|
1507 end
|
farmbuyer@1
|
1508 w:SetValue(v)
|
farmbuyer@1
|
1509 w:SetCallback("OnValueChanged", function(_w,event,value) addon.debug[d] = value end)
|
farmbuyer@1
|
1510 simple:AddChild(w)
|
farmbuyer@1
|
1511 end
|
farmbuyer@1
|
1512 grp:AddChild(simple)
|
farmbuyer@10
|
1513
|
farmbuyer@10
|
1514 simple = GUI:Create("SimpleGroup")
|
farmbuyer@10
|
1515 simple:SetLayout("Flow")
|
farmbuyer@10
|
1516 simple:SetRelativeWidth(0.85)
|
farmbuyer@10
|
1517 w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]])
|
farmbuyer@10
|
1518 w:SetRelativeWidth(0.15)
|
farmbuyer@10
|
1519 w:SetCallback("OnClick", function()
|
farmbuyer@10
|
1520 PlaySoundFile[[Sound\Music\WorldEvents\HordeFirepole.mp3]]
|
farmbuyer@10
|
1521 end)
|
farmbuyer@10
|
1522 simple:AddChild(w)
|
farmbuyer@10
|
1523 w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]])
|
farmbuyer@10
|
1524 w:SetRelativeWidth(0.15)
|
farmbuyer@10
|
1525 w:SetCallback("OnClick", function()
|
farmbuyer@10
|
1526 PlaySoundFile[[Sound\Music\WorldEvents\AllianceFirepole.mp3]]
|
farmbuyer@10
|
1527 end)
|
farmbuyer@10
|
1528 simple:AddChild(w)
|
farmbuyer@10
|
1529 grp:AddChild(simple)
|
farmbuyer@10
|
1530
|
farmbuyer@1
|
1531 grp:ResumeLayout()
|
farmbuyer@1
|
1532 container:AddChild(grp)
|
farmbuyer@1
|
1533 GUI:ClearFocus()
|
farmbuyer@1
|
1534 end
|
farmbuyer@1
|
1535
|
farmbuyer@1
|
1536 -- Initial lower panel function
|
farmbuyer@1
|
1537 local function adv_lower (container, specials)
|
farmbuyer@1
|
1538 local speedbump = GUI:Create("InteractiveLabel")
|
farmbuyer@1
|
1539 speedbump:SetFullWidth(true)
|
farmbuyer@1
|
1540 speedbump:SetFontObject(GameFontHighlightLarge)
|
farmbuyer@1
|
1541 speedbump:SetImage("Interface\\DialogFrame\\DialogAlertIcon")
|
farmbuyer@1
|
1542 speedbump:SetImageSize(50,50)
|
farmbuyer@1
|
1543 speedbump:SetText("The debugging/testing settings on the rest of this panel can"
|
farmbuyer@1
|
1544 .." seriously bork up the addon if you make a mistake. If you're okay"
|
farmbuyer@1
|
1545 .." with the possibility of losing data, click this warning to load the panel.")
|
farmbuyer@1
|
1546 speedbump:SetCallback("OnClick", function (_sb)
|
farmbuyer@1
|
1547 adv_lower = adv_real
|
farmbuyer@1
|
1548 return addon:redisplay()
|
farmbuyer@1
|
1549 --return tabs_OnGroupSelected_func(container.parent,"OnGroupSelected","opt")
|
farmbuyer@1
|
1550 end)
|
farmbuyer@1
|
1551 container:AddChild(speedbump)
|
farmbuyer@1
|
1552 end
|
farmbuyer@1
|
1553
|
farmbuyer@1
|
1554 tabs_OnGroupSelected["opt"] = function(container,specials)
|
farmbuyer@1
|
1555 --container:SetLayout("List")
|
farmbuyer@1
|
1556 container:SetLayout("Fill")
|
farmbuyer@1
|
1557 local scroll, grp, w
|
farmbuyer@1
|
1558
|
farmbuyer@1
|
1559 scroll = GUI:Create("ScrollFrame")
|
farmbuyer@1
|
1560 scroll:SetLayout("Flow")
|
farmbuyer@1
|
1561
|
farmbuyer@1
|
1562 grp = GUI:Create("InlineGroup")
|
farmbuyer@1
|
1563 grp:SetLayout("Flow")
|
farmbuyer@1
|
1564 grp:SetFullWidth(true)
|
farmbuyer@1
|
1565 grp:SetTitle("User Options [these are saved across sessions]")
|
farmbuyer@1
|
1566
|
farmbuyer@10
|
1567 -- The relative width fields used to be done to take up less vertical space, but
|
farmbuyer@10
|
1568 -- that turned out to look messy. Now they're just a straight line for the most part.
|
farmbuyer@10
|
1569
|
farmbuyer@1
|
1570 -- reminder popup
|
farmbuyer@16
|
1571 w = mkoption ('popup_on_join', "Show reminder popup", 0.49,
|
farmbuyer@1
|
1572 [[When joining a raid and not already tracking, display a dialog asking for instructions.]])
|
farmbuyer@1
|
1573 grp:AddChild(w)
|
farmbuyer@1
|
1574
|
farmbuyer@1
|
1575 -- toggle scroll-to-bottom on first tab
|
farmbuyer@16
|
1576 w = mkoption('scroll_to_bottom', "Scroll to bottom when opening display", 0.49,
|
farmbuyer@1
|
1577 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]])
|
farmbuyer@1
|
1578 grp:AddChild(w)
|
farmbuyer@1
|
1579
|
farmbuyer@1
|
1580 -- /loot option
|
farmbuyer@16
|
1581 w = mkoption('register_slashloot', "Register /loot slash command on login", 0.49,
|
farmbuyer@1
|
1582 [[Register "/loot" as a slash command in addition to the normal "/ouroloot". Relog to take effect.]])
|
farmbuyer@1
|
1583 grp:AddChild(w)
|
farmbuyer@1
|
1584
|
farmbuyer@1
|
1585 -- chatty mode
|
farmbuyer@16
|
1586 w = mkoption('chatty_on_kill', "Be chatty on boss kill", 0.49,
|
farmbuyer@1
|
1587 [[Print something to chat output when DBM tells Ouro Loot about a successful boss kill.]])
|
farmbuyer@1
|
1588 grp:AddChild(w)
|
farmbuyer@1
|
1589
|
farmbuyer@1
|
1590 -- less noise in main panel
|
farmbuyer@16
|
1591 w = mkoption('no_tracking_wipes', "Do not track wipes", 0.49,
|
farmbuyer@1
|
1592 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]])
|
farmbuyer@1
|
1593 grp:AddChild(w)
|
farmbuyer@1
|
1594
|
farmbuyer@1
|
1595 -- cutesy abbrevs
|
farmbuyer@16
|
1596 w = mkoption('snarky_boss', "Use snarky boss names", 0.49,
|
farmbuyer@1
|
1597 [[Irreverent replacement names for boss events.]])
|
farmbuyer@1
|
1598 grp:AddChild(w)
|
farmbuyer@1
|
1599
|
farmbuyer@1
|
1600 -- possible keybindings
|
farmbuyer@1
|
1601 do
|
farmbuyer@1
|
1602 local pair = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1603 pair:SetLayout("Flow")
|
farmbuyer@10
|
1604 pair:SetRelativeWidth(0.95)
|
farmbuyer@1
|
1605 local editbox, checkbox
|
farmbuyer@1
|
1606 editbox = mkbutton("EditBox", nil, OuroLootSV_opts.keybinding_text,
|
farmbuyer@1
|
1607 [[Keybinding text format is fragile! Relog to take effect.]])
|
farmbuyer@1
|
1608 editbox:SetRelativeWidth(0.5)
|
farmbuyer@1
|
1609 editbox:SetLabel("Keybinding text")
|
farmbuyer@1
|
1610 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@1
|
1611 OuroLootSV_opts.keybinding_text = value
|
farmbuyer@1
|
1612 end)
|
farmbuyer@1
|
1613 editbox:SetDisabled(not OuroLootSV_opts.keybinding)
|
farmbuyer@1
|
1614 checkbox = mkoption('keybinding', "Register keybinding", 0.5,
|
farmbuyer@1
|
1615 [[Register a keybinding to toggle the loot display. Relog to take effect.]],
|
farmbuyer@1
|
1616 function (_w,_,value)
|
farmbuyer@1
|
1617 OuroLootSV_opts.keybinding = value
|
farmbuyer@1
|
1618 editbox:SetDisabled(not OuroLootSV_opts.keybinding)
|
farmbuyer@1
|
1619 end)
|
farmbuyer@1
|
1620 pair:AddChild(checkbox)
|
farmbuyer@1
|
1621 pair:AddChild(editbox)
|
farmbuyer@1
|
1622 grp:AddChild(pair)
|
farmbuyer@1
|
1623 end
|
farmbuyer@1
|
1624
|
farmbuyer@3
|
1625 -- boss mod selection
|
farmbuyer@3
|
1626 w = GUI:Create("Spacer")
|
farmbuyer@3
|
1627 w:SetFullWidth(true)
|
farmbuyer@3
|
1628 w:SetHeight(20)
|
farmbuyer@3
|
1629 grp:AddChild(w)
|
farmbuyer@3
|
1630 do
|
farmbuyer@3
|
1631 local list = {}
|
farmbuyer@3
|
1632 local current
|
farmbuyer@3
|
1633 for k,v in ipairs(addon.bossmods) do
|
farmbuyer@3
|
1634 list[k] = v.n
|
farmbuyer@3
|
1635 if v.n == OuroLootSV_opts.bossmod then
|
farmbuyer@3
|
1636 current = k
|
farmbuyer@3
|
1637 end
|
farmbuyer@3
|
1638 end
|
farmbuyer@3
|
1639 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
|
farmbuyer@3
|
1640 w:SetRelativeWidth(0.2)
|
farmbuyer@3
|
1641 w:SetLabel("Boss Mod:")
|
farmbuyer@3
|
1642 w:SetList(list)
|
farmbuyer@3
|
1643 w:SetValue(current)
|
farmbuyer@3
|
1644 w:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@3
|
1645 OuroLootSV_opts.bossmod = list[choice]
|
farmbuyer@3
|
1646 end)
|
farmbuyer@3
|
1647 grp:AddChild(w)
|
farmbuyer@3
|
1648 end
|
farmbuyer@3
|
1649
|
farmbuyer@1
|
1650 -- item filter
|
farmbuyer@1
|
1651 w = GUI:Create("Spacer")
|
farmbuyer@1
|
1652 w:SetFullWidth(true)
|
farmbuyer@1
|
1653 w:SetHeight(20)
|
farmbuyer@1
|
1654 grp:AddChild(w)
|
farmbuyer@1
|
1655 do
|
farmbuyer@1
|
1656 local list = {}
|
farmbuyer@1
|
1657 for id in pairs(OuroLootSV_opts.itemfilter) do
|
farmbuyer@1
|
1658 local iname, _, iquality = GetItemInfo(id)
|
farmbuyer@2
|
1659 if iname then
|
farmbuyer@11
|
1660 list[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@2
|
1661 end
|
farmbuyer@1
|
1662 end
|
farmbuyer@1
|
1663 w = GUI:Create("EditBoxDropDown")
|
farmbuyer@1
|
1664 w:SetRelativeWidth(0.4)
|
farmbuyer@1
|
1665 w:SetText("Item filter")
|
farmbuyer@1
|
1666 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
|
farmbuyer@1
|
1667 w:SetList(list)
|
farmbuyer@1
|
1668 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
|
farmbuyer@1
|
1669 local iname, ilink, iquality = GetItemInfo(strtrim(text))
|
farmbuyer@1
|
1670 if not iname then
|
farmbuyer@1
|
1671 return addon:Print("Error: %s is not a valid item name/link!", text)
|
farmbuyer@1
|
1672 end
|
farmbuyer@1
|
1673 local id = tonumber(ilink:match("item:(%d+)"))
|
farmbuyer@11
|
1674 list[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@1
|
1675 OuroLootSV_opts.itemfilter[id] = true
|
farmbuyer@1
|
1676 addon:Print("Now filtering out", ilink)
|
farmbuyer@1
|
1677 end)
|
farmbuyer@1
|
1678 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
|
farmbuyer@1
|
1679 --local ilink = select(2,GetItemInfo(key_id))
|
farmbuyer@1
|
1680 OuroLootSV_opts.itemfilter[tonumber(key_id)] = nil
|
farmbuyer@1
|
1681 --addon:Print("No longer filtering out", ilink)
|
farmbuyer@1
|
1682 addon:Print("No longer filtering out", val_name)
|
farmbuyer@1
|
1683 end)
|
farmbuyer@1
|
1684 grp:AddChild(w)
|
farmbuyer@1
|
1685 end
|
farmbuyer@1
|
1686
|
farmbuyer@1
|
1687 addon.sender_list.sort()
|
farmbuyer@1
|
1688 if #addon.sender_list.namesI > 0 then
|
farmbuyer@1
|
1689 local senders = table.concat(addon.sender_list.namesI,'\n') -- sigh
|
farmbuyer@1
|
1690 -- If 39 other people in the raid are running this, the label will
|
farmbuyer@1
|
1691 -- explode... is it likely enough to care about? No.
|
farmbuyer@1
|
1692 w = GUI:Create("Spacer")
|
farmbuyer@1
|
1693 w:SetFullWidth(true)
|
farmbuyer@1
|
1694 w:SetHeight(20)
|
farmbuyer@1
|
1695 grp:AddChild(w)
|
farmbuyer@1
|
1696 w = GUI:Create("Label")
|
farmbuyer@1
|
1697 w:SetRelativeWidth(0.4)
|
farmbuyer@11
|
1698 w:SetText(ITEM_QUALITY_COLORS[3].hex .."Echo from latest ping:|r\n"..senders)
|
farmbuyer@1
|
1699 grp:AddChild(w)
|
farmbuyer@1
|
1700 end
|
farmbuyer@1
|
1701
|
farmbuyer@6
|
1702 scroll:AddChild(grp)
|
farmbuyer@6
|
1703
|
farmbuyer@1
|
1704 w = mkbutton("ReloadUI", [[Does what you think it does. Loot information is written out and restored.]])
|
farmbuyer@1
|
1705 w:SetFullWidth(true)
|
farmbuyer@1
|
1706 w:SetCallback("OnClick", ReloadUI)
|
farmbuyer@1
|
1707 specials:AddChild(w)
|
farmbuyer@1
|
1708
|
farmbuyer@1
|
1709 w = mkbutton("Ping!",
|
farmbuyer@1
|
1710 [[Asks other raid users for their addon version and current status. Results displayed on User Options panel.]])
|
farmbuyer@1
|
1711 w:SetFullWidth(true)
|
farmbuyer@1
|
1712 w:SetCallback("OnClick", function(_w)
|
farmbuyer@1
|
1713 _w:SetText("5... 4... 3...")
|
farmbuyer@1
|
1714 _w:SetDisabled(true)
|
farmbuyer@23
|
1715 addon:DoPing()
|
farmbuyer@1
|
1716 addon:ScheduleTimer(function(b)
|
farmbuyer@1
|
1717 if b:IsVisible() then
|
farmbuyer@1
|
1718 return addon:redisplay()
|
farmbuyer@1
|
1719 --return tabs_OnGroupSelected_func(container,"OnGroupSelected","opt")
|
farmbuyer@1
|
1720 end
|
farmbuyer@1
|
1721 end, 5, _w)
|
farmbuyer@1
|
1722 end)
|
farmbuyer@1
|
1723 specials:AddChild(w)
|
farmbuyer@1
|
1724
|
farmbuyer@1
|
1725 -- Add appropriate lower panel
|
farmbuyer@1
|
1726 adv_lower (scroll, specials)
|
farmbuyer@1
|
1727
|
farmbuyer@1
|
1728 -- Finish up
|
farmbuyer@1
|
1729 container:AddChild(scroll)
|
farmbuyer@1
|
1730 end
|
farmbuyer@1
|
1731 end
|
farmbuyer@1
|
1732
|
farmbuyer@1
|
1733
|
farmbuyer@1
|
1734 -- Simply to avoid recreating the same function over and over
|
farmbuyer@1
|
1735 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
|
farmbuyer@1
|
1736 tabs_OnGroupSelected_func = function (tabs,event,group)
|
farmbuyer@1
|
1737 tabs_OnGroupSelected_func_args[1] = tabs
|
farmbuyer@1
|
1738 tabs_OnGroupSelected_func_args[3] = group
|
farmbuyer@1
|
1739 tabs:ReleaseChildren()
|
farmbuyer@1
|
1740 local spec = tabs:GetUserData("special buttons group")
|
farmbuyer@1
|
1741 spec:ReleaseChildren()
|
farmbuyer@1
|
1742 local h = GUI:Create("Heading")
|
farmbuyer@1
|
1743 h:SetFullWidth(true)
|
farmbuyer@1
|
1744 h:SetText(_tabtexts[group].title)
|
farmbuyer@1
|
1745 spec:AddChild(h)
|
farmbuyer@1
|
1746 return tabs_OnGroupSelected[group](tabs,spec,group)
|
farmbuyer@1
|
1747 --[====[
|
farmbuyer@1
|
1748 Unfortunately, :GetHeight() called on anything useful out of a TabGroup
|
farmbuyer@1
|
1749 returns the static default size (about 50 pixels) until the refresh
|
farmbuyer@1
|
1750 cycle *after* all the frames are shown. Trying to fix it up after a
|
farmbuyer@1
|
1751 single OnUpdate doesn't work either. So for now it's all hardcoded.
|
farmbuyer@1
|
1752
|
farmbuyer@1
|
1753 Using this to determine the actual height of the usable area.
|
farmbuyer@1
|
1754 366 pixels
|
farmbuyer@1
|
1755 if group == "eoi" then
|
farmbuyer@1
|
1756 local stframe = tabs.children[1].frame
|
farmbuyer@1
|
1757 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
|
farmbuyer@1
|
1758 stframe:GetTop()-stframe:GetBottom())
|
farmbuyer@1
|
1759 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
|
farmbuyer@1
|
1760 stframe:GetRight()-stframe:GetLeft())
|
farmbuyer@1
|
1761 end
|
farmbuyer@1
|
1762 ]====]
|
farmbuyer@1
|
1763 end
|
farmbuyer@1
|
1764
|
farmbuyer@1
|
1765 --[[
|
farmbuyer@1
|
1766 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1767 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1768 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1769 ]]
|
farmbuyer@1
|
1770 do
|
farmbuyer@1
|
1771 local replacement_colors = { ["+"]="|cffffffff", ["<"]="|cff00ff00", [">"]="|r" }
|
farmbuyer@1
|
1772 function mkbutton (opt_widget_type, opt_key, label, status)
|
farmbuyer@1
|
1773 if not label then
|
farmbuyer@1
|
1774 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
|
farmbuyer@1
|
1775 elseif not status then
|
farmbuyer@1
|
1776 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
|
farmbuyer@1
|
1777 end
|
farmbuyer@1
|
1778 local button = GUI:Create(opt_widget_type)
|
farmbuyer@1
|
1779 if button.SetText then button:SetText(tostring(label)) end
|
farmbuyer@1
|
1780 status = status:gsub("[%+<>]",replacement_colors)
|
farmbuyer@1
|
1781 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
|
farmbuyer@1
|
1782 button:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@1
|
1783 -- retrieval key may be specified as nil if all the parameters are given
|
farmbuyer@1
|
1784 if opt_key then _d:SetUserData (opt_key, button) end
|
farmbuyer@1
|
1785 return button
|
farmbuyer@1
|
1786 end
|
farmbuyer@1
|
1787 end
|
farmbuyer@1
|
1788
|
farmbuyer@1
|
1789 --[[
|
farmbuyer@1
|
1790 Creates the main window.
|
farmbuyer@1
|
1791 ]]
|
farmbuyer@1
|
1792 function addon:BuildMainDisplay (opt_tabselect)
|
farmbuyer@1
|
1793 if self.display then
|
farmbuyer@1
|
1794 -- try to get everything to update, rebuild, refresh... ugh, no
|
farmbuyer@1
|
1795 self.display:Hide()
|
farmbuyer@1
|
1796 end
|
farmbuyer@1
|
1797
|
farmbuyer@25
|
1798 -- This probably causes taint... hm.
|
farmbuyer@25
|
1799 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
|
farmbuyer@25
|
1800 UIDROPDOWNMENU_SHOW_TIME = 4
|
farmbuyer@25
|
1801
|
farmbuyer@1
|
1802 local display = GUI:Create("Frame")
|
farmbuyer@1
|
1803 if _d then
|
farmbuyer@1
|
1804 display:SetUserData("eoiST",_d) -- warning! warning! kludge detected!
|
farmbuyer@1
|
1805 end
|
farmbuyer@1
|
1806 _d = display
|
farmbuyer@1
|
1807 self.display = display
|
farmbuyer@17
|
1808 display:SetTitle(window_title)
|
farmbuyer@1
|
1809 display:SetStatusText(self.status_text)
|
farmbuyer@1
|
1810 display:SetLayout("Flow")
|
farmbuyer@16
|
1811 display:SetStatusTable{width=900,height=550} -- default height is 500
|
farmbuyer@36
|
1812 if display.EnableResize then -- FIXME after next Ace3 release, this can be assumed
|
farmbuyer@36
|
1813 display:EnableResize(false)
|
farmbuyer@36
|
1814 end
|
farmbuyer@1
|
1815 display:SetCallback("OnClose", function(_display)
|
farmbuyer@25
|
1816 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
|
farmbuyer@1
|
1817 _d = _display:GetUserData("eoiST")
|
farmbuyer@1
|
1818 self.display = nil
|
farmbuyer@1
|
1819 GUI:Release(_display)
|
farmbuyer@6
|
1820 flib.clear()
|
farmbuyer@1
|
1821 collectgarbage()
|
farmbuyer@1
|
1822 end)
|
farmbuyer@1
|
1823
|
farmbuyer@1
|
1824 ----- Right-hand panel
|
farmbuyer@1
|
1825 local rhs_width = 0.20
|
farmbuyer@1
|
1826 local control = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1827 control:SetLayout("Flow")
|
farmbuyer@1
|
1828 control:SetRelativeWidth(rhs_width)
|
farmbuyer@1
|
1829 control.alignoffset = 25
|
farmbuyer@1
|
1830 control:PauseLayout()
|
farmbuyer@1
|
1831 local h,b
|
farmbuyer@1
|
1832
|
farmbuyer@1
|
1833 --- Main ---
|
farmbuyer@1
|
1834 h = GUI:Create("Heading")
|
farmbuyer@1
|
1835 h:SetFullWidth(true)
|
farmbuyer@1
|
1836 h:SetText("Main")
|
farmbuyer@1
|
1837 control:AddChild(h)
|
farmbuyer@1
|
1838
|
farmbuyer@1
|
1839 do
|
farmbuyer@1
|
1840 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
1841 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
|
farmbuyer@1
|
1842 b:SetFullWidth(true)
|
farmbuyer@1
|
1843 b:SetLabel("On/Off:")
|
farmbuyer@1
|
1844 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
|
farmbuyer@1
|
1845 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
|
farmbuyer@1
|
1846 b:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@1
|
1847 if choice == 1 then self:Activate()
|
farmbuyer@1
|
1848 elseif choice == 2 then self:Activate(nil,true)
|
farmbuyer@1
|
1849 else self:Deactivate()
|
farmbuyer@1
|
1850 end
|
farmbuyer@1
|
1851 _w = display:GetUserData('comm_ident')
|
farmbuyer@1
|
1852 if _w and _w:IsVisible() then
|
farmbuyer@1
|
1853 _w:SetDisabled(self.enabled or self.rebroadcast)
|
farmbuyer@1
|
1854 end
|
farmbuyer@1
|
1855 _w = display:GetUserData('eoi_bcast_req')
|
farmbuyer@1
|
1856 if _w and _w:IsVisible() then
|
farmbuyer@1
|
1857 _w:SetDisabled(not self.enabled)
|
farmbuyer@1
|
1858 end
|
farmbuyer@1
|
1859 end)
|
farmbuyer@1
|
1860 control:AddChild(b)
|
farmbuyer@1
|
1861 end
|
farmbuyer@1
|
1862
|
farmbuyer@1
|
1863 b = mkbutton("Dropdown", 'threshold', "",
|
farmbuyer@1
|
1864 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
|
farmbuyer@1
|
1865 b:SetFullWidth(true)
|
farmbuyer@1
|
1866 b:SetLabel("Threshold:")
|
farmbuyer@1
|
1867 b:SetList(self.thresholds)
|
farmbuyer@1
|
1868 b:SetValue(self.threshold)
|
farmbuyer@1
|
1869 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
1870 self:SetThreshold(choice)
|
farmbuyer@1
|
1871 end)
|
farmbuyer@1
|
1872 control:AddChild(b)
|
farmbuyer@1
|
1873
|
farmbuyer@4
|
1874 b = mkbutton("Clear Loot",
|
farmbuyer@1
|
1875 [[+Erases> all current loot information and generated text (but not saved texts).]])
|
farmbuyer@1
|
1876 b:SetFullWidth(true)
|
farmbuyer@1
|
1877 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
1878 StaticPopup_Show("OUROL_CLEAR").data = self
|
farmbuyer@1
|
1879 end)
|
farmbuyer@1
|
1880 control:AddChild(b)
|
farmbuyer@1
|
1881
|
farmbuyer@1
|
1882 b = GUI:Create("Spacer")
|
farmbuyer@1
|
1883 b:SetFullWidth(true)
|
farmbuyer@16
|
1884 b:SetHeight(10)
|
farmbuyer@1
|
1885 control:AddChild(b)
|
farmbuyer@1
|
1886
|
farmbuyer@1
|
1887 --[[
|
farmbuyer@1
|
1888 --- Saved Texts ---
|
farmbuyer@1
|
1889 [ Save Current As... ]
|
farmbuyer@1
|
1890 saved1
|
farmbuyer@1
|
1891 saved2
|
farmbuyer@1
|
1892 ...
|
farmbuyer@1
|
1893 [ Load ] [ Delete ]
|
farmbuyer@1
|
1894 ]]
|
farmbuyer@1
|
1895 h = GUI:Create("Heading")
|
farmbuyer@1
|
1896 h:SetFullWidth(true)
|
farmbuyer@1
|
1897 h:SetText("Saved Texts")
|
farmbuyer@1
|
1898 control:AddChild(h)
|
farmbuyer@1
|
1899 b = mkbutton("Save Current As...",
|
farmbuyer@1
|
1900 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
|
farmbuyer@1
|
1901 b:SetFullWidth(true)
|
farmbuyer@1
|
1902 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
1903 StaticPopup_Show "OUROL_SAVE_SAVEAS"
|
farmbuyer@1
|
1904 _d:Hide()
|
farmbuyer@1
|
1905 end)
|
farmbuyer@1
|
1906 control:AddChild(b)
|
farmbuyer@1
|
1907
|
farmbuyer@16
|
1908 do
|
farmbuyer@16
|
1909 local scontainer = GUI:Create("SimpleGroup")
|
farmbuyer@16
|
1910 scontainer:SetFullWidth(true)
|
farmbuyer@16
|
1911 scontainer:SetFullHeight(false)
|
farmbuyer@16
|
1912 scontainer:SetAutoAdjustHeight(false)
|
farmbuyer@16
|
1913 scontainer:SetHeight(40) -- no relative height available anymore
|
farmbuyer@16
|
1914 scontainer:SetLayout("Fill")
|
farmbuyer@16
|
1915 local scroll = GUI:Create("ScrollFrame")
|
farmbuyer@16
|
1916 scroll:SetLayout("List")
|
farmbuyer@16
|
1917 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
|
farmbuyer@16
|
1918 if saved then for i,s in ipairs(saved) do
|
farmbuyer@16
|
1919 local il = GUI:Create("InteractiveLabel")
|
farmbuyer@16
|
1920 il:SetFullWidth(true)
|
farmbuyer@16
|
1921 il:SetText(s.name)
|
farmbuyer@16
|
1922 il:SetUserData("num",i)
|
farmbuyer@16
|
1923 il:SetHighlight(1,1,1,0.4)
|
farmbuyer@16
|
1924 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
|
farmbuyer@16
|
1925 il:SetCallback("OnEnter", function() setstatus(str) end)
|
farmbuyer@16
|
1926 il:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@16
|
1927 il:SetCallback("OnClick", function(_il)
|
farmbuyer@16
|
1928 local prev = _d:GetUserData("saved selection")
|
farmbuyer@16
|
1929 if prev then
|
farmbuyer@16
|
1930 prev.highlight:Hide()
|
farmbuyer@16
|
1931 prev:SetColor()
|
farmbuyer@16
|
1932 end
|
farmbuyer@16
|
1933 _il:SetColor(0,1,0)
|
farmbuyer@16
|
1934 _il.highlight:Show()
|
farmbuyer@16
|
1935 _d:SetUserData("saved selection",_il)
|
farmbuyer@16
|
1936 _d:GetUserData("Load"):SetDisabled(false)
|
farmbuyer@16
|
1937 _d:GetUserData("Delete"):SetDisabled(false)
|
farmbuyer@16
|
1938 end)
|
farmbuyer@16
|
1939 scroll:AddChild(il)
|
farmbuyer@16
|
1940 end end
|
farmbuyer@16
|
1941 scontainer:AddChild(scroll)
|
farmbuyer@16
|
1942 control:AddChild(scontainer)
|
farmbuyer@16
|
1943 end
|
farmbuyer@1
|
1944
|
farmbuyer@1
|
1945 b = mkbutton("Load",
|
farmbuyer@1
|
1946 [[Load previously saved text. +REPLACES> all current loot information!]])
|
farmbuyer@1
|
1947 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
1948 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
1949 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
1950 self:save_restore(num)
|
farmbuyer@1
|
1951 self:BuildMainDisplay()
|
farmbuyer@1
|
1952 end)
|
farmbuyer@1
|
1953 b:SetDisabled(true)
|
farmbuyer@1
|
1954 control:AddChild(b)
|
farmbuyer@1
|
1955 b = mkbutton("Delete",
|
farmbuyer@1
|
1956 [[Delete previously saved text.]])
|
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_delete(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
|
farmbuyer@1
|
1966 b = GUI:Create("Spacer")
|
farmbuyer@1
|
1967 b:SetFullWidth(true)
|
farmbuyer@16
|
1968 b:SetHeight(10)
|
farmbuyer@1
|
1969 control:AddChild(b)
|
farmbuyer@1
|
1970
|
farmbuyer@1
|
1971 -- Other stuff on right-hand side
|
farmbuyer@1
|
1972 local tab_specials = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
1973 tab_specials:SetLayout("Flow")
|
farmbuyer@1
|
1974 tab_specials:SetFullWidth(true)
|
farmbuyer@1
|
1975 control:AddChild(tab_specials)
|
farmbuyer@1
|
1976 control:ResumeLayout()
|
farmbuyer@1
|
1977
|
farmbuyer@1
|
1978 ----- Left-hand group
|
farmbuyer@1
|
1979 local tabs = GUI:Create("TabGroup")
|
farmbuyer@1
|
1980 tabs:SetLayout("Flow")
|
farmbuyer@1
|
1981 tabs.alignoffset = 25
|
farmbuyer@1
|
1982 tabs.titletext:SetFontObject(GameFontNormalSmall) -- XXX
|
farmbuyer@1
|
1983 do
|
farmbuyer@1
|
1984 self.sender_list.sort()
|
farmbuyer@1
|
1985 tabs.titletext:SetFormattedText("Received broadcast data from %d |4player:players;.",
|
farmbuyer@1
|
1986 self.sender_list.activeI)
|
farmbuyer@1
|
1987 end
|
farmbuyer@1
|
1988 tabs:SetRelativeWidth(0.99-rhs_width)
|
farmbuyer@1
|
1989 tabs:SetFullHeight(true)
|
farmbuyer@1
|
1990 tabs:SetTabs(tabgroup_tabs)
|
farmbuyer@1
|
1991 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
|
farmbuyer@1
|
1992 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
|
farmbuyer@1
|
1993 setstatus(_tabtexts[value].desc)
|
farmbuyer@1
|
1994 end)
|
farmbuyer@1
|
1995 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
|
farmbuyer@1
|
1996 tabs:SetUserData("special buttons group",tab_specials)
|
farmbuyer@1
|
1997 tabs:SelectTab(opt_tabselect or "eoi")
|
farmbuyer@1
|
1998
|
farmbuyer@1
|
1999 display:AddChildren (tabs, control)
|
farmbuyer@1
|
2000 display:ApplyStatus()
|
farmbuyer@1
|
2001
|
farmbuyer@1
|
2002 display:Show() -- without this, only appears every *other* function call
|
farmbuyer@1
|
2003 return display
|
farmbuyer@1
|
2004 end
|
farmbuyer@1
|
2005
|
farmbuyer@1
|
2006 function addon:OpenMainDisplayToTab (text)
|
farmbuyer@1
|
2007 text = '^'..text
|
farmbuyer@1
|
2008 for tab,v in pairs(_tabtexts) do
|
farmbuyer@1
|
2009 if v.title:lower():find(text) then
|
farmbuyer@1
|
2010 self:BuildMainDisplay(tab)
|
farmbuyer@1
|
2011 return true
|
farmbuyer@1
|
2012 end
|
farmbuyer@1
|
2013 end
|
farmbuyer@1
|
2014 end
|
farmbuyer@1
|
2015
|
farmbuyer@1
|
2016 -- Essentially a re-click on the current tab (if the current tab were clickable).
|
farmbuyer@1
|
2017 function addon:redisplay ()
|
farmbuyer@1
|
2018 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
|
farmbuyer@1
|
2019 end
|
farmbuyer@1
|
2020
|
farmbuyer@1
|
2021
|
farmbuyer@1
|
2022 ------ Popup dialogs
|
farmbuyer@1
|
2023 -- Callback for each Next/Accept stage of inserting a new loot row via dropdown
|
farmbuyer@1
|
2024 local function eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@1
|
2025 if data.all_done then
|
farmbuyer@1
|
2026 -- It'll probably be the final entry in the table, but there might have
|
farmbuyer@1
|
2027 -- been real loot happening at the same time.
|
farmbuyer@1
|
2028 local boss_index = addon._addLootEntry{
|
farmbuyer@1
|
2029 kind = 'boss',
|
farmbuyer@1
|
2030 bosskill = (OuroLootSV_opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
|
farmbuyer@1
|
2031 reason = 'kill',
|
farmbuyer@1
|
2032 instance = data.instance,
|
farmbuyer@1
|
2033 duration = 0,
|
farmbuyer@1
|
2034 }
|
farmbuyer@1
|
2035 local entry = tremove(g_loot,boss_index)
|
farmbuyer@1
|
2036 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@1
|
2037 addon:_mark_boss_kill(data.rowindex)
|
farmbuyer@1
|
2038 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
|
farmbuyer@1
|
2039 dialog.data = nil -- free up memory
|
farmbuyer@1
|
2040 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
|
farmbuyer@1
|
2041 return
|
farmbuyer@1
|
2042 end
|
farmbuyer@1
|
2043
|
farmbuyer@16
|
2044 local text = dialog.editBox:GetText()
|
farmbuyer@1
|
2045
|
farmbuyer@1
|
2046 -- second click
|
farmbuyer@1
|
2047 if data.name and text then
|
farmbuyer@1
|
2048 data.instance = text
|
farmbuyer@1
|
2049 data.all_done = true
|
farmbuyer@1
|
2050 -- in future do one more thing, for now just jump to the check
|
farmbuyer@1
|
2051 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@1
|
2052 end
|
farmbuyer@1
|
2053
|
farmbuyer@1
|
2054 -- first click
|
farmbuyer@1
|
2055 if text then
|
farmbuyer@1
|
2056 data.name = text
|
farmbuyer@1
|
2057 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
|
farmbuyer@1
|
2058 getinstance.data = data
|
farmbuyer@16
|
2059 getinstance.editBox:SetText(addon.instance_tag())
|
farmbuyer@1
|
2060 -- This suppresses auto-hide (which would case the getinstance dialog
|
farmbuyer@1
|
2061 -- to go away), but only when mouse clicking. OnEnter is on its own.
|
farmbuyer@1
|
2062 return true
|
farmbuyer@1
|
2063 end
|
farmbuyer@1
|
2064 end
|
farmbuyer@1
|
2065
|
farmbuyer@1
|
2066 local function eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@1
|
2067 if data.all_done then
|
farmbuyer@1
|
2068 --local real_rebroadcast, real_enabled = addon.rebroadcast, addon.enabled
|
farmbuyer@1
|
2069 --g_rebroadcast, g_enabled = false, true
|
farmbuyer@1
|
2070 data.display:Hide()
|
farmbuyer@1
|
2071 local loot_index = addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes)
|
farmbuyer@1
|
2072 --g_rebroadcast, g_enabled = real_g_rebroadcast, real_g_enabled
|
farmbuyer@1
|
2073 local entry = tremove(g_loot,loot_index)
|
farmbuyer@1
|
2074 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@1
|
2075 --data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
|
farmbuyer@1
|
2076 addon:_fill_out_eoi_data(data.rowindex)
|
farmbuyer@1
|
2077 addon:BuildMainDisplay()
|
farmbuyer@1
|
2078 dialog.data = nil
|
farmbuyer@1
|
2079 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
|
farmbuyer@1
|
2080 return
|
farmbuyer@1
|
2081 end
|
farmbuyer@1
|
2082
|
farmbuyer@16
|
2083 local text = dialog.editBox:GetText():trim()
|
farmbuyer@1
|
2084
|
farmbuyer@1
|
2085 -- third click
|
farmbuyer@1
|
2086 if data.name and data.recipient and text then
|
farmbuyer@1
|
2087 data.notes = (text ~= "<none>") and text or nil
|
farmbuyer@1
|
2088 data.all_done = true
|
farmbuyer@1
|
2089 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@1
|
2090 end
|
farmbuyer@1
|
2091
|
farmbuyer@1
|
2092 -- second click
|
farmbuyer@1
|
2093 if data.name and text then
|
farmbuyer@1
|
2094 data.recipient = text
|
farmbuyer@1
|
2095 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
|
farmbuyer@1
|
2096 getnotes.data = data
|
farmbuyer@16
|
2097 getnotes.editBox:SetText("<none>")
|
farmbuyer@16
|
2098 getnotes.editBox:HighlightText()
|
farmbuyer@1
|
2099 return true
|
farmbuyer@1
|
2100 end
|
farmbuyer@1
|
2101
|
farmbuyer@1
|
2102 -- first click
|
farmbuyer@1
|
2103 if text then
|
farmbuyer@1
|
2104 data.name = text
|
farmbuyer@1
|
2105 dialog:Hide() -- technically a "different" one about to be shown
|
farmbuyer@1
|
2106 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
|
farmbuyer@1
|
2107 getrecipient.data = data
|
farmbuyer@16
|
2108 getrecipient.editBox:SetText("")
|
farmbuyer@1
|
2109 return true
|
farmbuyer@1
|
2110 end
|
farmbuyer@1
|
2111 end
|
farmbuyer@1
|
2112
|
farmbuyer@1
|
2113 local function eoi_st_insert_OnAccept (dialog, data)
|
farmbuyer@1
|
2114 if data.kind == 'boss' then
|
farmbuyer@1
|
2115 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@1
|
2116 elseif data.kind == 'loot' then
|
farmbuyer@1
|
2117 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@1
|
2118 end
|
farmbuyer@1
|
2119 end
|
farmbuyer@1
|
2120
|
farmbuyer@1
|
2121 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
|
farmbuyer@1
|
2122 text = "Clear current loot information and text?",
|
farmbuyer@16
|
2123 button1 = YES,
|
farmbuyer@16
|
2124 button2 = NO,
|
farmbuyer@1
|
2125 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2126 addon:Clear(--[[verbose_p=]]true)
|
farmbuyer@1
|
2127 end,
|
farmbuyer@1
|
2128 }
|
farmbuyer@1
|
2129
|
farmbuyer@37
|
2130 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2131 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2132 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r, and generate it anew from current loot?",
|
farmbuyer@37
|
2133 button1 = YES,
|
farmbuyer@37
|
2134 button2 = NO,
|
farmbuyer@37
|
2135 OnAccept = function (dialog, addon, data2)
|
farmbuyer@37
|
2136 data2(addon)
|
farmbuyer@37
|
2137 addon:Print("%s history has been regenerated.", addon.history.realm)
|
farmbuyer@37
|
2138 addon:redisplay()
|
farmbuyer@37
|
2139 end,
|
farmbuyer@37
|
2140 }
|
farmbuyer@37
|
2141
|
farmbuyer@16
|
2142 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
|
farmbuyer@37
|
2143 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2144 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2145 button1 = YES,
|
farmbuyer@16
|
2146 button2 = NO,
|
farmbuyer@16
|
2147 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2148 data2(addon)
|
farmbuyer@16
|
2149 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
|
farmbuyer@16
|
2150 addon:redisplay()
|
farmbuyer@16
|
2151 end,
|
farmbuyer@16
|
2152 }
|
farmbuyer@16
|
2153
|
farmbuyer@16
|
2154 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2155 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2156 text = "Erase all but the latest entry for players on " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2157 button1 = YES,
|
farmbuyer@16
|
2158 button2 = NO,
|
farmbuyer@16
|
2159 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2160 data2(addon)
|
farmbuyer@16
|
2161 addon:Print("All loot prior to the most recent entries has been erased.")
|
farmbuyer@16
|
2162 addon:redisplay()
|
farmbuyer@16
|
2163 end,
|
farmbuyer@16
|
2164 }
|
farmbuyer@16
|
2165
|
farmbuyer@27
|
2166 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
|
farmbuyer@27
|
2167 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
|
farmbuyer@27
|
2168 button1 = OKAY,
|
farmbuyer@27
|
2169 timeout = 0,
|
farmbuyer@27
|
2170 whileDead = true,
|
farmbuyer@27
|
2171 hideOnEscape = true,
|
farmbuyer@27
|
2172 enterClicksFirstButton = true,
|
farmbuyer@27
|
2173 hasEditBox = true,
|
farmbuyer@27
|
2174 editBoxWidth = 350,
|
farmbuyer@27
|
2175 OnShow = function (dialog, url)
|
farmbuyer@27
|
2176 dialog.editBox:SetText(url)
|
farmbuyer@27
|
2177 dialog.editBox:SetFocus()
|
farmbuyer@27
|
2178 dialog.editBox:HighlightText()
|
farmbuyer@27
|
2179 end,
|
farmbuyer@27
|
2180 }
|
farmbuyer@27
|
2181
|
farmbuyer@1
|
2182 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
|
farmbuyer@1
|
2183 text = "Do you wish to activate Ouro Loot?\n\n(Hit the Escape key to close this window without clicking)",
|
farmbuyer@1
|
2184 button1 = "Activate recording", -- "accept", left
|
farmbuyer@1
|
2185 button3 = "Broadcast only", -- "alt", middle
|
farmbuyer@1
|
2186 button2 = "Help", -- "cancel", right
|
farmbuyer@1
|
2187 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2188 addon:Activate()
|
farmbuyer@1
|
2189 end,
|
farmbuyer@1
|
2190 OnAlt = function (dialog, addon)
|
farmbuyer@1
|
2191 addon:Activate(nil,true)
|
farmbuyer@1
|
2192 end,
|
farmbuyer@1
|
2193 OnCancel = function (dialog, addon)
|
farmbuyer@1
|
2194 -- hitting escape also calls this, but the 3rd arg would be "clicked"
|
farmbuyer@1
|
2195 -- in both cases, not useful here.
|
farmbuyer@1
|
2196 local helpbutton = dialog.button2
|
farmbuyer@1
|
2197 local ismousing = MouseIsOver(helpbutton)
|
farmbuyer@1
|
2198 if ismousing then
|
farmbuyer@1
|
2199 -- they actually clicked the button (or at least the mouse was over "Help"
|
farmbuyer@1
|
2200 -- when they hit escape... sigh)
|
farmbuyer@1
|
2201 addon:BuildMainDisplay('help')
|
farmbuyer@1
|
2202 else
|
farmbuyer@1
|
2203 addon.popped = true
|
farmbuyer@1
|
2204 end
|
farmbuyer@1
|
2205 end,
|
farmbuyer@1
|
2206 }
|
farmbuyer@1
|
2207
|
farmbuyer@1
|
2208 -- The data member here is a table built with:
|
farmbuyer@1
|
2209 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
|
farmbuyer@1
|
2210 do
|
farmbuyer@1
|
2211 local t = flib.StaticPopup{
|
farmbuyer@1
|
2212 text = "Enter name of new %s, then click Next or press Enter:",
|
farmbuyer@1
|
2213 button1 = "Next >",
|
farmbuyer@1
|
2214 button2 = CANCEL,
|
farmbuyer@1
|
2215 hasEditBox = true,
|
farmbuyer@16
|
2216 editBoxWidth = 350,
|
farmbuyer@1
|
2217 maxLetters = 50,
|
farmbuyer@1
|
2218 noCancelOnReuse = true,
|
farmbuyer@1
|
2219 --[[ XXX still needed?
|
farmbuyer@1
|
2220 OnShow = function(dialog)
|
farmbuyer@1
|
2221 dialog.wideEditBox:SetText("")
|
farmbuyer@1
|
2222 dialog.wideEditBox:SetFocus()
|
farmbuyer@1
|
2223 end,]]
|
farmbuyer@1
|
2224 }
|
farmbuyer@1
|
2225 t.EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@39
|
2226 if editbox:GetText() == "" then return end
|
farmbuyer@1
|
2227 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2228 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
|
farmbuyer@1
|
2229 dialog:Hide() -- replicate OnAccept click behavior
|
farmbuyer@1
|
2230 end
|
farmbuyer@1
|
2231 end
|
farmbuyer@1
|
2232 t.enterClicksFirstButton = nil -- no effect with editbox focused
|
farmbuyer@1
|
2233 t.OnAccept = eoi_st_insert_OnAccept
|
farmbuyer@1
|
2234 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
|
farmbuyer@1
|
2235 end
|
farmbuyer@1
|
2236
|
farmbuyer@1
|
2237 -- This seems to be gratuitous use of metatables, really.
|
farmbuyer@1
|
2238 do
|
farmbuyer@1
|
2239 local OEIL = {
|
farmbuyer@1
|
2240 text = "Paste the new item into here, then click Next or press Enter:",
|
farmbuyer@1
|
2241 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
|
farmbuyer@1
|
2242 }
|
farmbuyer@1
|
2243 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
|
farmbuyer@1
|
2244
|
farmbuyer@1
|
2245 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
|
farmbuyer@1
|
2246 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
|
farmbuyer@1
|
2247 if dialogname then
|
farmbuyer@16
|
2248 _G[dialogname.."EditBox"]:SetText(link)
|
farmbuyer@1
|
2249 return true
|
farmbuyer@1
|
2250 end
|
farmbuyer@1
|
2251 end)
|
farmbuyer@1
|
2252 end
|
farmbuyer@1
|
2253
|
farmbuyer@1
|
2254 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
|
farmbuyer@1
|
2255 text = "Enter the player name:",
|
farmbuyer@1
|
2256 button1 = ACCEPT,
|
farmbuyer@1
|
2257 button2 = CANCEL,
|
farmbuyer@1
|
2258 hasEditBox = true,
|
farmbuyer@1
|
2259 --[[ XXX needed?
|
farmbuyer@1
|
2260 OnShow = function(dialog)
|
farmbuyer@1
|
2261 dialog.editBox:SetText("")
|
farmbuyer@1
|
2262 dialog.editBox:SetFocus()
|
farmbuyer@1
|
2263 end,]]
|
farmbuyer@1
|
2264 OnAccept = function(dialog, data)
|
farmbuyer@1
|
2265 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@24
|
2266 addon:reassign_loot (data.index, name)
|
farmbuyer@1
|
2267 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.index)
|
farmbuyer@1
|
2268 end,
|
farmbuyer@1
|
2269 }
|
farmbuyer@1
|
2270
|
farmbuyer@1
|
2271 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
|
farmbuyer@1
|
2272 text = "Enter a name for the loot collection:",
|
farmbuyer@1
|
2273 button1 = ACCEPT,
|
farmbuyer@1
|
2274 button2 = CANCEL,
|
farmbuyer@1
|
2275 hasEditBox = true,
|
farmbuyer@1
|
2276 maxLetters = 30,
|
farmbuyer@1
|
2277 --[[ XXX
|
farmbuyer@1
|
2278 OnShow = function(dialog)
|
farmbuyer@1
|
2279 dialog.editBox:SetText("")
|
farmbuyer@1
|
2280 dialog.editBox:SetFocus()
|
farmbuyer@1
|
2281 end,]]
|
farmbuyer@1
|
2282 OnAccept = function(dialog)--, data)
|
farmbuyer@1
|
2283 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@1
|
2284 addon:save_saveas(name)
|
farmbuyer@1
|
2285 addon:BuildMainDisplay()
|
farmbuyer@1
|
2286 end,
|
farmbuyer@1
|
2287 OnCancel = function(dialog)--, data, reason)
|
farmbuyer@1
|
2288 addon:BuildMainDisplay()
|
farmbuyer@1
|
2289 end,
|
farmbuyer@1
|
2290 --[[XXX
|
farmbuyer@1
|
2291 EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@1
|
2292 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2293 StaticPopupDialogs["OUROL_SAVE_SAVEAS"].OnAccept (dialog, dialog.data)
|
farmbuyer@1
|
2294 dialog:Hide()
|
farmbuyer@1
|
2295 end,]]
|
farmbuyer@1
|
2296 }
|
farmbuyer@1
|
2297
|
farmbuyer@25
|
2298
|
farmbuyer@25
|
2299 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
|
farmbuyer@25
|
2300 if true then
|
farmbuyer@25
|
2301 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
|
farmbuyer@25
|
2302 -- tagged with CHANGE.
|
farmbuyer@25
|
2303 local function onenter (self, motion)
|
farmbuyer@25
|
2304 if ( self.hasArrow ) then
|
farmbuyer@25
|
2305 local level = self:GetParent():GetID() + 1;
|
farmbuyer@25
|
2306 local listFrame = _G["DropDownList"..level];
|
farmbuyer@25
|
2307 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
|
farmbuyer@25
|
2308 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
|
farmbuyer@25
|
2309 end
|
farmbuyer@25
|
2310 else
|
farmbuyer@25
|
2311 CloseDropDownMenus(self:GetParent():GetID() + 1);
|
farmbuyer@25
|
2312 end
|
farmbuyer@25
|
2313 _G[self:GetName().."Highlight"]:Show();
|
farmbuyer@25
|
2314 UIDropDownMenu_StopCounting(self:GetParent());
|
farmbuyer@25
|
2315 if ( self.tooltipTitle ) then
|
farmbuyer@25
|
2316 if ( self.tooltipOnButton ) then
|
farmbuyer@25
|
2317 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
farmbuyer@25
|
2318 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
|
farmbuyer@25
|
2319 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
|
farmbuyer@25
|
2320 GameTooltip:Show();
|
farmbuyer@25
|
2321 else
|
farmbuyer@25
|
2322 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
|
farmbuyer@25
|
2323 end
|
farmbuyer@25
|
2324 end
|
farmbuyer@25
|
2325 end
|
farmbuyer@25
|
2326 -- end verbatime copy
|
farmbuyer@25
|
2327
|
farmbuyer@25
|
2328 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
|
farmbuyer@25
|
2329 local list = _G["DropDownList"..i]
|
farmbuyer@25
|
2330 if list then
|
farmbuyer@25
|
2331 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
|
farmbuyer@25
|
2332 local button = _G["DropDownList"..i.."Button"..j]
|
farmbuyer@25
|
2333 if button then
|
farmbuyer@25
|
2334 --print("button fixup",i,j)
|
farmbuyer@25
|
2335 button:SetScript("OnEnter",onenter)
|
farmbuyer@25
|
2336 end
|
farmbuyer@25
|
2337 end
|
farmbuyer@25
|
2338 end
|
farmbuyer@25
|
2339 end
|
farmbuyer@25
|
2340 end
|
farmbuyer@25
|
2341
|
farmbuyer@1
|
2342 -- vim:noet
|