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@95
|
1540 if addon:get_plugin(text_kind) then
|
farmbuyer@95
|
1541 local pname = addon:get_plugin(text_kind):GetName()
|
farmbuyer@58
|
1542 w = mkbutton("Reset SVs & ReloadUI",
|
farmbuyer@59
|
1543 ([[<DEBUG:> Reset savedvariables for %s plugin back to defaults, and trigger a UI reload.]]):format(pname))
|
farmbuyer@58
|
1544 w:SetFullWidth(true)
|
farmbuyer@58
|
1545 w:SetCallback("OnClick", function(_w)
|
farmbuyer@58
|
1546 _G['OuroLoot'..pname..'_opts'] = nil
|
farmbuyer@58
|
1547 ReloadUI()
|
farmbuyer@58
|
1548 end)
|
farmbuyer@58
|
1549 specials:AddChild(w)
|
farmbuyer@58
|
1550 end
|
farmbuyer@1
|
1551 _populate_text_specials (box, specials, mkbutton, text_kind)
|
farmbuyer@1
|
1552 end
|
farmbuyer@1
|
1553
|
farmbuyer@37
|
1554
|
farmbuyer@1
|
1555 -- Tab 4: History
|
farmbuyer@1
|
1556 -- Much of the implementation here follows a similar desgin for the first
|
farmbuyer@4
|
1557 -- tab's handling of ST objects. We will even reuse its controlling tables
|
farmbuyer@4
|
1558 -- when feasible.
|
farmbuyer@37
|
1559 local histST, hist_dropdownfuncs
|
farmbuyer@84
|
1560 local hist_normal_status =
|
farmbuyer@84
|
1561 [[Click on a row to view all history for that player only. (Click column headers to re-sort.)]]
|
farmbuyer@84
|
1562 local hist_name_status =
|
farmbuyer@84
|
1563 [[Right-click on any row to return to normal history display.]]
|
farmbuyer@84
|
1564
|
farmbuyer@84
|
1565 local history_filter_by_recent = function (st, e)
|
farmbuyer@84
|
1566 if e.kind ~= 'hist' then return true end
|
farmbuyer@84
|
1567 return e.cols[2].OLi == 1
|
farmbuyer@84
|
1568 end
|
farmbuyer@84
|
1569
|
farmbuyer@84
|
1570 local history_filter_who
|
farmbuyer@84
|
1571 local history_filter_by_name = function (st, e)
|
farmbuyer@84
|
1572 if e.kind ~= 'hist' then return true end
|
farmbuyer@84
|
1573 return e.OLwho == history_filter_who
|
farmbuyer@84
|
1574 end
|
farmbuyer@1
|
1575
|
farmbuyer@37
|
1576 hist_dropdownfuncs = dropdownfuncs{
|
farmbuyer@87
|
1577 ["Delete this loot event from history"] = function()--rowi
|
farmbuyer@84
|
1578 local h = _d:GetUserData("DD history entry")
|
farmbuyer@87
|
1579 local numleft,err = addon:_delHistoryEntry (h.cols[2].OLu, h.itemlink)
|
farmbuyer@87
|
1580 if numleft then
|
farmbuyer@86
|
1581 addon:Print("Removed history entry %s from %s.",
|
farmbuyer@86
|
1582 h.itemlink, addon:colorize(h.OLwho,h.OLclass))
|
farmbuyer@87
|
1583 if numleft < 1 then
|
farmbuyer@87
|
1584 history_filter_who = nil
|
farmbuyer@92
|
1585 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@87
|
1586 setstatus(hist_normal_status)
|
farmbuyer@87
|
1587 end
|
farmbuyer@84
|
1588 else
|
farmbuyer@84
|
1589 addon:Print(err)
|
farmbuyer@84
|
1590 end
|
farmbuyer@84
|
1591 end,
|
farmbuyer@84
|
1592
|
farmbuyer@87
|
1593 ["Delete this player's entire loot history"] = function()--rowi
|
farmbuyer@84
|
1594 local h = _d:GetUserData("DD history entry")
|
farmbuyer@84
|
1595 local name = h.OLwho
|
farmbuyer@84
|
1596 local player_i = addon.history.byname[name]
|
farmbuyer@84
|
1597 local gone = tremove (addon.history, player_i)
|
farmbuyer@84
|
1598 assert(gone.name == name)
|
farmbuyer@84
|
1599 addon:_build_history_names()
|
farmbuyer@86
|
1600 addon:Print("Removed player %s from history (%d total entries).",
|
farmbuyer@86
|
1601 addon:colorize(name,gone.person_class), #gone.unique)
|
farmbuyer@37
|
1602 end,
|
farmbuyer@37
|
1603 }
|
farmbuyer@84
|
1604 local hist_general_dropdown = gen_easymenu_table(
|
farmbuyer@84
|
1605 {{
|
farmbuyer@84
|
1606 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@84
|
1607 isTitle = true,
|
farmbuyer@84
|
1608 notClickable = true,
|
farmbuyer@84
|
1609 notCheckable = true,
|
farmbuyer@84
|
1610 }},
|
farmbuyer@84
|
1611 {
|
farmbuyer@84
|
1612 "Delete this player's entire loot history|Permanent, no going back!",
|
farmbuyer@84
|
1613 "--",
|
farmbuyer@84
|
1614 CLOSE
|
farmbuyer@84
|
1615 }, hist_dropdownfuncs)
|
farmbuyer@84
|
1616 local hist_specific_dropdown = gen_easymenu_table(
|
farmbuyer@37
|
1617 {{
|
farmbuyer@37
|
1618 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@37
|
1619 notClickable = true,
|
farmbuyer@37
|
1620 notCheckable = true,
|
farmbuyer@37
|
1621 }},
|
farmbuyer@37
|
1622 {
|
farmbuyer@84
|
1623 "Delete this loot event from history|Permanent, no going back!",
|
farmbuyer@37
|
1624 "--",
|
farmbuyer@37
|
1625 CLOSE
|
farmbuyer@37
|
1626 }, hist_dropdownfuncs)
|
farmbuyer@6
|
1627
|
farmbuyer@84
|
1628 -- Loot column
|
farmbuyer@84
|
1629 --[[
|
farmbuyer@84
|
1630 local function hist_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable)
|
farmbuyer@84
|
1631 end]]
|
farmbuyer@84
|
1632
|
farmbuyer@84
|
1633 -- Formatted timestamp column
|
farmbuyer@84
|
1634 local function hist_st_col3_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable)
|
farmbuyer@84
|
1635 if not fShow then
|
farmbuyer@84
|
1636 cellFrame.text:SetText("")
|
farmbuyer@84
|
1637 return
|
farmbuyer@84
|
1638 end
|
farmbuyer@84
|
1639
|
farmbuyer@84
|
1640 local h = data[realrow]
|
farmbuyer@84
|
1641 local cell = h.cols[column]
|
farmbuyer@84
|
1642
|
farmbuyer@84
|
1643 cellFrame.text:SetText(cell.value)
|
farmbuyer@84
|
1644 cellFrame.text:SetTextColor(1,1,1,1)
|
farmbuyer@84
|
1645
|
farmbuyer@84
|
1646 --stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[h.kind])
|
farmbuyer@84
|
1647 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable_default)
|
farmbuyer@84
|
1648 end
|
farmbuyer@84
|
1649
|
farmbuyer@84
|
1650 local function hist_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, down)
|
farmbuyer@84
|
1651 if (row == nil) or (realrow == nil) then return false end -- click column header, do default resorting
|
farmbuyer@84
|
1652 local h = data[realrow]
|
farmbuyer@84
|
1653 assert(h.kind=='hist')
|
farmbuyer@84
|
1654
|
farmbuyer@84
|
1655 -- Four button combinations we need to care about:
|
farmbuyer@84
|
1656
|
farmbuyer@84
|
1657 -- Shift-left pastes loot
|
farmbuyer@84
|
1658 if IsModifiedClick("CHATLINK") and column == 2 then
|
farmbuyer@84
|
1659 ChatEdit_InsertLink (h.itemlink)
|
farmbuyer@84
|
1660 return true -- do not do anything further
|
farmbuyer@84
|
1661 end
|
farmbuyer@84
|
1662
|
farmbuyer@84
|
1663 _d:SetUserData("DD index", realrow)
|
farmbuyer@84
|
1664 _d:SetUserData("DD history entry", h)
|
farmbuyer@84
|
1665
|
farmbuyer@84
|
1666 -- The rest depends on whether we're filtering (focused in on a specific
|
farmbuyer@84
|
1667 -- player) or not.
|
farmbuyer@84
|
1668 if history_filter_who then
|
farmbuyer@84
|
1669 -- Shift-right opens a menu
|
farmbuyer@84
|
1670 if IsShiftKeyDown() and button == "RightButton" then
|
farmbuyer@84
|
1671 hist_specific_dropdown[1].text = h.itemlink
|
farmbuyer@84
|
1672 EasyMenu (hist_specific_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@84
|
1673
|
farmbuyer@84
|
1674 -- Right goes back to normal mode
|
farmbuyer@84
|
1675 elseif button == "RightButton" then
|
farmbuyer@84
|
1676 history_filter_who = nil
|
farmbuyer@84
|
1677 stable:SetFilter(history_filter_by_recent)
|
farmbuyer@84
|
1678 setstatus(hist_normal_status)
|
farmbuyer@84
|
1679 end
|
farmbuyer@84
|
1680
|
farmbuyer@84
|
1681 else -- not focused
|
farmbuyer@84
|
1682 -- Shift-right opens a menu
|
farmbuyer@84
|
1683 if IsShiftKeyDown() and button == "RightButton" then
|
farmbuyer@84
|
1684 hist_general_dropdown[1].text = h.OLwho
|
farmbuyer@84
|
1685 EasyMenu (hist_general_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@84
|
1686
|
farmbuyer@84
|
1687 -- Left focuses on a specific player
|
farmbuyer@84
|
1688 elseif button == "LeftButton" then
|
farmbuyer@84
|
1689 history_filter_who = h.OLwho
|
farmbuyer@84
|
1690 stable:SetFilter(history_filter_by_name)
|
farmbuyer@84
|
1691 setstatus(hist_name_status)
|
farmbuyer@84
|
1692 end
|
farmbuyer@84
|
1693 end
|
farmbuyer@84
|
1694
|
farmbuyer@84
|
1695 return true -- do not do anything further
|
farmbuyer@84
|
1696 end
|
farmbuyer@84
|
1697
|
farmbuyer@84
|
1698 --[[
|
farmbuyer@84
|
1699 local function hist_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button)
|
farmbuyer@84
|
1700 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
|
farmbuyer@84
|
1701 local h = data[realrow]
|
farmbuyer@84
|
1702 assert(h.kind=='hist')
|
farmbuyer@84
|
1703
|
farmbuyer@84
|
1704 return true -- do not do anything further
|
farmbuyer@84
|
1705 end]]
|
farmbuyer@84
|
1706
|
farmbuyer@37
|
1707 local hist_st_cols = {
|
farmbuyer@37
|
1708 { -- col 1
|
farmbuyer@37
|
1709 name = "Player",
|
farmbuyer@37
|
1710 width = 130,
|
farmbuyer@37
|
1711 DoCellUpdate = eoi_st_col2_DoCellUpdate,
|
farmbuyer@37
|
1712 },
|
farmbuyer@37
|
1713 { -- col 2
|
farmbuyer@37
|
1714 name = "Most Recent Loot",
|
farmbuyer@37
|
1715 width = 250,
|
farmbuyer@84
|
1716 --DoCellUpdate = hist_st_col2_DoCellUpdate,
|
farmbuyer@37
|
1717 },
|
farmbuyer@37
|
1718 { -- col 3
|
farmbuyer@37
|
1719 name = "When",
|
farmbuyer@37
|
1720 width = 250,
|
farmbuyer@37
|
1721 DoCellUpdate = hist_st_col3_DoCellUpdate,
|
farmbuyer@37
|
1722 defaultsort = "asc",
|
farmbuyer@37
|
1723 sort = "asc",
|
farmbuyer@37
|
1724 sortnext = 1,
|
farmbuyer@37
|
1725 },
|
farmbuyer@37
|
1726 }
|
farmbuyer@37
|
1727
|
farmbuyer@37
|
1728 -- Tab 4: History (implementation)
|
farmbuyer@37
|
1729 tabs_OnGroupSelected["hist"] = function(container,specials)
|
farmbuyer@37
|
1730 histST = LibStub("ScrollingTable"):CreateST(hist_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
|
farmbuyer@95
|
1731 gui.histST = histST
|
farmbuyer@37
|
1732 if addon.author_debug then
|
farmbuyer@37
|
1733 _G.OLHST = histST
|
farmbuyer@1
|
1734 end
|
farmbuyer@1
|
1735
|
farmbuyer@37
|
1736 if not eoi_st_otherrow_bgcolortable_default then
|
farmbuyer@37
|
1737 eoi_st_otherrow_bgcolortable_default = histST:GetDefaultHighlightBlank()
|
farmbuyer@37
|
1738 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
|
farmbuyer@37
|
1739 return eoi_st_otherrow_bgcolortable_default
|
farmbuyer@37
|
1740 end})
|
farmbuyer@1
|
1741 end
|
farmbuyer@1
|
1742
|
farmbuyer@37
|
1743 addon:_build_history_names()
|
farmbuyer@37
|
1744 addon:_fill_out_hist_data(1)
|
farmbuyer@37
|
1745 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1746 histST:RegisterEvents{
|
farmbuyer@37
|
1747 OnEnter = eoi_st_OnEnter,
|
farmbuyer@37
|
1748 OnLeave = eoi_st_OnLeave,
|
farmbuyer@37
|
1749 OnClick = hist_st_OnClick,
|
farmbuyer@37
|
1750 --OnDoubleClick = hist_st_OnDoubleClick,
|
farmbuyer@37
|
1751 }
|
farmbuyer@37
|
1752 local oldrefresh = histST.Refresh
|
farmbuyer@37
|
1753 histST.Refresh = function (self, opt_index)
|
farmbuyer@37
|
1754 addon:_fill_out_hist_data(opt_index)
|
farmbuyer@37
|
1755 return oldrefresh(self)
|
farmbuyer@37
|
1756 end
|
farmbuyer@37
|
1757 histST.OuroLoot_Refresh = function (self, opt_index)
|
farmbuyer@37
|
1758 addon:_fill_out_hist_data(opt_index)
|
farmbuyer@37
|
1759 self:SortData() -- calls hooked refresh
|
farmbuyer@6
|
1760 end
|
farmbuyer@6
|
1761
|
farmbuyer@37
|
1762 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@6
|
1763
|
farmbuyer@37
|
1764 -- Zaps history for the given realm, or the current (current-playing
|
farmbuyer@37
|
1765 -- realm, not currently-displayed realm) one if not specified.
|
farmbuyer@37
|
1766 local function reset_current_realm (opt_realmname)
|
farmbuyer@37
|
1767 local r = assert(opt_realmname or GetRealmName())
|
farmbuyer@37
|
1768 -- new .history table:
|
farmbuyer@37
|
1769 addon.history_all[r] = addon:_prep_new_history_category (nil, r)
|
farmbuyer@37
|
1770 addon.history = addon.history_all[r]
|
farmbuyer@37
|
1771 addon.hist_clean = nil
|
farmbuyer@37
|
1772 -- new .history.st table:
|
farmbuyer@37
|
1773 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1774 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1775 end
|
farmbuyer@6
|
1776
|
farmbuyer@1
|
1777 tabs_OnGroupSelected["hist"] = function(container,specials)
|
farmbuyer@95
|
1778 local st_widget = AceGUI:Create("lib-st")
|
farmbuyer@95
|
1779 gui.which_ST = histST
|
farmbuyer@37
|
1780 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1781 st_widget:WrapST(histST)
|
farmbuyer@37
|
1782 st_widget.head_offset = 15
|
farmbuyer@37
|
1783 st_widget.tail_offset = 0
|
farmbuyer@37
|
1784 container:SetLayout("Fill")
|
farmbuyer@37
|
1785 container:AddChild(st_widget)
|
farmbuyer@37
|
1786 setstatus(hist_normal_status)
|
farmbuyer@1
|
1787
|
farmbuyer@37
|
1788 local b
|
farmbuyer@37
|
1789 do
|
farmbuyer@37
|
1790 local realms,current = {},1
|
farmbuyer@37
|
1791 for realmname,histtable in pairs(addon.history_all) do
|
farmbuyer@37
|
1792 if type(histtable) == 'table' then
|
farmbuyer@37
|
1793 tinsert(realms,realmname)
|
farmbuyer@37
|
1794 if addon.history == histtable then current = #realms end
|
farmbuyer@4
|
1795 end
|
farmbuyer@4
|
1796 end
|
farmbuyer@37
|
1797 b = mkbutton("Dropdown", nil, "", [[Which realm to display]])
|
farmbuyer@1
|
1798 b:SetFullWidth(true)
|
farmbuyer@37
|
1799 b:SetLabel() -- required even when empty, see ace3 ticket #234
|
farmbuyer@37
|
1800 b:SetList(realms)
|
farmbuyer@37
|
1801 b:SetValue(current)
|
farmbuyer@37
|
1802 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@37
|
1803 local r = realms[choice]
|
farmbuyer@37
|
1804 addon.history = addon:_prep_new_history_category (addon.history_all[r], r)
|
farmbuyer@37
|
1805 addon.hist_clean = nil
|
farmbuyer@6
|
1806 histST:OuroLoot_Refresh()
|
farmbuyer@6
|
1807 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1808 -- Reset filters to normal
|
farmbuyer@37
|
1809 history_filter_who = nil
|
farmbuyer@37
|
1810 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@37
|
1811 setstatus(hist_normal_status)
|
farmbuyer@1
|
1812 return addon:redisplay()
|
farmbuyer@1
|
1813 end)
|
farmbuyer@1
|
1814 specials:AddChild(b)
|
farmbuyer@37
|
1815 end
|
farmbuyer@1
|
1816
|
farmbuyer@95
|
1817 --[[ b = AceGUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]]
|
farmbuyer@4
|
1818
|
farmbuyer@37
|
1819 b = mkbutton("Regenerate",
|
farmbuyer@37
|
1820 [[Erases all history entries from the displayed realm, and regenerates it from current loot information.]])
|
farmbuyer@37
|
1821 b:SetFullWidth(true)
|
farmbuyer@37
|
1822 b:SetDisabled (#addon.history == 0)
|
farmbuyer@37
|
1823 b:SetCallback("OnClick", function(_b)
|
farmbuyer@37
|
1824 local dialog = StaticPopup_Show("OUROL_HIST_REGEN", addon.history.realm)
|
farmbuyer@37
|
1825 dialog.data = addon
|
farmbuyer@37
|
1826 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1827 _addon:rewrite_history (_addon.history.realm)
|
farmbuyer@37
|
1828 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1829 histST:SetData(_addon.history.st)
|
farmbuyer@37
|
1830 end
|
farmbuyer@37
|
1831 end)
|
farmbuyer@37
|
1832 specials:AddChild(b)
|
farmbuyer@1
|
1833
|
farmbuyer@37
|
1834 b = mkbutton('hist_clear', "Clear Realm History",
|
farmbuyer@37
|
1835 [[|cffff1010Erases absolutely all> history entries from the displayed realm.]])
|
farmbuyer@37
|
1836 b:SetFullWidth(true)
|
farmbuyer@37
|
1837 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1838 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", addon.history.realm)
|
farmbuyer@37
|
1839 dialog.data = addon
|
farmbuyer@37
|
1840 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1841 reset_current_realm(_addon.history.realm)
|
farmbuyer@37
|
1842 end
|
farmbuyer@37
|
1843 end)
|
farmbuyer@37
|
1844 specials:AddChild(b)
|
farmbuyer@37
|
1845
|
farmbuyer@37
|
1846 b = mkbutton('hist_clear_all', "Clear All History",
|
farmbuyer@37
|
1847 [[|cffff1010Erases absolutely all> history entries from ALL realms.]])
|
farmbuyer@37
|
1848 b:SetFullWidth(true)
|
farmbuyer@37
|
1849 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1850 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", "ALL realms")
|
farmbuyer@37
|
1851 dialog.data = addon
|
farmbuyer@37
|
1852 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1853 _addon.history_all = {}
|
farmbuyer@37
|
1854 reset_current_realm()
|
farmbuyer@37
|
1855 end
|
farmbuyer@37
|
1856 end)
|
farmbuyer@37
|
1857 specials:AddChild(b)
|
farmbuyer@37
|
1858
|
farmbuyer@37
|
1859 b = mkbutton('hist_clear_old', "Clear Older",
|
farmbuyer@75
|
1860 [[Preserves only the latest loot entries for players on the displayed realm, removing all earlier ones.]])
|
farmbuyer@37
|
1861 b:SetFullWidth(true)
|
farmbuyer@37
|
1862 b:SetCallback("OnClick", function (_b)
|
farmbuyer@75
|
1863 local dialog = StaticPopup_Show("OUROL_HIST_PREEN", '', addon.history.realm, addon)
|
farmbuyer@37
|
1864 dialog.data = addon
|
farmbuyer@75
|
1865 dialog.data2 = function (_addon, howmany)
|
farmbuyer@75
|
1866 _addon:preen_history (_addon.history.realm, howmany)
|
farmbuyer@37
|
1867 _addon.hist_clean = nil
|
farmbuyer@37
|
1868 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1869 end
|
farmbuyer@37
|
1870 end)
|
farmbuyer@37
|
1871 specials:AddChild(b)
|
farmbuyer@1
|
1872 end
|
farmbuyer@37
|
1873 return tabs_OnGroupSelected["hist"](container,specials)
|
farmbuyer@1
|
1874 end
|
farmbuyer@83
|
1875 noob_tips["hist"] = _markup[[
|
farmbuyer@83
|
1876 <Left>-click a row to see all history for that player. <Right>-click any row
|
farmbuyer@83
|
1877 to return to showing all players.
|
farmbuyer@83
|
1878
|
farmbuyer@83
|
1879 <Shift-Left> while over an item link to paste it into chat. <Shift-Right>
|
farmbuyer@83
|
1880 any row to display a dropdown menu.]]
|
farmbuyer@95
|
1881 -- '/ol hi pla' -> set filter on Playername
|
farmbuyer@88
|
1882 tabs_CLI_special["hist"] = function (name)
|
farmbuyer@88
|
1883 name = '^'..name -- already tolower'd by onslash
|
farmbuyer@88
|
1884 for _,player in ipairs(addon.history) do
|
farmbuyer@88
|
1885 if player.name:lower():find(name) then
|
farmbuyer@88
|
1886 history_filter_who = player.name
|
farmbuyer@88
|
1887 histST:SetFilter(history_filter_by_name)
|
farmbuyer@88
|
1888 setstatus(hist_name_status)
|
farmbuyer@88
|
1889 break
|
farmbuyer@88
|
1890 end
|
farmbuyer@88
|
1891 end
|
farmbuyer@88
|
1892 -- If nothing found, reset to normal or just leave alone?
|
farmbuyer@88
|
1893 end
|
farmbuyer@1
|
1894
|
farmbuyer@37
|
1895
|
farmbuyer@6
|
1896 -- Tab 5: Help (content in verbage.lua)
|
farmbuyer@1
|
1897
|
farmbuyer@37
|
1898
|
farmbuyer@96
|
1899 -- Tab 6: Options (content in options.lua)
|
farmbuyer@1
|
1900
|
farmbuyer@1
|
1901
|
farmbuyer@1
|
1902 -- Simply to avoid recreating the same function over and over
|
farmbuyer@1
|
1903 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
|
farmbuyer@1
|
1904 tabs_OnGroupSelected_func = function (tabs,event,group)
|
farmbuyer@1
|
1905 tabs_OnGroupSelected_func_args[1] = tabs
|
farmbuyer@1
|
1906 tabs_OnGroupSelected_func_args[3] = group
|
farmbuyer@98
|
1907 gui.opts = addon.db.profile
|
farmbuyer@83
|
1908 hide_noobtips_frame()
|
farmbuyer@1
|
1909 tabs:ReleaseChildren()
|
farmbuyer@1
|
1910 local spec = tabs:GetUserData("special buttons group")
|
farmbuyer@1
|
1911 spec:ReleaseChildren()
|
farmbuyer@95
|
1912 local h = AceGUI:Create("Heading")
|
farmbuyer@1
|
1913 h:SetFullWidth(true)
|
farmbuyer@95
|
1914 h:SetText(gui.tabtexts[group].title)
|
farmbuyer@1
|
1915 spec:AddChild(h)
|
farmbuyer@76
|
1916 do
|
farmbuyer@76
|
1917 addon.sender_list.sort()
|
farmbuyer@76
|
1918 local fmt = "Received broadcast data from %d |4player:players;."
|
farmbuyer@76
|
1919 if addon.history_suppress then
|
farmbuyer@76
|
1920 -- this is the druid class color reworked into hex
|
farmbuyer@76
|
1921 fmt = fmt .. " |cffff7d0aHistory recording suppressed.|r"
|
farmbuyer@76
|
1922 end
|
farmbuyer@76
|
1923 tabs.titletext:SetFormattedText (fmt, addon.sender_list.activeI)
|
farmbuyer@76
|
1924 end
|
farmbuyer@81
|
1925 local status,err = pcall (tabs_OnGroupSelected[group], tabs, spec, group)
|
farmbuyer@81
|
1926 if not status then
|
farmbuyer@81
|
1927 addon:horrible_horrible_error(err)
|
farmbuyer@81
|
1928 end
|
farmbuyer@97
|
1929 if gui.opts.gui_noob then
|
farmbuyer@83
|
1930 local tip = noob_tips[group]
|
farmbuyer@83
|
1931 if type(tip) == 'function' then
|
farmbuyer@83
|
1932 tip = tip()
|
farmbuyer@83
|
1933 end
|
farmbuyer@83
|
1934 if type(tip) == 'string' and tip ~= "" then
|
farmbuyer@83
|
1935 local w = get_noobtips_frame()
|
farmbuyer@83
|
1936 w:SetParent (_d.content)
|
farmbuyer@83
|
1937 w:ClearAllPoints()
|
farmbuyer@83
|
1938 w:SetPoint("BOTTOMLEFT", _d.frame, "BOTTOMRIGHT", 3, 3)
|
farmbuyer@83
|
1939 w:Show()
|
farmbuyer@83
|
1940 w:DoTextWork(tip)
|
farmbuyer@83
|
1941 end
|
farmbuyer@83
|
1942 end
|
farmbuyer@1
|
1943 --[====[
|
farmbuyer@1
|
1944 Unfortunately, :GetHeight() called on anything useful out of a TabGroup
|
farmbuyer@1
|
1945 returns the static default size (about 50 pixels) until the refresh
|
farmbuyer@1
|
1946 cycle *after* all the frames are shown. Trying to fix it up after a
|
farmbuyer@1
|
1947 single OnUpdate doesn't work either. So for now it's all hardcoded.
|
farmbuyer@1
|
1948
|
farmbuyer@83
|
1949 Using this to determine the actual height of the usable area. (Will
|
farmbuyer@83
|
1950 error until an ST is shown, which only happens if it's tracking, etc.)
|
farmbuyer@83
|
1951 416 pixels
|
farmbuyer@1
|
1952 if group == "eoi" then
|
farmbuyer@1
|
1953 local stframe = tabs.children[1].frame
|
farmbuyer@1
|
1954 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
|
farmbuyer@1
|
1955 stframe:GetTop()-stframe:GetBottom())
|
farmbuyer@1
|
1956 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
|
farmbuyer@1
|
1957 stframe:GetRight()-stframe:GetLeft())
|
farmbuyer@1
|
1958 end
|
farmbuyer@1
|
1959 ]====]
|
farmbuyer@1
|
1960 end
|
farmbuyer@1
|
1961
|
farmbuyer@1
|
1962 --[[
|
farmbuyer@1
|
1963 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1964 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1965 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
1966 ]]
|
farmbuyer@83
|
1967 function mkbutton (opt_widget_type, opt_key, label, status)
|
farmbuyer@83
|
1968 if not label then
|
farmbuyer@83
|
1969 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
|
farmbuyer@83
|
1970 elseif not status then
|
farmbuyer@83
|
1971 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
|
farmbuyer@1
|
1972 end
|
farmbuyer@95
|
1973 local button = assert(AceGUI:Create(opt_widget_type))
|
farmbuyer@83
|
1974 if button.SetText then button:SetText(tostring(label)) end
|
farmbuyer@83
|
1975 status = _markup(status)
|
farmbuyer@83
|
1976 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
|
farmbuyer@83
|
1977 button:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@83
|
1978 -- retrieval key may be specified as nil if all the parameters are given
|
farmbuyer@83
|
1979 if opt_key then _d:SetUserData (opt_key, button) end
|
farmbuyer@83
|
1980 return button
|
farmbuyer@1
|
1981 end
|
farmbuyer@96
|
1982 gui.mkbutton = mkbutton
|
farmbuyer@1
|
1983
|
farmbuyer@1
|
1984 --[[
|
farmbuyer@1
|
1985 Creates the main window.
|
farmbuyer@1
|
1986 ]]
|
farmbuyer@1
|
1987 function addon:BuildMainDisplay (opt_tabselect)
|
farmbuyer@1
|
1988 if self.display then
|
farmbuyer@1
|
1989 -- try to get everything to update, rebuild, refresh... ugh, no
|
farmbuyer@1
|
1990 self.display:Hide()
|
farmbuyer@1
|
1991 end
|
farmbuyer@92
|
1992 if self.NOLOAD then
|
farmbuyer@92
|
1993 -- don't even try
|
farmbuyer@92
|
1994 return
|
farmbuyer@92
|
1995 end
|
farmbuyer@1
|
1996
|
farmbuyer@25
|
1997 -- This probably causes taint... hm.
|
farmbuyer@25
|
1998 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
|
farmbuyer@25
|
1999 UIDROPDOWNMENU_SHOW_TIME = 4
|
farmbuyer@25
|
2000
|
farmbuyer@47
|
2001 if dirty_tabs then
|
farmbuyer@84
|
2002 -- pointers known to be good by now, pass them back in
|
farmbuyer@84
|
2003 self:gui_init (g_loot, g_uniques)
|
farmbuyer@47
|
2004 self:zero_printed_fenceposts()
|
farmbuyer@47
|
2005 end
|
farmbuyer@97
|
2006 gui.opts = self.db.profile
|
farmbuyer@47
|
2007
|
farmbuyer@95
|
2008 local display = AceGUI:Create("Frame")
|
farmbuyer@1
|
2009 _d = display
|
farmbuyer@1
|
2010 self.display = display
|
farmbuyer@17
|
2011 display:SetTitle(window_title)
|
farmbuyer@1
|
2012 display:SetStatusText(self.status_text)
|
farmbuyer@1
|
2013 display:SetLayout("Flow")
|
farmbuyer@16
|
2014 display:SetStatusTable{width=900,height=550} -- default height is 500
|
farmbuyer@47
|
2015 display:EnableResize(false)
|
farmbuyer@96
|
2016 display:SetUserData("GUI state",gui)
|
farmbuyer@1
|
2017 display:SetCallback("OnClose", function(_display)
|
farmbuyer@25
|
2018 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
|
farmbuyer@83
|
2019 hide_noobtips_frame()
|
farmbuyer@95
|
2020 _d = nil
|
farmbuyer@1
|
2021 self.display = nil
|
farmbuyer@95
|
2022 AceGUI:Release(_display)
|
farmbuyer@6
|
2023 flib.clear()
|
farmbuyer@1
|
2024 collectgarbage()
|
farmbuyer@1
|
2025 end)
|
farmbuyer@1
|
2026
|
farmbuyer@1
|
2027 ----- Right-hand panel
|
farmbuyer@1
|
2028 local rhs_width = 0.20
|
farmbuyer@95
|
2029 local control = AceGUI:Create("SimpleGroup")
|
farmbuyer@1
|
2030 control:SetLayout("Flow")
|
farmbuyer@1
|
2031 control:SetRelativeWidth(rhs_width)
|
farmbuyer@1
|
2032 control.alignoffset = 25
|
farmbuyer@1
|
2033 control:PauseLayout()
|
farmbuyer@1
|
2034 local h,b
|
farmbuyer@1
|
2035
|
farmbuyer@1
|
2036 --- Main ---
|
farmbuyer@95
|
2037 h = AceGUI:Create("Heading")
|
farmbuyer@1
|
2038 h:SetFullWidth(true)
|
farmbuyer@1
|
2039 h:SetText("Main")
|
farmbuyer@1
|
2040 control:AddChild(h)
|
farmbuyer@1
|
2041
|
farmbuyer@1
|
2042 do
|
farmbuyer@1
|
2043 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
2044 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
|
farmbuyer@1
|
2045 b:SetFullWidth(true)
|
farmbuyer@1
|
2046 b:SetLabel("On/Off:")
|
farmbuyer@1
|
2047 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
|
farmbuyer@1
|
2048 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
|
farmbuyer@1
|
2049 b:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@1
|
2050 if choice == 1 then self:Activate()
|
farmbuyer@1
|
2051 elseif choice == 2 then self:Activate(nil,true)
|
farmbuyer@1
|
2052 else self:Deactivate()
|
farmbuyer@1
|
2053 end
|
farmbuyer@1
|
2054 _w = display:GetUserData('comm_ident')
|
farmbuyer@1
|
2055 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2056 _w:SetDisabled(self.enabled or self.rebroadcast)
|
farmbuyer@1
|
2057 end
|
farmbuyer@1
|
2058 _w = display:GetUserData('eoi_bcast_req')
|
farmbuyer@1
|
2059 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2060 _w:SetDisabled(not self.enabled)
|
farmbuyer@1
|
2061 end
|
farmbuyer@1
|
2062 end)
|
farmbuyer@1
|
2063 control:AddChild(b)
|
farmbuyer@1
|
2064 end
|
farmbuyer@1
|
2065
|
farmbuyer@1
|
2066 b = mkbutton("Dropdown", 'threshold', "",
|
farmbuyer@1
|
2067 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
|
farmbuyer@1
|
2068 b:SetFullWidth(true)
|
farmbuyer@1
|
2069 b:SetLabel("Threshold:")
|
farmbuyer@1
|
2070 b:SetList(self.thresholds)
|
farmbuyer@1
|
2071 b:SetValue(self.threshold)
|
farmbuyer@1
|
2072 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
2073 self:SetThreshold(choice)
|
farmbuyer@1
|
2074 end)
|
farmbuyer@1
|
2075 control:AddChild(b)
|
farmbuyer@1
|
2076
|
farmbuyer@4
|
2077 b = mkbutton("Clear Loot",
|
farmbuyer@1
|
2078 [[+Erases> all current loot information and generated text (but not saved texts).]])
|
farmbuyer@1
|
2079 b:SetFullWidth(true)
|
farmbuyer@1
|
2080 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2081 StaticPopup_Show("OUROL_CLEAR").data = self
|
farmbuyer@1
|
2082 end)
|
farmbuyer@1
|
2083 control:AddChild(b)
|
farmbuyer@1
|
2084
|
farmbuyer@95
|
2085 b = AceGUI:Create("Spacer")
|
farmbuyer@1
|
2086 b:SetFullWidth(true)
|
farmbuyer@16
|
2087 b:SetHeight(10)
|
farmbuyer@1
|
2088 control:AddChild(b)
|
farmbuyer@1
|
2089
|
farmbuyer@1
|
2090 --[[
|
farmbuyer@1
|
2091 --- Saved Texts ---
|
farmbuyer@1
|
2092 [ Save Current As... ]
|
farmbuyer@1
|
2093 saved1
|
farmbuyer@1
|
2094 saved2
|
farmbuyer@1
|
2095 ...
|
farmbuyer@1
|
2096 [ Load ] [ Delete ]
|
farmbuyer@1
|
2097 ]]
|
farmbuyer@95
|
2098 h = AceGUI:Create("Heading")
|
farmbuyer@1
|
2099 h:SetFullWidth(true)
|
farmbuyer@1
|
2100 h:SetText("Saved Texts")
|
farmbuyer@1
|
2101 control:AddChild(h)
|
farmbuyer@1
|
2102 b = mkbutton("Save Current As...",
|
farmbuyer@1
|
2103 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
|
farmbuyer@1
|
2104 b:SetFullWidth(true)
|
farmbuyer@1
|
2105 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2106 StaticPopup_Show "OUROL_SAVE_SAVEAS"
|
farmbuyer@1
|
2107 _d:Hide()
|
farmbuyer@1
|
2108 end)
|
farmbuyer@1
|
2109 control:AddChild(b)
|
farmbuyer@1
|
2110
|
farmbuyer@16
|
2111 do
|
farmbuyer@95
|
2112 local scontainer = AceGUI:Create("SimpleGroup")
|
farmbuyer@16
|
2113 scontainer:SetFullWidth(true)
|
farmbuyer@16
|
2114 scontainer:SetFullHeight(false)
|
farmbuyer@16
|
2115 scontainer:SetAutoAdjustHeight(false)
|
farmbuyer@16
|
2116 scontainer:SetHeight(40) -- no relative height available anymore
|
farmbuyer@16
|
2117 scontainer:SetLayout("Fill")
|
farmbuyer@95
|
2118 local scroll = AceGUI:Create("ScrollFrame")
|
farmbuyer@16
|
2119 scroll:SetLayout("List")
|
farmbuyer@16
|
2120 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
|
farmbuyer@16
|
2121 if saved then for i,s in ipairs(saved) do
|
farmbuyer@95
|
2122 local il = AceGUI:Create("InteractiveLabel")
|
farmbuyer@16
|
2123 il:SetFullWidth(true)
|
farmbuyer@16
|
2124 il:SetText(s.name)
|
farmbuyer@16
|
2125 il:SetUserData("num",i)
|
farmbuyer@16
|
2126 il:SetHighlight(1,1,1,0.4)
|
farmbuyer@16
|
2127 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
|
farmbuyer@16
|
2128 il:SetCallback("OnEnter", function() setstatus(str) end)
|
farmbuyer@16
|
2129 il:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@16
|
2130 il:SetCallback("OnClick", function(_il)
|
farmbuyer@16
|
2131 local prev = _d:GetUserData("saved selection")
|
farmbuyer@16
|
2132 if prev then
|
farmbuyer@16
|
2133 prev.highlight:Hide()
|
farmbuyer@16
|
2134 prev:SetColor()
|
farmbuyer@16
|
2135 end
|
farmbuyer@16
|
2136 _il:SetColor(0,1,0)
|
farmbuyer@16
|
2137 _il.highlight:Show()
|
farmbuyer@16
|
2138 _d:SetUserData("saved selection",_il)
|
farmbuyer@16
|
2139 _d:GetUserData("Load"):SetDisabled(false)
|
farmbuyer@16
|
2140 _d:GetUserData("Delete"):SetDisabled(false)
|
farmbuyer@16
|
2141 end)
|
farmbuyer@16
|
2142 scroll:AddChild(il)
|
farmbuyer@16
|
2143 end end
|
farmbuyer@16
|
2144 scontainer:AddChild(scroll)
|
farmbuyer@16
|
2145 control:AddChild(scontainer)
|
farmbuyer@16
|
2146 end
|
farmbuyer@1
|
2147
|
farmbuyer@1
|
2148 b = mkbutton("Load",
|
farmbuyer@1
|
2149 [[Load previously saved text. +REPLACES> all current loot information!]])
|
farmbuyer@1
|
2150 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2151 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2152 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2153 self:save_restore(num)
|
farmbuyer@1
|
2154 self:BuildMainDisplay()
|
farmbuyer@1
|
2155 end)
|
farmbuyer@1
|
2156 b:SetDisabled(true)
|
farmbuyer@1
|
2157 control:AddChild(b)
|
farmbuyer@1
|
2158 b = mkbutton("Delete",
|
farmbuyer@1
|
2159 [[Delete previously saved text.]])
|
farmbuyer@1
|
2160 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2161 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2162 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2163 self:save_delete(num)
|
farmbuyer@1
|
2164 self:BuildMainDisplay()
|
farmbuyer@1
|
2165 end)
|
farmbuyer@1
|
2166 b:SetDisabled(true)
|
farmbuyer@1
|
2167 control:AddChild(b)
|
farmbuyer@1
|
2168
|
farmbuyer@95
|
2169 b = AceGUI:Create("Spacer")
|
farmbuyer@1
|
2170 b:SetFullWidth(true)
|
farmbuyer@16
|
2171 b:SetHeight(10)
|
farmbuyer@1
|
2172 control:AddChild(b)
|
farmbuyer@1
|
2173
|
farmbuyer@1
|
2174 -- Other stuff on right-hand side
|
farmbuyer@95
|
2175 local tab_specials = AceGUI:Create("SimpleGroup")
|
farmbuyer@1
|
2176 tab_specials:SetLayout("Flow")
|
farmbuyer@1
|
2177 tab_specials:SetFullWidth(true)
|
farmbuyer@1
|
2178 control:AddChild(tab_specials)
|
farmbuyer@1
|
2179 control:ResumeLayout()
|
farmbuyer@1
|
2180
|
farmbuyer@1
|
2181 ----- Left-hand group
|
farmbuyer@95
|
2182 local tabs = AceGUI:Create("TabGroup")
|
farmbuyer@1
|
2183 tabs:SetLayout("Flow")
|
farmbuyer@1
|
2184 tabs.alignoffset = 25
|
farmbuyer@49
|
2185 local titletext_orig_fo = tabs.titletext:GetFontObject()
|
farmbuyer@49
|
2186 tabs.titletext:SetFontObject(GameFontNormalSmall)
|
farmbuyer@49
|
2187 tabs:SetCallback("OnRelease", function(_tabs)
|
farmbuyer@49
|
2188 tabs.titletext:SetFontObject(titletext_orig_fo)
|
farmbuyer@49
|
2189 end)
|
farmbuyer@1
|
2190 tabs:SetRelativeWidth(0.99-rhs_width)
|
farmbuyer@1
|
2191 tabs:SetFullHeight(true)
|
farmbuyer@1
|
2192 tabs:SetTabs(tabgroup_tabs)
|
farmbuyer@1
|
2193 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
|
farmbuyer@1
|
2194 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
|
farmbuyer@95
|
2195 setstatus(gui.tabtexts[value].desc)
|
farmbuyer@1
|
2196 end)
|
farmbuyer@1
|
2197 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
|
farmbuyer@1
|
2198 tabs:SetUserData("special buttons group",tab_specials)
|
farmbuyer@76
|
2199 tabs:SelectTab((opt_tabselect and #opt_tabselect>0)
|
farmbuyer@76
|
2200 and opt_tabselect or "eoi")
|
farmbuyer@1
|
2201
|
farmbuyer@1
|
2202 display:AddChildren (tabs, control)
|
farmbuyer@1
|
2203 display:ApplyStatus()
|
farmbuyer@1
|
2204
|
farmbuyer@1
|
2205 display:Show() -- without this, only appears every *other* function call
|
farmbuyer@1
|
2206 return display
|
farmbuyer@1
|
2207 end
|
farmbuyer@1
|
2208
|
farmbuyer@95
|
2209 -- Searches tab titles from left to right.
|
farmbuyer@88
|
2210 function addon:OpenMainDisplayToTab (text, opt_arg)
|
farmbuyer@44
|
2211 text = '^'..text:lower()
|
farmbuyer@95
|
2212 for _,tab in ipairs(gui.taborder) do
|
farmbuyer@95
|
2213 local v = gui.tabtexts[tab]
|
farmbuyer@95
|
2214 if v and v.title:lower():find(text) then
|
farmbuyer@1
|
2215 self:BuildMainDisplay(tab)
|
farmbuyer@88
|
2216 if opt_arg and tabs_CLI_special[tab] then
|
farmbuyer@88
|
2217 tabs_CLI_special[tab](opt_arg)
|
farmbuyer@88
|
2218 end
|
farmbuyer@1
|
2219 return true
|
farmbuyer@1
|
2220 end
|
farmbuyer@1
|
2221 end
|
farmbuyer@1
|
2222 end
|
farmbuyer@1
|
2223
|
farmbuyer@1
|
2224 -- Essentially a re-click on the current tab (if the current tab were clickable).
|
farmbuyer@1
|
2225 function addon:redisplay ()
|
farmbuyer@1
|
2226 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
|
farmbuyer@1
|
2227 end
|
farmbuyer@1
|
2228
|
farmbuyer@1
|
2229
|
farmbuyer@1
|
2230 ------ Popup dialogs
|
farmbuyer@75
|
2231 local function build_my_slider_widget()
|
farmbuyer@75
|
2232 local s = CreateFrame("Slider", "OuroLootSlider", nil, "OptionsSliderTemplate")
|
farmbuyer@75
|
2233 s.text = OuroLootSliderText
|
farmbuyer@75
|
2234 s.low = OuroLootSliderLow
|
farmbuyer@75
|
2235 s.high = OuroLootSliderHigh
|
farmbuyer@75
|
2236 s:SetScript("OnValueChanged", function (_s, value)
|
farmbuyer@75
|
2237 _s.value = value -- conveniently, this is already of numeric type
|
farmbuyer@75
|
2238 --_s.text:SetText(tostring(value))
|
farmbuyer@75
|
2239 if _s.DoOnValueChanged then
|
farmbuyer@75
|
2240 _s:DoOnValueChanged()
|
farmbuyer@75
|
2241 end
|
farmbuyer@75
|
2242 end)
|
farmbuyer@75
|
2243 build_my_slider_widget = nil
|
farmbuyer@75
|
2244 return s
|
farmbuyer@75
|
2245 end
|
farmbuyer@75
|
2246
|
farmbuyer@1
|
2247 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
|
farmbuyer@1
|
2248 text = "Clear current loot information and text?",
|
farmbuyer@16
|
2249 button1 = YES,
|
farmbuyer@16
|
2250 button2 = NO,
|
farmbuyer@1
|
2251 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2252 addon:Clear(--[[verbose_p=]]true)
|
farmbuyer@1
|
2253 end,
|
farmbuyer@1
|
2254 }
|
farmbuyer@1
|
2255
|
farmbuyer@37
|
2256 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2257 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2258 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@75
|
2259 .. "%s|r, and generate it anew from current loot?",
|
farmbuyer@37
|
2260 button1 = YES,
|
farmbuyer@37
|
2261 button2 = NO,
|
farmbuyer@37
|
2262 OnAccept = function (dialog, addon, data2)
|
farmbuyer@37
|
2263 data2(addon)
|
farmbuyer@37
|
2264 addon:Print("%s history has been regenerated.", addon.history.realm)
|
farmbuyer@37
|
2265 addon:redisplay()
|
farmbuyer@37
|
2266 end,
|
farmbuyer@37
|
2267 }
|
farmbuyer@37
|
2268
|
farmbuyer@16
|
2269 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
|
farmbuyer@37
|
2270 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2271 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2272 button1 = YES,
|
farmbuyer@16
|
2273 button2 = NO,
|
farmbuyer@16
|
2274 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2275 data2(addon)
|
farmbuyer@16
|
2276 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
|
farmbuyer@16
|
2277 addon:redisplay()
|
farmbuyer@16
|
2278 end,
|
farmbuyer@16
|
2279 }
|
farmbuyer@16
|
2280
|
farmbuyer@16
|
2281 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2282 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2283 text = "This will erase all but the latest "
|
farmbuyer@75
|
2284 .. ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
|
farmbuyer@75
|
2285 .. "%s|r for each player on "
|
farmbuyer@75
|
2286 .. ITEM_QUALITY_COLORS[5].hex .. "%s|r. " .. CONTINUE .. "?",
|
farmbuyer@16
|
2287 button1 = YES,
|
farmbuyer@16
|
2288 button2 = NO,
|
farmbuyer@75
|
2289 OnShow = function (dialog, addon)
|
farmbuyer@75
|
2290 local thistable = StaticPopupDialogs[dialog.which]
|
farmbuyer@75
|
2291 -- StaticPopup_Resize does not take extraFrame into account, so we
|
farmbuyer@89
|
2292 -- monkeypatch the sizing method that _Resize calls at the end.
|
farmbuyer@75
|
2293 dialog.saved_setheight = dialog.SetHeight
|
farmbuyer@75
|
2294 dialog.SetHeight = function (d, h)
|
farmbuyer@75
|
2295 return d.saved_setheight(d,h+35)
|
farmbuyer@75
|
2296 end
|
farmbuyer@75
|
2297 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2298 dialog.extraFrame:SetPoint("TOP", dialog.text, "BOTTOM")
|
farmbuyer@75
|
2299 dialog.extraFrame:SetWidth(150)
|
farmbuyer@75
|
2300 dialog.extraFrame:SetHeight(35)
|
farmbuyer@75
|
2301 dialog.extraFrame:Show()
|
farmbuyer@75
|
2302 local slider = _G.OuroLootSlider or build_my_slider_widget()
|
farmbuyer@75
|
2303 slider.DoOnValueChanged = function(s)
|
farmbuyer@75
|
2304 dialog.text:SetFormattedText (thistable.text,
|
farmbuyer@75
|
2305 s.value == 1 and "single entry" or (s.value .. " entries"),
|
farmbuyer@75
|
2306 addon.history.realm)
|
farmbuyer@75
|
2307 StaticPopup_Resize (dialog, "OUROL_HIST_PREEN")
|
farmbuyer@75
|
2308 end
|
farmbuyer@75
|
2309 slider:SetOrientation('HORIZONTAL')
|
farmbuyer@75
|
2310 slider:SetMinMaxValues(1,30)
|
farmbuyer@75
|
2311 slider:SetValueStep(1)
|
farmbuyer@75
|
2312 slider.low:SetText("1")
|
farmbuyer@75
|
2313 slider.high:SetText("30")
|
farmbuyer@75
|
2314 --slider.tooltipText = ???
|
farmbuyer@75
|
2315 slider:SetParent(dialog.extraFrame)
|
farmbuyer@75
|
2316 slider:ClearAllPoints()
|
farmbuyer@75
|
2317 slider:SetPoint("TOPLEFT",dialog.extraFrame,"TOPLEFT",0, -15)
|
farmbuyer@75
|
2318 slider:SetPoint("BOTTOMRIGHT",dialog.extraFrame,"BOTTOMRIGHT",0, 0)
|
farmbuyer@75
|
2319 slider:Show()
|
farmbuyer@75
|
2320 -- This causes OnValueChanged to fire, reformatting the text. Except
|
farmbuyer@75
|
2321 -- IF the slider has already been shown, and IF at the time it was hidden
|
farmbuyer@75
|
2322 -- it had the same value here, THEN there is technically no "change"
|
farmbuyer@75
|
2323 -- and no event is fired. We work around this clever optimization by
|
farmbuyer@75
|
2324 -- doing a pair of set's, forcing the last one to fire OVC.
|
farmbuyer@75
|
2325 slider:SetValue(1)
|
farmbuyer@75
|
2326 slider:SetValue(5)
|
farmbuyer@75
|
2327 end,
|
farmbuyer@75
|
2328 OnAccept = function (dialog, addon, callback)
|
farmbuyer@75
|
2329 local howmany = assert(tonumber(_G.OuroLootSlider.value))
|
farmbuyer@75
|
2330 callback (addon, howmany)
|
farmbuyer@75
|
2331 addon:Print("All loot prior to the most recent %d |4entry:entries; has been erased.", howmany)
|
farmbuyer@16
|
2332 addon:redisplay()
|
farmbuyer@16
|
2333 end,
|
farmbuyer@75
|
2334 OnHide = function (dialog, addon)
|
farmbuyer@75
|
2335 dialog.SetHeight = nil
|
farmbuyer@75
|
2336 dialog.saved_setheight = nil
|
farmbuyer@75
|
2337 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2338 _G.OuroLootSlider:Hide() -- parent is hidden, why is this required?
|
farmbuyer@75
|
2339 _G.OuroLootSlider:ClearAllPoints()
|
farmbuyer@75
|
2340 _G.OuroLootSlider:SetParent(nil)
|
farmbuyer@75
|
2341 end,
|
farmbuyer@16
|
2342 }
|
farmbuyer@16
|
2343
|
farmbuyer@27
|
2344 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
|
farmbuyer@27
|
2345 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
|
farmbuyer@27
|
2346 button1 = OKAY,
|
farmbuyer@27
|
2347 timeout = 0,
|
farmbuyer@27
|
2348 whileDead = true,
|
farmbuyer@27
|
2349 hideOnEscape = true,
|
farmbuyer@27
|
2350 enterClicksFirstButton = true,
|
farmbuyer@27
|
2351 hasEditBox = true,
|
farmbuyer@27
|
2352 editBoxWidth = 350,
|
farmbuyer@53
|
2353 preferredIndex = 3,
|
farmbuyer@27
|
2354 OnShow = function (dialog, url)
|
farmbuyer@27
|
2355 dialog.editBox:SetText(url)
|
farmbuyer@27
|
2356 dialog.editBox:SetFocus()
|
farmbuyer@27
|
2357 dialog.editBox:HighlightText()
|
farmbuyer@27
|
2358 end,
|
farmbuyer@27
|
2359 }
|
farmbuyer@27
|
2360
|
farmbuyer@1
|
2361 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
|
farmbuyer@77
|
2362 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
|
2363 button1 = "Activate recording", -- "accept", left
|
farmbuyer@69
|
2364 button2 = "Broadcast Only", -- "cancel", middle
|
farmbuyer@69
|
2365 button3 = HELP_LABEL, -- "alt", right
|
farmbuyer@1
|
2366 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2367 addon:Activate()
|
farmbuyer@1
|
2368 end,
|
farmbuyer@69
|
2369 noCancelOnEscape = true,
|
farmbuyer@69
|
2370 OnCancel = function (dialog, addon)
|
farmbuyer@1
|
2371 addon:Activate(nil,true)
|
farmbuyer@1
|
2372 end,
|
farmbuyer@69
|
2373 OnAlt = function (dialog, addon)
|
farmbuyer@1
|
2374 -- hitting escape also calls this, but the 3rd arg would be "clicked"
|
farmbuyer@1
|
2375 -- in both cases, not useful here.
|
farmbuyer@89
|
2376 if MouseIsOver(dialog.button3) then
|
farmbuyer@1
|
2377 -- they actually clicked the button (or at least the mouse was over "Help"
|
farmbuyer@1
|
2378 -- when they hit escape... sigh)
|
farmbuyer@1
|
2379 addon:BuildMainDisplay('help')
|
farmbuyer@1
|
2380 else
|
farmbuyer@1
|
2381 addon.popped = true
|
farmbuyer@1
|
2382 end
|
farmbuyer@1
|
2383 end,
|
farmbuyer@1
|
2384 }
|
farmbuyer@1
|
2385
|
farmbuyer@69
|
2386 -- Callback for each Next/Accept stage of inserting a new loot or boss row via
|
farmbuyer@69
|
2387 -- dropdown. Thanks to noCancelOnReuse, each Show done here will technically
|
farmbuyer@69
|
2388 -- Hide and redisplay the same dialog, passing along the same 'data' structure
|
farmbuyer@69
|
2389 -- each time. The topmost call to our OnAccept will then finish by hiding the
|
farmbuyer@69
|
2390 -- (very last) dialog.
|
farmbuyer@69
|
2391 --
|
farmbuyer@69
|
2392 -- This is really, really hideous to read.
|
farmbuyer@69
|
2393 local function eoi_st_insert_OnAccept_boss (dialog, data, data2)
|
farmbuyer@69
|
2394 if data.all_done then
|
farmbuyer@69
|
2395 -- It'll probably be the final entry in the table, but there might have
|
farmbuyer@73
|
2396 -- been real loot happening while the user was clicking and typing.
|
farmbuyer@69
|
2397 local boss_index = addon._addBossEntry{
|
farmbuyer@69
|
2398 kind = 'boss',
|
farmbuyer@97
|
2399 bossname = (gui.opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
|
farmbuyer@69
|
2400 reason = 'kill',
|
farmbuyer@69
|
2401 instance = data.instance,
|
farmbuyer@69
|
2402 duration = 0,
|
farmbuyer@69
|
2403 maxsize = data.max_raid_size,
|
farmbuyer@69
|
2404 raidersnap = data.yes_snap or {},
|
farmbuyer@69
|
2405 }
|
farmbuyer@69
|
2406 local entry = tremove(g_loot,boss_index)
|
farmbuyer@69
|
2407 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@69
|
2408 addon:_mark_boss_kill(data.rowindex)
|
farmbuyer@95
|
2409 gui.eoiST:OuroLoot_Refresh(data.rowindex)
|
farmbuyer@69
|
2410 dialog.data = nil -- free up memory
|
farmbuyer@78
|
2411 addon:Print("Inserted %s %s at entry %d.", data.kind, data.name, data.rowindex)
|
farmbuyer@69
|
2412 return
|
farmbuyer@69
|
2413 end
|
farmbuyer@69
|
2414
|
farmbuyer@69
|
2415 -- third click
|
farmbuyer@69
|
2416 if data.name and data.instance then
|
farmbuyer@69
|
2417 data.all_done = true
|
farmbuyer@69
|
2418 -- this is how we distinguish OnAccept from OnCancel ("clicked"); the
|
farmbuyer@69
|
2419 -- 3rd param is handled all in StaticPopup_OnClick
|
farmbuyer@69
|
2420 if data2 ~= 'clicked' then
|
farmbuyer@69
|
2421 data.yes_snap = data.maybe_snap
|
farmbuyer@69
|
2422 end
|
farmbuyer@69
|
2423 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2424 end
|
farmbuyer@69
|
2425
|
farmbuyer@69
|
2426 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2427
|
farmbuyer@69
|
2428 -- second click
|
farmbuyer@69
|
2429 if data.name and text then
|
farmbuyer@69
|
2430 data.instance = text
|
farmbuyer@92
|
2431 -- not "reusing" this dialog in the same sense as with loot
|
farmbuyer@69
|
2432 dialog.data = nil
|
farmbuyer@69
|
2433 dialog:Hide()
|
farmbuyer@69
|
2434 local getsnap = StaticPopup_Show("OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP")
|
farmbuyer@69
|
2435 getsnap.data = data
|
farmbuyer@69
|
2436 return true
|
farmbuyer@69
|
2437 end
|
farmbuyer@69
|
2438
|
farmbuyer@69
|
2439 -- first click
|
farmbuyer@69
|
2440 if text then
|
farmbuyer@69
|
2441 data.name = text
|
farmbuyer@69
|
2442 local maybe_instance
|
farmbuyer@69
|
2443 data.maybe_snap, data.max_raid_size, maybe_instance = addon:snapshot_raid()
|
farmbuyer@69
|
2444 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
|
farmbuyer@69
|
2445 getinstance.data = data
|
farmbuyer@69
|
2446 getinstance.editBox:SetText(maybe_instance)
|
farmbuyer@69
|
2447 -- This suppresses auto-hide (which would cause the getinstance dialog
|
farmbuyer@69
|
2448 -- to go away), but only when mouse clicking. OnEnter is on its own.
|
farmbuyer@69
|
2449 return true
|
farmbuyer@69
|
2450 end
|
farmbuyer@69
|
2451 end
|
farmbuyer@69
|
2452
|
farmbuyer@69
|
2453 local function eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2454 if data.all_done then
|
farmbuyer@69
|
2455 data.display:Hide()
|
farmbuyer@73
|
2456 local loot_index = assert(addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes))
|
farmbuyer@69
|
2457 local entry = tremove(g_loot,loot_index)
|
farmbuyer@69
|
2458 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@69
|
2459 addon:_fill_out_eoi_data(data.rowindex)
|
farmbuyer@69
|
2460 addon:BuildMainDisplay()
|
farmbuyer@79
|
2461 local clicky = _new_rebroadcast_hyperlink (entry.unique)
|
farmbuyer@69
|
2462 dialog.data = nil
|
farmbuyer@78
|
2463 addon:Print ("Inserted %s %s at entry %d. %s",
|
farmbuyer@78
|
2464 data.kind, data.name, data.rowindex, tostring(clicky))
|
farmbuyer@69
|
2465 return
|
farmbuyer@69
|
2466 end
|
farmbuyer@69
|
2467
|
farmbuyer@69
|
2468 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2469
|
farmbuyer@69
|
2470 -- third click
|
farmbuyer@69
|
2471 if data.name and data.recipient and text then
|
farmbuyer@69
|
2472 data.notes = (text ~= "<none>") and text or nil
|
farmbuyer@69
|
2473 data.all_done = true
|
farmbuyer@69
|
2474 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2475 end
|
farmbuyer@69
|
2476
|
farmbuyer@69
|
2477 -- second click
|
farmbuyer@69
|
2478 if data.name and text then
|
farmbuyer@69
|
2479 data.recipient = text
|
farmbuyer@69
|
2480 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
|
farmbuyer@69
|
2481 getnotes.data = data
|
farmbuyer@69
|
2482 getnotes.editBox:SetText("<none>")
|
farmbuyer@69
|
2483 getnotes.editBox:HighlightText()
|
farmbuyer@69
|
2484 return true
|
farmbuyer@69
|
2485 end
|
farmbuyer@69
|
2486
|
farmbuyer@69
|
2487 -- first click
|
farmbuyer@69
|
2488 if text then
|
farmbuyer@69
|
2489 data.name = text
|
farmbuyer@69
|
2490 dialog:Hide() -- technically a "different" one about to be shown
|
farmbuyer@78
|
2491 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams =
|
farmbuyer@93
|
2492 AUTOCOMPLETE_LIST_TEMPLATES[IsInRaid() and "IN_GROUP" or "IN_GUILD"]
|
farmbuyer@69
|
2493 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
|
farmbuyer@78
|
2494 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams = nil
|
farmbuyer@69
|
2495 getrecipient.data = data
|
farmbuyer@69
|
2496 getrecipient.editBox:SetText("")
|
farmbuyer@69
|
2497 return true
|
farmbuyer@69
|
2498 end
|
farmbuyer@69
|
2499 end
|
farmbuyer@69
|
2500
|
farmbuyer@69
|
2501 local function eoi_st_insert_OnAccept (dialog, data)
|
farmbuyer@69
|
2502 if data.kind == 'boss' then
|
farmbuyer@69
|
2503 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2504 elseif data.kind == 'loot' then
|
farmbuyer@69
|
2505 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2506 end
|
farmbuyer@69
|
2507 end
|
farmbuyer@69
|
2508
|
farmbuyer@1
|
2509 -- The data member here is a table built with:
|
farmbuyer@1
|
2510 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
|
farmbuyer@1
|
2511 do
|
farmbuyer@1
|
2512 local t = flib.StaticPopup{
|
farmbuyer@75
|
2513 text = "Enter name of new %s, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@75
|
2514 button1 = CONTINUE.." ->",
|
farmbuyer@1
|
2515 button2 = CANCEL,
|
farmbuyer@1
|
2516 hasEditBox = true,
|
farmbuyer@16
|
2517 editBoxWidth = 350,
|
farmbuyer@1
|
2518 maxLetters = 50,
|
farmbuyer@1
|
2519 noCancelOnReuse = true,
|
farmbuyer@1
|
2520 }
|
farmbuyer@1
|
2521 t.EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@39
|
2522 if editbox:GetText() == "" then return end
|
farmbuyer@1
|
2523 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2524 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
|
farmbuyer@1
|
2525 dialog:Hide() -- replicate OnAccept click behavior
|
farmbuyer@1
|
2526 end
|
farmbuyer@1
|
2527 end
|
farmbuyer@1
|
2528 t.enterClicksFirstButton = nil -- no effect with editbox focused
|
farmbuyer@1
|
2529 t.OnAccept = eoi_st_insert_OnAccept
|
farmbuyer@1
|
2530 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
|
farmbuyer@1
|
2531
|
farmbuyer@69
|
2532 -- This seems to be gratuitous use of metatables, really.
|
farmbuyer@1
|
2533 local OEIL = {
|
farmbuyer@75
|
2534 text = "Paste the new item into here, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@1
|
2535 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
|
farmbuyer@1
|
2536 }
|
farmbuyer@1
|
2537 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
|
farmbuyer@1
|
2538
|
farmbuyer@1
|
2539 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
|
farmbuyer@1
|
2540 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
|
farmbuyer@1
|
2541 if dialogname then
|
farmbuyer@16
|
2542 _G[dialogname.."EditBox"]:SetText(link)
|
farmbuyer@1
|
2543 return true
|
farmbuyer@1
|
2544 end
|
farmbuyer@1
|
2545 end)
|
farmbuyer@69
|
2546
|
farmbuyer@69
|
2547 t = flib.StaticPopup{
|
farmbuyer@69
|
2548 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@69
|
2549 text = "Include a snapshot of the " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@77
|
2550 .. "CURRENT|r raid?|n|nClicking '" .. YES .. "' will allow this entry to "
|
farmbuyer@69
|
2551 .. "appear in attendance lists, but with the roster as it is NOW, not as it "
|
farmbuyer@69
|
2552 .. "was THEN. Clicking '" .. NO .."' means this kill cannot be included in "
|
farmbuyer@77
|
2553 .. "attendance.|n|n(Enter = '" .. YES .."', Escape = '" .. CANCEL .. "')",
|
farmbuyer@69
|
2554 button1 = YES, -- "accept", left
|
farmbuyer@69
|
2555 button2 = NO, -- "cancel", middle
|
farmbuyer@69
|
2556 button3 = CANCEL, -- "alt", right
|
farmbuyer@69
|
2557 }
|
farmbuyer@69
|
2558 -- Hitting Escape still hides the frame, but doesn't run OnCancel (which
|
farmbuyer@69
|
2559 -- is for the "No" button, not the "Cancel"/OnAlt button). Dizzy yet?
|
farmbuyer@69
|
2560 t.noCancelOnEscape = true
|
farmbuyer@69
|
2561 t.OnAccept = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2562 t.OnCancel = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2563 StaticPopupDialogs["OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP"] = t
|
farmbuyer@1
|
2564 end
|
farmbuyer@1
|
2565
|
farmbuyer@1
|
2566 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
|
farmbuyer@1
|
2567 text = "Enter the player name:",
|
farmbuyer@1
|
2568 button1 = ACCEPT,
|
farmbuyer@1
|
2569 button2 = CANCEL,
|
farmbuyer@1
|
2570 hasEditBox = true,
|
farmbuyer@1
|
2571 OnAccept = function(dialog, data)
|
farmbuyer@1
|
2572 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@81
|
2573 addon:reassign_loot ("local", data.index, name)
|
farmbuyer@95
|
2574 gui.eoiST:OuroLoot_Refresh(data.index)
|
farmbuyer@1
|
2575 end,
|
farmbuyer@1
|
2576 }
|
farmbuyer@1
|
2577
|
farmbuyer@1
|
2578 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
|
farmbuyer@1
|
2579 text = "Enter a name for the loot collection:",
|
farmbuyer@1
|
2580 button1 = ACCEPT,
|
farmbuyer@1
|
2581 button2 = CANCEL,
|
farmbuyer@1
|
2582 hasEditBox = true,
|
farmbuyer@1
|
2583 maxLetters = 30,
|
farmbuyer@1
|
2584 OnAccept = function(dialog)--, data)
|
farmbuyer@1
|
2585 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@1
|
2586 addon:save_saveas(name)
|
farmbuyer@1
|
2587 addon:BuildMainDisplay()
|
farmbuyer@1
|
2588 end,
|
farmbuyer@1
|
2589 OnCancel = function(dialog)--, data, reason)
|
farmbuyer@1
|
2590 addon:BuildMainDisplay()
|
farmbuyer@1
|
2591 end,
|
farmbuyer@1
|
2592 }
|
farmbuyer@1
|
2593
|
farmbuyer@25
|
2594
|
farmbuyer@25
|
2595 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
|
farmbuyer@25
|
2596 if true then
|
farmbuyer@25
|
2597 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
|
farmbuyer@25
|
2598 -- tagged with CHANGE.
|
farmbuyer@25
|
2599 local function onenter (self, motion)
|
farmbuyer@25
|
2600 if ( self.hasArrow ) then
|
farmbuyer@25
|
2601 local level = self:GetParent():GetID() + 1;
|
farmbuyer@25
|
2602 local listFrame = _G["DropDownList"..level];
|
farmbuyer@25
|
2603 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
|
farmbuyer@25
|
2604 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
|
farmbuyer@25
|
2605 end
|
farmbuyer@25
|
2606 else
|
farmbuyer@25
|
2607 CloseDropDownMenus(self:GetParent():GetID() + 1);
|
farmbuyer@25
|
2608 end
|
farmbuyer@25
|
2609 _G[self:GetName().."Highlight"]:Show();
|
farmbuyer@25
|
2610 UIDropDownMenu_StopCounting(self:GetParent());
|
farmbuyer@25
|
2611 if ( self.tooltipTitle ) then
|
farmbuyer@25
|
2612 if ( self.tooltipOnButton ) then
|
farmbuyer@25
|
2613 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
farmbuyer@25
|
2614 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
|
farmbuyer@25
|
2615 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
|
farmbuyer@25
|
2616 GameTooltip:Show();
|
farmbuyer@25
|
2617 else
|
farmbuyer@25
|
2618 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
|
farmbuyer@25
|
2619 end
|
farmbuyer@25
|
2620 end
|
farmbuyer@25
|
2621 end
|
farmbuyer@25
|
2622 -- end verbatime copy
|
farmbuyer@25
|
2623
|
farmbuyer@25
|
2624 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
|
farmbuyer@25
|
2625 local list = _G["DropDownList"..i]
|
farmbuyer@25
|
2626 if list then
|
farmbuyer@25
|
2627 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
|
farmbuyer@25
|
2628 local button = _G["DropDownList"..i.."Button"..j]
|
farmbuyer@25
|
2629 if button then
|
farmbuyer@25
|
2630 --print("button fixup",i,j)
|
farmbuyer@25
|
2631 button:SetScript("OnEnter",onenter)
|
farmbuyer@25
|
2632 end
|
farmbuyer@25
|
2633 end
|
farmbuyer@25
|
2634 end
|
farmbuyer@25
|
2635 end
|
farmbuyer@25
|
2636 end
|
farmbuyer@25
|
2637
|
farmbuyer@1
|
2638 -- vim:noet
|