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