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