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