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