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