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