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