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