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