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