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