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@1
|
856 g_generated = nil
|
farmbuyer@1
|
857 tabgroup_tabs = {}
|
farmbuyer@89
|
858 window_title = "Ouro Loot " .. self.version
|
farmbuyer@46
|
859 -- TabGroup stretches out the tabs to fill the row but only if >75% of the
|
farmbuyer@46
|
860 -- row is already full. It turns out that not doing this looks like ass.
|
farmbuyer@46
|
861 -- If we won't have enough tabs to trigger this on its own, pad out the tab
|
farmbuyer@46
|
862 -- titles (not looking quite as nice, ah well) to force it to trigger.
|
farmbuyer@95
|
863 local fmtstr = #gui.taborder > 6 and "%s" or " %s "
|
farmbuyer@95
|
864 for i,name in ipairs(gui.taborder) do
|
farmbuyer@49
|
865 tabgroup_tabs[i] = {
|
farmbuyer@49
|
866 value = name,
|
farmbuyer@95
|
867 text = fmtstr:format(gui.tabtexts[name].title),
|
farmbuyer@95
|
868 disabled = gui.tabtexts[name].disabled,
|
farmbuyer@49
|
869 }
|
farmbuyer@1
|
870 -- By default, tabs are editboxes with generated text
|
farmbuyer@49
|
871 if not tabs_OnGroupSelected[name] then
|
farmbuyer@49
|
872 tabs_OnGroupSelected[name] = tabs_generated_text_OGS
|
farmbuyer@1
|
873 end
|
farmbuyer@1
|
874 end
|
farmbuyer@47
|
875 dirty_tabs = nil
|
farmbuyer@116
|
876 return g_dloot
|
farmbuyer@1
|
877 end
|
farmbuyer@1
|
878
|
farmbuyer@37
|
879 --[[
|
farmbuyer@84
|
880 Dropdown menu handling; this has grown in ungainly directions.
|
farmbuyer@37
|
881 ]]
|
farmbuyer@37
|
882 -- forward decls
|
farmbuyer@1
|
883 local eoi_editcell
|
farmbuyer@1
|
884
|
farmbuyer@110
|
885 local dropdownmenuframe = CreateFrame("Frame", "OuroLootDropDownMenu", nil, "UIDropDownMenuTemplate")
|
farmbuyer@37
|
886 local dropdownfuncs
|
farmbuyer@37
|
887 do
|
farmbuyer@37
|
888 local ddf_mt = {
|
farmbuyer@37
|
889 __index = {
|
farmbuyer@37
|
890 -- more stuff should be moved into this table
|
farmbuyer@37
|
891 [CLOSE] = function() CloseDropDownMenus() end,
|
farmbuyer@37
|
892 }
|
farmbuyer@37
|
893 }
|
farmbuyer@37
|
894 dropdownfuncs = function(t)
|
farmbuyer@37
|
895 return setmetatable(t, ddf_mt)
|
farmbuyer@37
|
896 end
|
farmbuyer@37
|
897 end
|
farmbuyer@37
|
898
|
farmbuyer@1
|
899 local function dropdownmenu_handler (ddbutton, subfunc, arg)
|
farmbuyer@84
|
900 local i = _d and _d.GetUserData and _d:GetUserData("DD index")
|
farmbuyer@26
|
901 if i then
|
farmbuyer@26
|
902 subfunc(i,arg)
|
farmbuyer@95
|
903 gui.which_ST:OuroLoot_Refresh(i)
|
farmbuyer@26
|
904 end
|
farmbuyer@1
|
905 end
|
farmbuyer@1
|
906
|
farmbuyer@110
|
907 local function gen_dd_entry (name, functbl, funci, arg, ttt)
|
farmbuyer@110
|
908 local entry
|
farmbuyer@110
|
909 if name == '--' then
|
farmbuyer@110
|
910 entry = {
|
farmbuyer@110
|
911 text = "", disabled = true, notCheckable = true,
|
farmbuyer@110
|
912 }
|
farmbuyer@110
|
913 else
|
farmbuyer@110
|
914 local a1 = functbl[name]
|
farmbuyer@110
|
915 if type(funci) == 'string' then
|
farmbuyer@110
|
916 a1 = functbl[funci]
|
farmbuyer@1
|
917 end
|
farmbuyer@110
|
918 entry = {
|
farmbuyer@110
|
919 text = name,
|
farmbuyer@110
|
920 func = dropdownmenu_handler, arg1 = a1, arg2 = arg,
|
farmbuyer@110
|
921 notCheckable = true,
|
farmbuyer@110
|
922 tooltipOnButton = true,
|
farmbuyer@110
|
923 tooltipWhileDisabled = true,
|
farmbuyer@110
|
924 tooltipTitle = ttt and name or nil,
|
farmbuyer@110
|
925 tooltipText = ttt,
|
farmbuyer@110
|
926 }
|
farmbuyer@1
|
927 end
|
farmbuyer@110
|
928 return entry
|
farmbuyer@1
|
929 end
|
farmbuyer@1
|
930
|
farmbuyer@37
|
931
|
farmbuyer@37
|
932 -- Tab 1: Events Of Interest
|
farmbuyer@37
|
933 -- This actually takes up quite a bit of the file.
|
farmbuyer@37
|
934 eoi_dropdownfuncs = dropdownfuncs{
|
farmbuyer@1
|
935 df_INSERT = function(rowi,text)
|
farmbuyer@1
|
936 local which = (text == 'loot') and "OUROL_EOI_INSERT_LOOT" or "OUROL_EOI_INSERT"
|
farmbuyer@1
|
937 local dialog = StaticPopup_Show(which,text)
|
farmbuyer@16
|
938 dialog.editBox:SetScript("OnTextChanged",StaticPopup_EditBoxOnTextChanged)
|
farmbuyer@1
|
939 dialog.data = {rowindex=rowi, display=_d, kind=text}
|
farmbuyer@1
|
940 end,
|
farmbuyer@1
|
941
|
farmbuyer@1
|
942 df_DELETE = function(rowi)
|
farmbuyer@129
|
943 local gone, dgone = g_dloot:remove(rowi)
|
farmbuyer@100
|
944 addon:Fire ('DelEOIEntry', gone)
|
farmbuyer@1
|
945 addon:Print("Removed %s.",
|
farmbuyer@55
|
946 gone.itemlink or gone.bossname or gone.startday.text)
|
farmbuyer@100
|
947 if gone.kind == 'loot' then
|
farmbuyer@100
|
948 addon:Fire ('DelLootEntry', gone)
|
farmbuyer@100
|
949 if IsShiftKeyDown() then
|
farmbuyer@100
|
950 local okay,err = addon:_delHistoryEntry (gone)
|
farmbuyer@100
|
951 if okay then
|
farmbuyer@100
|
952 addon:Print("Removed history entry %s from %s.",
|
farmbuyer@100
|
953 gone.itemlink, addon:colorize(gone.person,gone.person_class))
|
farmbuyer@100
|
954 else
|
farmbuyer@100
|
955 addon:Print(err)
|
farmbuyer@100
|
956 end
|
farmbuyer@84
|
957 end
|
farmbuyer@36
|
958 end
|
farmbuyer@1
|
959 end,
|
farmbuyer@1
|
960
|
farmbuyer@110
|
961 df_DISPOSITION = function(rowi,disp) -- all "mark as <x>" entries start here
|
farmbuyer@110
|
962 addon:loot_mark_disposition ("local", rowi, disp)
|
farmbuyer@110
|
963 end,
|
farmbuyer@110
|
964
|
farmbuyer@1
|
965 ["Delete remaining entries for this day"] = function(rowi,kind)
|
farmbuyer@28
|
966 -- if kind is boss, also need to stop at new timestamp
|
farmbuyer@28
|
967 local fencepost = addon._find_timeboss_fencepost (kind, rowi)
|
farmbuyer@116
|
968 local count = fencepost and (fencepost-rowi) or (#g_dloot-rowi+1)
|
farmbuyer@1
|
969 repeat
|
farmbuyer@37
|
970 eoi_dropdownfuncs.df_DELETE(rowi)
|
farmbuyer@1
|
971 count = count - 1
|
farmbuyer@1
|
972 until count < 1
|
farmbuyer@1
|
973 end,
|
farmbuyer@1
|
974
|
farmbuyer@1
|
975 ["Rebroadcast this loot entry"] = function(rowi)
|
farmbuyer@116
|
976 local e = g_dloot[rowi]
|
farmbuyer@1
|
977 -- This only works because GetItemInfo accepts multiple argument formats
|
farmbuyer@71
|
978 addon:vbroadcast('loot', e.person, e.unique, e.itemlink, e.count, e.cols[3].value)
|
farmbuyer@28
|
979 addon:Print("Rebroadcast entry", rowi, e.itemlink)
|
farmbuyer@1
|
980 end,
|
farmbuyer@1
|
981
|
farmbuyer@1
|
982 ["Rebroadcast this boss"] = function(rowi,kind)
|
farmbuyer@28
|
983 -- if kind is boss, also need to stop at new timestamp
|
farmbuyer@116
|
984 local fencepost = addon._find_timeboss_fencepost (kind, rowi) or #g_dloot
|
farmbuyer@28
|
985 -- this could be a lot of traffic, but frankly it's counterproductive
|
farmbuyer@28
|
986 -- to try to micromanage when ChatThrottleLib is already doing so
|
farmbuyer@28
|
987 repeat
|
farmbuyer@116
|
988 local e = g_dloot[rowi]
|
farmbuyer@28
|
989 if e.kind == 'boss' then
|
farmbuyer@56
|
990 addon:vbroadcast('boss', e.reason, e.bossname, e.instance)
|
farmbuyer@28
|
991 elseif e.kind == 'loot' then
|
farmbuyer@28
|
992 -- This only works because GetItemInfo accepts multiple argument formats
|
farmbuyer@71
|
993 addon:vbroadcast('loot', e.person, e.unique, e.itemlink, e.count, e.cols[3].value)
|
farmbuyer@28
|
994 end
|
farmbuyer@55
|
995 addon:Print("Rebroadcast entry", rowi, e.itemlink or e.bossname or UNKNOWN)
|
farmbuyer@28
|
996 rowi = rowi + 1
|
farmbuyer@28
|
997 until rowi >= fencepost
|
farmbuyer@1
|
998 end,
|
farmbuyer@1
|
999
|
farmbuyer@1
|
1000 ["Show only this player"] = function(rowi)
|
farmbuyer@95
|
1001 local st = assert(gui.eoiST)
|
farmbuyer@1
|
1002 _d:SetUserData("player filter name", g_loot[rowi].person)
|
farmbuyer@1
|
1003 st:SetFilter(_d:GetUserData("player filter by name"))
|
farmbuyer@1
|
1004 _d:GetUserData("eoi_filter_reset"):SetDisabled(false)
|
farmbuyer@81
|
1005 -- it'd be more futureproof to get the button and call some kind
|
farmbuyer@81
|
1006 -- of :GetText() on it, but no such function is provided by acegui
|
farmbuyer@81
|
1007 setstatus[[Use the "Reset Player Filter" button in the lower-right to return to normal.]]
|
farmbuyer@1
|
1008 end,
|
farmbuyer@1
|
1009
|
farmbuyer@1
|
1010 ["Change from 'wipe' to 'kill'"] = function(rowi)
|
farmbuyer@1
|
1011 addon:_mark_boss_kill(rowi)
|
farmbuyer@1
|
1012 -- the fillout function called automatically will start too far down the list
|
farmbuyer@95
|
1013 gui.eoiST:OuroLoot_Refresh()
|
farmbuyer@1
|
1014 end,
|
farmbuyer@1
|
1015
|
farmbuyer@1
|
1016 ["Edit note"] = function(rowi)
|
farmbuyer@84
|
1017 eoi_editcell (rowi, _d:GetUserData("DD cell"))
|
farmbuyer@1
|
1018 end,
|
farmbuyer@1
|
1019
|
farmbuyer@1
|
1020 df_REASSIGN = function(rowi,to_whom)
|
farmbuyer@81
|
1021 addon:reassign_loot ("local", rowi, to_whom)
|
farmbuyer@1
|
1022 CloseDropDownMenus() -- also need to close parent menu
|
farmbuyer@1
|
1023 end,
|
farmbuyer@1
|
1024 ["Enter name..."] = function(rowi)
|
farmbuyer@25
|
1025 CloseDropDownMenus() -- also need to close parent menu
|
farmbuyer@1
|
1026 local dialog = StaticPopup_Show "OUROL_REASSIGN_ENTER"
|
farmbuyer@1
|
1027 dialog.data = {index=rowi, display=_d}
|
farmbuyer@1
|
1028 end,
|
farmbuyer@1
|
1029 }
|
farmbuyer@110
|
1030
|
farmbuyer@110
|
1031 do
|
farmbuyer@110
|
1032 local function E (name, funci, arg, ttt)
|
farmbuyer@110
|
1033 return gen_dd_entry (name, eoi_dropdownfuncs, funci, arg, ttt)
|
farmbuyer@110
|
1034 end
|
farmbuyer@110
|
1035
|
farmbuyer@110
|
1036 gui.dropdown.eoi_time = {
|
farmbuyer@110
|
1037 {
|
farmbuyer@110
|
1038 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@110
|
1039 isTitle = true,
|
farmbuyer@110
|
1040 notClickable = true,
|
farmbuyer@110
|
1041 notCheckable = true,
|
farmbuyer@110
|
1042 },
|
farmbuyer@110
|
1043 E("Rebroadcast this day", "Rebroadcast this boss", 'time', "Broadcasts everything from here down until a new day."),
|
farmbuyer@110
|
1044 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
|
1045 E("Insert new loot entry", 'df_INSERT', 'loot', "Inserts new loot above this one, prompting you for information."),
|
farmbuyer@110
|
1046 E("Insert new boss kill event", 'df_INSERT', 'boss', "Inserts new event above this one, prompting you for information."),
|
farmbuyer@110
|
1047 E(CLOSE),
|
farmbuyer@110
|
1048 }
|
farmbuyer@128
|
1049 gui.dropdown.eoi_loot_mark = {}
|
farmbuyer@110
|
1050 gui.dropdown.eoi_loot = {
|
farmbuyer@110
|
1051 {
|
farmbuyer@110
|
1052 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@110
|
1053 notClickable = true,
|
farmbuyer@110
|
1054 notCheckable = true,
|
farmbuyer@110
|
1055 },
|
farmbuyer@128
|
1056 {
|
farmbuyer@128
|
1057 text = "Mark as...",
|
farmbuyer@128
|
1058 hasArrow = true,
|
farmbuyer@128
|
1059 menuList = gui.dropdown.eoi_loot_mark,
|
farmbuyer@128
|
1060 tooltipOnButton = true,
|
farmbuyer@128
|
1061 tooltipWhileDisabled = true,
|
farmbuyer@128
|
1062 notCheckable = true,
|
farmbuyer@128
|
1063 },
|
farmbuyer@110
|
1064 E("--"),
|
farmbuyer@110
|
1065 E("Rebroadcast this loot entry", nil, nil, "Sends this loot event, including special notes, as if it just happened."),
|
farmbuyer@110
|
1066 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
|
1067 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
|
1068 E("Insert new loot entry", 'df_INSERT', 'loot', "Inserts new loot above this one, prompting you for information."),
|
farmbuyer@110
|
1069 E("Insert new boss kill event", 'df_INSERT', 'boss', "Inserts new event above this one, prompting you for information."),
|
farmbuyer@110
|
1070 E("Edit note", nil, nil, "Same as double-clicking in the Notes column."),
|
farmbuyer@110
|
1071 E("--"),
|
farmbuyer@110
|
1072 E(CLOSE),
|
farmbuyer@110
|
1073 }
|
farmbuyer@110
|
1074 gui.dropdown.eoi_player = {
|
farmbuyer@1
|
1075 {
|
farmbuyer@1
|
1076 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@1
|
1077 isTitle = true,
|
farmbuyer@1
|
1078 notClickable = true,
|
farmbuyer@1
|
1079 notCheckable = true,
|
farmbuyer@1
|
1080 },
|
farmbuyer@1
|
1081 {
|
farmbuyer@1
|
1082 text = "Reassign to...",
|
farmbuyer@1
|
1083 hasArrow = true,
|
farmbuyer@1
|
1084 --menuList = filled in in the fly,
|
farmbuyer@25
|
1085 tooltipOnButton = true,
|
farmbuyer@25
|
1086 tooltipWhileDisabled = true,
|
farmbuyer@128
|
1087 notCheckable = true,
|
farmbuyer@1
|
1088 },
|
farmbuyer@110
|
1089 E("Show only this player"),
|
farmbuyer@110
|
1090 E(CLOSE),
|
farmbuyer@110
|
1091 }
|
farmbuyer@110
|
1092 gui.dropdown.eoi_boss = {
|
farmbuyer@110
|
1093 {
|
farmbuyer@110
|
1094 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@110
|
1095 isTitle = true,
|
farmbuyer@110
|
1096 notClickable = true,
|
farmbuyer@110
|
1097 notCheckable = true,
|
farmbuyer@110
|
1098 },
|
farmbuyer@110
|
1099 E("Change from 'wipe' to 'kill'", nil, nil, "Also collapses previous wipe entries."), -- KILLWIPE
|
farmbuyer@110
|
1100 E("Rebroadcast this boss", nil, 'boss', "Broadcasts the kill event and all subsequent loot until next boss."),
|
farmbuyer@110
|
1101 E("Delete this boss event", 'df_DELETE', nil, "Permanent, no going back!"),
|
farmbuyer@110
|
1102 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
|
1103 E("Insert new loot entry", 'df_INSERT', 'loot', "Inserts new loot above this one, prompting you for information."),
|
farmbuyer@110
|
1104 E("Insert new boss kill event", 'df_INSERT', 'boss', "Inserts new event above this one, prompting you for information."),
|
farmbuyer@110
|
1105 E("--"),
|
farmbuyer@110
|
1106 E(CLOSE),
|
farmbuyer@110
|
1107 }
|
farmbuyer@110
|
1108 end
|
farmbuyer@110
|
1109
|
farmbuyer@1
|
1110
|
farmbuyer@84
|
1111 --[[ quoted verbatim from lib-st docs (table->stable for obvious reasons):
|
farmbuyer@1
|
1112 rowFrame This is the UI Frame table for the row.
|
farmbuyer@1
|
1113 cellFrame This is the UI Frame table for the cell in the row.
|
farmbuyer@1
|
1114 data This is the data table supplied to the scrolling table (in case you lost it :) )
|
farmbuyer@1
|
1115 cols This is the cols table supplied to the scrolling table (again, in case you lost it :) )
|
farmbuyer@1
|
1116 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
|
1117 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
|
1118 column This is the index of which column the event was triggered in.
|
farmbuyer@84
|
1119 stable This is a reference to the scrollingtable table.
|
farmbuyer@1
|
1120 ... Any arguments generated by the '''NORMAL''' Blizzard event triggered by the frame are passed as is.
|
farmbuyer@1
|
1121 ]]
|
farmbuyer@84
|
1122 local function eoi_st_OnEnter (rowFrame, cellFrame, data, cols, row, realrow, column, stable, motion)
|
farmbuyer@1
|
1123 if (row == nil) or (realrow == nil) then return end -- mouseover column header
|
farmbuyer@1
|
1124 local e = data[realrow]
|
farmbuyer@103
|
1125 if e == nil then return end -- something horrible has happened
|
farmbuyer@1
|
1126 local kind = e.kind
|
farmbuyer@114
|
1127 local cell = e.cols[column]
|
farmbuyer@72
|
1128 local tt = GameTooltip -- can this be hoisted? does GT ever get securely replaced?
|
farmbuyer@1
|
1129
|
farmbuyer@96
|
1130 if gui._do_debugging_tooltip and column == 1 and kind ~= 'hist' then
|
farmbuyer@72
|
1131 _build_debugging_tooltip (cellFrame, realrow)
|
farmbuyer@72
|
1132 end
|
farmbuyer@84
|
1133 if (kind == 'loot' and column == 1) or (kind == 'hist' and column == 2) then
|
farmbuyer@72
|
1134 tt:SetOwner (cellFrame, "ANCHOR_RIGHT", -20, 0)
|
farmbuyer@19
|
1135 if e.cache_miss then
|
farmbuyer@72
|
1136 tt:ClearLines()
|
farmbuyer@72
|
1137 tt:AddLine("Missing Cache Data")
|
farmbuyer@72
|
1138 tt:AddLine([[Wait a few seconds, then type]], 0.8, 0.8, 0.8, 1)
|
farmbuyer@81
|
1139 tt:AddLine([[/ouroloot fix cache]], 0, 1, 64/255, nil)
|
farmbuyer@72
|
1140 tt:AddLine([[and redisplay this window.]], 0.8, 0.8, 0.8, 1)
|
farmbuyer@72
|
1141 tt:Show()
|
farmbuyer@19
|
1142 elseif e.itemlink then
|
farmbuyer@72
|
1143 tt:SetHyperlink (e.itemlink)
|
farmbuyer@16
|
1144 end
|
farmbuyer@1
|
1145
|
farmbuyer@1
|
1146 elseif kind == 'loot' and column == 2 then
|
farmbuyer@72
|
1147 tt:SetOwner (cellFrame, "ANCHOR_BOTTOMRIGHT", -50, 5)
|
farmbuyer@72
|
1148 tt:ClearLines()
|
farmbuyer@118
|
1149 tt:AddLine(e.fperson .. " Loot:")
|
farmbuyer@1
|
1150 local counter = 0
|
farmbuyer@1
|
1151 for i,e2 in ipairs(data) do
|
farmbuyer@1
|
1152 if e2.person == e.person then -- would be awesome to test for alts
|
farmbuyer@1
|
1153 if counter > 10 then
|
farmbuyer@72
|
1154 tt:AddLine("...")
|
farmbuyer@1
|
1155 break
|
farmbuyer@1
|
1156 else
|
farmbuyer@1
|
1157 -- textures screw up too badly, strip them
|
farmbuyer@1
|
1158 local textured = e2.cols[1].value
|
farmbuyer@1
|
1159 local space = textured:find(" ")
|
farmbuyer@72
|
1160 tt:AddLine(textured:sub(space+1))
|
farmbuyer@1
|
1161 counter = counter + 1
|
farmbuyer@1
|
1162 end
|
farmbuyer@1
|
1163 end
|
farmbuyer@1
|
1164 end
|
farmbuyer@72
|
1165 tt:Show()
|
farmbuyer@1
|
1166
|
farmbuyer@1
|
1167 elseif kind == 'loot' and column == 3 then
|
farmbuyer@114
|
1168 setstatus(cell.value)
|
farmbuyer@114
|
1169
|
farmbuyer@114
|
1170 elseif kind == 'hist' and column == 3 and cell.hist_miss then
|
farmbuyer@114
|
1171 tt:SetOwner (cellFrame, "ANCHOR_RIGHT", -20, 0)
|
farmbuyer@114
|
1172 tt:ClearLines()
|
farmbuyer@114
|
1173 tt:AddLine("Corrupted History Data")
|
farmbuyer@114
|
1174 tt:AddLine([[Close this window, then type]], 0.8, 0.8, 0.8, 1)
|
farmbuyer@114
|
1175 tt:AddLine([[/ouroloot fix history]], 0, 1, 64/255, nil)
|
farmbuyer@114
|
1176 tt:AddLine([[and redisplay this window.]], 0.8, 0.8, 0.8, 1)
|
farmbuyer@114
|
1177 tt:Show()
|
farmbuyer@1
|
1178
|
farmbuyer@1
|
1179 end
|
farmbuyer@1
|
1180
|
farmbuyer@1
|
1181 return false -- continue with default highlighting behavior
|
farmbuyer@1
|
1182 end
|
farmbuyer@84
|
1183 local function eoi_st_OnLeave (rowFrame, cellFrame, data, cols, row, realrow, column, stable, motion)
|
farmbuyer@1
|
1184 GameTooltip:Hide()
|
farmbuyer@72
|
1185 _hide_debugging_tooltip()
|
farmbuyer@103
|
1186 if (row == nil) or (realrow == nil) then return false end
|
farmbuyer@103
|
1187
|
farmbuyer@103
|
1188 if stable:GetSelection() ~= realrow then
|
farmbuyer@103
|
1189 if data[realrow].kind ~= 'loot' then
|
farmbuyer@103
|
1190 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[data[realrow].reason or data[realrow].kind])
|
farmbuyer@103
|
1191 return true -- do not do anything further
|
farmbuyer@103
|
1192 else
|
farmbuyer@103
|
1193 return false -- continue with default un-highlighting behavior
|
farmbuyer@103
|
1194 end
|
farmbuyer@103
|
1195 else
|
farmbuyer@1
|
1196 return true -- do not do anything further
|
farmbuyer@1
|
1197 end
|
farmbuyer@1
|
1198 end
|
farmbuyer@1
|
1199
|
farmbuyer@84
|
1200 local function eoi_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, down)
|
farmbuyer@1
|
1201 if (row == nil) or (realrow == nil) then return true end -- click column header, suppress reordering
|
farmbuyer@1
|
1202 local e = data[realrow]
|
farmbuyer@1
|
1203 local kind = e.kind
|
farmbuyer@1
|
1204
|
farmbuyer@1
|
1205 -- Check for shift-clicking a loot line
|
farmbuyer@84
|
1206 if IsModifiedClick("CHATLINK") and kind == 'loot' and column == 1
|
farmbuyer@16
|
1207 then
|
farmbuyer@1
|
1208 ChatEdit_InsertLink (e.itemlink)
|
farmbuyer@1
|
1209 return true -- do not do anything further
|
farmbuyer@1
|
1210 end
|
farmbuyer@1
|
1211
|
farmbuyer@103
|
1212 -- Zap any jump-to-line highlighting
|
farmbuyer@103
|
1213 stable:ClearSelection()
|
farmbuyer@103
|
1214
|
farmbuyer@1
|
1215 -- Remaining actions are all right-click
|
farmbuyer@1
|
1216 if button ~= "RightButton" then return true end
|
farmbuyer@84
|
1217 _d:SetUserData("DD index", realrow)
|
farmbuyer@1
|
1218
|
farmbuyer@1
|
1219 if kind == 'loot' and (column == 1 or column == 3) then
|
farmbuyer@84
|
1220 _d:SetUserData("DD cell", cellFrame)
|
farmbuyer@110
|
1221 gui.dropdown.eoi_loot[1].text = e.itemlink
|
farmbuyer@110
|
1222 EasyMenu (gui.dropdown.eoi_loot, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
1223
|
farmbuyer@1
|
1224 elseif kind == 'loot' and column == 2 then
|
farmbuyer@111
|
1225 local ddep = gui.dropdown.eoi_player
|
farmbuyer@118
|
1226 ddep[1].text = e.fperson
|
farmbuyer@1
|
1227 local raiders = {}
|
farmbuyer@118
|
1228 for i, name, info in addon:sorted_raiders_iter() do
|
farmbuyer@118
|
1229 raiders[i] = gen_dd_entry (info.fname or name, eoi_dropdownfuncs,
|
farmbuyer@118
|
1230 'df_REASSIGN', name)
|
farmbuyer@118
|
1231 if info.online == 'offline' then
|
farmbuyer@118
|
1232 raiders[i].colorCode = GRAY_FONT_COLOR_CODE
|
farmbuyer@118
|
1233 elseif info.online == 'no_longer' then
|
farmbuyer@118
|
1234 raiders[i].colorCode = RED_FONT_COLOR_CODE
|
farmbuyer@118
|
1235 end
|
farmbuyer@1
|
1236 end
|
farmbuyer@110
|
1237 tinsert (raiders, gen_dd_entry ("Enter name...", eoi_dropdownfuncs))
|
farmbuyer@110
|
1238 tinsert (raiders, gen_dd_entry (CLOSE, eoi_dropdownfuncs))
|
farmbuyer@111
|
1239 ddep[2].menuList = raiders
|
farmbuyer@109
|
1240
|
farmbuyer@109
|
1241 if not addon:_test_disposition (e.disposition, 'can_reassign') then
|
farmbuyer@111
|
1242 ddep[2].disabled = true
|
farmbuyer@111
|
1243 ddep[2].tooltipTitle = "Cannot Reassign"
|
farmbuyer@111
|
1244 ddep[2].tooltipText = "You must first mark this item as 'normal' or 'offspec' before reassignment."
|
farmbuyer@25
|
1245 else
|
farmbuyer@111
|
1246 ddep[2].disabled = nil
|
farmbuyer@111
|
1247 ddep[2].tooltipTitle = nil
|
farmbuyer@111
|
1248 ddep[2].tooltipText = nil
|
farmbuyer@25
|
1249 end
|
farmbuyer@111
|
1250 EasyMenu (ddep, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
1251
|
farmbuyer@1
|
1252 elseif kind == 'boss' then
|
farmbuyer@110
|
1253 gui.dropdown.eoi_boss[1].text = e.bossname
|
farmbuyer@110
|
1254 -- KILLWIPE: update '2' if this is not the 2nd entry in gui.dropdown.eoi_boss
|
farmbuyer@110
|
1255 gui.dropdown.eoi_boss[2].tooltipWhileDisabled = nil
|
farmbuyer@110
|
1256 gui.dropdown.eoi_boss[2].disabled = e.reason ~= 'wipe' and true or nil
|
farmbuyer@110
|
1257 EasyMenu (gui.dropdown.eoi_boss, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
1258
|
farmbuyer@1
|
1259 elseif kind == 'time' then
|
farmbuyer@110
|
1260 gui.dropdown.eoi_time[1].text = e.startday.text
|
farmbuyer@110
|
1261 EasyMenu (gui.dropdown.eoi_time, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@1
|
1262
|
farmbuyer@1
|
1263 end
|
farmbuyer@1
|
1264
|
farmbuyer@1
|
1265 return true -- do not do anything further
|
farmbuyer@1
|
1266 end
|
farmbuyer@1
|
1267
|
farmbuyer@1
|
1268 function eoi_editcell (row_index, cell_frame)
|
farmbuyer@116
|
1269 local e = g_dloot[row_index]
|
farmbuyer@1
|
1270 if not e then return end -- how the hell could we get this far?
|
farmbuyer@1
|
1271 local celldata = e.cols[3]
|
farmbuyer@95
|
1272 local box = AceGUI:Create("EditBox")
|
farmbuyer@1
|
1273 box:SetText(celldata.value)
|
farmbuyer@1
|
1274 box:SetUserData("old show", box.editbox:GetScript("OnShow"))
|
farmbuyer@1
|
1275 box:SetUserData("old escape", box.editbox:GetScript("OnEscapePressed"))
|
farmbuyer@1
|
1276 box.editbox:SetScript("OnShow", box.editbox.SetFocus)
|
farmbuyer@1
|
1277 box.editbox:SetScript("OnEscapePressed", function(_be)
|
farmbuyer@1
|
1278 _be:ClearFocus()
|
farmbuyer@1
|
1279 _be.obj:Release()
|
farmbuyer@1
|
1280 end)
|
farmbuyer@1
|
1281 box:SetCallback("OnEnterPressed", function(_b,event,value)
|
farmbuyer@1
|
1282 e.extratext = value
|
farmbuyer@1
|
1283 celldata.value = value
|
farmbuyer@1
|
1284 e.bcast_from = nil -- things get screwy if this field is still present. sigh.
|
farmbuyer@1
|
1285 e.extratext_byhand = true
|
farmbuyer@1
|
1286 value = value and value:match("^(x%d+)")
|
farmbuyer@1
|
1287 if value then e.count = value end
|
farmbuyer@1
|
1288 _b:Release()
|
farmbuyer@95
|
1289 return gui.eoiST:OuroLoot_Refresh(row_index)
|
farmbuyer@1
|
1290 end)
|
farmbuyer@1
|
1291 box:SetCallback("OnRelease", function(_b)
|
farmbuyer@1
|
1292 _b.editbox:ClearFocus()
|
farmbuyer@1
|
1293 _b.editbox:SetScript("OnShow", _b:GetUserData("old show"))
|
farmbuyer@1
|
1294 _b.editbox:SetScript("OnEscapePressed", _b:GetUserData("old escape"))
|
farmbuyer@1
|
1295 setstatus("")
|
farmbuyer@1
|
1296 end)
|
farmbuyer@1
|
1297 box.frame:SetAllPoints(cell_frame)
|
farmbuyer@1
|
1298 box.frame:SetParent(cell_frame)
|
farmbuyer@1
|
1299 box.frame:SetFrameLevel(cell_frame:GetFrameLevel()+1)
|
farmbuyer@1
|
1300 box.frame:Show()
|
farmbuyer@1
|
1301 setstatus("Press Enter or click Okay to accept changes, or press Escape to cancel them.")
|
farmbuyer@1
|
1302 end
|
farmbuyer@1
|
1303
|
farmbuyer@84
|
1304 local function eoi_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button)
|
farmbuyer@1
|
1305 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
|
farmbuyer@1
|
1306 local e = data[realrow]
|
farmbuyer@1
|
1307 local kind = e.kind
|
farmbuyer@1
|
1308
|
farmbuyer@84
|
1309 --_d:SetUserData("DD index", realrow)
|
farmbuyer@1
|
1310 if kind == 'loot' and column == 3 and button == "LeftButton" then
|
farmbuyer@1
|
1311 eoi_editcell (realrow, cellFrame)
|
farmbuyer@1
|
1312 end
|
farmbuyer@1
|
1313
|
farmbuyer@1
|
1314 return true -- do not do anything further
|
farmbuyer@1
|
1315 end
|
farmbuyer@1
|
1316
|
farmbuyer@103
|
1317 -- Used for anything not overridden elsewhere.
|
farmbuyer@103
|
1318 local function eoi_st_default_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable)
|
farmbuyer@103
|
1319 if not fShow then
|
farmbuyer@103
|
1320 cellFrame.text:SetText("")
|
farmbuyer@103
|
1321 if cellFrame.icontexture then
|
farmbuyer@103
|
1322 cellFrame.icontexture:Hide()
|
farmbuyer@103
|
1323 end
|
farmbuyer@103
|
1324 return
|
farmbuyer@103
|
1325 end
|
farmbuyer@103
|
1326
|
farmbuyer@103
|
1327 local e = data[realrow]
|
farmbuyer@103
|
1328 local cell = e.cols[column]
|
farmbuyer@129
|
1329 if not cell then
|
farmbuyer@129
|
1330 pprint('default_cellupdate', "row", realrow, "had no cell in col",
|
farmbuyer@129
|
1331 column, "retrying from first row")
|
farmbuyer@129
|
1332 addon:_fill_out_eoi_data(1)
|
farmbuyer@129
|
1333 cell = e.cols[column]
|
farmbuyer@129
|
1334 if not cell then
|
farmbuyer@129
|
1335 pprint('default_cellupdate', "FAILED, bailing")
|
farmbuyer@129
|
1336 return
|
farmbuyer@129
|
1337 end
|
farmbuyer@129
|
1338 end
|
farmbuyer@103
|
1339
|
farmbuyer@103
|
1340 cellFrame.text:SetText(cell.value)
|
farmbuyer@103
|
1341 -- subset of what the default ST's docellupdate looks for
|
farmbuyer@103
|
1342 local color = cols[column].color and cols[column].color(data,cols,realrow,column,stable)
|
farmbuyer@103
|
1343 if color then
|
farmbuyer@103
|
1344 cellFrame.text:SetTextColor(color.r,color.g,color.b,color.a)
|
farmbuyer@103
|
1345 else
|
farmbuyer@103
|
1346 cellFrame.text:SetTextColor(1,1,1,1)
|
farmbuyer@103
|
1347 end
|
farmbuyer@103
|
1348
|
farmbuyer@103
|
1349 if stable:GetSelection() ~= realrow then
|
farmbuyer@103
|
1350 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[e.reason or e.kind or ""])
|
farmbuyer@103
|
1351 else
|
farmbuyer@103
|
1352 stable:SetHighLightColor (rowFrame, stable:GetDefaultHighlight())
|
farmbuyer@103
|
1353 end
|
farmbuyer@103
|
1354 end
|
farmbuyer@103
|
1355
|
farmbuyer@1
|
1356 -- Used for EOI column 2 and Hist column 1. Both are player name columns.
|
farmbuyer@84
|
1357 local function eoi_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable)
|
farmbuyer@1
|
1358 if not fShow then
|
farmbuyer@1
|
1359 cellFrame.text:SetText("")
|
farmbuyer@1
|
1360 if cellFrame.icontexture then
|
farmbuyer@1
|
1361 cellFrame.icontexture:Hide()
|
farmbuyer@1
|
1362 end
|
farmbuyer@1
|
1363 return
|
farmbuyer@1
|
1364 end
|
farmbuyer@1
|
1365
|
farmbuyer@1
|
1366 local e = data[realrow]
|
farmbuyer@1
|
1367 local cell = e.cols[column]
|
farmbuyer@1
|
1368
|
farmbuyer@1
|
1369 cellFrame.text:SetText(cell.value)
|
farmbuyer@1
|
1370
|
farmbuyer@1
|
1371 if e.person_class then
|
farmbuyer@1
|
1372 local icon
|
farmbuyer@1
|
1373 if cellFrame.icontexture then
|
farmbuyer@1
|
1374 icon = cellFrame.icontexture
|
farmbuyer@1
|
1375 else
|
farmbuyer@1
|
1376 icon = cellFrame:CreateTexture(nil,"BACKGROUND")
|
farmbuyer@1
|
1377 icon:SetPoint("LEFT", cellFrame, "LEFT")
|
farmbuyer@1
|
1378 icon:SetHeight(eoi_st_rowheight-4)
|
farmbuyer@1
|
1379 icon:SetWidth(eoi_st_rowheight-4)
|
farmbuyer@1
|
1380 icon:SetTexture("Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes")
|
farmbuyer@1
|
1381 cellFrame.icontexture = icon
|
farmbuyer@1
|
1382 end
|
farmbuyer@1
|
1383 icon:SetTexCoord(unpack(CLASS_ICON_TCOORDS[e.person_class]))
|
farmbuyer@1
|
1384 icon:Show()
|
farmbuyer@1
|
1385 cellFrame.text:SetPoint("LEFT", icon, "RIGHT", 1, 0)
|
farmbuyer@86
|
1386 local color = addon.class_colors[e.person_class]
|
farmbuyer@92
|
1387 cellFrame.text:SetTextColor(color.r,color.g,color.b,color.a)
|
farmbuyer@1
|
1388 else
|
farmbuyer@1
|
1389 if cellFrame.icontexture then
|
farmbuyer@1
|
1390 cellFrame.icontexture:Hide()
|
farmbuyer@1
|
1391 cellFrame.text:SetPoint("LEFT", cellFrame, "LEFT")
|
farmbuyer@1
|
1392 end
|
farmbuyer@73
|
1393 cellFrame.text:SetTextColor(1,1,1,1)
|
farmbuyer@1
|
1394 end
|
farmbuyer@1
|
1395
|
farmbuyer@103
|
1396 if stable:GetSelection() ~= realrow then
|
farmbuyer@1
|
1397 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[e.reason or e.kind or ""])
|
farmbuyer@103
|
1398 else
|
farmbuyer@103
|
1399 stable:SetHighLightColor (rowFrame, stable:GetDefaultHighlight())
|
farmbuyer@103
|
1400 end
|
farmbuyer@1
|
1401 end
|
farmbuyer@1
|
1402
|
farmbuyer@116
|
1403 eoi_st_cols = {
|
farmbuyer@1
|
1404 { -- col 1
|
farmbuyer@1
|
1405 name = "Item",
|
farmbuyer@1
|
1406 width = 250,
|
farmbuyer@1
|
1407 },
|
farmbuyer@1
|
1408 { -- col 2
|
farmbuyer@1
|
1409 name = "Player",
|
farmbuyer@1
|
1410 width = 130,
|
farmbuyer@1
|
1411 DoCellUpdate = eoi_st_col2_DoCellUpdate,
|
farmbuyer@1
|
1412 },
|
farmbuyer@1
|
1413 { -- col 3
|
farmbuyer@1
|
1414 name = "Notes",
|
farmbuyer@3
|
1415 width = 250,
|
farmbuyer@73
|
1416 color = eoi_st_lootrow_col3_colortable_func,
|
farmbuyer@1
|
1417 },
|
farmbuyer@1
|
1418 }
|
farmbuyer@1
|
1419
|
farmbuyer@6
|
1420 local player_filter_all
|
farmbuyer@6
|
1421 local player_filter_by_name = function (st, e)
|
farmbuyer@1
|
1422 if e.kind ~= 'loot' then return true end
|
farmbuyer@1
|
1423 return e.person == _d:GetUserData("player filter name")
|
farmbuyer@1
|
1424 end
|
farmbuyer@1
|
1425
|
farmbuyer@1
|
1426 -- Tab 1: Events Of Interest (implementation)
|
farmbuyer@1
|
1427 tabs_OnGroupSelected["eoi"] = function(ocontainer,specials)
|
farmbuyer@1
|
1428 if (not addon.rebroadcast) and (not addon.enabled) and (#g_loot < 1) then
|
farmbuyer@40
|
1429 addon.dprint('flow', "Nothing to show in first tab, skipping creation")
|
farmbuyer@40
|
1430 return
|
farmbuyer@1
|
1431 end
|
farmbuyer@1
|
1432
|
farmbuyer@1
|
1433 -- The first time this function is called, we set up a persistent ST
|
farmbuyer@1
|
1434 -- object and store it. Any other delayed setup work is done, and then
|
farmbuyer@1
|
1435 -- this function replaces itself with a smaller, sleeker, sexier one.
|
farmbuyer@1
|
1436 -- This function will later be garbage collected.
|
farmbuyer@1
|
1437 local ST = LibStub("ScrollingTable"):CreateST(eoi_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
|
farmbuyer@95
|
1438 gui.eoiST = assert(ST)
|
farmbuyer@1
|
1439 if addon.author_debug then
|
farmbuyer@1
|
1440 _G.OLST = ST
|
farmbuyer@1
|
1441 end
|
farmbuyer@1
|
1442
|
farmbuyer@103
|
1443 ST.DoCellUpdate = eoi_st_default_DoCellUpdate
|
farmbuyer@1
|
1444 if not eoi_st_otherrow_bgcolortable_default then
|
farmbuyer@1
|
1445 eoi_st_otherrow_bgcolortable_default = ST:GetDefaultHighlightBlank()
|
farmbuyer@1
|
1446 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
|
farmbuyer@1
|
1447 return eoi_st_otherrow_bgcolortable_default
|
farmbuyer@1
|
1448 end})
|
farmbuyer@1
|
1449 end
|
farmbuyer@1
|
1450
|
farmbuyer@1
|
1451 -- Calling SetData breaks (trying to call Refresh) if g_loot hasn't gone
|
farmbuyer@1
|
1452 -- through this loop.
|
farmbuyer@1
|
1453 addon:_fill_out_eoi_data(1)
|
farmbuyer@122
|
1454 --[[ safety check begin
|
farmbuyer@116
|
1455 for i,e in ipairs(g_dloot) do
|
farmbuyer@1
|
1456 if type(e.cols) ~= 'table' then
|
farmbuyer@1
|
1457 addon:Print("ARGH, index",i,"bad in eoi_OGS, type",type(e.cols),
|
farmbuyer@55
|
1458 "entry kind", e.kind, "data", e.itemname or e.bossname or e.startday.text,
|
farmbuyer@55
|
1459 "-- please take a screenshot and send to Farmbuyer@US-Kilrogg.")
|
farmbuyer@1
|
1460 tabledump(e)
|
farmbuyer@1
|
1461 end
|
farmbuyer@1
|
1462 end
|
farmbuyer@122
|
1463 -- safety check end]]
|
farmbuyer@116
|
1464 ST:SetData(g_dloot)
|
farmbuyer@103
|
1465 ST:EnableSelection(true)
|
farmbuyer@1
|
1466 ST:RegisterEvents{
|
farmbuyer@1
|
1467 OnEnter = eoi_st_OnEnter,
|
farmbuyer@1
|
1468 OnLeave = eoi_st_OnLeave,
|
farmbuyer@1
|
1469 OnClick = eoi_st_OnClick,
|
farmbuyer@1
|
1470 OnDoubleClick = eoi_st_OnDoubleClick,
|
farmbuyer@1
|
1471 }
|
farmbuyer@1
|
1472
|
farmbuyer@1
|
1473 -- We want a single "update and redraw" function for the ST. Also, the
|
farmbuyer@1
|
1474 -- given refresh function is badly named and does nothing; the actual
|
farmbuyer@1
|
1475 -- function is SortData (also badly named when no sorting is being done),
|
farmbuyer@1
|
1476 -- which unconditionally calls the *hooked* Refresh.
|
farmbuyer@1
|
1477 local oldrefresh = ST.Refresh
|
farmbuyer@1
|
1478 ST.Refresh = function (self, opt_index)
|
farmbuyer@1
|
1479 addon:_fill_out_eoi_data(opt_index)
|
farmbuyer@1
|
1480 return oldrefresh(self)
|
farmbuyer@1
|
1481 end
|
farmbuyer@1
|
1482 ST.OuroLoot_Refresh = function (self, opt_index)
|
farmbuyer@1
|
1483 addon:_fill_out_eoi_data(opt_index)
|
farmbuyer@122
|
1484 --[[ safety check begin
|
farmbuyer@116
|
1485 for i,e in ipairs(g_dloot) do
|
farmbuyer@1
|
1486 if type(e.cols) ~= 'table' then
|
farmbuyer@4
|
1487 addon:Print("ARGH, index",i,"bad in eoi refresh, refreshed at", opt_index, "type",type(e.cols),
|
farmbuyer@55
|
1488 "entry kind", e.kind, "data", e.itemname or e.bossname or e.startday.text,
|
farmbuyer@55
|
1489 "-- please take a screenshot and send to Farmbuyer@US-Kilrogg.")
|
farmbuyer@1
|
1490 tabledump(e)
|
farmbuyer@1
|
1491 end
|
farmbuyer@1
|
1492 end
|
farmbuyer@122
|
1493 -- safety check end]]
|
farmbuyer@1
|
1494 self:SortData() -- calls hooked refresh
|
farmbuyer@1
|
1495 end
|
farmbuyer@1
|
1496
|
farmbuyer@1
|
1497 -- No need to keep creating function closures that all just "return true",
|
farmbuyer@1
|
1498 -- instead we grab the one made inside lib-st. There's no "get filter" API
|
farmbuyer@1
|
1499 -- so we just reach inside.
|
farmbuyer@6
|
1500 player_filter_all = ST.Filter
|
farmbuyer@1
|
1501
|
farmbuyer@1
|
1502 -- Now set up the future drawing function...
|
farmbuyer@1
|
1503 tabs_OnGroupSelected["eoi"] = function(container,specials)
|
farmbuyer@95
|
1504 local st_widget = AceGUI:Create("lib-st")
|
farmbuyer@95
|
1505 local st = assert(gui.eoiST)
|
farmbuyer@1
|
1506
|
farmbuyer@95
|
1507 gui.which_ST = st
|
farmbuyer@84
|
1508
|
farmbuyer@1
|
1509 -- This is actually required each time
|
farmbuyer@6
|
1510 _d:SetUserData ("player filter clear", player_filter_all)
|
farmbuyer@6
|
1511 _d:SetUserData ("player filter by name", player_filter_by_name)
|
farmbuyer@1
|
1512
|
farmbuyer@1
|
1513 st:OuroLoot_Refresh()
|
farmbuyer@1
|
1514 st_widget:WrapST(st)
|
farmbuyer@3
|
1515 st_widget.head_offset = 15
|
farmbuyer@3
|
1516 st_widget.tail_offset = 0
|
farmbuyer@1
|
1517
|
farmbuyer@97
|
1518 if gui.opts.scroll_to_bottom then
|
farmbuyer@1
|
1519 local scrollbar = _G[st.scrollframe:GetName().."ScrollBar"]
|
farmbuyer@1
|
1520 if scrollbar then
|
farmbuyer@1
|
1521 local _,max = scrollbar:GetMinMaxValues()
|
farmbuyer@1
|
1522 scrollbar:SetValue(max) -- also calls hooked Refresh
|
farmbuyer@1
|
1523 end
|
farmbuyer@1
|
1524 end
|
farmbuyer@1
|
1525
|
farmbuyer@1
|
1526 container:SetLayout("Fill")
|
farmbuyer@1
|
1527 container:AddChild(st_widget)
|
farmbuyer@1
|
1528
|
farmbuyer@42
|
1529 local b
|
farmbuyer@42
|
1530 --[===[ b = mkbutton("Generate Header",
|
farmbuyer@42
|
1531 [[]])
|
farmbuyer@42
|
1532 b:SetFullWidth(true)
|
farmbuyer@42
|
1533 b:SetCallback("OnClick", function (_b)
|
farmbuyer@42
|
1534 end)
|
farmbuyer@42
|
1535 specials:AddChild(b) ]===]
|
farmbuyer@42
|
1536
|
farmbuyer@42
|
1537 b = mkbutton('eoi_filter_reset', "Reset Player Filter",
|
farmbuyer@1
|
1538 [[Return to showing complete loot information.]])
|
farmbuyer@1
|
1539 b:SetFullWidth(true)
|
farmbuyer@1
|
1540 b:SetCallback("OnClick", function (_b)
|
farmbuyer@95
|
1541 gui.eoiST:SetFilter(player_filter_all)
|
farmbuyer@1
|
1542 _b:SetDisabled(true)
|
farmbuyer@1
|
1543 end)
|
farmbuyer@6
|
1544 b:SetDisabled(st.Filter == player_filter_all)
|
farmbuyer@1
|
1545 specials:AddChild(b)
|
farmbuyer@1
|
1546
|
farmbuyer@1
|
1547 local people = { "<nobody>" }
|
farmbuyer@1
|
1548 local initial
|
farmbuyer@118
|
1549 for i, name, info in
|
farmbuyer@118
|
1550 addon:sorted_raiders_iter (--[[fullnames=]]true, 'online')
|
farmbuyer@118
|
1551 do
|
farmbuyer@118
|
1552 tinsert (people, name)
|
farmbuyer@118
|
1553 if name == addon.sharder then
|
farmbuyer@118
|
1554 initial = i + 1 -- +1 offset for "nobody"
|
farmbuyer@118
|
1555 end
|
farmbuyer@1
|
1556 end
|
farmbuyer@1
|
1557 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
1558 [[If set, items received by this person will be automatically marked as disenchanted.]])
|
farmbuyer@1
|
1559 b:SetFullWidth(true)
|
farmbuyer@1
|
1560 b:SetLabel("Auto-mark as shard:")
|
farmbuyer@1
|
1561 b:SetList(people)
|
farmbuyer@1
|
1562 b:SetValue(initial or 1)
|
farmbuyer@1
|
1563 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
1564 addon.sharder = (choice ~= 1) and people[choice] or nil
|
farmbuyer@1
|
1565 end)
|
farmbuyer@1
|
1566 specials:AddChild(b)
|
farmbuyer@1
|
1567
|
farmbuyer@42
|
1568 b = mkbutton('eoi_bcast_req', "Request B'casters",
|
farmbuyer@1
|
1569 [[Sends out a request for others to enable loot rebroadcasting if they have not already done so.]])
|
farmbuyer@1
|
1570 b:SetFullWidth(true)
|
farmbuyer@1
|
1571 b:SetCallback("OnClick", function ()
|
farmbuyer@1
|
1572 addon:Print("Sending request!")
|
farmbuyer@1
|
1573 addon.requesting = true
|
farmbuyer@1
|
1574 addon:broadcast('bcast_req')
|
farmbuyer@1
|
1575 end)
|
farmbuyer@1
|
1576 b:SetDisabled(not addon.enabled)
|
farmbuyer@1
|
1577 specials:AddChild(b)
|
farmbuyer@1
|
1578 end
|
farmbuyer@1
|
1579 -- ...and call it.
|
farmbuyer@1
|
1580 return tabs_OnGroupSelected["eoi"](ocontainer,specials)
|
farmbuyer@1
|
1581 end
|
farmbuyer@83
|
1582 noob_tips["eoi"] = _markup[[
|
farmbuyer@83
|
1583 <Shift-Left> while over an item link to paste it into chat.
|
farmbuyer@83
|
1584
|
farmbuyer@83
|
1585 <Right>-click any row to display a dropdown menu. The menu is different for
|
farmbuyer@83
|
1586 the Player column than it is for the Item/Notes columns, and different for
|
farmbuyer@103
|
1587 loot entries than it is for other rows.
|
farmbuyer@103
|
1588
|
farmbuyer@103
|
1589 A normal click on a line will remove any highlighting from opening the
|
farmbuyer@103
|
1590 display from a chat link.]]
|
farmbuyer@103
|
1591 tabs_CLI_special["eoi"] = function (name_or_lineno)
|
farmbuyer@103
|
1592 if type(name_or_lineno) == 'string' then
|
farmbuyer@103
|
1593 -- uh
|
farmbuyer@103
|
1594 elseif type(name_or_lineno) == 'number' then
|
farmbuyer@116
|
1595 if name_or_lineno < 1 or name_or_lineno > #g_dloot then
|
farmbuyer@103
|
1596 return
|
farmbuyer@103
|
1597 end
|
farmbuyer@103
|
1598 local scrollhere = -9
|
farmbuyer@103
|
1599 repeat
|
farmbuyer@103
|
1600 scrollhere = scrollhere + 10
|
farmbuyer@103
|
1601 gui.eoiST.offset = scrollhere
|
farmbuyer@103
|
1602 until gui.eoiST:RowIsVisible(name_or_lineno)
|
farmbuyer@103
|
1603 -- Value must be in pixels, not "how many rows"
|
farmbuyer@103
|
1604 scrollhere = scrollhere * eoi_st_rowheight
|
farmbuyer@103
|
1605 -- But not past the bottom, it looks ugly
|
farmbuyer@103
|
1606 scrollhere = math.min (scrollhere,
|
farmbuyer@103
|
1607 (#gui.eoiST.filtered - eoi_st_displayed_rows) * eoi_st_rowheight)
|
farmbuyer@103
|
1608 gui.eoiST:SetSelection(name_or_lineno)
|
farmbuyer@110
|
1609 if name_or_lineno > eoi_st_displayed_rows then
|
farmbuyer@110
|
1610 -- don't try to scroll if there's not enough lines
|
farmbuyer@110
|
1611 local sf = gui.eoiST.scrollframe
|
farmbuyer@110
|
1612 sf:GetScript("OnVerticalScroll")(sf,scrollhere)
|
farmbuyer@110
|
1613 end
|
farmbuyer@103
|
1614 end
|
farmbuyer@103
|
1615 end
|
farmbuyer@1
|
1616
|
farmbuyer@37
|
1617
|
farmbuyer@1
|
1618 -- Tab 2/3 (generated text)
|
farmbuyer@1
|
1619 function tabs_generated_text_OGS (container, specials, text_kind)
|
farmbuyer@1
|
1620 container:SetLayout("Fill")
|
farmbuyer@95
|
1621 local box = AceGUI:Create("MultiLineEditBox")
|
farmbuyer@1
|
1622 box:SetFullWidth(true)
|
farmbuyer@1
|
1623 box:SetFullHeight(true)
|
farmbuyer@1
|
1624 box:SetLabel("Pressing the Escape key while typing will return keystroke control to the usual chat window.")
|
farmbuyer@1
|
1625 box:DisableButton(true)
|
farmbuyer@1
|
1626 addon:_fill_out_eoi_data(1)
|
farmbuyer@1
|
1627
|
farmbuyer@1
|
1628 -- Update the savedvar copy of the text before presenting it for editing,
|
farmbuyer@1
|
1629 -- then save it again when editing finishes. This way if the user goes
|
farmbuyer@1
|
1630 -- offline while editing, at least the unedited version is saved instead
|
farmbuyer@1
|
1631 -- of all the new text being lost entirely. (Yes, it's happened.)
|
farmbuyer@1
|
1632 --
|
farmbuyer@1
|
1633 -- No good local-ish place to store the cursor position that will also
|
farmbuyer@1
|
1634 -- survive the entire display being released. Abuse the generated text
|
farmbuyer@1
|
1635 -- cache for this purpose.
|
farmbuyer@1
|
1636 local pos = text_kind.."_pos"
|
farmbuyer@1
|
1637 if _generate_text(text_kind) then
|
farmbuyer@1
|
1638 g_loot[text_kind] = g_loot[text_kind] .. g_generated[text_kind]
|
farmbuyer@1
|
1639 g_generated[text_kind] = nil
|
farmbuyer@1
|
1640 end
|
farmbuyer@1
|
1641 box:SetText(g_loot[text_kind])
|
farmbuyer@1
|
1642 box.editBox:SetCursorPosition(g_generated[pos] or 0)
|
farmbuyer@1
|
1643 box.editBox:SetScript("OnShow", box.editBox.SetFocus)
|
farmbuyer@1
|
1644 box:SetCallback("OnRelease", function(_box)
|
farmbuyer@1
|
1645 box.editBox:ClearFocus()
|
farmbuyer@1
|
1646 g_loot[text_kind] = _box:GetText()
|
farmbuyer@1
|
1647 g_generated[pos] = _box.editBox:GetCursorPosition()
|
farmbuyer@1
|
1648 end)
|
farmbuyer@1
|
1649 container:AddChild(box)
|
farmbuyer@1
|
1650
|
farmbuyer@1
|
1651 local w = mkbutton("Regenerate",
|
farmbuyer@1
|
1652 [[+DISCARD> all text in this tab, and regenerate it from the current loot information.]])
|
farmbuyer@1
|
1653 w:SetFullWidth(true)
|
farmbuyer@1
|
1654 w:SetDisabled ((#g_loot == 0) and (box:GetText() == ""))
|
farmbuyer@1
|
1655 w:SetCallback("OnClick", function(_w)
|
farmbuyer@1
|
1656 box:SetText("")
|
farmbuyer@1
|
1657 g_loot[text_kind] = ""
|
farmbuyer@1
|
1658 g_loot.printed[text_kind] = 0
|
farmbuyer@1
|
1659 g_generated.last_instance = nil
|
farmbuyer@1
|
1660 g_generated[pos] = nil
|
farmbuyer@95
|
1661 addon:Print("'%s' has been regenerated.", gui.tabtexts[text_kind].title)
|
farmbuyer@1
|
1662 return addon:redisplay()
|
farmbuyer@1
|
1663 end)
|
farmbuyer@1
|
1664 specials:AddChild(w)
|
farmbuyer@1
|
1665 _populate_text_specials (box, specials, mkbutton, text_kind)
|
farmbuyer@1
|
1666 end
|
farmbuyer@1
|
1667
|
farmbuyer@37
|
1668
|
farmbuyer@1
|
1669 -- Tab 4: History
|
farmbuyer@1
|
1670 -- Much of the implementation here follows a similar desgin for the first
|
farmbuyer@4
|
1671 -- tab's handling of ST objects. We will even reuse its controlling tables
|
farmbuyer@4
|
1672 -- when feasible.
|
farmbuyer@37
|
1673 local histST, hist_dropdownfuncs
|
farmbuyer@84
|
1674 local hist_normal_status =
|
farmbuyer@84
|
1675 [[Click on a row to view all history for that player only. (Click column headers to re-sort.)]]
|
farmbuyer@84
|
1676 local hist_name_status =
|
farmbuyer@84
|
1677 [[Right-click on any row to return to normal history display.]]
|
farmbuyer@84
|
1678
|
farmbuyer@84
|
1679 local history_filter_by_recent = function (st, e)
|
farmbuyer@84
|
1680 if e.kind ~= 'hist' then return true end
|
farmbuyer@84
|
1681 return e.cols[2].OLi == 1
|
farmbuyer@84
|
1682 end
|
farmbuyer@84
|
1683
|
farmbuyer@84
|
1684 local history_filter_who
|
farmbuyer@84
|
1685 local history_filter_by_name = function (st, e)
|
farmbuyer@84
|
1686 if e.kind ~= 'hist' then return true end
|
farmbuyer@84
|
1687 return e.OLwho == history_filter_who
|
farmbuyer@84
|
1688 end
|
farmbuyer@1
|
1689
|
farmbuyer@37
|
1690 hist_dropdownfuncs = dropdownfuncs{
|
farmbuyer@87
|
1691 ["Delete this loot event from history"] = function()--rowi
|
farmbuyer@84
|
1692 local h = _d:GetUserData("DD history entry")
|
farmbuyer@87
|
1693 local numleft,err = addon:_delHistoryEntry (h.cols[2].OLu, h.itemlink)
|
farmbuyer@87
|
1694 if numleft then
|
farmbuyer@86
|
1695 addon:Print("Removed history entry %s from %s.",
|
farmbuyer@86
|
1696 h.itemlink, addon:colorize(h.OLwho,h.OLclass))
|
farmbuyer@87
|
1697 if numleft < 1 then
|
farmbuyer@87
|
1698 history_filter_who = nil
|
farmbuyer@92
|
1699 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@87
|
1700 setstatus(hist_normal_status)
|
farmbuyer@87
|
1701 end
|
farmbuyer@84
|
1702 else
|
farmbuyer@84
|
1703 addon:Print(err)
|
farmbuyer@84
|
1704 end
|
farmbuyer@84
|
1705 end,
|
farmbuyer@84
|
1706
|
farmbuyer@87
|
1707 ["Delete this player's entire loot history"] = function()--rowi
|
farmbuyer@84
|
1708 local h = _d:GetUserData("DD history entry")
|
farmbuyer@84
|
1709 local name = h.OLwho
|
farmbuyer@84
|
1710 local player_i = addon.history.byname[name]
|
farmbuyer@84
|
1711 local gone = tremove (addon.history, player_i)
|
farmbuyer@84
|
1712 assert(gone.name == name)
|
farmbuyer@84
|
1713 addon:_build_history_names()
|
farmbuyer@86
|
1714 addon:Print("Removed player %s from history (%d total entries).",
|
farmbuyer@86
|
1715 addon:colorize(name,gone.person_class), #gone.unique)
|
farmbuyer@37
|
1716 end,
|
farmbuyer@37
|
1717 }
|
farmbuyer@110
|
1718
|
farmbuyer@110
|
1719 do
|
farmbuyer@110
|
1720 local function E (name, funci, arg, ttt)
|
farmbuyer@110
|
1721 return gen_dd_entry (name, hist_dropdownfuncs, funci, arg, ttt)
|
farmbuyer@110
|
1722 end
|
farmbuyer@110
|
1723
|
farmbuyer@110
|
1724 gui.dropdown.hist_general = {
|
farmbuyer@110
|
1725 {
|
farmbuyer@110
|
1726 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@110
|
1727 isTitle = true,
|
farmbuyer@110
|
1728 notClickable = true,
|
farmbuyer@110
|
1729 notCheckable = true,
|
farmbuyer@110
|
1730 },
|
farmbuyer@110
|
1731 E("Delete this player's entire loot history", nil, nil, "Permanent, no going back!"),
|
farmbuyer@110
|
1732 E("--"),
|
farmbuyer@110
|
1733 E(CLOSE),
|
farmbuyer@110
|
1734 }
|
farmbuyer@110
|
1735 gui.dropdown.hist_specific = {
|
farmbuyer@110
|
1736 {
|
farmbuyer@110
|
1737 -- this is the dropdown title, text filled in on the fly
|
farmbuyer@110
|
1738 notClickable = true,
|
farmbuyer@110
|
1739 notCheckable = true,
|
farmbuyer@110
|
1740 },
|
farmbuyer@110
|
1741 E("Delete this loot event from history", nil, nil, "Permanent, no going back!"),
|
farmbuyer@110
|
1742 E("--"),
|
farmbuyer@110
|
1743 E(CLOSE),
|
farmbuyer@110
|
1744 }
|
farmbuyer@110
|
1745 end
|
farmbuyer@6
|
1746
|
farmbuyer@84
|
1747 -- Loot column
|
farmbuyer@84
|
1748 --[[
|
farmbuyer@84
|
1749 local function hist_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable)
|
farmbuyer@84
|
1750 end]]
|
farmbuyer@84
|
1751
|
farmbuyer@84
|
1752 -- Formatted timestamp column
|
farmbuyer@84
|
1753 local function hist_st_col3_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable)
|
farmbuyer@84
|
1754 if not fShow then
|
farmbuyer@84
|
1755 cellFrame.text:SetText("")
|
farmbuyer@84
|
1756 return
|
farmbuyer@84
|
1757 end
|
farmbuyer@84
|
1758
|
farmbuyer@84
|
1759 local h = data[realrow]
|
farmbuyer@84
|
1760 local cell = h.cols[column]
|
farmbuyer@84
|
1761
|
farmbuyer@84
|
1762 cellFrame.text:SetText(cell.value)
|
farmbuyer@84
|
1763 cellFrame.text:SetTextColor(1,1,1,1)
|
farmbuyer@84
|
1764
|
farmbuyer@84
|
1765 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable_default)
|
farmbuyer@84
|
1766 end
|
farmbuyer@84
|
1767
|
farmbuyer@84
|
1768 local function hist_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, down)
|
farmbuyer@84
|
1769 if (row == nil) or (realrow == nil) then return false end -- click column header, do default resorting
|
farmbuyer@84
|
1770 local h = data[realrow]
|
farmbuyer@84
|
1771 assert(h.kind=='hist')
|
farmbuyer@84
|
1772
|
farmbuyer@84
|
1773 -- Four button combinations we need to care about:
|
farmbuyer@84
|
1774
|
farmbuyer@84
|
1775 -- Shift-left pastes loot
|
farmbuyer@84
|
1776 if IsModifiedClick("CHATLINK") and column == 2 then
|
farmbuyer@84
|
1777 ChatEdit_InsertLink (h.itemlink)
|
farmbuyer@84
|
1778 return true -- do not do anything further
|
farmbuyer@84
|
1779 end
|
farmbuyer@84
|
1780
|
farmbuyer@84
|
1781 _d:SetUserData("DD index", realrow)
|
farmbuyer@84
|
1782 _d:SetUserData("DD history entry", h)
|
farmbuyer@84
|
1783
|
farmbuyer@84
|
1784 -- The rest depends on whether we're filtering (focused in on a specific
|
farmbuyer@84
|
1785 -- player) or not.
|
farmbuyer@84
|
1786 if history_filter_who then
|
farmbuyer@84
|
1787 -- Shift-right opens a menu
|
farmbuyer@84
|
1788 if IsShiftKeyDown() and button == "RightButton" then
|
farmbuyer@110
|
1789 gui.dropdown.hist_specific[1].text = h.itemlink
|
farmbuyer@110
|
1790 EasyMenu (gui.dropdown.hist_specific, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@84
|
1791
|
farmbuyer@84
|
1792 -- Right goes back to normal mode
|
farmbuyer@84
|
1793 elseif button == "RightButton" then
|
farmbuyer@84
|
1794 history_filter_who = nil
|
farmbuyer@84
|
1795 stable:SetFilter(history_filter_by_recent)
|
farmbuyer@84
|
1796 setstatus(hist_normal_status)
|
farmbuyer@84
|
1797 end
|
farmbuyer@84
|
1798
|
farmbuyer@84
|
1799 else -- not focused
|
farmbuyer@84
|
1800 -- Shift-right opens a menu
|
farmbuyer@84
|
1801 if IsShiftKeyDown() and button == "RightButton" then
|
farmbuyer@110
|
1802 gui.dropdown.hist_general[1].text = h.OLwho
|
farmbuyer@110
|
1803 EasyMenu (gui.dropdown.hist_general, dropdownmenuframe, cellFrame, 0, 0, "MENU")
|
farmbuyer@84
|
1804
|
farmbuyer@84
|
1805 -- Left focuses on a specific player
|
farmbuyer@84
|
1806 elseif button == "LeftButton" then
|
farmbuyer@84
|
1807 history_filter_who = h.OLwho
|
farmbuyer@84
|
1808 stable:SetFilter(history_filter_by_name)
|
farmbuyer@84
|
1809 setstatus(hist_name_status)
|
farmbuyer@84
|
1810 end
|
farmbuyer@84
|
1811 end
|
farmbuyer@84
|
1812
|
farmbuyer@84
|
1813 return true -- do not do anything further
|
farmbuyer@84
|
1814 end
|
farmbuyer@84
|
1815
|
farmbuyer@84
|
1816 --[[
|
farmbuyer@84
|
1817 local function hist_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button)
|
farmbuyer@84
|
1818 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
|
farmbuyer@84
|
1819 local h = data[realrow]
|
farmbuyer@84
|
1820 assert(h.kind=='hist')
|
farmbuyer@84
|
1821
|
farmbuyer@84
|
1822 return true -- do not do anything further
|
farmbuyer@84
|
1823 end]]
|
farmbuyer@84
|
1824
|
farmbuyer@37
|
1825 local hist_st_cols = {
|
farmbuyer@37
|
1826 { -- col 1
|
farmbuyer@37
|
1827 name = "Player",
|
farmbuyer@37
|
1828 width = 130,
|
farmbuyer@37
|
1829 DoCellUpdate = eoi_st_col2_DoCellUpdate,
|
farmbuyer@37
|
1830 },
|
farmbuyer@37
|
1831 { -- col 2
|
farmbuyer@37
|
1832 name = "Most Recent Loot",
|
farmbuyer@37
|
1833 width = 250,
|
farmbuyer@84
|
1834 --DoCellUpdate = hist_st_col2_DoCellUpdate,
|
farmbuyer@37
|
1835 },
|
farmbuyer@37
|
1836 { -- col 3
|
farmbuyer@37
|
1837 name = "When",
|
farmbuyer@37
|
1838 width = 250,
|
farmbuyer@37
|
1839 DoCellUpdate = hist_st_col3_DoCellUpdate,
|
farmbuyer@37
|
1840 defaultsort = "asc",
|
farmbuyer@37
|
1841 sort = "asc",
|
farmbuyer@37
|
1842 sortnext = 1,
|
farmbuyer@37
|
1843 },
|
farmbuyer@37
|
1844 }
|
farmbuyer@37
|
1845
|
farmbuyer@37
|
1846 -- Tab 4: History (implementation)
|
farmbuyer@37
|
1847 tabs_OnGroupSelected["hist"] = function(container,specials)
|
farmbuyer@37
|
1848 histST = LibStub("ScrollingTable"):CreateST(hist_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
|
farmbuyer@95
|
1849 gui.histST = histST
|
farmbuyer@37
|
1850 if addon.author_debug then
|
farmbuyer@37
|
1851 _G.OLHST = histST
|
farmbuyer@1
|
1852 end
|
farmbuyer@1
|
1853
|
farmbuyer@37
|
1854 if not eoi_st_otherrow_bgcolortable_default then
|
farmbuyer@37
|
1855 eoi_st_otherrow_bgcolortable_default = histST:GetDefaultHighlightBlank()
|
farmbuyer@37
|
1856 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
|
farmbuyer@37
|
1857 return eoi_st_otherrow_bgcolortable_default
|
farmbuyer@37
|
1858 end})
|
farmbuyer@1
|
1859 end
|
farmbuyer@1
|
1860
|
farmbuyer@37
|
1861 addon:_build_history_names()
|
farmbuyer@37
|
1862 addon:_fill_out_hist_data(1)
|
farmbuyer@37
|
1863 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1864 histST:RegisterEvents{
|
farmbuyer@37
|
1865 OnEnter = eoi_st_OnEnter,
|
farmbuyer@37
|
1866 OnLeave = eoi_st_OnLeave,
|
farmbuyer@37
|
1867 OnClick = hist_st_OnClick,
|
farmbuyer@37
|
1868 --OnDoubleClick = hist_st_OnDoubleClick,
|
farmbuyer@37
|
1869 }
|
farmbuyer@37
|
1870 local oldrefresh = histST.Refresh
|
farmbuyer@37
|
1871 histST.Refresh = function (self, opt_index)
|
farmbuyer@37
|
1872 addon:_fill_out_hist_data(opt_index)
|
farmbuyer@37
|
1873 return oldrefresh(self)
|
farmbuyer@37
|
1874 end
|
farmbuyer@37
|
1875 histST.OuroLoot_Refresh = function (self, opt_index)
|
farmbuyer@37
|
1876 addon:_fill_out_hist_data(opt_index)
|
farmbuyer@37
|
1877 self:SortData() -- calls hooked refresh
|
farmbuyer@6
|
1878 end
|
farmbuyer@6
|
1879
|
farmbuyer@37
|
1880 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@6
|
1881
|
farmbuyer@37
|
1882 -- Zaps history for the given realm, or the current (current-playing
|
farmbuyer@37
|
1883 -- realm, not currently-displayed realm) one if not specified.
|
farmbuyer@37
|
1884 local function reset_current_realm (opt_realmname)
|
farmbuyer@37
|
1885 local r = assert(opt_realmname or GetRealmName())
|
farmbuyer@37
|
1886 -- new .history table:
|
farmbuyer@37
|
1887 addon.history_all[r] = addon:_prep_new_history_category (nil, r)
|
farmbuyer@37
|
1888 addon.history = addon.history_all[r]
|
farmbuyer@37
|
1889 addon.hist_clean = nil
|
farmbuyer@37
|
1890 -- new .history.st table:
|
farmbuyer@37
|
1891 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1892 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1893 end
|
farmbuyer@6
|
1894
|
farmbuyer@1
|
1895 tabs_OnGroupSelected["hist"] = function(container,specials)
|
farmbuyer@95
|
1896 local st_widget = AceGUI:Create("lib-st")
|
farmbuyer@95
|
1897 gui.which_ST = histST
|
farmbuyer@37
|
1898 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1899 st_widget:WrapST(histST)
|
farmbuyer@37
|
1900 st_widget.head_offset = 15
|
farmbuyer@37
|
1901 st_widget.tail_offset = 0
|
farmbuyer@37
|
1902 container:SetLayout("Fill")
|
farmbuyer@37
|
1903 container:AddChild(st_widget)
|
farmbuyer@114
|
1904 -- If we're focused on one player, but have deleted all entries for
|
farmbuyer@114
|
1905 -- that player, don't sit there stuck on a blank grid.
|
farmbuyer@125
|
1906 if history_filter_who and #histST.filtered > 0 then
|
farmbuyer@125
|
1907 setstatus(hist_name_status)
|
farmbuyer@125
|
1908 else
|
farmbuyer@114
|
1909 history_filter_who = nil
|
farmbuyer@114
|
1910 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@114
|
1911 setstatus(hist_normal_status)
|
farmbuyer@114
|
1912 end
|
farmbuyer@1
|
1913
|
farmbuyer@37
|
1914 local b
|
farmbuyer@37
|
1915 do
|
farmbuyer@37
|
1916 local realms,current = {},1
|
farmbuyer@37
|
1917 for realmname,histtable in pairs(addon.history_all) do
|
farmbuyer@37
|
1918 if type(histtable) == 'table' then
|
farmbuyer@37
|
1919 tinsert(realms,realmname)
|
farmbuyer@37
|
1920 if addon.history == histtable then current = #realms end
|
farmbuyer@4
|
1921 end
|
farmbuyer@4
|
1922 end
|
farmbuyer@37
|
1923 b = mkbutton("Dropdown", nil, "", [[Which realm to display]])
|
farmbuyer@1
|
1924 b:SetFullWidth(true)
|
farmbuyer@37
|
1925 b:SetLabel() -- required even when empty, see ace3 ticket #234
|
farmbuyer@37
|
1926 b:SetList(realms)
|
farmbuyer@37
|
1927 b:SetValue(current)
|
farmbuyer@37
|
1928 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@37
|
1929 local r = realms[choice]
|
farmbuyer@37
|
1930 addon.history = addon:_prep_new_history_category (addon.history_all[r], r)
|
farmbuyer@37
|
1931 addon.hist_clean = nil
|
farmbuyer@6
|
1932 histST:OuroLoot_Refresh()
|
farmbuyer@6
|
1933 histST:SetData(addon.history.st)
|
farmbuyer@37
|
1934 -- Reset filters to normal
|
farmbuyer@37
|
1935 history_filter_who = nil
|
farmbuyer@37
|
1936 histST:SetFilter(history_filter_by_recent)
|
farmbuyer@37
|
1937 setstatus(hist_normal_status)
|
farmbuyer@1
|
1938 return addon:redisplay()
|
farmbuyer@1
|
1939 end)
|
farmbuyer@1
|
1940 specials:AddChild(b)
|
farmbuyer@37
|
1941 end
|
farmbuyer@1
|
1942
|
farmbuyer@95
|
1943 --[[ b = AceGUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]]
|
farmbuyer@4
|
1944
|
farmbuyer@37
|
1945 b = mkbutton("Regenerate",
|
farmbuyer@37
|
1946 [[Erases all history entries from the displayed realm, and regenerates it from current loot information.]])
|
farmbuyer@37
|
1947 b:SetFullWidth(true)
|
farmbuyer@37
|
1948 b:SetCallback("OnClick", function(_b)
|
farmbuyer@37
|
1949 local dialog = StaticPopup_Show("OUROL_HIST_REGEN", addon.history.realm)
|
farmbuyer@37
|
1950 dialog.data = addon
|
farmbuyer@37
|
1951 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1952 _addon:rewrite_history (_addon.history.realm)
|
farmbuyer@37
|
1953 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1954 histST:SetData(_addon.history.st)
|
farmbuyer@37
|
1955 end
|
farmbuyer@37
|
1956 end)
|
farmbuyer@37
|
1957 specials:AddChild(b)
|
farmbuyer@1
|
1958
|
farmbuyer@37
|
1959 b = mkbutton('hist_clear', "Clear Realm History",
|
farmbuyer@37
|
1960 [[|cffff1010Erases absolutely all> history entries from the displayed realm.]])
|
farmbuyer@37
|
1961 b:SetFullWidth(true)
|
farmbuyer@37
|
1962 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1963 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", addon.history.realm)
|
farmbuyer@37
|
1964 dialog.data = addon
|
farmbuyer@37
|
1965 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1966 reset_current_realm(_addon.history.realm)
|
farmbuyer@37
|
1967 end
|
farmbuyer@37
|
1968 end)
|
farmbuyer@37
|
1969 specials:AddChild(b)
|
farmbuyer@37
|
1970
|
farmbuyer@37
|
1971 b = mkbutton('hist_clear_all', "Clear All History",
|
farmbuyer@37
|
1972 [[|cffff1010Erases absolutely all> history entries from ALL realms.]])
|
farmbuyer@37
|
1973 b:SetFullWidth(true)
|
farmbuyer@37
|
1974 b:SetCallback("OnClick", function (_b)
|
farmbuyer@37
|
1975 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", "ALL realms")
|
farmbuyer@37
|
1976 dialog.data = addon
|
farmbuyer@37
|
1977 dialog.data2 = function(_addon)
|
farmbuyer@37
|
1978 _addon.history_all = {}
|
farmbuyer@37
|
1979 reset_current_realm()
|
farmbuyer@37
|
1980 end
|
farmbuyer@37
|
1981 end)
|
farmbuyer@37
|
1982 specials:AddChild(b)
|
farmbuyer@37
|
1983
|
farmbuyer@37
|
1984 b = mkbutton('hist_clear_old', "Clear Older",
|
farmbuyer@75
|
1985 [[Preserves only the latest loot entries for players on the displayed realm, removing all earlier ones.]])
|
farmbuyer@37
|
1986 b:SetFullWidth(true)
|
farmbuyer@37
|
1987 b:SetCallback("OnClick", function (_b)
|
farmbuyer@75
|
1988 local dialog = StaticPopup_Show("OUROL_HIST_PREEN", '', addon.history.realm, addon)
|
farmbuyer@37
|
1989 dialog.data = addon
|
farmbuyer@75
|
1990 dialog.data2 = function (_addon, howmany)
|
farmbuyer@75
|
1991 _addon:preen_history (_addon.history.realm, howmany)
|
farmbuyer@37
|
1992 _addon.hist_clean = nil
|
farmbuyer@37
|
1993 histST:OuroLoot_Refresh()
|
farmbuyer@37
|
1994 end
|
farmbuyer@37
|
1995 end)
|
farmbuyer@37
|
1996 specials:AddChild(b)
|
farmbuyer@1
|
1997 end
|
farmbuyer@37
|
1998 return tabs_OnGroupSelected["hist"](container,specials)
|
farmbuyer@1
|
1999 end
|
farmbuyer@83
|
2000 noob_tips["hist"] = _markup[[
|
farmbuyer@83
|
2001 <Left>-click a row to see all history for that player. <Right>-click any row
|
farmbuyer@83
|
2002 to return to showing all players.
|
farmbuyer@83
|
2003
|
farmbuyer@83
|
2004 <Shift-Left> while over an item link to paste it into chat. <Shift-Right>
|
farmbuyer@83
|
2005 any row to display a dropdown menu.]]
|
farmbuyer@95
|
2006 -- '/ol hi pla' -> set filter on Playername
|
farmbuyer@88
|
2007 tabs_CLI_special["hist"] = function (name)
|
farmbuyer@88
|
2008 name = '^'..name -- already tolower'd by onslash
|
farmbuyer@88
|
2009 for _,player in ipairs(addon.history) do
|
farmbuyer@88
|
2010 if player.name:lower():find(name) then
|
farmbuyer@88
|
2011 history_filter_who = player.name
|
farmbuyer@88
|
2012 histST:SetFilter(history_filter_by_name)
|
farmbuyer@88
|
2013 setstatus(hist_name_status)
|
farmbuyer@88
|
2014 break
|
farmbuyer@88
|
2015 end
|
farmbuyer@88
|
2016 end
|
farmbuyer@88
|
2017 -- If nothing found, reset to normal or just leave alone?
|
farmbuyer@88
|
2018 end
|
farmbuyer@1
|
2019
|
farmbuyer@37
|
2020
|
farmbuyer@6
|
2021 -- Tab 5: Help (content in verbage.lua)
|
farmbuyer@1
|
2022
|
farmbuyer@37
|
2023
|
farmbuyer@96
|
2024 -- Tab 6: Options (content in options.lua)
|
farmbuyer@1
|
2025
|
farmbuyer@1
|
2026
|
farmbuyer@1
|
2027 -- Simply to avoid recreating the same function over and over
|
farmbuyer@1
|
2028 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
|
farmbuyer@1
|
2029 tabs_OnGroupSelected_func = function (tabs,event,group)
|
farmbuyer@1
|
2030 tabs_OnGroupSelected_func_args[1] = tabs
|
farmbuyer@1
|
2031 tabs_OnGroupSelected_func_args[3] = group
|
farmbuyer@98
|
2032 gui.opts = addon.db.profile
|
farmbuyer@83
|
2033 hide_noobtips_frame()
|
farmbuyer@1
|
2034 tabs:ReleaseChildren()
|
farmbuyer@1
|
2035 local spec = tabs:GetUserData("special buttons group")
|
farmbuyer@1
|
2036 spec:ReleaseChildren()
|
farmbuyer@95
|
2037 local h = AceGUI:Create("Heading")
|
farmbuyer@1
|
2038 h:SetFullWidth(true)
|
farmbuyer@95
|
2039 h:SetText(gui.tabtexts[group].title)
|
farmbuyer@1
|
2040 spec:AddChild(h)
|
farmbuyer@76
|
2041 do
|
farmbuyer@76
|
2042 addon.sender_list.sort()
|
farmbuyer@76
|
2043 local fmt = "Received broadcast data from %d |4player:players;."
|
farmbuyer@76
|
2044 if addon.history_suppress then
|
farmbuyer@76
|
2045 -- this is the druid class color reworked into hex
|
farmbuyer@76
|
2046 fmt = fmt .. " |cffff7d0aHistory recording suppressed.|r"
|
farmbuyer@76
|
2047 end
|
farmbuyer@76
|
2048 tabs.titletext:SetFormattedText (fmt, addon.sender_list.activeI)
|
farmbuyer@76
|
2049 end
|
farmbuyer@81
|
2050 local status,err = pcall (tabs_OnGroupSelected[group], tabs, spec, group)
|
farmbuyer@81
|
2051 if not status then
|
farmbuyer@81
|
2052 addon:horrible_horrible_error(err)
|
farmbuyer@81
|
2053 end
|
farmbuyer@97
|
2054 if gui.opts.gui_noob then
|
farmbuyer@83
|
2055 local tip = noob_tips[group]
|
farmbuyer@83
|
2056 if type(tip) == 'function' then
|
farmbuyer@83
|
2057 tip = tip()
|
farmbuyer@83
|
2058 end
|
farmbuyer@83
|
2059 if type(tip) == 'string' and tip ~= "" then
|
farmbuyer@83
|
2060 local w = get_noobtips_frame()
|
farmbuyer@83
|
2061 w:SetParent (_d.content)
|
farmbuyer@83
|
2062 w:ClearAllPoints()
|
farmbuyer@83
|
2063 w:SetPoint("BOTTOMLEFT", _d.frame, "BOTTOMRIGHT", 3, 3)
|
farmbuyer@83
|
2064 w:Show()
|
farmbuyer@83
|
2065 w:DoTextWork(tip)
|
farmbuyer@83
|
2066 end
|
farmbuyer@83
|
2067 end
|
farmbuyer@1
|
2068 --[====[
|
farmbuyer@1
|
2069 Unfortunately, :GetHeight() called on anything useful out of a TabGroup
|
farmbuyer@1
|
2070 returns the static default size (about 50 pixels) until the refresh
|
farmbuyer@1
|
2071 cycle *after* all the frames are shown. Trying to fix it up after a
|
farmbuyer@126
|
2072 single OnUpdate doesn't work either. So for now it's all hardcoded;
|
farmbuyer@126
|
2073 a ScrollingTable requires a row count to determine its height rather
|
farmbuyer@126
|
2074 than using SetPoints to constrain a usable area.
|
farmbuyer@1
|
2075
|
farmbuyer@83
|
2076 Using this to determine the actual height of the usable area. (Will
|
farmbuyer@83
|
2077 error until an ST is shown, which only happens if it's tracking, etc.)
|
farmbuyer@83
|
2078 416 pixels
|
farmbuyer@1
|
2079 if group == "eoi" then
|
farmbuyer@1
|
2080 local stframe = tabs.children[1].frame
|
farmbuyer@1
|
2081 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
|
farmbuyer@1
|
2082 stframe:GetTop()-stframe:GetBottom())
|
farmbuyer@1
|
2083 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
|
farmbuyer@1
|
2084 stframe:GetRight()-stframe:GetLeft())
|
farmbuyer@1
|
2085 end
|
farmbuyer@1
|
2086 ]====]
|
farmbuyer@1
|
2087 end
|
farmbuyer@1
|
2088
|
farmbuyer@1
|
2089 --[[
|
farmbuyer@1
|
2090 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2091 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2092 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2093 ]]
|
farmbuyer@83
|
2094 function mkbutton (opt_widget_type, opt_key, label, status)
|
farmbuyer@83
|
2095 if not label then
|
farmbuyer@83
|
2096 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
|
farmbuyer@83
|
2097 elseif not status then
|
farmbuyer@83
|
2098 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
|
farmbuyer@1
|
2099 end
|
farmbuyer@95
|
2100 local button = assert(AceGUI:Create(opt_widget_type))
|
farmbuyer@83
|
2101 if button.SetText then button:SetText(tostring(label)) end
|
farmbuyer@83
|
2102 status = _markup(status)
|
farmbuyer@83
|
2103 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
|
farmbuyer@83
|
2104 button:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@83
|
2105 -- retrieval key may be specified as nil if all the parameters are given
|
farmbuyer@83
|
2106 if opt_key then _d:SetUserData (opt_key, button) end
|
farmbuyer@83
|
2107 return button
|
farmbuyer@1
|
2108 end
|
farmbuyer@96
|
2109 gui.mkbutton = mkbutton
|
farmbuyer@1
|
2110
|
farmbuyer@1
|
2111 --[[
|
farmbuyer@125
|
2112 Creates the main window. Can jump directly to a tab (and feed it CLI
|
farmbuyer@125
|
2113 routine arguments), if given the appropriate tab code.
|
farmbuyer@1
|
2114 ]]
|
farmbuyer@125
|
2115 function addon:BuildMainDisplay (opt_tabselect, opt_tabselect_CLI_arg)
|
farmbuyer@1
|
2116 if self.display then
|
farmbuyer@1
|
2117 -- try to get everything to update, rebuild, refresh... ugh, no
|
farmbuyer@1
|
2118 self.display:Hide()
|
farmbuyer@1
|
2119 end
|
farmbuyer@92
|
2120 if self.NOLOAD then
|
farmbuyer@92
|
2121 -- don't even try
|
farmbuyer@92
|
2122 return
|
farmbuyer@92
|
2123 end
|
farmbuyer@1
|
2124
|
farmbuyer@25
|
2125 -- This probably causes taint... hm.
|
farmbuyer@25
|
2126 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
|
farmbuyer@25
|
2127 UIDROPDOWNMENU_SHOW_TIME = 4
|
farmbuyer@25
|
2128
|
farmbuyer@47
|
2129 if dirty_tabs then
|
farmbuyer@129
|
2130 self.dprint('flow', "dirty flag set in BuildMainDisplay, recreating!")
|
farmbuyer@129
|
2131 self:gui_init()
|
farmbuyer@47
|
2132 self:zero_printed_fenceposts()
|
farmbuyer@47
|
2133 end
|
farmbuyer@97
|
2134 gui.opts = self.db.profile
|
farmbuyer@47
|
2135
|
farmbuyer@95
|
2136 local display = AceGUI:Create("Frame")
|
farmbuyer@1
|
2137 _d = display
|
farmbuyer@1
|
2138 self.display = display
|
farmbuyer@17
|
2139 display:SetTitle(window_title)
|
farmbuyer@1
|
2140 display:SetStatusText(self.status_text)
|
farmbuyer@1
|
2141 display:SetLayout("Flow")
|
farmbuyer@16
|
2142 display:SetStatusTable{width=900,height=550} -- default height is 500
|
farmbuyer@47
|
2143 display:EnableResize(false)
|
farmbuyer@96
|
2144 display:SetUserData("GUI state",gui)
|
farmbuyer@1
|
2145 display:SetCallback("OnClose", function(_display)
|
farmbuyer@25
|
2146 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
|
farmbuyer@83
|
2147 hide_noobtips_frame()
|
farmbuyer@95
|
2148 _d = nil
|
farmbuyer@1
|
2149 self.display = nil
|
farmbuyer@95
|
2150 AceGUI:Release(_display)
|
farmbuyer@6
|
2151 flib.clear()
|
farmbuyer@1
|
2152 collectgarbage()
|
farmbuyer@1
|
2153 end)
|
farmbuyer@1
|
2154
|
farmbuyer@1
|
2155 ----- Right-hand panel
|
farmbuyer@1
|
2156 local rhs_width = 0.20
|
farmbuyer@95
|
2157 local control = AceGUI:Create("SimpleGroup")
|
farmbuyer@1
|
2158 control:SetLayout("Flow")
|
farmbuyer@1
|
2159 control:SetRelativeWidth(rhs_width)
|
farmbuyer@1
|
2160 control.alignoffset = 25
|
farmbuyer@1
|
2161 control:PauseLayout()
|
farmbuyer@1
|
2162 local h,b
|
farmbuyer@1
|
2163
|
farmbuyer@1
|
2164 --- Main ---
|
farmbuyer@95
|
2165 h = AceGUI:Create("Heading")
|
farmbuyer@1
|
2166 h:SetFullWidth(true)
|
farmbuyer@1
|
2167 h:SetText("Main")
|
farmbuyer@1
|
2168 control:AddChild(h)
|
farmbuyer@1
|
2169
|
farmbuyer@1
|
2170 do
|
farmbuyer@1
|
2171 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
2172 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
|
farmbuyer@1
|
2173 b:SetFullWidth(true)
|
farmbuyer@1
|
2174 b:SetLabel("On/Off:")
|
farmbuyer@1
|
2175 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
|
farmbuyer@1
|
2176 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
|
farmbuyer@1
|
2177 b:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@1
|
2178 if choice == 1 then self:Activate()
|
farmbuyer@1
|
2179 elseif choice == 2 then self:Activate(nil,true)
|
farmbuyer@1
|
2180 else self:Deactivate()
|
farmbuyer@1
|
2181 end
|
farmbuyer@1
|
2182 _w = display:GetUserData('comm_ident')
|
farmbuyer@1
|
2183 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2184 _w:SetDisabled(self.enabled or self.rebroadcast)
|
farmbuyer@1
|
2185 end
|
farmbuyer@1
|
2186 _w = display:GetUserData('eoi_bcast_req')
|
farmbuyer@1
|
2187 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2188 _w:SetDisabled(not self.enabled)
|
farmbuyer@1
|
2189 end
|
farmbuyer@1
|
2190 end)
|
farmbuyer@1
|
2191 control:AddChild(b)
|
farmbuyer@1
|
2192 end
|
farmbuyer@1
|
2193
|
farmbuyer@1
|
2194 b = mkbutton("Dropdown", 'threshold', "",
|
farmbuyer@1
|
2195 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
|
farmbuyer@1
|
2196 b:SetFullWidth(true)
|
farmbuyer@1
|
2197 b:SetLabel("Threshold:")
|
farmbuyer@1
|
2198 b:SetList(self.thresholds)
|
farmbuyer@1
|
2199 b:SetValue(self.threshold)
|
farmbuyer@1
|
2200 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
2201 self:SetThreshold(choice)
|
farmbuyer@1
|
2202 end)
|
farmbuyer@1
|
2203 control:AddChild(b)
|
farmbuyer@1
|
2204
|
farmbuyer@4
|
2205 b = mkbutton("Clear Loot",
|
farmbuyer@1
|
2206 [[+Erases> all current loot information and generated text (but not saved texts).]])
|
farmbuyer@1
|
2207 b:SetFullWidth(true)
|
farmbuyer@1
|
2208 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2209 StaticPopup_Show("OUROL_CLEAR").data = self
|
farmbuyer@1
|
2210 end)
|
farmbuyer@1
|
2211 control:AddChild(b)
|
farmbuyer@1
|
2212
|
farmbuyer@95
|
2213 b = AceGUI:Create("Spacer")
|
farmbuyer@1
|
2214 b:SetFullWidth(true)
|
farmbuyer@16
|
2215 b:SetHeight(10)
|
farmbuyer@1
|
2216 control:AddChild(b)
|
farmbuyer@1
|
2217
|
farmbuyer@1
|
2218 --[[
|
farmbuyer@1
|
2219 --- Saved Texts ---
|
farmbuyer@1
|
2220 [ Save Current As... ]
|
farmbuyer@1
|
2221 saved1
|
farmbuyer@1
|
2222 saved2
|
farmbuyer@1
|
2223 ...
|
farmbuyer@1
|
2224 [ Load ] [ Delete ]
|
farmbuyer@1
|
2225 ]]
|
farmbuyer@95
|
2226 h = AceGUI:Create("Heading")
|
farmbuyer@1
|
2227 h:SetFullWidth(true)
|
farmbuyer@1
|
2228 h:SetText("Saved Texts")
|
farmbuyer@1
|
2229 control:AddChild(h)
|
farmbuyer@1
|
2230 b = mkbutton("Save Current As...",
|
farmbuyer@1
|
2231 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
|
farmbuyer@1
|
2232 b:SetFullWidth(true)
|
farmbuyer@1
|
2233 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2234 StaticPopup_Show "OUROL_SAVE_SAVEAS"
|
farmbuyer@1
|
2235 _d:Hide()
|
farmbuyer@1
|
2236 end)
|
farmbuyer@1
|
2237 control:AddChild(b)
|
farmbuyer@1
|
2238
|
farmbuyer@16
|
2239 do
|
farmbuyer@95
|
2240 local scontainer = AceGUI:Create("SimpleGroup")
|
farmbuyer@16
|
2241 scontainer:SetFullWidth(true)
|
farmbuyer@16
|
2242 scontainer:SetFullHeight(false)
|
farmbuyer@16
|
2243 scontainer:SetAutoAdjustHeight(false)
|
farmbuyer@16
|
2244 scontainer:SetHeight(40) -- no relative height available anymore
|
farmbuyer@16
|
2245 scontainer:SetLayout("Fill")
|
farmbuyer@95
|
2246 local scroll = AceGUI:Create("ScrollFrame")
|
farmbuyer@16
|
2247 scroll:SetLayout("List")
|
farmbuyer@16
|
2248 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
|
farmbuyer@16
|
2249 if saved then for i,s in ipairs(saved) do
|
farmbuyer@95
|
2250 local il = AceGUI:Create("InteractiveLabel")
|
farmbuyer@16
|
2251 il:SetFullWidth(true)
|
farmbuyer@16
|
2252 il:SetText(s.name)
|
farmbuyer@16
|
2253 il:SetUserData("num",i)
|
farmbuyer@16
|
2254 il:SetHighlight(1,1,1,0.4)
|
farmbuyer@16
|
2255 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
|
farmbuyer@16
|
2256 il:SetCallback("OnEnter", function() setstatus(str) end)
|
farmbuyer@16
|
2257 il:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@16
|
2258 il:SetCallback("OnClick", function(_il)
|
farmbuyer@16
|
2259 local prev = _d:GetUserData("saved selection")
|
farmbuyer@16
|
2260 if prev then
|
farmbuyer@16
|
2261 prev.highlight:Hide()
|
farmbuyer@16
|
2262 prev:SetColor()
|
farmbuyer@16
|
2263 end
|
farmbuyer@16
|
2264 _il:SetColor(0,1,0)
|
farmbuyer@16
|
2265 _il.highlight:Show()
|
farmbuyer@16
|
2266 _d:SetUserData("saved selection",_il)
|
farmbuyer@16
|
2267 _d:GetUserData("Load"):SetDisabled(false)
|
farmbuyer@16
|
2268 _d:GetUserData("Delete"):SetDisabled(false)
|
farmbuyer@16
|
2269 end)
|
farmbuyer@16
|
2270 scroll:AddChild(il)
|
farmbuyer@16
|
2271 end end
|
farmbuyer@16
|
2272 scontainer:AddChild(scroll)
|
farmbuyer@16
|
2273 control:AddChild(scontainer)
|
farmbuyer@16
|
2274 end
|
farmbuyer@1
|
2275
|
farmbuyer@1
|
2276 b = mkbutton("Load",
|
farmbuyer@1
|
2277 [[Load previously saved text. +REPLACES> all current loot information!]])
|
farmbuyer@1
|
2278 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2279 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2280 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2281 self:save_restore(num)
|
farmbuyer@1
|
2282 self:BuildMainDisplay()
|
farmbuyer@1
|
2283 end)
|
farmbuyer@1
|
2284 b:SetDisabled(true)
|
farmbuyer@1
|
2285 control:AddChild(b)
|
farmbuyer@1
|
2286 b = mkbutton("Delete",
|
farmbuyer@1
|
2287 [[Delete previously saved text.]])
|
farmbuyer@1
|
2288 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2289 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2290 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2291 self:save_delete(num)
|
farmbuyer@1
|
2292 self:BuildMainDisplay()
|
farmbuyer@1
|
2293 end)
|
farmbuyer@1
|
2294 b:SetDisabled(true)
|
farmbuyer@1
|
2295 control:AddChild(b)
|
farmbuyer@1
|
2296
|
farmbuyer@95
|
2297 b = AceGUI:Create("Spacer")
|
farmbuyer@1
|
2298 b:SetFullWidth(true)
|
farmbuyer@16
|
2299 b:SetHeight(10)
|
farmbuyer@1
|
2300 control:AddChild(b)
|
farmbuyer@1
|
2301
|
farmbuyer@1
|
2302 -- Other stuff on right-hand side
|
farmbuyer@95
|
2303 local tab_specials = AceGUI:Create("SimpleGroup")
|
farmbuyer@1
|
2304 tab_specials:SetLayout("Flow")
|
farmbuyer@1
|
2305 tab_specials:SetFullWidth(true)
|
farmbuyer@1
|
2306 control:AddChild(tab_specials)
|
farmbuyer@1
|
2307 control:ResumeLayout()
|
farmbuyer@1
|
2308
|
farmbuyer@1
|
2309 ----- Left-hand group
|
farmbuyer@95
|
2310 local tabs = AceGUI:Create("TabGroup")
|
farmbuyer@1
|
2311 tabs:SetLayout("Flow")
|
farmbuyer@1
|
2312 tabs.alignoffset = 25
|
farmbuyer@49
|
2313 local titletext_orig_fo = tabs.titletext:GetFontObject()
|
farmbuyer@49
|
2314 tabs.titletext:SetFontObject(GameFontNormalSmall)
|
farmbuyer@49
|
2315 tabs:SetCallback("OnRelease", function(_tabs)
|
farmbuyer@49
|
2316 tabs.titletext:SetFontObject(titletext_orig_fo)
|
farmbuyer@49
|
2317 end)
|
farmbuyer@1
|
2318 tabs:SetRelativeWidth(0.99-rhs_width)
|
farmbuyer@1
|
2319 tabs:SetFullHeight(true)
|
farmbuyer@1
|
2320 tabs:SetTabs(tabgroup_tabs)
|
farmbuyer@1
|
2321 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
|
farmbuyer@1
|
2322 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
|
farmbuyer@95
|
2323 setstatus(gui.tabtexts[value].desc)
|
farmbuyer@1
|
2324 end)
|
farmbuyer@1
|
2325 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
|
farmbuyer@1
|
2326 tabs:SetUserData("special buttons group",tab_specials)
|
farmbuyer@125
|
2327
|
farmbuyer@125
|
2328 local whichtab, tabargs = "eoi"
|
farmbuyer@125
|
2329 if opt_tabselect and #opt_tabselect > 0 then
|
farmbuyer@125
|
2330 whichtab, tabargs = opt_tabselect, opt_tabselect_CLI_arg
|
farmbuyer@125
|
2331 end
|
farmbuyer@125
|
2332 tabs:SelectTab(whichtab)
|
farmbuyer@1
|
2333
|
farmbuyer@1
|
2334 display:AddChildren (tabs, control)
|
farmbuyer@1
|
2335 display:ApplyStatus()
|
farmbuyer@125
|
2336 display:Show() -- without this, only appears every *other* function call
|
farmbuyer@1
|
2337
|
farmbuyer@125
|
2338 if tabargs and tabs_CLI_special[whichtab] then
|
farmbuyer@125
|
2339 tabs_CLI_special[whichtab](tabargs)
|
farmbuyer@125
|
2340 end
|
farmbuyer@1
|
2341 return display
|
farmbuyer@1
|
2342 end
|
farmbuyer@1
|
2343
|
farmbuyer@125
|
2344 -- Searches tab title texts from left to right.
|
farmbuyer@88
|
2345 function addon:OpenMainDisplayToTab (text, opt_arg)
|
farmbuyer@44
|
2346 text = '^'..text:lower()
|
farmbuyer@95
|
2347 for _,tab in ipairs(gui.taborder) do
|
farmbuyer@95
|
2348 local v = gui.tabtexts[tab]
|
farmbuyer@95
|
2349 if v and v.title:lower():find(text) then
|
farmbuyer@125
|
2350 self:BuildMainDisplay (tab, opt_arg)
|
farmbuyer@1
|
2351 return true
|
farmbuyer@1
|
2352 end
|
farmbuyer@1
|
2353 end
|
farmbuyer@1
|
2354 end
|
farmbuyer@1
|
2355
|
farmbuyer@1
|
2356 -- Essentially a re-click on the current tab (if the current tab were clickable).
|
farmbuyer@1
|
2357 function addon:redisplay ()
|
farmbuyer@1
|
2358 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
|
farmbuyer@1
|
2359 end
|
farmbuyer@1
|
2360
|
farmbuyer@103
|
2361 function addon:GoToLootLine (line)
|
farmbuyer@103
|
2362 local lineno = tonumber(self.lootjumps[line])
|
farmbuyer@103
|
2363 self:OpenMainDisplayToTab ("Loot", lineno)
|
farmbuyer@103
|
2364 end
|
farmbuyer@103
|
2365
|
farmbuyer@1
|
2366
|
farmbuyer@110
|
2367 -- We need to be able to reference the dropdownmenu locals, and I didn't want to
|
farmbuyer@110
|
2368 -- bubble them up any higher.
|
farmbuyer@128
|
2369 do
|
farmbuyer@128
|
2370 -- If the UIDropDownMenu_SetSelected* functions could be used with EasyMenu
|
farmbuyer@128
|
2371 -- in a sane fashion, we could dispense with the 'checked' field.
|
farmbuyer@128
|
2372 local function disposition_is_checked (buttonframe)
|
farmbuyer@128
|
2373 -- arg2 == disp code, GetID == index into dropdown array
|
farmbuyer@128
|
2374 local i = _d and _d.GetUserData and _d:GetUserData("DD index")
|
farmbuyer@128
|
2375 if i then
|
farmbuyer@128
|
2376 return g_loot[i].disposition == buttonframe.arg2
|
farmbuyer@128
|
2377 end
|
farmbuyer@110
|
2378 end
|
farmbuyer@110
|
2379
|
farmbuyer@128
|
2380 function gui.add_dropdown_entry (menutag, name, func_tbl, func_or_othername, arg, tooltiptext)
|
farmbuyer@128
|
2381 local emtbl = assert(gui.dropdown[menutag])
|
farmbuyer@128
|
2382
|
farmbuyer@128
|
2383 if type(func_tbl) == 'table' then
|
farmbuyer@128
|
2384 -- use it directly
|
farmbuyer@128
|
2385 elseif func_tbl == nil then
|
farmbuyer@128
|
2386 -- determine it from the menu tag
|
farmbuyer@128
|
2387 func_tbl = (menutag:sub(1,3) == 'eoi' and eoi_dropdownfuncs)
|
farmbuyer@128
|
2388 or (menutag:sub(1,4) == 'hist' and hist_dropdownfuncs)
|
farmbuyer@128
|
2389 or error("Cannot figure out function table from menu tag name")
|
farmbuyer@128
|
2390 end
|
farmbuyer@128
|
2391
|
farmbuyer@128
|
2392 if type(func_or_othername) == 'string' then
|
farmbuyer@128
|
2393 -- gen_dd_entry handles this
|
farmbuyer@128
|
2394 elseif type(func_or_othername) == 'function' then
|
farmbuyer@128
|
2395 error"bah"
|
farmbuyer@128
|
2396 end
|
farmbuyer@128
|
2397
|
farmbuyer@128
|
2398 -- Insert most new entries right under the title
|
farmbuyer@128
|
2399 local index
|
farmbuyer@128
|
2400 if menutag == 'eoi_loot' then
|
farmbuyer@128
|
2401 index = 3
|
farmbuyer@128
|
2402 elseif menutag == 'eoi_player' then
|
farmbuyer@128
|
2403 index = 3
|
farmbuyer@128
|
2404 elseif menutag == 'eoi_loot_mark' then
|
farmbuyer@128
|
2405 index = #emtbl + 1
|
farmbuyer@128
|
2406 else
|
farmbuyer@128
|
2407 index = 2
|
farmbuyer@128
|
2408 end
|
farmbuyer@128
|
2409
|
farmbuyer@128
|
2410 local ent = gen_dd_entry (name, func_tbl, func_or_othername, arg, tooltiptext)
|
farmbuyer@128
|
2411 tinsert (emtbl, index, ent)
|
farmbuyer@128
|
2412
|
farmbuyer@128
|
2413 if menutag == 'eoi_loot_mark' then
|
farmbuyer@128
|
2414 ent.notCheckable = nil
|
farmbuyer@128
|
2415 ent.checked = disposition_is_checked
|
farmbuyer@128
|
2416 end
|
farmbuyer@128
|
2417
|
farmbuyer@128
|
2418 return ent
|
farmbuyer@110
|
2419 end
|
farmbuyer@110
|
2420 end
|
farmbuyer@110
|
2421
|
farmbuyer@110
|
2422
|
farmbuyer@1
|
2423 ------ Popup dialogs
|
farmbuyer@75
|
2424 local function build_my_slider_widget()
|
farmbuyer@75
|
2425 local s = CreateFrame("Slider", "OuroLootSlider", nil, "OptionsSliderTemplate")
|
farmbuyer@75
|
2426 s.text = OuroLootSliderText
|
farmbuyer@75
|
2427 s.low = OuroLootSliderLow
|
farmbuyer@75
|
2428 s.high = OuroLootSliderHigh
|
farmbuyer@75
|
2429 s:SetScript("OnValueChanged", function (_s, value)
|
farmbuyer@75
|
2430 _s.value = value -- conveniently, this is already of numeric type
|
farmbuyer@75
|
2431 --_s.text:SetText(tostring(value))
|
farmbuyer@75
|
2432 if _s.DoOnValueChanged then
|
farmbuyer@75
|
2433 _s:DoOnValueChanged()
|
farmbuyer@75
|
2434 end
|
farmbuyer@75
|
2435 end)
|
farmbuyer@75
|
2436 build_my_slider_widget = nil
|
farmbuyer@75
|
2437 return s
|
farmbuyer@75
|
2438 end
|
farmbuyer@75
|
2439
|
farmbuyer@1
|
2440 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
|
farmbuyer@1
|
2441 text = "Clear current loot information and text?",
|
farmbuyer@16
|
2442 button1 = YES,
|
farmbuyer@16
|
2443 button2 = NO,
|
farmbuyer@1
|
2444 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2445 addon:Clear(--[[verbose_p=]]true)
|
farmbuyer@1
|
2446 end,
|
farmbuyer@1
|
2447 }
|
farmbuyer@1
|
2448
|
farmbuyer@37
|
2449 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2450 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2451 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@125
|
2452 .. "%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
|
2453 button1 = YES,
|
farmbuyer@37
|
2454 button2 = NO,
|
farmbuyer@37
|
2455 OnAccept = function (dialog, addon, data2)
|
farmbuyer@37
|
2456 data2(addon)
|
farmbuyer@37
|
2457 addon:Print("%s history has been regenerated.", addon.history.realm)
|
farmbuyer@37
|
2458 addon:redisplay()
|
farmbuyer@37
|
2459 end,
|
farmbuyer@37
|
2460 }
|
farmbuyer@37
|
2461
|
farmbuyer@16
|
2462 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
|
farmbuyer@37
|
2463 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2464 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2465 button1 = YES,
|
farmbuyer@16
|
2466 button2 = NO,
|
farmbuyer@16
|
2467 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2468 data2(addon)
|
farmbuyer@16
|
2469 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
|
farmbuyer@16
|
2470 addon:redisplay()
|
farmbuyer@16
|
2471 end,
|
farmbuyer@16
|
2472 }
|
farmbuyer@16
|
2473
|
farmbuyer@16
|
2474 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2475 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2476 text = "This will erase all but the latest "
|
farmbuyer@75
|
2477 .. ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
|
farmbuyer@75
|
2478 .. "%s|r for each player on "
|
farmbuyer@75
|
2479 .. ITEM_QUALITY_COLORS[5].hex .. "%s|r. " .. CONTINUE .. "?",
|
farmbuyer@16
|
2480 button1 = YES,
|
farmbuyer@16
|
2481 button2 = NO,
|
farmbuyer@75
|
2482 OnShow = function (dialog, addon)
|
farmbuyer@75
|
2483 local thistable = StaticPopupDialogs[dialog.which]
|
farmbuyer@75
|
2484 -- StaticPopup_Resize does not take extraFrame into account, so we
|
farmbuyer@89
|
2485 -- monkeypatch the sizing method that _Resize calls at the end.
|
farmbuyer@75
|
2486 dialog.saved_setheight = dialog.SetHeight
|
farmbuyer@75
|
2487 dialog.SetHeight = function (d, h)
|
farmbuyer@75
|
2488 return d.saved_setheight(d,h+35)
|
farmbuyer@75
|
2489 end
|
farmbuyer@75
|
2490 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2491 dialog.extraFrame:SetPoint("TOP", dialog.text, "BOTTOM")
|
farmbuyer@75
|
2492 dialog.extraFrame:SetWidth(150)
|
farmbuyer@75
|
2493 dialog.extraFrame:SetHeight(35)
|
farmbuyer@75
|
2494 dialog.extraFrame:Show()
|
farmbuyer@75
|
2495 local slider = _G.OuroLootSlider or build_my_slider_widget()
|
farmbuyer@75
|
2496 slider.DoOnValueChanged = function(s)
|
farmbuyer@75
|
2497 dialog.text:SetFormattedText (thistable.text,
|
farmbuyer@75
|
2498 s.value == 1 and "single entry" or (s.value .. " entries"),
|
farmbuyer@75
|
2499 addon.history.realm)
|
farmbuyer@75
|
2500 StaticPopup_Resize (dialog, "OUROL_HIST_PREEN")
|
farmbuyer@75
|
2501 end
|
farmbuyer@75
|
2502 slider:SetOrientation('HORIZONTAL')
|
farmbuyer@75
|
2503 slider:SetMinMaxValues(1,30)
|
farmbuyer@75
|
2504 slider:SetValueStep(1)
|
farmbuyer@75
|
2505 slider.low:SetText("1")
|
farmbuyer@75
|
2506 slider.high:SetText("30")
|
farmbuyer@75
|
2507 --slider.tooltipText = ???
|
farmbuyer@75
|
2508 slider:SetParent(dialog.extraFrame)
|
farmbuyer@75
|
2509 slider:ClearAllPoints()
|
farmbuyer@75
|
2510 slider:SetPoint("TOPLEFT",dialog.extraFrame,"TOPLEFT",0, -15)
|
farmbuyer@75
|
2511 slider:SetPoint("BOTTOMRIGHT",dialog.extraFrame,"BOTTOMRIGHT",0, 0)
|
farmbuyer@75
|
2512 slider:Show()
|
farmbuyer@75
|
2513 -- This causes OnValueChanged to fire, reformatting the text. Except
|
farmbuyer@75
|
2514 -- IF the slider has already been shown, and IF at the time it was hidden
|
farmbuyer@75
|
2515 -- it had the same value here, THEN there is technically no "change"
|
farmbuyer@75
|
2516 -- and no event is fired. We work around this clever optimization by
|
farmbuyer@75
|
2517 -- doing a pair of set's, forcing the last one to fire OVC.
|
farmbuyer@75
|
2518 slider:SetValue(1)
|
farmbuyer@75
|
2519 slider:SetValue(5)
|
farmbuyer@75
|
2520 end,
|
farmbuyer@75
|
2521 OnAccept = function (dialog, addon, callback)
|
farmbuyer@75
|
2522 local howmany = assert(tonumber(_G.OuroLootSlider.value))
|
farmbuyer@75
|
2523 callback (addon, howmany)
|
farmbuyer@75
|
2524 addon:Print("All loot prior to the most recent %d |4entry:entries; has been erased.", howmany)
|
farmbuyer@16
|
2525 addon:redisplay()
|
farmbuyer@16
|
2526 end,
|
farmbuyer@75
|
2527 OnHide = function (dialog, addon)
|
farmbuyer@75
|
2528 dialog.SetHeight = nil
|
farmbuyer@75
|
2529 dialog.saved_setheight = nil
|
farmbuyer@75
|
2530 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2531 _G.OuroLootSlider:Hide() -- parent is hidden, why is this required?
|
farmbuyer@75
|
2532 _G.OuroLootSlider:ClearAllPoints()
|
farmbuyer@75
|
2533 _G.OuroLootSlider:SetParent(nil)
|
farmbuyer@75
|
2534 end,
|
farmbuyer@16
|
2535 }
|
farmbuyer@16
|
2536
|
farmbuyer@27
|
2537 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
|
farmbuyer@27
|
2538 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
|
farmbuyer@27
|
2539 button1 = OKAY,
|
farmbuyer@27
|
2540 timeout = 0,
|
farmbuyer@27
|
2541 whileDead = true,
|
farmbuyer@27
|
2542 hideOnEscape = true,
|
farmbuyer@27
|
2543 enterClicksFirstButton = true,
|
farmbuyer@27
|
2544 hasEditBox = true,
|
farmbuyer@27
|
2545 editBoxWidth = 350,
|
farmbuyer@53
|
2546 preferredIndex = 3,
|
farmbuyer@27
|
2547 OnShow = function (dialog, url)
|
farmbuyer@27
|
2548 dialog.editBox:SetText(url)
|
farmbuyer@27
|
2549 dialog.editBox:SetFocus()
|
farmbuyer@27
|
2550 dialog.editBox:HighlightText()
|
farmbuyer@27
|
2551 end,
|
farmbuyer@27
|
2552 }
|
farmbuyer@27
|
2553
|
farmbuyer@1
|
2554 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
|
farmbuyer@77
|
2555 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
|
2556 button1 = "Activate recording", -- "accept", left
|
farmbuyer@69
|
2557 button2 = "Broadcast Only", -- "cancel", middle
|
farmbuyer@69
|
2558 button3 = HELP_LABEL, -- "alt", right
|
farmbuyer@1
|
2559 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2560 addon:Activate()
|
farmbuyer@1
|
2561 end,
|
farmbuyer@69
|
2562 noCancelOnEscape = true,
|
farmbuyer@69
|
2563 OnCancel = function (dialog, addon)
|
farmbuyer@1
|
2564 addon:Activate(nil,true)
|
farmbuyer@1
|
2565 end,
|
farmbuyer@69
|
2566 OnAlt = function (dialog, addon)
|
farmbuyer@1
|
2567 -- hitting escape also calls this, but the 3rd arg would be "clicked"
|
farmbuyer@1
|
2568 -- in both cases, not useful here.
|
farmbuyer@89
|
2569 if MouseIsOver(dialog.button3) then
|
farmbuyer@1
|
2570 -- they actually clicked the button (or at least the mouse was over "Help"
|
farmbuyer@1
|
2571 -- when they hit escape... sigh)
|
farmbuyer@1
|
2572 addon:BuildMainDisplay('help')
|
farmbuyer@1
|
2573 else
|
farmbuyer@1
|
2574 addon.popped = true
|
farmbuyer@1
|
2575 end
|
farmbuyer@1
|
2576 end,
|
farmbuyer@1
|
2577 }
|
farmbuyer@1
|
2578
|
farmbuyer@69
|
2579 -- Callback for each Next/Accept stage of inserting a new loot or boss row via
|
farmbuyer@69
|
2580 -- dropdown. Thanks to noCancelOnReuse, each Show done here will technically
|
farmbuyer@69
|
2581 -- Hide and redisplay the same dialog, passing along the same 'data' structure
|
farmbuyer@69
|
2582 -- each time. The topmost call to our OnAccept will then finish by hiding the
|
farmbuyer@69
|
2583 -- (very last) dialog.
|
farmbuyer@69
|
2584 --
|
farmbuyer@116
|
2585 -- This is really, really hideous to read. Maybe increment a 'stage' counter
|
farmbuyer@116
|
2586 -- so the code flows top-down, rather than testing for missing data and going
|
farmbuyer@116
|
2587 -- backwards.
|
farmbuyer@69
|
2588 local function eoi_st_insert_OnAccept_boss (dialog, data, data2)
|
farmbuyer@69
|
2589 if data.all_done then
|
farmbuyer@116
|
2590 -- boss_index will probably be the final entry in the table, but there
|
farmbuyer@116
|
2591 -- might have been real loot happening while the user was typing.
|
farmbuyer@69
|
2592 local boss_index = addon._addBossEntry{
|
farmbuyer@69
|
2593 kind = 'boss',
|
farmbuyer@97
|
2594 bossname = (gui.opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
|
farmbuyer@69
|
2595 reason = 'kill',
|
farmbuyer@69
|
2596 instance = data.instance,
|
farmbuyer@69
|
2597 duration = 0,
|
farmbuyer@69
|
2598 maxsize = data.max_raid_size,
|
farmbuyer@69
|
2599 raidersnap = data.yes_snap or {},
|
farmbuyer@69
|
2600 }
|
farmbuyer@69
|
2601 local entry = tremove(g_loot,boss_index)
|
farmbuyer@129
|
2602 g_dloot:insert (data.rowindex, entry)
|
farmbuyer@69
|
2603 addon:_mark_boss_kill(data.rowindex)
|
farmbuyer@95
|
2604 gui.eoiST:OuroLoot_Refresh(data.rowindex)
|
farmbuyer@103
|
2605 local jumpprefix = addon.chatprefix ("GoToLootLine", data.rowindex)
|
farmbuyer@69
|
2606 dialog.data = nil -- free up memory
|
farmbuyer@103
|
2607 addon:PCFPrint (_G.DEFAULT_CHAT_FRAME, jumpprefix,
|
farmbuyer@103
|
2608 "Inserted %s %s at entry %d.",
|
farmbuyer@103
|
2609 data.kind, data.name, data.rowindex)
|
farmbuyer@69
|
2610 return
|
farmbuyer@69
|
2611 end
|
farmbuyer@69
|
2612
|
farmbuyer@69
|
2613 -- third click
|
farmbuyer@69
|
2614 if data.name and data.instance then
|
farmbuyer@69
|
2615 data.all_done = true
|
farmbuyer@69
|
2616 -- this is how we distinguish OnAccept from OnCancel ("clicked"); the
|
farmbuyer@69
|
2617 -- 3rd param is handled all in StaticPopup_OnClick
|
farmbuyer@69
|
2618 if data2 ~= 'clicked' then
|
farmbuyer@69
|
2619 data.yes_snap = data.maybe_snap
|
farmbuyer@69
|
2620 end
|
farmbuyer@69
|
2621 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2622 end
|
farmbuyer@69
|
2623
|
farmbuyer@69
|
2624 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2625
|
farmbuyer@69
|
2626 -- second click
|
farmbuyer@69
|
2627 if data.name and text then
|
farmbuyer@69
|
2628 data.instance = text
|
farmbuyer@92
|
2629 -- not "reusing" this dialog in the same sense as with loot
|
farmbuyer@69
|
2630 dialog.data = nil
|
farmbuyer@69
|
2631 dialog:Hide()
|
farmbuyer@69
|
2632 local getsnap = StaticPopup_Show("OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP")
|
farmbuyer@69
|
2633 getsnap.data = data
|
farmbuyer@69
|
2634 return true
|
farmbuyer@69
|
2635 end
|
farmbuyer@69
|
2636
|
farmbuyer@69
|
2637 -- first click
|
farmbuyer@69
|
2638 if text then
|
farmbuyer@69
|
2639 data.name = text
|
farmbuyer@69
|
2640 local maybe_instance
|
farmbuyer@69
|
2641 data.maybe_snap, data.max_raid_size, maybe_instance = addon:snapshot_raid()
|
farmbuyer@69
|
2642 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
|
farmbuyer@69
|
2643 getinstance.data = data
|
farmbuyer@69
|
2644 getinstance.editBox:SetText(maybe_instance)
|
farmbuyer@69
|
2645 -- This suppresses auto-hide (which would cause the getinstance dialog
|
farmbuyer@69
|
2646 -- to go away), but only when mouse clicking. OnEnter is on its own.
|
farmbuyer@69
|
2647 return true
|
farmbuyer@69
|
2648 end
|
farmbuyer@69
|
2649 end
|
farmbuyer@69
|
2650
|
farmbuyer@69
|
2651 local function eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2652 if data.all_done then
|
farmbuyer@69
|
2653 data.display:Hide()
|
farmbuyer@73
|
2654 local loot_index = assert(addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes))
|
farmbuyer@69
|
2655 local entry = tremove(g_loot,loot_index)
|
farmbuyer@129
|
2656 g_dloot:insert (data.rowindex, entry)
|
farmbuyer@69
|
2657 addon:_fill_out_eoi_data(data.rowindex)
|
farmbuyer@69
|
2658 addon:BuildMainDisplay()
|
farmbuyer@79
|
2659 local clicky = _new_rebroadcast_hyperlink (entry.unique)
|
farmbuyer@103
|
2660 local jumpprefix = addon.chatprefix ("GoToLootLine", data.rowindex)
|
farmbuyer@69
|
2661 dialog.data = nil
|
farmbuyer@103
|
2662 addon:PCFPrint (_G.DEFAULT_CHAT_FRAME, jumpprefix,
|
farmbuyer@103
|
2663 "Inserted %s %s at entry %d. %s",
|
farmbuyer@78
|
2664 data.kind, data.name, data.rowindex, tostring(clicky))
|
farmbuyer@69
|
2665 return
|
farmbuyer@69
|
2666 end
|
farmbuyer@69
|
2667
|
farmbuyer@69
|
2668 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2669
|
farmbuyer@69
|
2670 -- third click
|
farmbuyer@69
|
2671 if data.name and data.recipient and text then
|
farmbuyer@69
|
2672 data.notes = (text ~= "<none>") and text or nil
|
farmbuyer@69
|
2673 data.all_done = true
|
farmbuyer@69
|
2674 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2675 end
|
farmbuyer@69
|
2676
|
farmbuyer@69
|
2677 -- second click
|
farmbuyer@69
|
2678 if data.name and text then
|
farmbuyer@69
|
2679 data.recipient = text
|
farmbuyer@69
|
2680 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
|
farmbuyer@69
|
2681 getnotes.data = data
|
farmbuyer@69
|
2682 getnotes.editBox:SetText("<none>")
|
farmbuyer@69
|
2683 getnotes.editBox:HighlightText()
|
farmbuyer@69
|
2684 return true
|
farmbuyer@69
|
2685 end
|
farmbuyer@69
|
2686
|
farmbuyer@69
|
2687 -- first click
|
farmbuyer@69
|
2688 if text then
|
farmbuyer@69
|
2689 data.name = text
|
farmbuyer@69
|
2690 dialog:Hide() -- technically a "different" one about to be shown
|
farmbuyer@78
|
2691 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams =
|
farmbuyer@93
|
2692 AUTOCOMPLETE_LIST_TEMPLATES[IsInRaid() and "IN_GROUP" or "IN_GUILD"]
|
farmbuyer@69
|
2693 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
|
farmbuyer@78
|
2694 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams = nil
|
farmbuyer@69
|
2695 getrecipient.data = data
|
farmbuyer@69
|
2696 getrecipient.editBox:SetText("")
|
farmbuyer@69
|
2697 return true
|
farmbuyer@69
|
2698 end
|
farmbuyer@69
|
2699 end
|
farmbuyer@69
|
2700
|
farmbuyer@69
|
2701 local function eoi_st_insert_OnAccept (dialog, data)
|
farmbuyer@69
|
2702 if data.kind == 'boss' then
|
farmbuyer@69
|
2703 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2704 elseif data.kind == 'loot' then
|
farmbuyer@69
|
2705 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2706 end
|
farmbuyer@69
|
2707 end
|
farmbuyer@69
|
2708
|
farmbuyer@1
|
2709 -- The data member here is a table built with:
|
farmbuyer@1
|
2710 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
|
farmbuyer@1
|
2711 do
|
farmbuyer@1
|
2712 local t = flib.StaticPopup{
|
farmbuyer@75
|
2713 text = "Enter name of new %s, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@75
|
2714 button1 = CONTINUE.." ->",
|
farmbuyer@1
|
2715 button2 = CANCEL,
|
farmbuyer@1
|
2716 hasEditBox = true,
|
farmbuyer@16
|
2717 editBoxWidth = 350,
|
farmbuyer@1
|
2718 maxLetters = 50,
|
farmbuyer@1
|
2719 noCancelOnReuse = true,
|
farmbuyer@1
|
2720 }
|
farmbuyer@1
|
2721 t.EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@39
|
2722 if editbox:GetText() == "" then return end
|
farmbuyer@1
|
2723 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2724 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
|
farmbuyer@1
|
2725 dialog:Hide() -- replicate OnAccept click behavior
|
farmbuyer@1
|
2726 end
|
farmbuyer@1
|
2727 end
|
farmbuyer@1
|
2728 t.enterClicksFirstButton = nil -- no effect with editbox focused
|
farmbuyer@1
|
2729 t.OnAccept = eoi_st_insert_OnAccept
|
farmbuyer@1
|
2730 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
|
farmbuyer@1
|
2731
|
farmbuyer@69
|
2732 -- This seems to be gratuitous use of metatables, really.
|
farmbuyer@1
|
2733 local OEIL = {
|
farmbuyer@75
|
2734 text = "Paste the new item into here, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@1
|
2735 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
|
farmbuyer@1
|
2736 }
|
farmbuyer@1
|
2737 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
|
farmbuyer@1
|
2738
|
farmbuyer@1
|
2739 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
|
farmbuyer@1
|
2740 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
|
farmbuyer@1
|
2741 if dialogname then
|
farmbuyer@16
|
2742 _G[dialogname.."EditBox"]:SetText(link)
|
farmbuyer@1
|
2743 return true
|
farmbuyer@1
|
2744 end
|
farmbuyer@1
|
2745 end)
|
farmbuyer@69
|
2746
|
farmbuyer@69
|
2747 t = flib.StaticPopup{
|
farmbuyer@69
|
2748 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@69
|
2749 text = "Include a snapshot of the " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@77
|
2750 .. "CURRENT|r raid?|n|nClicking '" .. YES .. "' will allow this entry to "
|
farmbuyer@69
|
2751 .. "appear in attendance lists, but with the roster as it is NOW, not as it "
|
farmbuyer@69
|
2752 .. "was THEN. Clicking '" .. NO .."' means this kill cannot be included in "
|
farmbuyer@77
|
2753 .. "attendance.|n|n(Enter = '" .. YES .."', Escape = '" .. CANCEL .. "')",
|
farmbuyer@69
|
2754 button1 = YES, -- "accept", left
|
farmbuyer@69
|
2755 button2 = NO, -- "cancel", middle
|
farmbuyer@69
|
2756 button3 = CANCEL, -- "alt", right
|
farmbuyer@69
|
2757 }
|
farmbuyer@69
|
2758 -- Hitting Escape still hides the frame, but doesn't run OnCancel (which
|
farmbuyer@69
|
2759 -- is for the "No" button, not the "Cancel"/OnAlt button). Dizzy yet?
|
farmbuyer@69
|
2760 t.noCancelOnEscape = true
|
farmbuyer@69
|
2761 t.OnAccept = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2762 t.OnCancel = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2763 StaticPopupDialogs["OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP"] = t
|
farmbuyer@1
|
2764 end
|
farmbuyer@1
|
2765
|
farmbuyer@1
|
2766 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
|
farmbuyer@1
|
2767 text = "Enter the player name:",
|
farmbuyer@1
|
2768 button1 = ACCEPT,
|
farmbuyer@1
|
2769 button2 = CANCEL,
|
farmbuyer@1
|
2770 hasEditBox = true,
|
farmbuyer@1
|
2771 OnAccept = function(dialog, data)
|
farmbuyer@1
|
2772 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@81
|
2773 addon:reassign_loot ("local", data.index, name)
|
farmbuyer@95
|
2774 gui.eoiST:OuroLoot_Refresh(data.index)
|
farmbuyer@1
|
2775 end,
|
farmbuyer@1
|
2776 }
|
farmbuyer@1
|
2777
|
farmbuyer@1
|
2778 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
|
farmbuyer@1
|
2779 text = "Enter a name for the loot collection:",
|
farmbuyer@1
|
2780 button1 = ACCEPT,
|
farmbuyer@1
|
2781 button2 = CANCEL,
|
farmbuyer@1
|
2782 hasEditBox = true,
|
farmbuyer@1
|
2783 maxLetters = 30,
|
farmbuyer@1
|
2784 OnAccept = function(dialog)--, data)
|
farmbuyer@1
|
2785 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@1
|
2786 addon:save_saveas(name)
|
farmbuyer@1
|
2787 addon:BuildMainDisplay()
|
farmbuyer@1
|
2788 end,
|
farmbuyer@1
|
2789 OnCancel = function(dialog)--, data, reason)
|
farmbuyer@1
|
2790 addon:BuildMainDisplay()
|
farmbuyer@1
|
2791 end,
|
farmbuyer@1
|
2792 }
|
farmbuyer@1
|
2793
|
farmbuyer@25
|
2794
|
farmbuyer@25
|
2795 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
|
farmbuyer@25
|
2796 if true then
|
farmbuyer@25
|
2797 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
|
farmbuyer@25
|
2798 -- tagged with CHANGE.
|
farmbuyer@25
|
2799 local function onenter (self, motion)
|
farmbuyer@25
|
2800 if ( self.hasArrow ) then
|
farmbuyer@25
|
2801 local level = self:GetParent():GetID() + 1;
|
farmbuyer@25
|
2802 local listFrame = _G["DropDownList"..level];
|
farmbuyer@25
|
2803 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
|
farmbuyer@25
|
2804 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
|
farmbuyer@25
|
2805 end
|
farmbuyer@25
|
2806 else
|
farmbuyer@25
|
2807 CloseDropDownMenus(self:GetParent():GetID() + 1);
|
farmbuyer@25
|
2808 end
|
farmbuyer@25
|
2809 _G[self:GetName().."Highlight"]:Show();
|
farmbuyer@25
|
2810 UIDropDownMenu_StopCounting(self:GetParent());
|
farmbuyer@25
|
2811 if ( self.tooltipTitle ) then
|
farmbuyer@25
|
2812 if ( self.tooltipOnButton ) then
|
farmbuyer@25
|
2813 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
farmbuyer@25
|
2814 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
|
farmbuyer@25
|
2815 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
|
farmbuyer@25
|
2816 GameTooltip:Show();
|
farmbuyer@25
|
2817 else
|
farmbuyer@25
|
2818 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
|
farmbuyer@25
|
2819 end
|
farmbuyer@25
|
2820 end
|
farmbuyer@25
|
2821 end
|
farmbuyer@25
|
2822 -- end verbatime copy
|
farmbuyer@25
|
2823
|
farmbuyer@25
|
2824 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
|
farmbuyer@25
|
2825 local list = _G["DropDownList"..i]
|
farmbuyer@25
|
2826 if list then
|
farmbuyer@25
|
2827 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
|
farmbuyer@25
|
2828 local button = _G["DropDownList"..i.."Button"..j]
|
farmbuyer@25
|
2829 if button then
|
farmbuyer@25
|
2830 --print("button fixup",i,j)
|
farmbuyer@25
|
2831 button:SetScript("OnEnter",onenter)
|
farmbuyer@25
|
2832 end
|
farmbuyer@25
|
2833 end
|
farmbuyer@25
|
2834 end
|
farmbuyer@25
|
2835 end
|
farmbuyer@25
|
2836 end
|
farmbuyer@25
|
2837
|
farmbuyer@109
|
2838 addon.FILES_LOADED = addon.FILES_LOADED + 1
|
farmbuyer@1
|
2839 -- vim:noet
|