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