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