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