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