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@1
|
2035 single OnUpdate doesn't work either. So for now it's all hardcoded.
|
farmbuyer@1
|
2036
|
farmbuyer@83
|
2037 Using this to determine the actual height of the usable area. (Will
|
farmbuyer@83
|
2038 error until an ST is shown, which only happens if it's tracking, etc.)
|
farmbuyer@83
|
2039 416 pixels
|
farmbuyer@1
|
2040 if group == "eoi" then
|
farmbuyer@1
|
2041 local stframe = tabs.children[1].frame
|
farmbuyer@1
|
2042 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
|
farmbuyer@1
|
2043 stframe:GetTop()-stframe:GetBottom())
|
farmbuyer@1
|
2044 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
|
farmbuyer@1
|
2045 stframe:GetRight()-stframe:GetLeft())
|
farmbuyer@1
|
2046 end
|
farmbuyer@1
|
2047 ]====]
|
farmbuyer@1
|
2048 end
|
farmbuyer@1
|
2049
|
farmbuyer@1
|
2050 --[[
|
farmbuyer@1
|
2051 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2052 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2053 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2054 ]]
|
farmbuyer@83
|
2055 function mkbutton (opt_widget_type, opt_key, label, status)
|
farmbuyer@83
|
2056 if not label then
|
farmbuyer@83
|
2057 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
|
farmbuyer@83
|
2058 elseif not status then
|
farmbuyer@83
|
2059 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
|
farmbuyer@1
|
2060 end
|
farmbuyer@95
|
2061 local button = assert(AceGUI:Create(opt_widget_type))
|
farmbuyer@83
|
2062 if button.SetText then button:SetText(tostring(label)) end
|
farmbuyer@83
|
2063 status = _markup(status)
|
farmbuyer@83
|
2064 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
|
farmbuyer@83
|
2065 button:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@83
|
2066 -- retrieval key may be specified as nil if all the parameters are given
|
farmbuyer@83
|
2067 if opt_key then _d:SetUserData (opt_key, button) end
|
farmbuyer@83
|
2068 return button
|
farmbuyer@1
|
2069 end
|
farmbuyer@96
|
2070 gui.mkbutton = mkbutton
|
farmbuyer@1
|
2071
|
farmbuyer@1
|
2072 --[[
|
farmbuyer@125
|
2073 Creates the main window. Can jump directly to a tab (and feed it CLI
|
farmbuyer@125
|
2074 routine arguments), if given the appropriate tab code.
|
farmbuyer@1
|
2075 ]]
|
farmbuyer@125
|
2076 function addon:BuildMainDisplay (opt_tabselect, opt_tabselect_CLI_arg)
|
farmbuyer@1
|
2077 if self.display then
|
farmbuyer@1
|
2078 -- try to get everything to update, rebuild, refresh... ugh, no
|
farmbuyer@1
|
2079 self.display:Hide()
|
farmbuyer@1
|
2080 end
|
farmbuyer@92
|
2081 if self.NOLOAD then
|
farmbuyer@92
|
2082 -- don't even try
|
farmbuyer@92
|
2083 return
|
farmbuyer@92
|
2084 end
|
farmbuyer@1
|
2085
|
farmbuyer@25
|
2086 -- This probably causes taint... hm.
|
farmbuyer@25
|
2087 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
|
farmbuyer@25
|
2088 UIDROPDOWNMENU_SHOW_TIME = 4
|
farmbuyer@25
|
2089
|
farmbuyer@47
|
2090 if dirty_tabs then
|
farmbuyer@84
|
2091 -- pointers known to be good by now, pass them back in
|
farmbuyer@84
|
2092 self:gui_init (g_loot, g_uniques)
|
farmbuyer@47
|
2093 self:zero_printed_fenceposts()
|
farmbuyer@47
|
2094 end
|
farmbuyer@97
|
2095 gui.opts = self.db.profile
|
farmbuyer@47
|
2096
|
farmbuyer@95
|
2097 local display = AceGUI:Create("Frame")
|
farmbuyer@1
|
2098 _d = display
|
farmbuyer@1
|
2099 self.display = display
|
farmbuyer@17
|
2100 display:SetTitle(window_title)
|
farmbuyer@1
|
2101 display:SetStatusText(self.status_text)
|
farmbuyer@1
|
2102 display:SetLayout("Flow")
|
farmbuyer@16
|
2103 display:SetStatusTable{width=900,height=550} -- default height is 500
|
farmbuyer@47
|
2104 display:EnableResize(false)
|
farmbuyer@96
|
2105 display:SetUserData("GUI state",gui)
|
farmbuyer@1
|
2106 display:SetCallback("OnClose", function(_display)
|
farmbuyer@25
|
2107 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
|
farmbuyer@83
|
2108 hide_noobtips_frame()
|
farmbuyer@95
|
2109 _d = nil
|
farmbuyer@1
|
2110 self.display = nil
|
farmbuyer@95
|
2111 AceGUI:Release(_display)
|
farmbuyer@6
|
2112 flib.clear()
|
farmbuyer@1
|
2113 collectgarbage()
|
farmbuyer@1
|
2114 end)
|
farmbuyer@1
|
2115
|
farmbuyer@1
|
2116 ----- Right-hand panel
|
farmbuyer@1
|
2117 local rhs_width = 0.20
|
farmbuyer@95
|
2118 local control = AceGUI:Create("SimpleGroup")
|
farmbuyer@1
|
2119 control:SetLayout("Flow")
|
farmbuyer@1
|
2120 control:SetRelativeWidth(rhs_width)
|
farmbuyer@1
|
2121 control.alignoffset = 25
|
farmbuyer@1
|
2122 control:PauseLayout()
|
farmbuyer@1
|
2123 local h,b
|
farmbuyer@1
|
2124
|
farmbuyer@1
|
2125 --- Main ---
|
farmbuyer@95
|
2126 h = AceGUI:Create("Heading")
|
farmbuyer@1
|
2127 h:SetFullWidth(true)
|
farmbuyer@1
|
2128 h:SetText("Main")
|
farmbuyer@1
|
2129 control:AddChild(h)
|
farmbuyer@1
|
2130
|
farmbuyer@1
|
2131 do
|
farmbuyer@1
|
2132 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
2133 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
|
farmbuyer@1
|
2134 b:SetFullWidth(true)
|
farmbuyer@1
|
2135 b:SetLabel("On/Off:")
|
farmbuyer@1
|
2136 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
|
farmbuyer@1
|
2137 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
|
farmbuyer@1
|
2138 b:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@1
|
2139 if choice == 1 then self:Activate()
|
farmbuyer@1
|
2140 elseif choice == 2 then self:Activate(nil,true)
|
farmbuyer@1
|
2141 else self:Deactivate()
|
farmbuyer@1
|
2142 end
|
farmbuyer@1
|
2143 _w = display:GetUserData('comm_ident')
|
farmbuyer@1
|
2144 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2145 _w:SetDisabled(self.enabled or self.rebroadcast)
|
farmbuyer@1
|
2146 end
|
farmbuyer@1
|
2147 _w = display:GetUserData('eoi_bcast_req')
|
farmbuyer@1
|
2148 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2149 _w:SetDisabled(not self.enabled)
|
farmbuyer@1
|
2150 end
|
farmbuyer@1
|
2151 end)
|
farmbuyer@1
|
2152 control:AddChild(b)
|
farmbuyer@1
|
2153 end
|
farmbuyer@1
|
2154
|
farmbuyer@1
|
2155 b = mkbutton("Dropdown", 'threshold', "",
|
farmbuyer@1
|
2156 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
|
farmbuyer@1
|
2157 b:SetFullWidth(true)
|
farmbuyer@1
|
2158 b:SetLabel("Threshold:")
|
farmbuyer@1
|
2159 b:SetList(self.thresholds)
|
farmbuyer@1
|
2160 b:SetValue(self.threshold)
|
farmbuyer@1
|
2161 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
2162 self:SetThreshold(choice)
|
farmbuyer@1
|
2163 end)
|
farmbuyer@1
|
2164 control:AddChild(b)
|
farmbuyer@1
|
2165
|
farmbuyer@4
|
2166 b = mkbutton("Clear Loot",
|
farmbuyer@1
|
2167 [[+Erases> all current loot information and generated text (but not saved texts).]])
|
farmbuyer@1
|
2168 b:SetFullWidth(true)
|
farmbuyer@1
|
2169 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2170 StaticPopup_Show("OUROL_CLEAR").data = self
|
farmbuyer@1
|
2171 end)
|
farmbuyer@1
|
2172 control:AddChild(b)
|
farmbuyer@1
|
2173
|
farmbuyer@95
|
2174 b = AceGUI:Create("Spacer")
|
farmbuyer@1
|
2175 b:SetFullWidth(true)
|
farmbuyer@16
|
2176 b:SetHeight(10)
|
farmbuyer@1
|
2177 control:AddChild(b)
|
farmbuyer@1
|
2178
|
farmbuyer@1
|
2179 --[[
|
farmbuyer@1
|
2180 --- Saved Texts ---
|
farmbuyer@1
|
2181 [ Save Current As... ]
|
farmbuyer@1
|
2182 saved1
|
farmbuyer@1
|
2183 saved2
|
farmbuyer@1
|
2184 ...
|
farmbuyer@1
|
2185 [ Load ] [ Delete ]
|
farmbuyer@1
|
2186 ]]
|
farmbuyer@95
|
2187 h = AceGUI:Create("Heading")
|
farmbuyer@1
|
2188 h:SetFullWidth(true)
|
farmbuyer@1
|
2189 h:SetText("Saved Texts")
|
farmbuyer@1
|
2190 control:AddChild(h)
|
farmbuyer@1
|
2191 b = mkbutton("Save Current As...",
|
farmbuyer@1
|
2192 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
|
farmbuyer@1
|
2193 b:SetFullWidth(true)
|
farmbuyer@1
|
2194 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2195 StaticPopup_Show "OUROL_SAVE_SAVEAS"
|
farmbuyer@1
|
2196 _d:Hide()
|
farmbuyer@1
|
2197 end)
|
farmbuyer@1
|
2198 control:AddChild(b)
|
farmbuyer@1
|
2199
|
farmbuyer@16
|
2200 do
|
farmbuyer@95
|
2201 local scontainer = AceGUI:Create("SimpleGroup")
|
farmbuyer@16
|
2202 scontainer:SetFullWidth(true)
|
farmbuyer@16
|
2203 scontainer:SetFullHeight(false)
|
farmbuyer@16
|
2204 scontainer:SetAutoAdjustHeight(false)
|
farmbuyer@16
|
2205 scontainer:SetHeight(40) -- no relative height available anymore
|
farmbuyer@16
|
2206 scontainer:SetLayout("Fill")
|
farmbuyer@95
|
2207 local scroll = AceGUI:Create("ScrollFrame")
|
farmbuyer@16
|
2208 scroll:SetLayout("List")
|
farmbuyer@16
|
2209 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
|
farmbuyer@16
|
2210 if saved then for i,s in ipairs(saved) do
|
farmbuyer@95
|
2211 local il = AceGUI:Create("InteractiveLabel")
|
farmbuyer@16
|
2212 il:SetFullWidth(true)
|
farmbuyer@16
|
2213 il:SetText(s.name)
|
farmbuyer@16
|
2214 il:SetUserData("num",i)
|
farmbuyer@16
|
2215 il:SetHighlight(1,1,1,0.4)
|
farmbuyer@16
|
2216 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
|
farmbuyer@16
|
2217 il:SetCallback("OnEnter", function() setstatus(str) end)
|
farmbuyer@16
|
2218 il:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@16
|
2219 il:SetCallback("OnClick", function(_il)
|
farmbuyer@16
|
2220 local prev = _d:GetUserData("saved selection")
|
farmbuyer@16
|
2221 if prev then
|
farmbuyer@16
|
2222 prev.highlight:Hide()
|
farmbuyer@16
|
2223 prev:SetColor()
|
farmbuyer@16
|
2224 end
|
farmbuyer@16
|
2225 _il:SetColor(0,1,0)
|
farmbuyer@16
|
2226 _il.highlight:Show()
|
farmbuyer@16
|
2227 _d:SetUserData("saved selection",_il)
|
farmbuyer@16
|
2228 _d:GetUserData("Load"):SetDisabled(false)
|
farmbuyer@16
|
2229 _d:GetUserData("Delete"):SetDisabled(false)
|
farmbuyer@16
|
2230 end)
|
farmbuyer@16
|
2231 scroll:AddChild(il)
|
farmbuyer@16
|
2232 end end
|
farmbuyer@16
|
2233 scontainer:AddChild(scroll)
|
farmbuyer@16
|
2234 control:AddChild(scontainer)
|
farmbuyer@16
|
2235 end
|
farmbuyer@1
|
2236
|
farmbuyer@1
|
2237 b = mkbutton("Load",
|
farmbuyer@1
|
2238 [[Load previously saved text. +REPLACES> all current loot information!]])
|
farmbuyer@1
|
2239 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2240 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2241 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2242 self:save_restore(num)
|
farmbuyer@1
|
2243 self:BuildMainDisplay()
|
farmbuyer@1
|
2244 end)
|
farmbuyer@1
|
2245 b:SetDisabled(true)
|
farmbuyer@1
|
2246 control:AddChild(b)
|
farmbuyer@1
|
2247 b = mkbutton("Delete",
|
farmbuyer@1
|
2248 [[Delete previously saved text.]])
|
farmbuyer@1
|
2249 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2250 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2251 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2252 self:save_delete(num)
|
farmbuyer@1
|
2253 self:BuildMainDisplay()
|
farmbuyer@1
|
2254 end)
|
farmbuyer@1
|
2255 b:SetDisabled(true)
|
farmbuyer@1
|
2256 control:AddChild(b)
|
farmbuyer@1
|
2257
|
farmbuyer@95
|
2258 b = AceGUI:Create("Spacer")
|
farmbuyer@1
|
2259 b:SetFullWidth(true)
|
farmbuyer@16
|
2260 b:SetHeight(10)
|
farmbuyer@1
|
2261 control:AddChild(b)
|
farmbuyer@1
|
2262
|
farmbuyer@1
|
2263 -- Other stuff on right-hand side
|
farmbuyer@95
|
2264 local tab_specials = AceGUI:Create("SimpleGroup")
|
farmbuyer@1
|
2265 tab_specials:SetLayout("Flow")
|
farmbuyer@1
|
2266 tab_specials:SetFullWidth(true)
|
farmbuyer@1
|
2267 control:AddChild(tab_specials)
|
farmbuyer@1
|
2268 control:ResumeLayout()
|
farmbuyer@1
|
2269
|
farmbuyer@1
|
2270 ----- Left-hand group
|
farmbuyer@95
|
2271 local tabs = AceGUI:Create("TabGroup")
|
farmbuyer@1
|
2272 tabs:SetLayout("Flow")
|
farmbuyer@1
|
2273 tabs.alignoffset = 25
|
farmbuyer@49
|
2274 local titletext_orig_fo = tabs.titletext:GetFontObject()
|
farmbuyer@49
|
2275 tabs.titletext:SetFontObject(GameFontNormalSmall)
|
farmbuyer@49
|
2276 tabs:SetCallback("OnRelease", function(_tabs)
|
farmbuyer@49
|
2277 tabs.titletext:SetFontObject(titletext_orig_fo)
|
farmbuyer@49
|
2278 end)
|
farmbuyer@1
|
2279 tabs:SetRelativeWidth(0.99-rhs_width)
|
farmbuyer@1
|
2280 tabs:SetFullHeight(true)
|
farmbuyer@1
|
2281 tabs:SetTabs(tabgroup_tabs)
|
farmbuyer@1
|
2282 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
|
farmbuyer@1
|
2283 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
|
farmbuyer@95
|
2284 setstatus(gui.tabtexts[value].desc)
|
farmbuyer@1
|
2285 end)
|
farmbuyer@1
|
2286 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
|
farmbuyer@1
|
2287 tabs:SetUserData("special buttons group",tab_specials)
|
farmbuyer@125
|
2288
|
farmbuyer@125
|
2289 local whichtab, tabargs = "eoi"
|
farmbuyer@125
|
2290 if opt_tabselect and #opt_tabselect > 0 then
|
farmbuyer@125
|
2291 whichtab, tabargs = opt_tabselect, opt_tabselect_CLI_arg
|
farmbuyer@125
|
2292 end
|
farmbuyer@125
|
2293 tabs:SelectTab(whichtab)
|
farmbuyer@1
|
2294
|
farmbuyer@1
|
2295 display:AddChildren (tabs, control)
|
farmbuyer@1
|
2296 display:ApplyStatus()
|
farmbuyer@125
|
2297 display:Show() -- without this, only appears every *other* function call
|
farmbuyer@1
|
2298
|
farmbuyer@125
|
2299 if tabargs and tabs_CLI_special[whichtab] then
|
farmbuyer@125
|
2300 tabs_CLI_special[whichtab](tabargs)
|
farmbuyer@125
|
2301 end
|
farmbuyer@1
|
2302 return display
|
farmbuyer@1
|
2303 end
|
farmbuyer@1
|
2304
|
farmbuyer@125
|
2305 -- Searches tab title texts from left to right.
|
farmbuyer@88
|
2306 function addon:OpenMainDisplayToTab (text, opt_arg)
|
farmbuyer@44
|
2307 text = '^'..text:lower()
|
farmbuyer@95
|
2308 for _,tab in ipairs(gui.taborder) do
|
farmbuyer@95
|
2309 local v = gui.tabtexts[tab]
|
farmbuyer@95
|
2310 if v and v.title:lower():find(text) then
|
farmbuyer@125
|
2311 self:BuildMainDisplay (tab, opt_arg)
|
farmbuyer@1
|
2312 return true
|
farmbuyer@1
|
2313 end
|
farmbuyer@1
|
2314 end
|
farmbuyer@1
|
2315 end
|
farmbuyer@1
|
2316
|
farmbuyer@1
|
2317 -- Essentially a re-click on the current tab (if the current tab were clickable).
|
farmbuyer@1
|
2318 function addon:redisplay ()
|
farmbuyer@1
|
2319 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
|
farmbuyer@1
|
2320 end
|
farmbuyer@1
|
2321
|
farmbuyer@103
|
2322 function addon:GoToLootLine (line)
|
farmbuyer@103
|
2323 local lineno = tonumber(self.lootjumps[line])
|
farmbuyer@103
|
2324 self:OpenMainDisplayToTab ("Loot", lineno)
|
farmbuyer@103
|
2325 end
|
farmbuyer@103
|
2326
|
farmbuyer@1
|
2327
|
farmbuyer@110
|
2328 -- We need to be able to reference the dropdownmenu locals, and I didn't want to
|
farmbuyer@110
|
2329 -- bubble them up any higher.
|
farmbuyer@110
|
2330 function gui.add_dropdown_entry (menutag, name, func_tbl, func_or_othername, arg, tooltiptext)
|
farmbuyer@110
|
2331 local emtbl = assert(gui.dropdown[menutag])
|
farmbuyer@110
|
2332
|
farmbuyer@110
|
2333 if type(func_tbl) == 'table' then
|
farmbuyer@110
|
2334 -- use it directly
|
farmbuyer@110
|
2335 elseif func_tbl == nil then
|
farmbuyer@110
|
2336 -- determine it from the menu tag
|
farmbuyer@110
|
2337 func_tbl = (menutag:sub(1,3) == 'eoi' and eoi_dropdownfuncs)
|
farmbuyer@110
|
2338 or (menutag:sub(1,4) == 'hist' and hist_dropdownfuncs)
|
farmbuyer@110
|
2339 or error("Cannot figure out function table from menu tag name")
|
farmbuyer@110
|
2340 end
|
farmbuyer@110
|
2341
|
farmbuyer@110
|
2342 if type(func_or_othername) == 'string' then
|
farmbuyer@110
|
2343 -- gen_dd_entry handles this
|
farmbuyer@110
|
2344 elseif type(func_or_othername) == 'function' then
|
farmbuyer@110
|
2345 error"bah"
|
farmbuyer@110
|
2346 end
|
farmbuyer@110
|
2347
|
farmbuyer@110
|
2348 local index
|
farmbuyer@110
|
2349 if menutag == 'eoi_loot' then
|
farmbuyer@110
|
2350 index = 2
|
farmbuyer@110
|
2351 elseif menutag == 'eoi_player' then
|
farmbuyer@110
|
2352 index = 3
|
farmbuyer@110
|
2353 else
|
farmbuyer@110
|
2354 index = 2
|
farmbuyer@110
|
2355 end
|
farmbuyer@110
|
2356
|
farmbuyer@110
|
2357 local ent = gen_dd_entry (name, func_tbl, func_or_othername, arg, tooltiptext)
|
farmbuyer@110
|
2358 tinsert (emtbl, index, ent)
|
farmbuyer@110
|
2359 return ent
|
farmbuyer@110
|
2360 end
|
farmbuyer@110
|
2361
|
farmbuyer@110
|
2362
|
farmbuyer@1
|
2363 ------ Popup dialogs
|
farmbuyer@75
|
2364 local function build_my_slider_widget()
|
farmbuyer@75
|
2365 local s = CreateFrame("Slider", "OuroLootSlider", nil, "OptionsSliderTemplate")
|
farmbuyer@75
|
2366 s.text = OuroLootSliderText
|
farmbuyer@75
|
2367 s.low = OuroLootSliderLow
|
farmbuyer@75
|
2368 s.high = OuroLootSliderHigh
|
farmbuyer@75
|
2369 s:SetScript("OnValueChanged", function (_s, value)
|
farmbuyer@75
|
2370 _s.value = value -- conveniently, this is already of numeric type
|
farmbuyer@75
|
2371 --_s.text:SetText(tostring(value))
|
farmbuyer@75
|
2372 if _s.DoOnValueChanged then
|
farmbuyer@75
|
2373 _s:DoOnValueChanged()
|
farmbuyer@75
|
2374 end
|
farmbuyer@75
|
2375 end)
|
farmbuyer@75
|
2376 build_my_slider_widget = nil
|
farmbuyer@75
|
2377 return s
|
farmbuyer@75
|
2378 end
|
farmbuyer@75
|
2379
|
farmbuyer@1
|
2380 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
|
farmbuyer@1
|
2381 text = "Clear current loot information and text?",
|
farmbuyer@16
|
2382 button1 = YES,
|
farmbuyer@16
|
2383 button2 = NO,
|
farmbuyer@1
|
2384 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2385 addon:Clear(--[[verbose_p=]]true)
|
farmbuyer@1
|
2386 end,
|
farmbuyer@1
|
2387 }
|
farmbuyer@1
|
2388
|
farmbuyer@37
|
2389 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2390 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2391 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@125
|
2392 .. "%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
|
2393 button1 = YES,
|
farmbuyer@37
|
2394 button2 = NO,
|
farmbuyer@37
|
2395 OnAccept = function (dialog, addon, data2)
|
farmbuyer@37
|
2396 data2(addon)
|
farmbuyer@37
|
2397 addon:Print("%s history has been regenerated.", addon.history.realm)
|
farmbuyer@37
|
2398 addon:redisplay()
|
farmbuyer@37
|
2399 end,
|
farmbuyer@37
|
2400 }
|
farmbuyer@37
|
2401
|
farmbuyer@16
|
2402 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
|
farmbuyer@37
|
2403 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2404 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2405 button1 = YES,
|
farmbuyer@16
|
2406 button2 = NO,
|
farmbuyer@16
|
2407 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2408 data2(addon)
|
farmbuyer@16
|
2409 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
|
farmbuyer@16
|
2410 addon:redisplay()
|
farmbuyer@16
|
2411 end,
|
farmbuyer@16
|
2412 }
|
farmbuyer@16
|
2413
|
farmbuyer@16
|
2414 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2415 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2416 text = "This will erase all but the latest "
|
farmbuyer@75
|
2417 .. ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
|
farmbuyer@75
|
2418 .. "%s|r for each player on "
|
farmbuyer@75
|
2419 .. ITEM_QUALITY_COLORS[5].hex .. "%s|r. " .. CONTINUE .. "?",
|
farmbuyer@16
|
2420 button1 = YES,
|
farmbuyer@16
|
2421 button2 = NO,
|
farmbuyer@75
|
2422 OnShow = function (dialog, addon)
|
farmbuyer@75
|
2423 local thistable = StaticPopupDialogs[dialog.which]
|
farmbuyer@75
|
2424 -- StaticPopup_Resize does not take extraFrame into account, so we
|
farmbuyer@89
|
2425 -- monkeypatch the sizing method that _Resize calls at the end.
|
farmbuyer@75
|
2426 dialog.saved_setheight = dialog.SetHeight
|
farmbuyer@75
|
2427 dialog.SetHeight = function (d, h)
|
farmbuyer@75
|
2428 return d.saved_setheight(d,h+35)
|
farmbuyer@75
|
2429 end
|
farmbuyer@75
|
2430 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2431 dialog.extraFrame:SetPoint("TOP", dialog.text, "BOTTOM")
|
farmbuyer@75
|
2432 dialog.extraFrame:SetWidth(150)
|
farmbuyer@75
|
2433 dialog.extraFrame:SetHeight(35)
|
farmbuyer@75
|
2434 dialog.extraFrame:Show()
|
farmbuyer@75
|
2435 local slider = _G.OuroLootSlider or build_my_slider_widget()
|
farmbuyer@75
|
2436 slider.DoOnValueChanged = function(s)
|
farmbuyer@75
|
2437 dialog.text:SetFormattedText (thistable.text,
|
farmbuyer@75
|
2438 s.value == 1 and "single entry" or (s.value .. " entries"),
|
farmbuyer@75
|
2439 addon.history.realm)
|
farmbuyer@75
|
2440 StaticPopup_Resize (dialog, "OUROL_HIST_PREEN")
|
farmbuyer@75
|
2441 end
|
farmbuyer@75
|
2442 slider:SetOrientation('HORIZONTAL')
|
farmbuyer@75
|
2443 slider:SetMinMaxValues(1,30)
|
farmbuyer@75
|
2444 slider:SetValueStep(1)
|
farmbuyer@75
|
2445 slider.low:SetText("1")
|
farmbuyer@75
|
2446 slider.high:SetText("30")
|
farmbuyer@75
|
2447 --slider.tooltipText = ???
|
farmbuyer@75
|
2448 slider:SetParent(dialog.extraFrame)
|
farmbuyer@75
|
2449 slider:ClearAllPoints()
|
farmbuyer@75
|
2450 slider:SetPoint("TOPLEFT",dialog.extraFrame,"TOPLEFT",0, -15)
|
farmbuyer@75
|
2451 slider:SetPoint("BOTTOMRIGHT",dialog.extraFrame,"BOTTOMRIGHT",0, 0)
|
farmbuyer@75
|
2452 slider:Show()
|
farmbuyer@75
|
2453 -- This causes OnValueChanged to fire, reformatting the text. Except
|
farmbuyer@75
|
2454 -- IF the slider has already been shown, and IF at the time it was hidden
|
farmbuyer@75
|
2455 -- it had the same value here, THEN there is technically no "change"
|
farmbuyer@75
|
2456 -- and no event is fired. We work around this clever optimization by
|
farmbuyer@75
|
2457 -- doing a pair of set's, forcing the last one to fire OVC.
|
farmbuyer@75
|
2458 slider:SetValue(1)
|
farmbuyer@75
|
2459 slider:SetValue(5)
|
farmbuyer@75
|
2460 end,
|
farmbuyer@75
|
2461 OnAccept = function (dialog, addon, callback)
|
farmbuyer@75
|
2462 local howmany = assert(tonumber(_G.OuroLootSlider.value))
|
farmbuyer@75
|
2463 callback (addon, howmany)
|
farmbuyer@75
|
2464 addon:Print("All loot prior to the most recent %d |4entry:entries; has been erased.", howmany)
|
farmbuyer@16
|
2465 addon:redisplay()
|
farmbuyer@16
|
2466 end,
|
farmbuyer@75
|
2467 OnHide = function (dialog, addon)
|
farmbuyer@75
|
2468 dialog.SetHeight = nil
|
farmbuyer@75
|
2469 dialog.saved_setheight = nil
|
farmbuyer@75
|
2470 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2471 _G.OuroLootSlider:Hide() -- parent is hidden, why is this required?
|
farmbuyer@75
|
2472 _G.OuroLootSlider:ClearAllPoints()
|
farmbuyer@75
|
2473 _G.OuroLootSlider:SetParent(nil)
|
farmbuyer@75
|
2474 end,
|
farmbuyer@16
|
2475 }
|
farmbuyer@16
|
2476
|
farmbuyer@27
|
2477 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
|
farmbuyer@27
|
2478 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
|
farmbuyer@27
|
2479 button1 = OKAY,
|
farmbuyer@27
|
2480 timeout = 0,
|
farmbuyer@27
|
2481 whileDead = true,
|
farmbuyer@27
|
2482 hideOnEscape = true,
|
farmbuyer@27
|
2483 enterClicksFirstButton = true,
|
farmbuyer@27
|
2484 hasEditBox = true,
|
farmbuyer@27
|
2485 editBoxWidth = 350,
|
farmbuyer@53
|
2486 preferredIndex = 3,
|
farmbuyer@27
|
2487 OnShow = function (dialog, url)
|
farmbuyer@27
|
2488 dialog.editBox:SetText(url)
|
farmbuyer@27
|
2489 dialog.editBox:SetFocus()
|
farmbuyer@27
|
2490 dialog.editBox:HighlightText()
|
farmbuyer@27
|
2491 end,
|
farmbuyer@27
|
2492 }
|
farmbuyer@27
|
2493
|
farmbuyer@1
|
2494 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
|
farmbuyer@77
|
2495 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
|
2496 button1 = "Activate recording", -- "accept", left
|
farmbuyer@69
|
2497 button2 = "Broadcast Only", -- "cancel", middle
|
farmbuyer@69
|
2498 button3 = HELP_LABEL, -- "alt", right
|
farmbuyer@1
|
2499 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2500 addon:Activate()
|
farmbuyer@1
|
2501 end,
|
farmbuyer@69
|
2502 noCancelOnEscape = true,
|
farmbuyer@69
|
2503 OnCancel = function (dialog, addon)
|
farmbuyer@1
|
2504 addon:Activate(nil,true)
|
farmbuyer@1
|
2505 end,
|
farmbuyer@69
|
2506 OnAlt = function (dialog, addon)
|
farmbuyer@1
|
2507 -- hitting escape also calls this, but the 3rd arg would be "clicked"
|
farmbuyer@1
|
2508 -- in both cases, not useful here.
|
farmbuyer@89
|
2509 if MouseIsOver(dialog.button3) then
|
farmbuyer@1
|
2510 -- they actually clicked the button (or at least the mouse was over "Help"
|
farmbuyer@1
|
2511 -- when they hit escape... sigh)
|
farmbuyer@1
|
2512 addon:BuildMainDisplay('help')
|
farmbuyer@1
|
2513 else
|
farmbuyer@1
|
2514 addon.popped = true
|
farmbuyer@1
|
2515 end
|
farmbuyer@1
|
2516 end,
|
farmbuyer@1
|
2517 }
|
farmbuyer@1
|
2518
|
farmbuyer@69
|
2519 -- Callback for each Next/Accept stage of inserting a new loot or boss row via
|
farmbuyer@69
|
2520 -- dropdown. Thanks to noCancelOnReuse, each Show done here will technically
|
farmbuyer@69
|
2521 -- Hide and redisplay the same dialog, passing along the same 'data' structure
|
farmbuyer@69
|
2522 -- each time. The topmost call to our OnAccept will then finish by hiding the
|
farmbuyer@69
|
2523 -- (very last) dialog.
|
farmbuyer@69
|
2524 --
|
farmbuyer@116
|
2525 -- This is really, really hideous to read. Maybe increment a 'stage' counter
|
farmbuyer@116
|
2526 -- so the code flows top-down, rather than testing for missing data and going
|
farmbuyer@116
|
2527 -- backwards.
|
farmbuyer@69
|
2528 local function eoi_st_insert_OnAccept_boss (dialog, data, data2)
|
farmbuyer@69
|
2529 if data.all_done then
|
farmbuyer@116
|
2530 -- boss_index will probably be the final entry in the table, but there
|
farmbuyer@116
|
2531 -- might have been real loot happening while the user was typing.
|
farmbuyer@69
|
2532 local boss_index = addon._addBossEntry{
|
farmbuyer@69
|
2533 kind = 'boss',
|
farmbuyer@97
|
2534 bossname = (gui.opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
|
farmbuyer@69
|
2535 reason = 'kill',
|
farmbuyer@69
|
2536 instance = data.instance,
|
farmbuyer@69
|
2537 duration = 0,
|
farmbuyer@69
|
2538 maxsize = data.max_raid_size,
|
farmbuyer@69
|
2539 raidersnap = data.yes_snap or {},
|
farmbuyer@69
|
2540 }
|
farmbuyer@69
|
2541 local entry = tremove(g_loot,boss_index)
|
farmbuyer@69
|
2542 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@69
|
2543 addon:_mark_boss_kill(data.rowindex)
|
farmbuyer@95
|
2544 gui.eoiST:OuroLoot_Refresh(data.rowindex)
|
farmbuyer@103
|
2545 local jumpprefix = addon.chatprefix ("GoToLootLine", data.rowindex)
|
farmbuyer@69
|
2546 dialog.data = nil -- free up memory
|
farmbuyer@103
|
2547 addon:PCFPrint (_G.DEFAULT_CHAT_FRAME, jumpprefix,
|
farmbuyer@103
|
2548 "Inserted %s %s at entry %d.",
|
farmbuyer@103
|
2549 data.kind, data.name, data.rowindex)
|
farmbuyer@69
|
2550 return
|
farmbuyer@69
|
2551 end
|
farmbuyer@69
|
2552
|
farmbuyer@69
|
2553 -- third click
|
farmbuyer@69
|
2554 if data.name and data.instance then
|
farmbuyer@69
|
2555 data.all_done = true
|
farmbuyer@69
|
2556 -- this is how we distinguish OnAccept from OnCancel ("clicked"); the
|
farmbuyer@69
|
2557 -- 3rd param is handled all in StaticPopup_OnClick
|
farmbuyer@69
|
2558 if data2 ~= 'clicked' then
|
farmbuyer@69
|
2559 data.yes_snap = data.maybe_snap
|
farmbuyer@69
|
2560 end
|
farmbuyer@69
|
2561 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2562 end
|
farmbuyer@69
|
2563
|
farmbuyer@69
|
2564 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2565
|
farmbuyer@69
|
2566 -- second click
|
farmbuyer@69
|
2567 if data.name and text then
|
farmbuyer@69
|
2568 data.instance = text
|
farmbuyer@92
|
2569 -- not "reusing" this dialog in the same sense as with loot
|
farmbuyer@69
|
2570 dialog.data = nil
|
farmbuyer@69
|
2571 dialog:Hide()
|
farmbuyer@69
|
2572 local getsnap = StaticPopup_Show("OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP")
|
farmbuyer@69
|
2573 getsnap.data = data
|
farmbuyer@69
|
2574 return true
|
farmbuyer@69
|
2575 end
|
farmbuyer@69
|
2576
|
farmbuyer@69
|
2577 -- first click
|
farmbuyer@69
|
2578 if text then
|
farmbuyer@69
|
2579 data.name = text
|
farmbuyer@69
|
2580 local maybe_instance
|
farmbuyer@69
|
2581 data.maybe_snap, data.max_raid_size, maybe_instance = addon:snapshot_raid()
|
farmbuyer@69
|
2582 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
|
farmbuyer@69
|
2583 getinstance.data = data
|
farmbuyer@69
|
2584 getinstance.editBox:SetText(maybe_instance)
|
farmbuyer@69
|
2585 -- This suppresses auto-hide (which would cause the getinstance dialog
|
farmbuyer@69
|
2586 -- to go away), but only when mouse clicking. OnEnter is on its own.
|
farmbuyer@69
|
2587 return true
|
farmbuyer@69
|
2588 end
|
farmbuyer@69
|
2589 end
|
farmbuyer@69
|
2590
|
farmbuyer@69
|
2591 local function eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2592 if data.all_done then
|
farmbuyer@69
|
2593 data.display:Hide()
|
farmbuyer@73
|
2594 local loot_index = assert(addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes))
|
farmbuyer@69
|
2595 local entry = tremove(g_loot,loot_index)
|
farmbuyer@69
|
2596 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@69
|
2597 addon:_fill_out_eoi_data(data.rowindex)
|
farmbuyer@69
|
2598 addon:BuildMainDisplay()
|
farmbuyer@79
|
2599 local clicky = _new_rebroadcast_hyperlink (entry.unique)
|
farmbuyer@103
|
2600 local jumpprefix = addon.chatprefix ("GoToLootLine", data.rowindex)
|
farmbuyer@69
|
2601 dialog.data = nil
|
farmbuyer@103
|
2602 addon:PCFPrint (_G.DEFAULT_CHAT_FRAME, jumpprefix,
|
farmbuyer@103
|
2603 "Inserted %s %s at entry %d. %s",
|
farmbuyer@78
|
2604 data.kind, data.name, data.rowindex, tostring(clicky))
|
farmbuyer@69
|
2605 return
|
farmbuyer@69
|
2606 end
|
farmbuyer@69
|
2607
|
farmbuyer@69
|
2608 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2609
|
farmbuyer@69
|
2610 -- third click
|
farmbuyer@69
|
2611 if data.name and data.recipient and text then
|
farmbuyer@69
|
2612 data.notes = (text ~= "<none>") and text or nil
|
farmbuyer@69
|
2613 data.all_done = true
|
farmbuyer@69
|
2614 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2615 end
|
farmbuyer@69
|
2616
|
farmbuyer@69
|
2617 -- second click
|
farmbuyer@69
|
2618 if data.name and text then
|
farmbuyer@69
|
2619 data.recipient = text
|
farmbuyer@69
|
2620 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
|
farmbuyer@69
|
2621 getnotes.data = data
|
farmbuyer@69
|
2622 getnotes.editBox:SetText("<none>")
|
farmbuyer@69
|
2623 getnotes.editBox:HighlightText()
|
farmbuyer@69
|
2624 return true
|
farmbuyer@69
|
2625 end
|
farmbuyer@69
|
2626
|
farmbuyer@69
|
2627 -- first click
|
farmbuyer@69
|
2628 if text then
|
farmbuyer@69
|
2629 data.name = text
|
farmbuyer@69
|
2630 dialog:Hide() -- technically a "different" one about to be shown
|
farmbuyer@78
|
2631 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams =
|
farmbuyer@93
|
2632 AUTOCOMPLETE_LIST_TEMPLATES[IsInRaid() and "IN_GROUP" or "IN_GUILD"]
|
farmbuyer@69
|
2633 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
|
farmbuyer@78
|
2634 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams = nil
|
farmbuyer@69
|
2635 getrecipient.data = data
|
farmbuyer@69
|
2636 getrecipient.editBox:SetText("")
|
farmbuyer@69
|
2637 return true
|
farmbuyer@69
|
2638 end
|
farmbuyer@69
|
2639 end
|
farmbuyer@69
|
2640
|
farmbuyer@69
|
2641 local function eoi_st_insert_OnAccept (dialog, data)
|
farmbuyer@69
|
2642 if data.kind == 'boss' then
|
farmbuyer@69
|
2643 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2644 elseif data.kind == 'loot' then
|
farmbuyer@69
|
2645 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2646 end
|
farmbuyer@69
|
2647 end
|
farmbuyer@69
|
2648
|
farmbuyer@1
|
2649 -- The data member here is a table built with:
|
farmbuyer@1
|
2650 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
|
farmbuyer@1
|
2651 do
|
farmbuyer@1
|
2652 local t = flib.StaticPopup{
|
farmbuyer@75
|
2653 text = "Enter name of new %s, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@75
|
2654 button1 = CONTINUE.." ->",
|
farmbuyer@1
|
2655 button2 = CANCEL,
|
farmbuyer@1
|
2656 hasEditBox = true,
|
farmbuyer@16
|
2657 editBoxWidth = 350,
|
farmbuyer@1
|
2658 maxLetters = 50,
|
farmbuyer@1
|
2659 noCancelOnReuse = true,
|
farmbuyer@1
|
2660 }
|
farmbuyer@1
|
2661 t.EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@39
|
2662 if editbox:GetText() == "" then return end
|
farmbuyer@1
|
2663 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2664 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
|
farmbuyer@1
|
2665 dialog:Hide() -- replicate OnAccept click behavior
|
farmbuyer@1
|
2666 end
|
farmbuyer@1
|
2667 end
|
farmbuyer@1
|
2668 t.enterClicksFirstButton = nil -- no effect with editbox focused
|
farmbuyer@1
|
2669 t.OnAccept = eoi_st_insert_OnAccept
|
farmbuyer@1
|
2670 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
|
farmbuyer@1
|
2671
|
farmbuyer@69
|
2672 -- This seems to be gratuitous use of metatables, really.
|
farmbuyer@1
|
2673 local OEIL = {
|
farmbuyer@75
|
2674 text = "Paste the new item into here, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@1
|
2675 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
|
farmbuyer@1
|
2676 }
|
farmbuyer@1
|
2677 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
|
farmbuyer@1
|
2678
|
farmbuyer@1
|
2679 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
|
farmbuyer@1
|
2680 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
|
farmbuyer@1
|
2681 if dialogname then
|
farmbuyer@16
|
2682 _G[dialogname.."EditBox"]:SetText(link)
|
farmbuyer@1
|
2683 return true
|
farmbuyer@1
|
2684 end
|
farmbuyer@1
|
2685 end)
|
farmbuyer@69
|
2686
|
farmbuyer@69
|
2687 t = flib.StaticPopup{
|
farmbuyer@69
|
2688 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@69
|
2689 text = "Include a snapshot of the " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@77
|
2690 .. "CURRENT|r raid?|n|nClicking '" .. YES .. "' will allow this entry to "
|
farmbuyer@69
|
2691 .. "appear in attendance lists, but with the roster as it is NOW, not as it "
|
farmbuyer@69
|
2692 .. "was THEN. Clicking '" .. NO .."' means this kill cannot be included in "
|
farmbuyer@77
|
2693 .. "attendance.|n|n(Enter = '" .. YES .."', Escape = '" .. CANCEL .. "')",
|
farmbuyer@69
|
2694 button1 = YES, -- "accept", left
|
farmbuyer@69
|
2695 button2 = NO, -- "cancel", middle
|
farmbuyer@69
|
2696 button3 = CANCEL, -- "alt", right
|
farmbuyer@69
|
2697 }
|
farmbuyer@69
|
2698 -- Hitting Escape still hides the frame, but doesn't run OnCancel (which
|
farmbuyer@69
|
2699 -- is for the "No" button, not the "Cancel"/OnAlt button). Dizzy yet?
|
farmbuyer@69
|
2700 t.noCancelOnEscape = true
|
farmbuyer@69
|
2701 t.OnAccept = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2702 t.OnCancel = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2703 StaticPopupDialogs["OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP"] = t
|
farmbuyer@1
|
2704 end
|
farmbuyer@1
|
2705
|
farmbuyer@1
|
2706 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
|
farmbuyer@1
|
2707 text = "Enter the player name:",
|
farmbuyer@1
|
2708 button1 = ACCEPT,
|
farmbuyer@1
|
2709 button2 = CANCEL,
|
farmbuyer@1
|
2710 hasEditBox = true,
|
farmbuyer@1
|
2711 OnAccept = function(dialog, data)
|
farmbuyer@1
|
2712 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@81
|
2713 addon:reassign_loot ("local", data.index, name)
|
farmbuyer@95
|
2714 gui.eoiST:OuroLoot_Refresh(data.index)
|
farmbuyer@1
|
2715 end,
|
farmbuyer@1
|
2716 }
|
farmbuyer@1
|
2717
|
farmbuyer@1
|
2718 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
|
farmbuyer@1
|
2719 text = "Enter a name for the loot collection:",
|
farmbuyer@1
|
2720 button1 = ACCEPT,
|
farmbuyer@1
|
2721 button2 = CANCEL,
|
farmbuyer@1
|
2722 hasEditBox = true,
|
farmbuyer@1
|
2723 maxLetters = 30,
|
farmbuyer@1
|
2724 OnAccept = function(dialog)--, data)
|
farmbuyer@1
|
2725 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@1
|
2726 addon:save_saveas(name)
|
farmbuyer@1
|
2727 addon:BuildMainDisplay()
|
farmbuyer@1
|
2728 end,
|
farmbuyer@1
|
2729 OnCancel = function(dialog)--, data, reason)
|
farmbuyer@1
|
2730 addon:BuildMainDisplay()
|
farmbuyer@1
|
2731 end,
|
farmbuyer@1
|
2732 }
|
farmbuyer@1
|
2733
|
farmbuyer@25
|
2734
|
farmbuyer@25
|
2735 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
|
farmbuyer@25
|
2736 if true then
|
farmbuyer@25
|
2737 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
|
farmbuyer@25
|
2738 -- tagged with CHANGE.
|
farmbuyer@25
|
2739 local function onenter (self, motion)
|
farmbuyer@25
|
2740 if ( self.hasArrow ) then
|
farmbuyer@25
|
2741 local level = self:GetParent():GetID() + 1;
|
farmbuyer@25
|
2742 local listFrame = _G["DropDownList"..level];
|
farmbuyer@25
|
2743 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
|
farmbuyer@25
|
2744 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
|
farmbuyer@25
|
2745 end
|
farmbuyer@25
|
2746 else
|
farmbuyer@25
|
2747 CloseDropDownMenus(self:GetParent():GetID() + 1);
|
farmbuyer@25
|
2748 end
|
farmbuyer@25
|
2749 _G[self:GetName().."Highlight"]:Show();
|
farmbuyer@25
|
2750 UIDropDownMenu_StopCounting(self:GetParent());
|
farmbuyer@25
|
2751 if ( self.tooltipTitle ) then
|
farmbuyer@25
|
2752 if ( self.tooltipOnButton ) then
|
farmbuyer@25
|
2753 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
farmbuyer@25
|
2754 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
|
farmbuyer@25
|
2755 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
|
farmbuyer@25
|
2756 GameTooltip:Show();
|
farmbuyer@25
|
2757 else
|
farmbuyer@25
|
2758 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
|
farmbuyer@25
|
2759 end
|
farmbuyer@25
|
2760 end
|
farmbuyer@25
|
2761 end
|
farmbuyer@25
|
2762 -- end verbatime copy
|
farmbuyer@25
|
2763
|
farmbuyer@25
|
2764 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
|
farmbuyer@25
|
2765 local list = _G["DropDownList"..i]
|
farmbuyer@25
|
2766 if list then
|
farmbuyer@25
|
2767 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
|
farmbuyer@25
|
2768 local button = _G["DropDownList"..i.."Button"..j]
|
farmbuyer@25
|
2769 if button then
|
farmbuyer@25
|
2770 --print("button fixup",i,j)
|
farmbuyer@25
|
2771 button:SetScript("OnEnter",onenter)
|
farmbuyer@25
|
2772 end
|
farmbuyer@25
|
2773 end
|
farmbuyer@25
|
2774 end
|
farmbuyer@25
|
2775 end
|
farmbuyer@25
|
2776 end
|
farmbuyer@25
|
2777
|
farmbuyer@109
|
2778 addon.FILES_LOADED = addon.FILES_LOADED + 1
|
farmbuyer@1
|
2779 -- vim:noet
|