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