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