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