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