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@1
|
2194 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
|
farmbuyer@1
|
2195 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
|
farmbuyer@1
|
2196 b:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@149
|
2197 if choice == 1 then self:Activate("dropdown")
|
farmbuyer@149
|
2198 elseif choice == 2 then self:Activate("dropdownbc",nil,true)
|
farmbuyer@1
|
2199 else self:Deactivate()
|
farmbuyer@1
|
2200 end
|
farmbuyer@1
|
2201 _w = display:GetUserData('comm_ident')
|
farmbuyer@1
|
2202 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2203 _w:SetDisabled(self.enabled or self.rebroadcast)
|
farmbuyer@1
|
2204 end
|
farmbuyer@1
|
2205 _w = display:GetUserData('eoi_bcast_req')
|
farmbuyer@1
|
2206 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2207 _w:SetDisabled(not self.enabled)
|
farmbuyer@1
|
2208 end
|
farmbuyer@1
|
2209 end)
|
farmbuyer@1
|
2210 control:AddChild(b)
|
farmbuyer@1
|
2211 end
|
farmbuyer@1
|
2212
|
farmbuyer@1
|
2213 b = mkbutton("Dropdown", 'threshold', "",
|
farmbuyer@1
|
2214 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
|
farmbuyer@1
|
2215 b:SetFullWidth(true)
|
farmbuyer@1
|
2216 b:SetLabel("Threshold:")
|
farmbuyer@1
|
2217 b:SetList(self.thresholds)
|
farmbuyer@1
|
2218 b:SetValue(self.threshold)
|
farmbuyer@1
|
2219 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
2220 self:SetThreshold(choice)
|
farmbuyer@1
|
2221 end)
|
farmbuyer@1
|
2222 control:AddChild(b)
|
farmbuyer@1
|
2223
|
farmbuyer@4
|
2224 b = mkbutton("Clear Loot",
|
farmbuyer@1
|
2225 [[+Erases> all current loot information and generated text (but not saved texts).]])
|
farmbuyer@1
|
2226 b:SetFullWidth(true)
|
farmbuyer@1
|
2227 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2228 StaticPopup_Show("OUROL_CLEAR").data = self
|
farmbuyer@1
|
2229 end)
|
farmbuyer@1
|
2230 control:AddChild(b)
|
farmbuyer@1
|
2231
|
farmbuyer@95
|
2232 b = AceGUI:Create("Spacer")
|
farmbuyer@1
|
2233 b:SetFullWidth(true)
|
farmbuyer@16
|
2234 b:SetHeight(10)
|
farmbuyer@1
|
2235 control:AddChild(b)
|
farmbuyer@1
|
2236
|
farmbuyer@1
|
2237 --[[
|
farmbuyer@1
|
2238 --- Saved Texts ---
|
farmbuyer@1
|
2239 [ Save Current As... ]
|
farmbuyer@1
|
2240 saved1
|
farmbuyer@1
|
2241 saved2
|
farmbuyer@1
|
2242 ...
|
farmbuyer@1
|
2243 [ Load ] [ Delete ]
|
farmbuyer@1
|
2244 ]]
|
farmbuyer@95
|
2245 h = AceGUI:Create("Heading")
|
farmbuyer@1
|
2246 h:SetFullWidth(true)
|
farmbuyer@1
|
2247 h:SetText("Saved Texts")
|
farmbuyer@1
|
2248 control:AddChild(h)
|
farmbuyer@1
|
2249 b = mkbutton("Save Current As...",
|
farmbuyer@1
|
2250 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
|
farmbuyer@1
|
2251 b:SetFullWidth(true)
|
farmbuyer@1
|
2252 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2253 StaticPopup_Show "OUROL_SAVE_SAVEAS"
|
farmbuyer@1
|
2254 _d:Hide()
|
farmbuyer@1
|
2255 end)
|
farmbuyer@1
|
2256 control:AddChild(b)
|
farmbuyer@1
|
2257
|
farmbuyer@16
|
2258 do
|
farmbuyer@95
|
2259 local scontainer = AceGUI:Create("SimpleGroup")
|
farmbuyer@16
|
2260 scontainer:SetFullWidth(true)
|
farmbuyer@16
|
2261 scontainer:SetFullHeight(false)
|
farmbuyer@16
|
2262 scontainer:SetAutoAdjustHeight(false)
|
farmbuyer@16
|
2263 scontainer:SetHeight(40) -- no relative height available anymore
|
farmbuyer@16
|
2264 scontainer:SetLayout("Fill")
|
farmbuyer@95
|
2265 local scroll = AceGUI:Create("ScrollFrame")
|
farmbuyer@16
|
2266 scroll:SetLayout("List")
|
farmbuyer@16
|
2267 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
|
farmbuyer@16
|
2268 if saved then for i,s in ipairs(saved) do
|
farmbuyer@95
|
2269 local il = AceGUI:Create("InteractiveLabel")
|
farmbuyer@16
|
2270 il:SetFullWidth(true)
|
farmbuyer@16
|
2271 il:SetText(s.name)
|
farmbuyer@16
|
2272 il:SetUserData("num",i)
|
farmbuyer@16
|
2273 il:SetHighlight(1,1,1,0.4)
|
farmbuyer@16
|
2274 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
|
farmbuyer@16
|
2275 il:SetCallback("OnEnter", function() setstatus(str) end)
|
farmbuyer@16
|
2276 il:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@16
|
2277 il:SetCallback("OnClick", function(_il)
|
farmbuyer@16
|
2278 local prev = _d:GetUserData("saved selection")
|
farmbuyer@16
|
2279 if prev then
|
farmbuyer@16
|
2280 prev.highlight:Hide()
|
farmbuyer@16
|
2281 prev:SetColor()
|
farmbuyer@16
|
2282 end
|
farmbuyer@16
|
2283 _il:SetColor(0,1,0)
|
farmbuyer@16
|
2284 _il.highlight:Show()
|
farmbuyer@16
|
2285 _d:SetUserData("saved selection",_il)
|
farmbuyer@16
|
2286 _d:GetUserData("Load"):SetDisabled(false)
|
farmbuyer@16
|
2287 _d:GetUserData("Delete"):SetDisabled(false)
|
farmbuyer@16
|
2288 end)
|
farmbuyer@16
|
2289 scroll:AddChild(il)
|
farmbuyer@16
|
2290 end end
|
farmbuyer@16
|
2291 scontainer:AddChild(scroll)
|
farmbuyer@16
|
2292 control:AddChild(scontainer)
|
farmbuyer@16
|
2293 end
|
farmbuyer@1
|
2294
|
farmbuyer@1
|
2295 b = mkbutton("Load",
|
farmbuyer@1
|
2296 [[Load previously saved text. +REPLACES> all current loot information!]])
|
farmbuyer@1
|
2297 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2298 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2299 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2300 self:save_restore(num)
|
farmbuyer@1
|
2301 self:BuildMainDisplay()
|
farmbuyer@1
|
2302 end)
|
farmbuyer@1
|
2303 b:SetDisabled(true)
|
farmbuyer@1
|
2304 control:AddChild(b)
|
farmbuyer@1
|
2305 b = mkbutton("Delete",
|
farmbuyer@1
|
2306 [[Delete previously saved text.]])
|
farmbuyer@1
|
2307 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2308 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2309 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2310 self:save_delete(num)
|
farmbuyer@1
|
2311 self:BuildMainDisplay()
|
farmbuyer@1
|
2312 end)
|
farmbuyer@1
|
2313 b:SetDisabled(true)
|
farmbuyer@1
|
2314 control:AddChild(b)
|
farmbuyer@1
|
2315
|
farmbuyer@95
|
2316 b = AceGUI:Create("Spacer")
|
farmbuyer@1
|
2317 b:SetFullWidth(true)
|
farmbuyer@16
|
2318 b:SetHeight(10)
|
farmbuyer@1
|
2319 control:AddChild(b)
|
farmbuyer@1
|
2320
|
farmbuyer@1
|
2321 -- Other stuff on right-hand side
|
farmbuyer@95
|
2322 local tab_specials = AceGUI:Create("SimpleGroup")
|
farmbuyer@1
|
2323 tab_specials:SetLayout("Flow")
|
farmbuyer@1
|
2324 tab_specials:SetFullWidth(true)
|
farmbuyer@1
|
2325 control:AddChild(tab_specials)
|
farmbuyer@1
|
2326 control:ResumeLayout()
|
farmbuyer@1
|
2327
|
farmbuyer@1
|
2328 ----- Left-hand group
|
farmbuyer@95
|
2329 local tabs = AceGUI:Create("TabGroup")
|
farmbuyer@1
|
2330 tabs:SetLayout("Flow")
|
farmbuyer@1
|
2331 tabs.alignoffset = 25
|
farmbuyer@49
|
2332 local titletext_orig_fo = tabs.titletext:GetFontObject()
|
farmbuyer@49
|
2333 tabs.titletext:SetFontObject(GameFontNormalSmall)
|
farmbuyer@49
|
2334 tabs:SetCallback("OnRelease", function(_tabs)
|
farmbuyer@49
|
2335 tabs.titletext:SetFontObject(titletext_orig_fo)
|
farmbuyer@49
|
2336 end)
|
farmbuyer@1
|
2337 tabs:SetRelativeWidth(0.99-rhs_width)
|
farmbuyer@1
|
2338 tabs:SetFullHeight(true)
|
farmbuyer@1
|
2339 tabs:SetTabs(tabgroup_tabs)
|
farmbuyer@1
|
2340 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
|
farmbuyer@1
|
2341 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
|
farmbuyer@95
|
2342 setstatus(gui.tabtexts[value].desc)
|
farmbuyer@1
|
2343 end)
|
farmbuyer@1
|
2344 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
|
farmbuyer@1
|
2345 tabs:SetUserData("special buttons group",tab_specials)
|
farmbuyer@125
|
2346
|
farmbuyer@125
|
2347 local whichtab, tabargs = "eoi"
|
farmbuyer@125
|
2348 if opt_tabselect and #opt_tabselect > 0 then
|
farmbuyer@125
|
2349 whichtab, tabargs = opt_tabselect, opt_tabselect_CLI_arg
|
farmbuyer@125
|
2350 end
|
farmbuyer@125
|
2351 tabs:SelectTab(whichtab)
|
farmbuyer@1
|
2352
|
farmbuyer@1
|
2353 display:AddChildren (tabs, control)
|
farmbuyer@1
|
2354 display:ApplyStatus()
|
farmbuyer@125
|
2355 display:Show() -- without this, only appears every *other* function call
|
farmbuyer@1
|
2356
|
farmbuyer@125
|
2357 if tabargs and tabs_CLI_special[whichtab] then
|
farmbuyer@125
|
2358 tabs_CLI_special[whichtab](tabargs)
|
farmbuyer@125
|
2359 end
|
farmbuyer@1
|
2360 return display
|
farmbuyer@1
|
2361 end
|
farmbuyer@1
|
2362
|
farmbuyer@125
|
2363 -- Searches tab title texts from left to right.
|
farmbuyer@88
|
2364 function addon:OpenMainDisplayToTab (text, opt_arg)
|
farmbuyer@44
|
2365 text = '^'..text:lower()
|
farmbuyer@95
|
2366 for _,tab in ipairs(gui.taborder) do
|
farmbuyer@95
|
2367 local v = gui.tabtexts[tab]
|
farmbuyer@95
|
2368 if v and v.title:lower():find(text) then
|
farmbuyer@125
|
2369 self:BuildMainDisplay (tab, opt_arg)
|
farmbuyer@1
|
2370 return true
|
farmbuyer@1
|
2371 end
|
farmbuyer@1
|
2372 end
|
farmbuyer@1
|
2373 end
|
farmbuyer@1
|
2374
|
farmbuyer@1
|
2375 -- Essentially a re-click on the current tab (if the current tab were clickable).
|
farmbuyer@1
|
2376 function addon:redisplay ()
|
farmbuyer@1
|
2377 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
|
farmbuyer@1
|
2378 end
|
farmbuyer@1
|
2379
|
farmbuyer@103
|
2380 function addon:GoToLootLine (line)
|
farmbuyer@103
|
2381 local lineno = tonumber(self.lootjumps[line])
|
farmbuyer@103
|
2382 self:OpenMainDisplayToTab ("Loot", lineno)
|
farmbuyer@103
|
2383 end
|
farmbuyer@103
|
2384
|
farmbuyer@1
|
2385
|
farmbuyer@110
|
2386 -- We need to be able to reference the dropdownmenu locals, and I didn't want to
|
farmbuyer@110
|
2387 -- bubble them up any higher.
|
farmbuyer@128
|
2388 do
|
farmbuyer@128
|
2389 -- If the UIDropDownMenu_SetSelected* functions could be used with EasyMenu
|
farmbuyer@128
|
2390 -- in a sane fashion, we could dispense with the 'checked' field.
|
farmbuyer@128
|
2391 local function disposition_is_checked (buttonframe)
|
farmbuyer@128
|
2392 -- arg2 == disp code, GetID == index into dropdown array
|
farmbuyer@128
|
2393 local i = _d and _d.GetUserData and _d:GetUserData("DD index")
|
farmbuyer@128
|
2394 if i then
|
farmbuyer@128
|
2395 return g_loot[i].disposition == buttonframe.arg2
|
farmbuyer@128
|
2396 end
|
farmbuyer@110
|
2397 end
|
farmbuyer@110
|
2398
|
farmbuyer@128
|
2399 function gui.add_dropdown_entry (menutag, name, func_tbl, func_or_othername, arg, tooltiptext)
|
farmbuyer@128
|
2400 local emtbl = assert(gui.dropdown[menutag])
|
farmbuyer@128
|
2401
|
farmbuyer@128
|
2402 if type(func_tbl) == 'table' then
|
farmbuyer@128
|
2403 -- use it directly
|
farmbuyer@128
|
2404 elseif func_tbl == nil then
|
farmbuyer@128
|
2405 -- determine it from the menu tag
|
farmbuyer@128
|
2406 func_tbl = (menutag:sub(1,3) == 'eoi' and eoi_dropdownfuncs)
|
farmbuyer@128
|
2407 or (menutag:sub(1,4) == 'hist' and hist_dropdownfuncs)
|
farmbuyer@128
|
2408 or error("Cannot figure out function table from menu tag name")
|
farmbuyer@128
|
2409 end
|
farmbuyer@128
|
2410
|
farmbuyer@128
|
2411 if type(func_or_othername) == 'string' then
|
farmbuyer@128
|
2412 -- gen_dd_entry handles this
|
farmbuyer@128
|
2413 elseif type(func_or_othername) == 'function' then
|
farmbuyer@128
|
2414 error"bah"
|
farmbuyer@128
|
2415 end
|
farmbuyer@128
|
2416
|
farmbuyer@128
|
2417 -- Insert most new entries right under the title
|
farmbuyer@128
|
2418 local index
|
farmbuyer@128
|
2419 if menutag == 'eoi_loot' then
|
farmbuyer@128
|
2420 index = 3
|
farmbuyer@128
|
2421 elseif menutag == 'eoi_player' then
|
farmbuyer@128
|
2422 index = 3
|
farmbuyer@128
|
2423 elseif menutag == 'eoi_loot_mark' then
|
farmbuyer@128
|
2424 index = #emtbl + 1
|
farmbuyer@128
|
2425 else
|
farmbuyer@128
|
2426 index = 2
|
farmbuyer@128
|
2427 end
|
farmbuyer@128
|
2428
|
farmbuyer@128
|
2429 local ent = gen_dd_entry (name, func_tbl, func_or_othername, arg, tooltiptext)
|
farmbuyer@128
|
2430 tinsert (emtbl, index, ent)
|
farmbuyer@128
|
2431
|
farmbuyer@128
|
2432 if menutag == 'eoi_loot_mark' then
|
farmbuyer@128
|
2433 ent.notCheckable = nil
|
farmbuyer@128
|
2434 ent.checked = disposition_is_checked
|
farmbuyer@128
|
2435 end
|
farmbuyer@128
|
2436
|
farmbuyer@128
|
2437 return ent
|
farmbuyer@110
|
2438 end
|
farmbuyer@110
|
2439 end
|
farmbuyer@110
|
2440
|
farmbuyer@110
|
2441
|
farmbuyer@1
|
2442 ------ Popup dialogs
|
farmbuyer@75
|
2443 local function build_my_slider_widget()
|
farmbuyer@75
|
2444 local s = CreateFrame("Slider", "OuroLootSlider", nil, "OptionsSliderTemplate")
|
farmbuyer@75
|
2445 s.text = OuroLootSliderText
|
farmbuyer@75
|
2446 s.low = OuroLootSliderLow
|
farmbuyer@75
|
2447 s.high = OuroLootSliderHigh
|
farmbuyer@75
|
2448 s:SetScript("OnValueChanged", function (_s, value)
|
farmbuyer@75
|
2449 _s.value = value -- conveniently, this is already of numeric type
|
farmbuyer@75
|
2450 --_s.text:SetText(tostring(value))
|
farmbuyer@75
|
2451 if _s.DoOnValueChanged then
|
farmbuyer@75
|
2452 _s:DoOnValueChanged()
|
farmbuyer@75
|
2453 end
|
farmbuyer@75
|
2454 end)
|
farmbuyer@75
|
2455 build_my_slider_widget = nil
|
farmbuyer@75
|
2456 return s
|
farmbuyer@75
|
2457 end
|
farmbuyer@75
|
2458
|
farmbuyer@1
|
2459 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
|
farmbuyer@1
|
2460 text = "Clear current loot information and text?",
|
farmbuyer@16
|
2461 button1 = YES,
|
farmbuyer@16
|
2462 button2 = NO,
|
farmbuyer@1
|
2463 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2464 addon:Clear(--[[verbose_p=]]true)
|
farmbuyer@1
|
2465 end,
|
farmbuyer@1
|
2466 }
|
farmbuyer@1
|
2467
|
farmbuyer@37
|
2468 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
|
farmbuyer@142
|
2469 -- Concatenate this once at load time.
|
farmbuyer@142
|
2470 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_LEGENDARY].hex
|
farmbuyer@125
|
2471 .. "%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
|
2472 button1 = YES,
|
farmbuyer@37
|
2473 button2 = NO,
|
farmbuyer@37
|
2474 OnAccept = function (dialog, addon, data2)
|
farmbuyer@37
|
2475 data2(addon)
|
farmbuyer@37
|
2476 addon:Print("%s history has been regenerated.", addon.history.realm)
|
farmbuyer@37
|
2477 addon:redisplay()
|
farmbuyer@37
|
2478 end,
|
farmbuyer@37
|
2479 }
|
farmbuyer@37
|
2480
|
farmbuyer@16
|
2481 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
|
farmbuyer@142
|
2482 -- Concatenate this once at load time.
|
farmbuyer@142
|
2483 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_LEGENDARY].hex .. "%s|r?",
|
farmbuyer@16
|
2484 button1 = YES,
|
farmbuyer@16
|
2485 button2 = NO,
|
farmbuyer@16
|
2486 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2487 data2(addon)
|
farmbuyer@16
|
2488 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
|
farmbuyer@16
|
2489 addon:redisplay()
|
farmbuyer@16
|
2490 end,
|
farmbuyer@16
|
2491 }
|
farmbuyer@16
|
2492
|
farmbuyer@16
|
2493 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
|
farmbuyer@142
|
2494 -- Concatenate this once at load time.
|
farmbuyer@75
|
2495 text = "This will erase all but the latest "
|
farmbuyer@142
|
2496 .. ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_UNCOMMON].hex
|
farmbuyer@75
|
2497 .. "%s|r for each player on "
|
farmbuyer@142
|
2498 .. ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_LEGENDARY].hex
|
farmbuyer@142
|
2499 .. "%s|r. " .. CONTINUE .. "?",
|
farmbuyer@16
|
2500 button1 = YES,
|
farmbuyer@16
|
2501 button2 = NO,
|
farmbuyer@75
|
2502 OnShow = function (dialog, addon)
|
farmbuyer@75
|
2503 local thistable = StaticPopupDialogs[dialog.which]
|
farmbuyer@75
|
2504 -- StaticPopup_Resize does not take extraFrame into account, so we
|
farmbuyer@89
|
2505 -- monkeypatch the sizing method that _Resize calls at the end.
|
farmbuyer@75
|
2506 dialog.saved_setheight = dialog.SetHeight
|
farmbuyer@75
|
2507 dialog.SetHeight = function (d, h)
|
farmbuyer@75
|
2508 return d.saved_setheight(d,h+35)
|
farmbuyer@75
|
2509 end
|
farmbuyer@75
|
2510 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2511 dialog.extraFrame:SetPoint("TOP", dialog.text, "BOTTOM")
|
farmbuyer@75
|
2512 dialog.extraFrame:SetWidth(150)
|
farmbuyer@75
|
2513 dialog.extraFrame:SetHeight(35)
|
farmbuyer@75
|
2514 dialog.extraFrame:Show()
|
farmbuyer@75
|
2515 local slider = _G.OuroLootSlider or build_my_slider_widget()
|
farmbuyer@75
|
2516 slider.DoOnValueChanged = function(s)
|
farmbuyer@75
|
2517 dialog.text:SetFormattedText (thistable.text,
|
farmbuyer@75
|
2518 s.value == 1 and "single entry" or (s.value .. " entries"),
|
farmbuyer@75
|
2519 addon.history.realm)
|
farmbuyer@75
|
2520 StaticPopup_Resize (dialog, "OUROL_HIST_PREEN")
|
farmbuyer@75
|
2521 end
|
farmbuyer@75
|
2522 slider:SetOrientation('HORIZONTAL')
|
farmbuyer@75
|
2523 slider:SetMinMaxValues(1,30)
|
farmbuyer@75
|
2524 slider:SetValueStep(1)
|
farmbuyer@145
|
2525 slider:SetObeyStepOnDrag(true)
|
farmbuyer@75
|
2526 slider.low:SetText("1")
|
farmbuyer@75
|
2527 slider.high:SetText("30")
|
farmbuyer@75
|
2528 --slider.tooltipText = ???
|
farmbuyer@75
|
2529 slider:SetParent(dialog.extraFrame)
|
farmbuyer@75
|
2530 slider:ClearAllPoints()
|
farmbuyer@75
|
2531 slider:SetPoint("TOPLEFT",dialog.extraFrame,"TOPLEFT",0, -15)
|
farmbuyer@75
|
2532 slider:SetPoint("BOTTOMRIGHT",dialog.extraFrame,"BOTTOMRIGHT",0, 0)
|
farmbuyer@75
|
2533 slider:Show()
|
farmbuyer@75
|
2534 -- This causes OnValueChanged to fire, reformatting the text. Except
|
farmbuyer@75
|
2535 -- IF the slider has already been shown, and IF at the time it was hidden
|
farmbuyer@75
|
2536 -- it had the same value here, THEN there is technically no "change"
|
farmbuyer@75
|
2537 -- and no event is fired. We work around this clever optimization by
|
farmbuyer@75
|
2538 -- doing a pair of set's, forcing the last one to fire OVC.
|
farmbuyer@75
|
2539 slider:SetValue(1)
|
farmbuyer@75
|
2540 slider:SetValue(5)
|
farmbuyer@75
|
2541 end,
|
farmbuyer@75
|
2542 OnAccept = function (dialog, addon, callback)
|
farmbuyer@75
|
2543 local howmany = assert(tonumber(_G.OuroLootSlider.value))
|
farmbuyer@75
|
2544 callback (addon, howmany)
|
farmbuyer@75
|
2545 addon:Print("All loot prior to the most recent %d |4entry:entries; has been erased.", howmany)
|
farmbuyer@16
|
2546 addon:redisplay()
|
farmbuyer@16
|
2547 end,
|
farmbuyer@75
|
2548 OnHide = function (dialog, addon)
|
farmbuyer@75
|
2549 dialog.SetHeight = nil
|
farmbuyer@75
|
2550 dialog.saved_setheight = nil
|
farmbuyer@75
|
2551 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2552 _G.OuroLootSlider:Hide() -- parent is hidden, why is this required?
|
farmbuyer@75
|
2553 _G.OuroLootSlider:ClearAllPoints()
|
farmbuyer@75
|
2554 _G.OuroLootSlider:SetParent(nil)
|
farmbuyer@75
|
2555 end,
|
farmbuyer@16
|
2556 }
|
farmbuyer@16
|
2557
|
farmbuyer@27
|
2558 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
|
farmbuyer@27
|
2559 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
|
farmbuyer@27
|
2560 button1 = OKAY,
|
farmbuyer@27
|
2561 timeout = 0,
|
farmbuyer@27
|
2562 whileDead = true,
|
farmbuyer@27
|
2563 hideOnEscape = true,
|
farmbuyer@27
|
2564 enterClicksFirstButton = true,
|
farmbuyer@27
|
2565 hasEditBox = true,
|
farmbuyer@27
|
2566 editBoxWidth = 350,
|
farmbuyer@53
|
2567 preferredIndex = 3,
|
farmbuyer@27
|
2568 OnShow = function (dialog, url)
|
farmbuyer@27
|
2569 dialog.editBox:SetText(url)
|
farmbuyer@27
|
2570 dialog.editBox:SetFocus()
|
farmbuyer@27
|
2571 dialog.editBox:HighlightText()
|
farmbuyer@27
|
2572 end,
|
farmbuyer@27
|
2573 }
|
farmbuyer@27
|
2574
|
farmbuyer@1
|
2575 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
|
farmbuyer@77
|
2576 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
|
2577 button1 = "Activate recording", -- "accept", left
|
farmbuyer@69
|
2578 button2 = "Broadcast Only", -- "cancel", middle
|
farmbuyer@69
|
2579 button3 = HELP_LABEL, -- "alt", right
|
farmbuyer@1
|
2580 OnAccept = function (dialog, addon)
|
farmbuyer@149
|
2581 pprint('remind', "OnAccept")
|
farmbuyer@149
|
2582 addon:Activate("remind")
|
farmbuyer@1
|
2583 end,
|
farmbuyer@69
|
2584 noCancelOnEscape = true,
|
farmbuyer@149
|
2585 noCancelOnReuse = true,
|
farmbuyer@149
|
2586 closeButton = true,
|
farmbuyer@69
|
2587 OnCancel = function (dialog, addon)
|
farmbuyer@149
|
2588 pprint('remind', "OnCancel")
|
farmbuyer@149
|
2589 addon:Activate("remindbc",nil,true)
|
farmbuyer@1
|
2590 end,
|
farmbuyer@69
|
2591 OnAlt = function (dialog, addon)
|
farmbuyer@149
|
2592 pprint('remind', "OnAlt")
|
farmbuyer@1
|
2593 -- hitting escape also calls this, but the 3rd arg would be "clicked"
|
farmbuyer@1
|
2594 -- in both cases, not useful here.
|
farmbuyer@89
|
2595 if MouseIsOver(dialog.button3) then
|
farmbuyer@1
|
2596 -- they actually clicked the button (or at least the mouse was over "Help"
|
farmbuyer@1
|
2597 -- when they hit escape... sigh)
|
farmbuyer@1
|
2598 addon:BuildMainDisplay('help')
|
farmbuyer@1
|
2599 else
|
farmbuyer@1
|
2600 addon.popped = true
|
farmbuyer@1
|
2601 end
|
farmbuyer@1
|
2602 end,
|
farmbuyer@149
|
2603 --@debug@
|
farmbuyer@149
|
2604 OnHide = function (dialog, addon)
|
farmbuyer@149
|
2605 pprint('remind', "OnHide")
|
farmbuyer@149
|
2606 end,
|
farmbuyer@149
|
2607 --@end-debug@
|
farmbuyer@1
|
2608 }
|
farmbuyer@1
|
2609
|
farmbuyer@69
|
2610 -- Callback for each Next/Accept stage of inserting a new loot or boss row via
|
farmbuyer@69
|
2611 -- dropdown. Thanks to noCancelOnReuse, each Show done here will technically
|
farmbuyer@69
|
2612 -- Hide and redisplay the same dialog, passing along the same 'data' structure
|
farmbuyer@69
|
2613 -- each time. The topmost call to our OnAccept will then finish by hiding the
|
farmbuyer@69
|
2614 -- (very last) dialog.
|
farmbuyer@69
|
2615 --
|
farmbuyer@116
|
2616 -- This is really, really hideous to read. Maybe increment a 'stage' counter
|
farmbuyer@116
|
2617 -- so the code flows top-down, rather than testing for missing data and going
|
farmbuyer@116
|
2618 -- backwards.
|
farmbuyer@69
|
2619 local function eoi_st_insert_OnAccept_boss (dialog, data, data2)
|
farmbuyer@69
|
2620 if data.all_done then
|
farmbuyer@116
|
2621 -- boss_index will probably be the final entry in the table, but there
|
farmbuyer@116
|
2622 -- might have been real loot happening while the user was typing.
|
farmbuyer@69
|
2623 local boss_index = addon._addBossEntry{
|
farmbuyer@69
|
2624 kind = 'boss',
|
farmbuyer@97
|
2625 bossname = (gui.opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
|
farmbuyer@69
|
2626 reason = 'kill',
|
farmbuyer@69
|
2627 instance = data.instance,
|
farmbuyer@69
|
2628 duration = 0,
|
farmbuyer@69
|
2629 maxsize = data.max_raid_size,
|
farmbuyer@69
|
2630 raidersnap = data.yes_snap or {},
|
farmbuyer@69
|
2631 }
|
farmbuyer@69
|
2632 local entry = tremove(g_loot,boss_index)
|
farmbuyer@129
|
2633 g_dloot:insert (data.rowindex, entry)
|
farmbuyer@69
|
2634 addon:_mark_boss_kill(data.rowindex)
|
farmbuyer@95
|
2635 gui.eoiST:OuroLoot_Refresh(data.rowindex)
|
farmbuyer@103
|
2636 local jumpprefix = addon.chatprefix ("GoToLootLine", data.rowindex)
|
farmbuyer@69
|
2637 dialog.data = nil -- free up memory
|
farmbuyer@103
|
2638 addon:PCFPrint (_G.DEFAULT_CHAT_FRAME, jumpprefix,
|
farmbuyer@103
|
2639 "Inserted %s %s at entry %d.",
|
farmbuyer@103
|
2640 data.kind, data.name, data.rowindex)
|
farmbuyer@69
|
2641 return
|
farmbuyer@69
|
2642 end
|
farmbuyer@69
|
2643
|
farmbuyer@69
|
2644 -- third click
|
farmbuyer@69
|
2645 if data.name and data.instance then
|
farmbuyer@69
|
2646 data.all_done = true
|
farmbuyer@69
|
2647 -- this is how we distinguish OnAccept from OnCancel ("clicked"); the
|
farmbuyer@69
|
2648 -- 3rd param is handled all in StaticPopup_OnClick
|
farmbuyer@69
|
2649 if data2 ~= 'clicked' then
|
farmbuyer@69
|
2650 data.yes_snap = data.maybe_snap
|
farmbuyer@69
|
2651 end
|
farmbuyer@69
|
2652 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2653 end
|
farmbuyer@69
|
2654
|
farmbuyer@69
|
2655 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2656
|
farmbuyer@69
|
2657 -- second click
|
farmbuyer@69
|
2658 if data.name and text then
|
farmbuyer@69
|
2659 data.instance = text
|
farmbuyer@92
|
2660 -- not "reusing" this dialog in the same sense as with loot
|
farmbuyer@69
|
2661 dialog.data = nil
|
farmbuyer@69
|
2662 dialog:Hide()
|
farmbuyer@69
|
2663 local getsnap = StaticPopup_Show("OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP")
|
farmbuyer@69
|
2664 getsnap.data = data
|
farmbuyer@69
|
2665 return true
|
farmbuyer@69
|
2666 end
|
farmbuyer@69
|
2667
|
farmbuyer@69
|
2668 -- first click
|
farmbuyer@69
|
2669 if text then
|
farmbuyer@69
|
2670 data.name = text
|
farmbuyer@69
|
2671 local maybe_instance
|
farmbuyer@69
|
2672 data.maybe_snap, data.max_raid_size, maybe_instance = addon:snapshot_raid()
|
farmbuyer@69
|
2673 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
|
farmbuyer@69
|
2674 getinstance.data = data
|
farmbuyer@69
|
2675 getinstance.editBox:SetText(maybe_instance)
|
farmbuyer@69
|
2676 -- This suppresses auto-hide (which would cause the getinstance dialog
|
farmbuyer@69
|
2677 -- to go away), but only when mouse clicking. OnEnter is on its own.
|
farmbuyer@69
|
2678 return true
|
farmbuyer@69
|
2679 end
|
farmbuyer@69
|
2680 end
|
farmbuyer@69
|
2681
|
farmbuyer@69
|
2682 local function eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2683 if data.all_done then
|
farmbuyer@69
|
2684 data.display:Hide()
|
farmbuyer@73
|
2685 local loot_index = assert(addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes))
|
farmbuyer@69
|
2686 local entry = tremove(g_loot,loot_index)
|
farmbuyer@129
|
2687 g_dloot:insert (data.rowindex, entry)
|
farmbuyer@69
|
2688 addon:_fill_out_eoi_data(data.rowindex)
|
farmbuyer@69
|
2689 addon:BuildMainDisplay()
|
farmbuyer@79
|
2690 local clicky = _new_rebroadcast_hyperlink (entry.unique)
|
farmbuyer@103
|
2691 local jumpprefix = addon.chatprefix ("GoToLootLine", data.rowindex)
|
farmbuyer@69
|
2692 dialog.data = nil
|
farmbuyer@103
|
2693 addon:PCFPrint (_G.DEFAULT_CHAT_FRAME, jumpprefix,
|
farmbuyer@103
|
2694 "Inserted %s %s at entry %d. %s",
|
farmbuyer@78
|
2695 data.kind, data.name, data.rowindex, tostring(clicky))
|
farmbuyer@69
|
2696 return
|
farmbuyer@69
|
2697 end
|
farmbuyer@69
|
2698
|
farmbuyer@69
|
2699 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2700
|
farmbuyer@69
|
2701 -- third click
|
farmbuyer@69
|
2702 if data.name and data.recipient and text then
|
farmbuyer@69
|
2703 data.notes = (text ~= "<none>") and text or nil
|
farmbuyer@69
|
2704 data.all_done = true
|
farmbuyer@69
|
2705 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2706 end
|
farmbuyer@69
|
2707
|
farmbuyer@69
|
2708 -- second click
|
farmbuyer@69
|
2709 if data.name and text then
|
farmbuyer@69
|
2710 data.recipient = text
|
farmbuyer@69
|
2711 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
|
farmbuyer@69
|
2712 getnotes.data = data
|
farmbuyer@69
|
2713 getnotes.editBox:SetText("<none>")
|
farmbuyer@69
|
2714 getnotes.editBox:HighlightText()
|
farmbuyer@69
|
2715 return true
|
farmbuyer@69
|
2716 end
|
farmbuyer@69
|
2717
|
farmbuyer@69
|
2718 -- first click
|
farmbuyer@69
|
2719 if text then
|
farmbuyer@69
|
2720 data.name = text
|
farmbuyer@69
|
2721 dialog:Hide() -- technically a "different" one about to be shown
|
farmbuyer@78
|
2722 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams =
|
farmbuyer@93
|
2723 AUTOCOMPLETE_LIST_TEMPLATES[IsInRaid() and "IN_GROUP" or "IN_GUILD"]
|
farmbuyer@69
|
2724 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
|
farmbuyer@78
|
2725 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams = nil
|
farmbuyer@69
|
2726 getrecipient.data = data
|
farmbuyer@69
|
2727 getrecipient.editBox:SetText("")
|
farmbuyer@69
|
2728 return true
|
farmbuyer@69
|
2729 end
|
farmbuyer@69
|
2730 end
|
farmbuyer@69
|
2731
|
farmbuyer@69
|
2732 local function eoi_st_insert_OnAccept (dialog, data)
|
farmbuyer@69
|
2733 if data.kind == 'boss' then
|
farmbuyer@69
|
2734 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2735 elseif data.kind == 'loot' then
|
farmbuyer@69
|
2736 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2737 end
|
farmbuyer@69
|
2738 end
|
farmbuyer@69
|
2739
|
farmbuyer@1
|
2740 -- The data member here is a table built with:
|
farmbuyer@1
|
2741 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
|
farmbuyer@1
|
2742 do
|
farmbuyer@1
|
2743 local t = flib.StaticPopup{
|
farmbuyer@75
|
2744 text = "Enter name of new %s, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@75
|
2745 button1 = CONTINUE.." ->",
|
farmbuyer@1
|
2746 button2 = CANCEL,
|
farmbuyer@1
|
2747 hasEditBox = true,
|
farmbuyer@16
|
2748 editBoxWidth = 350,
|
farmbuyer@1
|
2749 maxLetters = 50,
|
farmbuyer@1
|
2750 noCancelOnReuse = true,
|
farmbuyer@1
|
2751 }
|
farmbuyer@1
|
2752 t.EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@39
|
2753 if editbox:GetText() == "" then return end
|
farmbuyer@1
|
2754 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2755 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
|
farmbuyer@1
|
2756 dialog:Hide() -- replicate OnAccept click behavior
|
farmbuyer@1
|
2757 end
|
farmbuyer@1
|
2758 end
|
farmbuyer@1
|
2759 t.enterClicksFirstButton = nil -- no effect with editbox focused
|
farmbuyer@1
|
2760 t.OnAccept = eoi_st_insert_OnAccept
|
farmbuyer@1
|
2761 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
|
farmbuyer@1
|
2762
|
farmbuyer@69
|
2763 -- This seems to be gratuitous use of metatables, really.
|
farmbuyer@1
|
2764 local OEIL = {
|
farmbuyer@75
|
2765 text = "Paste the new item into here, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@1
|
2766 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
|
farmbuyer@1
|
2767 }
|
farmbuyer@1
|
2768 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
|
farmbuyer@1
|
2769
|
farmbuyer@1
|
2770 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
|
farmbuyer@1
|
2771 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
|
farmbuyer@1
|
2772 if dialogname then
|
farmbuyer@16
|
2773 _G[dialogname.."EditBox"]:SetText(link)
|
farmbuyer@1
|
2774 return true
|
farmbuyer@1
|
2775 end
|
farmbuyer@1
|
2776 end)
|
farmbuyer@69
|
2777
|
farmbuyer@69
|
2778 t = flib.StaticPopup{
|
farmbuyer@142
|
2779 -- Concatenate this once at load time.
|
farmbuyer@142
|
2780 text = "Include a snapshot of the " .. ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_LEGENDARY].hex
|
farmbuyer@77
|
2781 .. "CURRENT|r raid?|n|nClicking '" .. YES .. "' will allow this entry to "
|
farmbuyer@69
|
2782 .. "appear in attendance lists, but with the roster as it is NOW, not as it "
|
farmbuyer@69
|
2783 .. "was THEN. Clicking '" .. NO .."' means this kill cannot be included in "
|
farmbuyer@77
|
2784 .. "attendance.|n|n(Enter = '" .. YES .."', Escape = '" .. CANCEL .. "')",
|
farmbuyer@69
|
2785 button1 = YES, -- "accept", left
|
farmbuyer@69
|
2786 button2 = NO, -- "cancel", middle
|
farmbuyer@69
|
2787 button3 = CANCEL, -- "alt", right
|
farmbuyer@69
|
2788 }
|
farmbuyer@69
|
2789 -- Hitting Escape still hides the frame, but doesn't run OnCancel (which
|
farmbuyer@69
|
2790 -- is for the "No" button, not the "Cancel"/OnAlt button). Dizzy yet?
|
farmbuyer@69
|
2791 t.noCancelOnEscape = true
|
farmbuyer@69
|
2792 t.OnAccept = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2793 t.OnCancel = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2794 StaticPopupDialogs["OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP"] = t
|
farmbuyer@1
|
2795 end
|
farmbuyer@1
|
2796
|
farmbuyer@1
|
2797 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
|
farmbuyer@1
|
2798 text = "Enter the player name:",
|
farmbuyer@1
|
2799 button1 = ACCEPT,
|
farmbuyer@1
|
2800 button2 = CANCEL,
|
farmbuyer@1
|
2801 hasEditBox = true,
|
farmbuyer@1
|
2802 OnAccept = function(dialog, data)
|
farmbuyer@1
|
2803 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@81
|
2804 addon:reassign_loot ("local", data.index, name)
|
farmbuyer@95
|
2805 gui.eoiST:OuroLoot_Refresh(data.index)
|
farmbuyer@1
|
2806 end,
|
farmbuyer@1
|
2807 }
|
farmbuyer@1
|
2808
|
farmbuyer@1
|
2809 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
|
farmbuyer@1
|
2810 text = "Enter a name for the loot collection:",
|
farmbuyer@1
|
2811 button1 = ACCEPT,
|
farmbuyer@1
|
2812 button2 = CANCEL,
|
farmbuyer@1
|
2813 hasEditBox = true,
|
farmbuyer@1
|
2814 maxLetters = 30,
|
farmbuyer@1
|
2815 OnAccept = function(dialog)--, data)
|
farmbuyer@1
|
2816 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@1
|
2817 addon:save_saveas(name)
|
farmbuyer@1
|
2818 addon:BuildMainDisplay()
|
farmbuyer@1
|
2819 end,
|
farmbuyer@1
|
2820 OnCancel = function(dialog)--, data, reason)
|
farmbuyer@1
|
2821 addon:BuildMainDisplay()
|
farmbuyer@1
|
2822 end,
|
farmbuyer@1
|
2823 }
|
farmbuyer@1
|
2824
|
farmbuyer@25
|
2825
|
farmbuyer@25
|
2826 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
|
farmbuyer@25
|
2827 if true then
|
farmbuyer@25
|
2828 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
|
farmbuyer@25
|
2829 -- tagged with CHANGE.
|
farmbuyer@25
|
2830 local function onenter (self, motion)
|
farmbuyer@25
|
2831 if ( self.hasArrow ) then
|
farmbuyer@25
|
2832 local level = self:GetParent():GetID() + 1;
|
farmbuyer@25
|
2833 local listFrame = _G["DropDownList"..level];
|
farmbuyer@25
|
2834 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
|
farmbuyer@25
|
2835 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
|
farmbuyer@25
|
2836 end
|
farmbuyer@25
|
2837 else
|
farmbuyer@25
|
2838 CloseDropDownMenus(self:GetParent():GetID() + 1);
|
farmbuyer@25
|
2839 end
|
farmbuyer@25
|
2840 _G[self:GetName().."Highlight"]:Show();
|
farmbuyer@25
|
2841 UIDropDownMenu_StopCounting(self:GetParent());
|
farmbuyer@25
|
2842 if ( self.tooltipTitle ) then
|
farmbuyer@25
|
2843 if ( self.tooltipOnButton ) then
|
farmbuyer@25
|
2844 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
farmbuyer@25
|
2845 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
|
farmbuyer@25
|
2846 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
|
farmbuyer@25
|
2847 GameTooltip:Show();
|
farmbuyer@25
|
2848 else
|
farmbuyer@25
|
2849 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
|
farmbuyer@25
|
2850 end
|
farmbuyer@25
|
2851 end
|
farmbuyer@25
|
2852 end
|
farmbuyer@25
|
2853 -- end verbatime copy
|
farmbuyer@25
|
2854
|
farmbuyer@25
|
2855 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
|
farmbuyer@25
|
2856 local list = _G["DropDownList"..i]
|
farmbuyer@25
|
2857 if list then
|
farmbuyer@25
|
2858 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
|
farmbuyer@25
|
2859 local button = _G["DropDownList"..i.."Button"..j]
|
farmbuyer@25
|
2860 if button then
|
farmbuyer@25
|
2861 --print("button fixup",i,j)
|
farmbuyer@25
|
2862 button:SetScript("OnEnter",onenter)
|
farmbuyer@25
|
2863 end
|
farmbuyer@25
|
2864 end
|
farmbuyer@25
|
2865 end
|
farmbuyer@25
|
2866 end
|
farmbuyer@25
|
2867 end
|
farmbuyer@25
|
2868
|
farmbuyer@109
|
2869 addon.FILES_LOADED = addon.FILES_LOADED + 1
|
farmbuyer@1
|
2870 -- vim:noet
|