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