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