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