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