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@10
|
2129
|
farmbuyer@1
|
2130 -- reminder popup
|
farmbuyer@83
|
2131 w = mkoption ('popup_on_join', "Show reminder popup on new raid", 0.49,
|
farmbuyer@1
|
2132 [[When joining a raid and not already tracking, display a dialog asking for instructions.]])
|
farmbuyer@1
|
2133 grp:AddChild(w)
|
farmbuyer@1
|
2134
|
farmbuyer@1
|
2135 -- toggle scroll-to-bottom on first tab
|
farmbuyer@16
|
2136 w = mkoption('scroll_to_bottom', "Scroll to bottom when opening display", 0.49,
|
farmbuyer@1
|
2137 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]])
|
farmbuyer@1
|
2138 grp:AddChild(w)
|
farmbuyer@1
|
2139
|
farmbuyer@73
|
2140 -- chatty boss mode
|
farmbuyer@16
|
2141 w = mkoption('chatty_on_kill', "Be chatty on boss kill", 0.49,
|
farmbuyer@83
|
2142 [[Print something to chat output when the boss mod tells Ouro Loot about a successful boss kill.]])
|
farmbuyer@1
|
2143 grp:AddChild(w)
|
farmbuyer@1
|
2144
|
farmbuyer@1
|
2145 -- less noise in main panel
|
farmbuyer@16
|
2146 w = mkoption('no_tracking_wipes', "Do not track wipes", 0.49,
|
farmbuyer@1
|
2147 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]])
|
farmbuyer@1
|
2148 grp:AddChild(w)
|
farmbuyer@1
|
2149
|
farmbuyer@1
|
2150 -- cutesy abbrevs
|
farmbuyer@16
|
2151 w = mkoption('snarky_boss', "Use snarky boss names", 0.49,
|
farmbuyer@83
|
2152 [[Irreverent replacement names for boss events. See abbreviations.lua for details.]])
|
farmbuyer@1
|
2153 grp:AddChild(w)
|
farmbuyer@1
|
2154
|
farmbuyer@57
|
2155 -- LOD plugins in all cases
|
farmbuyer@57
|
2156 w = mkoption('display_disabled_LODs', "Include disabled plugins", 0.49,
|
farmbuyer@57
|
2157 [[Show loadable plugins even if they've been disabled (and offer to enable them). Relog to take effect.]])
|
farmbuyer@57
|
2158 grp:AddChild(w)
|
farmbuyer@57
|
2159
|
farmbuyer@65
|
2160 -- showing the "(from Rebroadcasterdude)" in the notes column
|
farmbuyer@65
|
2161 w = mkoption('display_bcast_from', "Show rebroadcasting player", 0.49,
|
farmbuyer@73
|
2162 [[Include "from PlayerName" in the Notes column for loot that was broadcast to you. (Not included in forum output).]],
|
farmbuyer@65
|
2163 function(_w,_e,value)
|
farmbuyer@65
|
2164 opts.display_bcast_from = value
|
farmbuyer@65
|
2165 addon.loot_clean = nil
|
farmbuyer@65
|
2166 end)
|
farmbuyer@65
|
2167 grp:AddChild(w)
|
farmbuyer@65
|
2168
|
farmbuyer@73
|
2169 -- prefilling g_uniques with history
|
farmbuyer@73
|
2170 w = mkoption('precache_history_uniques', "Prescan for faster handling", 0.49,
|
farmbuyer@73
|
2171 [[See description under +Help -- Handy Tips -- Prescanning> for instructions.]])
|
farmbuyer@73
|
2172 grp:AddChild(w)
|
farmbuyer@73
|
2173
|
farmbuyer@94
|
2174 w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(5) grp:AddChild(w)
|
farmbuyer@73
|
2175
|
farmbuyer@1
|
2176 -- possible keybindings
|
farmbuyer@1
|
2177 do
|
farmbuyer@73
|
2178 local pair = GUI:Create("InlineGroup")
|
farmbuyer@73
|
2179 pair:SetLayout("List")
|
farmbuyer@73
|
2180 pair:SetRelativeWidth(0.49)
|
farmbuyer@89
|
2181 pair:SetTitle("Keybinding for '/ouroloot'")
|
farmbuyer@1
|
2182 local editbox, checkbox
|
farmbuyer@65
|
2183 editbox = mkbutton("EditBox", nil, opts.keybinding_text,
|
farmbuyer@83
|
2184 [[Keybinding text format is fragile (ALT then CTRL then SHIFT)! Relog to take effect.]])
|
farmbuyer@73
|
2185 editbox:SetFullWidth(true)
|
farmbuyer@1
|
2186 editbox:SetLabel("Keybinding text")
|
farmbuyer@1
|
2187 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@65
|
2188 opts.keybinding_text = value
|
farmbuyer@1
|
2189 end)
|
farmbuyer@65
|
2190 editbox:SetDisabled(not opts.keybinding)
|
farmbuyer@73
|
2191 checkbox = mkoption('keybinding', "Register keybinding", 1,
|
farmbuyer@1
|
2192 [[Register a keybinding to toggle the loot display. Relog to take effect.]],
|
farmbuyer@1
|
2193 function (_w,_,value)
|
farmbuyer@65
|
2194 opts.keybinding = value
|
farmbuyer@65
|
2195 editbox:SetDisabled(not opts.keybinding)
|
farmbuyer@1
|
2196 end)
|
farmbuyer@73
|
2197 checkbox:SetFullWidth(true)
|
farmbuyer@1
|
2198 pair:AddChild(checkbox)
|
farmbuyer@1
|
2199 pair:AddChild(editbox)
|
farmbuyer@1
|
2200 grp:AddChild(pair)
|
farmbuyer@1
|
2201 end
|
farmbuyer@1
|
2202
|
farmbuyer@94
|
2203 -- replacement for slashloot
|
farmbuyer@94
|
2204 do
|
farmbuyer@94
|
2205 local pair = GUI:Create("InlineGroup")
|
farmbuyer@94
|
2206 pair:SetLayout("List")
|
farmbuyer@94
|
2207 pair:SetRelativeWidth(0.49)
|
farmbuyer@94
|
2208 pair:SetTitle('Synonyms for "/ouroloot"')
|
farmbuyer@94
|
2209 local editbox, checkbox
|
farmbuyer@94
|
2210 editbox = mkbutton("EditBox", nil, opts.slash_synonyms,
|
farmbuyer@94
|
2211 [[Separate multiple synonyms with a comma. Relog to take effect.]])
|
farmbuyer@94
|
2212 editbox:SetFullWidth(true)
|
farmbuyer@94
|
2213 editbox:SetLabel("Slash commands")
|
farmbuyer@94
|
2214 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
|
farmbuyer@94
|
2215 -- Do the sanity checking here rather than at each login.
|
farmbuyer@94
|
2216 -- This is not foolproof. That's okay.
|
farmbuyer@94
|
2217 local t = { strsplit(',', tostring(value)) }
|
farmbuyer@94
|
2218 for k,v in ipairs(t) do
|
farmbuyer@94
|
2219 v = v:trim()
|
farmbuyer@94
|
2220 if v:sub(1,1) ~= "/" then
|
farmbuyer@94
|
2221 v = "/" .. v
|
farmbuyer@94
|
2222 end
|
farmbuyer@94
|
2223 t[k] = v
|
farmbuyer@94
|
2224 end
|
farmbuyer@94
|
2225 value = table.concat(t,',')
|
farmbuyer@94
|
2226 _e:SetText(value)
|
farmbuyer@94
|
2227 opts.slash_synonyms = value
|
farmbuyer@94
|
2228 end)
|
farmbuyer@94
|
2229 editbox:SetDisabled(not opts.register_slash_synonyms)
|
farmbuyer@94
|
2230 checkbox = mkoption('register_slash_synonyms', "Register slash commands", 1,
|
farmbuyer@94
|
2231 [[Register these slash commands as synonyms for "/ouroloot". Relog to take effect.]],
|
farmbuyer@94
|
2232 function (_w,_,value)
|
farmbuyer@94
|
2233 opts.register_slash_synonyms = value
|
farmbuyer@94
|
2234 editbox:SetDisabled(not opts.register_slash_synonyms)
|
farmbuyer@94
|
2235 end)
|
farmbuyer@94
|
2236 checkbox:SetFullWidth(true)
|
farmbuyer@94
|
2237 pair:AddChild(checkbox)
|
farmbuyer@94
|
2238 pair:AddChild(editbox)
|
farmbuyer@94
|
2239 grp:AddChild(pair)
|
farmbuyer@94
|
2240 end
|
farmbuyer@94
|
2241
|
farmbuyer@73
|
2242 -- chatty disposition/assignment changes
|
farmbuyer@73
|
2243 do
|
farmbuyer@73
|
2244 local chatgroup = GUI:Create("InlineGroup")
|
farmbuyer@73
|
2245 chatgroup:SetLayout("List")
|
farmbuyer@73
|
2246 chatgroup:SetRelativeWidth(0.49)
|
farmbuyer@73
|
2247 chatgroup:SetTitle("Remote Changes Chat")
|
farmbuyer@73
|
2248 local toggle, editbox
|
farmbuyer@73
|
2249 toggle = mkoption('chatty_on_remote_changes', "Be chatty on remote changes", 1,
|
farmbuyer@73
|
2250 [[Print something to chat when other users change recorded loot.]],
|
farmbuyer@73
|
2251 function (_w,_,value)
|
farmbuyer@73
|
2252 opts.chatty_on_remote_changes = value
|
farmbuyer@73
|
2253 editbox:SetDisabled(not opts.chatty_on_remote_changes)
|
farmbuyer@73
|
2254 end)
|
farmbuyer@73
|
2255 toggle:SetFullWidth(true)
|
farmbuyer@73
|
2256 chatgroup:AddChild(toggle)
|
farmbuyer@73
|
2257 w = GUI:Create("Label")
|
farmbuyer@73
|
2258 w:SetFullWidth(true)
|
farmbuyer@73
|
2259 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
|
2260 chatgroup:AddChild(w)
|
farmbuyer@73
|
2261 editbox = mkbutton("EditBox", nil, opts.chatty_on_remote_changes_frame,
|
farmbuyer@73
|
2262 [[1 = default chat frame, 2 = combat log, etc]])
|
farmbuyer@73
|
2263 editbox:SetFullWidth(true)
|
farmbuyer@73
|
2264 editbox:SetLabel("Output Chatframe")
|
farmbuyer@73
|
2265 editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
|
farmbuyer@73
|
2266 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@73
|
2267 local prev = opts.chatty_on_remote_changes_frame
|
farmbuyer@73
|
2268 value = value:trim()
|
farmbuyer@73
|
2269 value = tonumber(value) or value
|
farmbuyer@73
|
2270 if addon:_set_remote_change_chatframe (value) then
|
farmbuyer@73
|
2271 opts.chatty_on_remote_changes_frame = value
|
farmbuyer@73
|
2272 _w:SetText(tostring(value))
|
farmbuyer@73
|
2273 _w.editbox:ClearFocus()
|
farmbuyer@73
|
2274 else
|
farmbuyer@73
|
2275 _w:SetText(tostring(prev))
|
farmbuyer@73
|
2276 end
|
farmbuyer@73
|
2277 end)
|
farmbuyer@73
|
2278 editbox:SetDisabled(not opts.chatty_on_remote_changes)
|
farmbuyer@73
|
2279 chatgroup:AddChild(editbox)
|
farmbuyer@73
|
2280 w = mkbutton("Chat Frame Numbers",
|
farmbuyer@73
|
2281 [[Print each chat window number in its own frame, for easy reference in the editing field.]])
|
farmbuyer@73
|
2282 w:SetFullWidth(true)
|
farmbuyer@73
|
2283 w:SetCallback("OnClick", function()
|
farmbuyer@73
|
2284 for i = 1, NUM_CHAT_WINDOWS do
|
farmbuyer@73
|
2285 local cf = _G['ChatFrame'..i]
|
farmbuyer@73
|
2286 if not cf then break end
|
farmbuyer@73
|
2287 addon:CFPrint (cf, "This is frame number |cffff0000%d|r.", i)
|
farmbuyer@73
|
2288 end
|
farmbuyer@73
|
2289 end)
|
farmbuyer@73
|
2290 chatgroup:AddChild(w)
|
farmbuyer@73
|
2291 grp:AddChild(chatgroup)
|
farmbuyer@73
|
2292 end
|
farmbuyer@73
|
2293
|
farmbuyer@3
|
2294 -- boss mod selection
|
farmbuyer@94
|
2295 w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) grp:AddChild(w)
|
farmbuyer@3
|
2296 do
|
farmbuyer@3
|
2297 local list = {}
|
farmbuyer@3
|
2298 local current
|
farmbuyer@3
|
2299 for k,v in ipairs(addon.bossmods) do
|
farmbuyer@3
|
2300 list[k] = v.n
|
farmbuyer@65
|
2301 if v.n == opts.bossmod then
|
farmbuyer@3
|
2302 current = k
|
farmbuyer@3
|
2303 end
|
farmbuyer@3
|
2304 end
|
farmbuyer@3
|
2305 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
|
farmbuyer@3
|
2306 w:SetRelativeWidth(0.2)
|
farmbuyer@3
|
2307 w:SetLabel("Boss Mod:")
|
farmbuyer@3
|
2308 w:SetList(list)
|
farmbuyer@3
|
2309 w:SetValue(current)
|
farmbuyer@3
|
2310 w:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@65
|
2311 opts.bossmod = list[choice]
|
farmbuyer@3
|
2312 end)
|
farmbuyer@3
|
2313 grp:AddChild(w)
|
farmbuyer@3
|
2314 end
|
farmbuyer@3
|
2315
|
farmbuyer@70
|
2316 -- item filters
|
farmbuyer@94
|
2317 w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) grp:AddChild(w)
|
farmbuyer@1
|
2318 do
|
farmbuyer@70
|
2319 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
|
2320 local cache_warn, cache_warned = false, false
|
farmbuyer@70
|
2321 local function do_warning()
|
farmbuyer@70
|
2322 if cache_warn and not cache_warned then
|
farmbuyer@70
|
2323 cache_warned = true
|
farmbuyer@70
|
2324 addon:Print(warntext)
|
farmbuyer@70
|
2325 end
|
farmbuyer@70
|
2326 end
|
farmbuyer@70
|
2327
|
farmbuyer@70
|
2328 local filterlist, vaultlist = {}, {}
|
farmbuyer@65
|
2329 for id in pairs(opts.itemfilter) do
|
farmbuyer@1
|
2330 local iname, _, iquality = GetItemInfo(id)
|
farmbuyer@2
|
2331 if iname then
|
farmbuyer@70
|
2332 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@54
|
2333 else
|
farmbuyer@54
|
2334 cache_warn = true
|
farmbuyer@2
|
2335 end
|
farmbuyer@1
|
2336 end
|
farmbuyer@70
|
2337 for id in pairs(opts.itemvault) do
|
farmbuyer@70
|
2338 local iname, _, iquality = GetItemInfo(id)
|
farmbuyer@70
|
2339 if iname then
|
farmbuyer@70
|
2340 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@70
|
2341 else
|
farmbuyer@70
|
2342 cache_warn = true
|
farmbuyer@70
|
2343 end
|
farmbuyer@70
|
2344 end
|
farmbuyer@70
|
2345
|
farmbuyer@1
|
2346 w = GUI:Create("EditBoxDropDown")
|
farmbuyer@1
|
2347 w:SetRelativeWidth(0.4)
|
farmbuyer@1
|
2348 w:SetText("Item filter")
|
farmbuyer@1
|
2349 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
|
farmbuyer@70
|
2350 w:SetList(filterlist)
|
farmbuyer@1
|
2351 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
|
farmbuyer@73
|
2352 local iname, ilink, iquality = GetItemInfo(text:trim())
|
farmbuyer@1
|
2353 if not iname then
|
farmbuyer@1
|
2354 return addon:Print("Error: %s is not a valid item name/link!", text)
|
farmbuyer@1
|
2355 end
|
farmbuyer@1
|
2356 local id = tonumber(ilink:match("item:(%d+)"))
|
farmbuyer@70
|
2357 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@65
|
2358 opts.itemfilter[id] = true
|
farmbuyer@1
|
2359 addon:Print("Now filtering out", ilink)
|
farmbuyer@1
|
2360 end)
|
farmbuyer@1
|
2361 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
|
farmbuyer@1
|
2362 --local ilink = select(2,GetItemInfo(key_id))
|
farmbuyer@65
|
2363 opts.itemfilter[tonumber(key_id)] = nil
|
farmbuyer@1
|
2364 --addon:Print("No longer filtering out", ilink)
|
farmbuyer@1
|
2365 addon:Print("No longer filtering out", val_name)
|
farmbuyer@1
|
2366 end)
|
farmbuyer@70
|
2367 w:SetCallback("OnDropdownShown",do_warning)
|
farmbuyer@70
|
2368 grp:AddChild(w)
|
farmbuyer@70
|
2369
|
farmbuyer@70
|
2370 w = GUI:Create("Spacer")
|
farmbuyer@70
|
2371 w:SetRelativeWidth(0.1)
|
farmbuyer@70
|
2372 w:SetHeight(2)
|
farmbuyer@70
|
2373 grp:AddChild(w)
|
farmbuyer@70
|
2374
|
farmbuyer@70
|
2375 w = GUI:Create("EditBoxDropDown")
|
farmbuyer@70
|
2376 w:SetRelativeWidth(0.4)
|
farmbuyer@70
|
2377 w:SetText("Vault items")
|
farmbuyer@70
|
2378 w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.")
|
farmbuyer@70
|
2379 w:SetList(vaultlist)
|
farmbuyer@70
|
2380 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
|
farmbuyer@73
|
2381 local iname, ilink, iquality = GetItemInfo(text:trim())
|
farmbuyer@70
|
2382 if not iname then
|
farmbuyer@70
|
2383 return addon:Print("Error: %s is not a valid item name/link!", text)
|
farmbuyer@54
|
2384 end
|
farmbuyer@70
|
2385 local id = tonumber(ilink:match("item:(%d+)"))
|
farmbuyer@70
|
2386 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@70
|
2387 opts.itemvault[id] = true
|
farmbuyer@70
|
2388 addon:Print("Now auto-vaulting", ilink)
|
farmbuyer@54
|
2389 end)
|
farmbuyer@70
|
2390 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
|
farmbuyer@70
|
2391 --local ilink = select(2,GetItemInfo(key_id))
|
farmbuyer@70
|
2392 opts.itemfilter[tonumber(key_id)] = nil
|
farmbuyer@70
|
2393 --addon:Print("No longer filtering out", ilink)
|
farmbuyer@70
|
2394 addon:Print("No longer auto-vaulting", val_name)
|
farmbuyer@70
|
2395 end)
|
farmbuyer@70
|
2396 w:SetCallback("OnDropdownShown",do_warning)
|
farmbuyer@1
|
2397 grp:AddChild(w)
|
farmbuyer@1
|
2398 end
|
farmbuyer@1
|
2399
|
farmbuyer@1
|
2400 addon.sender_list.sort()
|
farmbuyer@1
|
2401 if #addon.sender_list.namesI > 0 then
|
farmbuyer@1
|
2402 local senders = table.concat(addon.sender_list.namesI,'\n') -- sigh
|
farmbuyer@1
|
2403 -- If 39 other people in the raid are running this, the label will
|
farmbuyer@1
|
2404 -- explode... is it likely enough to care about? No.
|
farmbuyer@1
|
2405 w = GUI:Create("Spacer")
|
farmbuyer@1
|
2406 w:SetFullWidth(true)
|
farmbuyer@1
|
2407 w:SetHeight(20)
|
farmbuyer@1
|
2408 grp:AddChild(w)
|
farmbuyer@1
|
2409 w = GUI:Create("Label")
|
farmbuyer@1
|
2410 w:SetRelativeWidth(0.4)
|
farmbuyer@11
|
2411 w:SetText(ITEM_QUALITY_COLORS[3].hex .."Echo from latest ping:|r\n"..senders)
|
farmbuyer@1
|
2412 grp:AddChild(w)
|
farmbuyer@1
|
2413 end
|
farmbuyer@1
|
2414
|
farmbuyer@6
|
2415 scroll:AddChild(grp)
|
farmbuyer@6
|
2416
|
farmbuyer@1
|
2417 w = mkbutton("ReloadUI", [[Does what you think it does. Loot information is written out and restored.]])
|
farmbuyer@1
|
2418 w:SetFullWidth(true)
|
farmbuyer@1
|
2419 w:SetCallback("OnClick", ReloadUI)
|
farmbuyer@1
|
2420 specials:AddChild(w)
|
farmbuyer@1
|
2421
|
farmbuyer@1
|
2422 w = mkbutton("Ping!",
|
farmbuyer@1
|
2423 [[Asks other raid users for their addon version and current status. Results displayed on User Options panel.]])
|
farmbuyer@1
|
2424 w:SetFullWidth(true)
|
farmbuyer@1
|
2425 w:SetCallback("OnClick", function(_w)
|
farmbuyer@1
|
2426 _w:SetText("5... 4... 3...")
|
farmbuyer@1
|
2427 _w:SetDisabled(true)
|
farmbuyer@23
|
2428 addon:DoPing()
|
farmbuyer@1
|
2429 addon:ScheduleTimer(function(b)
|
farmbuyer@1
|
2430 if b:IsVisible() then
|
farmbuyer@1
|
2431 return addon:redisplay()
|
farmbuyer@1
|
2432 end
|
farmbuyer@1
|
2433 end, 5, _w)
|
farmbuyer@1
|
2434 end)
|
farmbuyer@1
|
2435 specials:AddChild(w)
|
farmbuyer@1
|
2436
|
farmbuyer@1
|
2437 -- Add appropriate lower panel
|
farmbuyer@1
|
2438 adv_lower (scroll, specials)
|
farmbuyer@1
|
2439
|
farmbuyer@1
|
2440 -- Finish up
|
farmbuyer@1
|
2441 container:AddChild(scroll)
|
farmbuyer@1
|
2442 end
|
farmbuyer@1
|
2443 end
|
farmbuyer@1
|
2444
|
farmbuyer@1
|
2445
|
farmbuyer@1
|
2446 -- Simply to avoid recreating the same function over and over
|
farmbuyer@1
|
2447 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
|
farmbuyer@1
|
2448 tabs_OnGroupSelected_func = function (tabs,event,group)
|
farmbuyer@1
|
2449 tabs_OnGroupSelected_func_args[1] = tabs
|
farmbuyer@1
|
2450 tabs_OnGroupSelected_func_args[3] = group
|
farmbuyer@83
|
2451 hide_noobtips_frame()
|
farmbuyer@1
|
2452 tabs:ReleaseChildren()
|
farmbuyer@1
|
2453 local spec = tabs:GetUserData("special buttons group")
|
farmbuyer@1
|
2454 spec:ReleaseChildren()
|
farmbuyer@1
|
2455 local h = GUI:Create("Heading")
|
farmbuyer@1
|
2456 h:SetFullWidth(true)
|
farmbuyer@1
|
2457 h:SetText(_tabtexts[group].title)
|
farmbuyer@1
|
2458 spec:AddChild(h)
|
farmbuyer@76
|
2459 do
|
farmbuyer@76
|
2460 addon.sender_list.sort()
|
farmbuyer@76
|
2461 local fmt = "Received broadcast data from %d |4player:players;."
|
farmbuyer@76
|
2462 if addon.history_suppress then
|
farmbuyer@76
|
2463 -- this is the druid class color reworked into hex
|
farmbuyer@76
|
2464 fmt = fmt .. " |cffff7d0aHistory recording suppressed.|r"
|
farmbuyer@76
|
2465 end
|
farmbuyer@76
|
2466 tabs.titletext:SetFormattedText (fmt, addon.sender_list.activeI)
|
farmbuyer@76
|
2467 end
|
farmbuyer@81
|
2468 local status,err = pcall (tabs_OnGroupSelected[group], tabs, spec, group)
|
farmbuyer@81
|
2469 if not status then
|
farmbuyer@81
|
2470 addon:horrible_horrible_error(err)
|
farmbuyer@81
|
2471 end
|
farmbuyer@83
|
2472 if OuroLootSV_opts.gui_noob then
|
farmbuyer@83
|
2473 local tip = noob_tips[group]
|
farmbuyer@83
|
2474 if type(tip) == 'function' then
|
farmbuyer@83
|
2475 tip = tip()
|
farmbuyer@83
|
2476 end
|
farmbuyer@83
|
2477 if type(tip) == 'string' and tip ~= "" then
|
farmbuyer@83
|
2478 local w = get_noobtips_frame()
|
farmbuyer@83
|
2479 w:SetParent (_d.content)
|
farmbuyer@83
|
2480 w:ClearAllPoints()
|
farmbuyer@83
|
2481 w:SetPoint("BOTTOMLEFT", _d.frame, "BOTTOMRIGHT", 3, 3)
|
farmbuyer@83
|
2482 w:Show()
|
farmbuyer@83
|
2483 w:DoTextWork(tip)
|
farmbuyer@83
|
2484 end
|
farmbuyer@83
|
2485 end
|
farmbuyer@1
|
2486 --[====[
|
farmbuyer@1
|
2487 Unfortunately, :GetHeight() called on anything useful out of a TabGroup
|
farmbuyer@1
|
2488 returns the static default size (about 50 pixels) until the refresh
|
farmbuyer@1
|
2489 cycle *after* all the frames are shown. Trying to fix it up after a
|
farmbuyer@1
|
2490 single OnUpdate doesn't work either. So for now it's all hardcoded.
|
farmbuyer@1
|
2491
|
farmbuyer@83
|
2492 Using this to determine the actual height of the usable area. (Will
|
farmbuyer@83
|
2493 error until an ST is shown, which only happens if it's tracking, etc.)
|
farmbuyer@83
|
2494 416 pixels
|
farmbuyer@1
|
2495 if group == "eoi" then
|
farmbuyer@1
|
2496 local stframe = tabs.children[1].frame
|
farmbuyer@1
|
2497 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
|
farmbuyer@1
|
2498 stframe:GetTop()-stframe:GetBottom())
|
farmbuyer@1
|
2499 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
|
farmbuyer@1
|
2500 stframe:GetRight()-stframe:GetLeft())
|
farmbuyer@1
|
2501 end
|
farmbuyer@1
|
2502 ]====]
|
farmbuyer@1
|
2503 end
|
farmbuyer@1
|
2504
|
farmbuyer@1
|
2505 --[[
|
farmbuyer@1
|
2506 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2507 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2508 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2509 ]]
|
farmbuyer@83
|
2510 function mkbutton (opt_widget_type, opt_key, label, status)
|
farmbuyer@83
|
2511 if not label then
|
farmbuyer@83
|
2512 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
|
farmbuyer@83
|
2513 elseif not status then
|
farmbuyer@83
|
2514 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
|
farmbuyer@1
|
2515 end
|
farmbuyer@83
|
2516 local button = assert(GUI:Create(opt_widget_type))
|
farmbuyer@83
|
2517 if button.SetText then button:SetText(tostring(label)) end
|
farmbuyer@83
|
2518 status = _markup(status)
|
farmbuyer@83
|
2519 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
|
farmbuyer@83
|
2520 button:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@83
|
2521 -- retrieval key may be specified as nil if all the parameters are given
|
farmbuyer@83
|
2522 if opt_key then _d:SetUserData (opt_key, button) end
|
farmbuyer@83
|
2523 return button
|
farmbuyer@1
|
2524 end
|
farmbuyer@1
|
2525
|
farmbuyer@1
|
2526 --[[
|
farmbuyer@1
|
2527 Creates the main window.
|
farmbuyer@1
|
2528 ]]
|
farmbuyer@1
|
2529 function addon:BuildMainDisplay (opt_tabselect)
|
farmbuyer@1
|
2530 if self.display then
|
farmbuyer@1
|
2531 -- try to get everything to update, rebuild, refresh... ugh, no
|
farmbuyer@1
|
2532 self.display:Hide()
|
farmbuyer@1
|
2533 end
|
farmbuyer@92
|
2534 if self.NOLOAD then
|
farmbuyer@92
|
2535 -- don't even try
|
farmbuyer@92
|
2536 return
|
farmbuyer@92
|
2537 end
|
farmbuyer@1
|
2538
|
farmbuyer@25
|
2539 -- This probably causes taint... hm.
|
farmbuyer@25
|
2540 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
|
farmbuyer@25
|
2541 UIDROPDOWNMENU_SHOW_TIME = 4
|
farmbuyer@25
|
2542
|
farmbuyer@47
|
2543 if dirty_tabs then
|
farmbuyer@84
|
2544 -- pointers known to be good by now, pass them back in
|
farmbuyer@84
|
2545 self:gui_init (g_loot, g_uniques)
|
farmbuyer@47
|
2546 self:zero_printed_fenceposts()
|
farmbuyer@47
|
2547 end
|
farmbuyer@47
|
2548
|
farmbuyer@1
|
2549 local display = GUI:Create("Frame")
|
farmbuyer@1
|
2550 if _d then
|
farmbuyer@79
|
2551 display:SetUserData("eoiST",_d) -- warning! warning! kludge detected!
|
farmbuyer@1
|
2552 end
|
farmbuyer@1
|
2553 _d = display
|
farmbuyer@1
|
2554 self.display = display
|
farmbuyer@17
|
2555 display:SetTitle(window_title)
|
farmbuyer@1
|
2556 display:SetStatusText(self.status_text)
|
farmbuyer@1
|
2557 display:SetLayout("Flow")
|
farmbuyer@16
|
2558 display:SetStatusTable{width=900,height=550} -- default height is 500
|
farmbuyer@47
|
2559 display:EnableResize(false)
|
farmbuyer@1
|
2560 display:SetCallback("OnClose", function(_display)
|
farmbuyer@25
|
2561 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
|
farmbuyer@83
|
2562 hide_noobtips_frame()
|
farmbuyer@1
|
2563 _d = _display:GetUserData("eoiST")
|
farmbuyer@1
|
2564 self.display = nil
|
farmbuyer@1
|
2565 GUI:Release(_display)
|
farmbuyer@6
|
2566 flib.clear()
|
farmbuyer@1
|
2567 collectgarbage()
|
farmbuyer@1
|
2568 end)
|
farmbuyer@1
|
2569
|
farmbuyer@1
|
2570 ----- Right-hand panel
|
farmbuyer@1
|
2571 local rhs_width = 0.20
|
farmbuyer@1
|
2572 local control = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
2573 control:SetLayout("Flow")
|
farmbuyer@1
|
2574 control:SetRelativeWidth(rhs_width)
|
farmbuyer@1
|
2575 control.alignoffset = 25
|
farmbuyer@1
|
2576 control:PauseLayout()
|
farmbuyer@1
|
2577 local h,b
|
farmbuyer@1
|
2578
|
farmbuyer@1
|
2579 --- Main ---
|
farmbuyer@1
|
2580 h = GUI:Create("Heading")
|
farmbuyer@1
|
2581 h:SetFullWidth(true)
|
farmbuyer@1
|
2582 h:SetText("Main")
|
farmbuyer@1
|
2583 control:AddChild(h)
|
farmbuyer@1
|
2584
|
farmbuyer@1
|
2585 do
|
farmbuyer@1
|
2586 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
2587 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
|
farmbuyer@1
|
2588 b:SetFullWidth(true)
|
farmbuyer@1
|
2589 b:SetLabel("On/Off:")
|
farmbuyer@1
|
2590 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
|
farmbuyer@1
|
2591 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
|
farmbuyer@1
|
2592 b:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@1
|
2593 if choice == 1 then self:Activate()
|
farmbuyer@1
|
2594 elseif choice == 2 then self:Activate(nil,true)
|
farmbuyer@1
|
2595 else self:Deactivate()
|
farmbuyer@1
|
2596 end
|
farmbuyer@1
|
2597 _w = display:GetUserData('comm_ident')
|
farmbuyer@1
|
2598 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2599 _w:SetDisabled(self.enabled or self.rebroadcast)
|
farmbuyer@1
|
2600 end
|
farmbuyer@1
|
2601 _w = display:GetUserData('eoi_bcast_req')
|
farmbuyer@1
|
2602 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2603 _w:SetDisabled(not self.enabled)
|
farmbuyer@1
|
2604 end
|
farmbuyer@1
|
2605 end)
|
farmbuyer@1
|
2606 control:AddChild(b)
|
farmbuyer@1
|
2607 end
|
farmbuyer@1
|
2608
|
farmbuyer@1
|
2609 b = mkbutton("Dropdown", 'threshold', "",
|
farmbuyer@1
|
2610 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
|
farmbuyer@1
|
2611 b:SetFullWidth(true)
|
farmbuyer@1
|
2612 b:SetLabel("Threshold:")
|
farmbuyer@1
|
2613 b:SetList(self.thresholds)
|
farmbuyer@1
|
2614 b:SetValue(self.threshold)
|
farmbuyer@1
|
2615 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
2616 self:SetThreshold(choice)
|
farmbuyer@1
|
2617 end)
|
farmbuyer@1
|
2618 control:AddChild(b)
|
farmbuyer@1
|
2619
|
farmbuyer@4
|
2620 b = mkbutton("Clear Loot",
|
farmbuyer@1
|
2621 [[+Erases> all current loot information and generated text (but not saved texts).]])
|
farmbuyer@1
|
2622 b:SetFullWidth(true)
|
farmbuyer@1
|
2623 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2624 StaticPopup_Show("OUROL_CLEAR").data = self
|
farmbuyer@1
|
2625 end)
|
farmbuyer@1
|
2626 control:AddChild(b)
|
farmbuyer@1
|
2627
|
farmbuyer@1
|
2628 b = GUI:Create("Spacer")
|
farmbuyer@1
|
2629 b:SetFullWidth(true)
|
farmbuyer@16
|
2630 b:SetHeight(10)
|
farmbuyer@1
|
2631 control:AddChild(b)
|
farmbuyer@1
|
2632
|
farmbuyer@1
|
2633 --[[
|
farmbuyer@1
|
2634 --- Saved Texts ---
|
farmbuyer@1
|
2635 [ Save Current As... ]
|
farmbuyer@1
|
2636 saved1
|
farmbuyer@1
|
2637 saved2
|
farmbuyer@1
|
2638 ...
|
farmbuyer@1
|
2639 [ Load ] [ Delete ]
|
farmbuyer@1
|
2640 ]]
|
farmbuyer@1
|
2641 h = GUI:Create("Heading")
|
farmbuyer@1
|
2642 h:SetFullWidth(true)
|
farmbuyer@1
|
2643 h:SetText("Saved Texts")
|
farmbuyer@1
|
2644 control:AddChild(h)
|
farmbuyer@1
|
2645 b = mkbutton("Save Current As...",
|
farmbuyer@1
|
2646 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
|
farmbuyer@1
|
2647 b:SetFullWidth(true)
|
farmbuyer@1
|
2648 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2649 StaticPopup_Show "OUROL_SAVE_SAVEAS"
|
farmbuyer@1
|
2650 _d:Hide()
|
farmbuyer@1
|
2651 end)
|
farmbuyer@1
|
2652 control:AddChild(b)
|
farmbuyer@1
|
2653
|
farmbuyer@16
|
2654 do
|
farmbuyer@16
|
2655 local scontainer = GUI:Create("SimpleGroup")
|
farmbuyer@16
|
2656 scontainer:SetFullWidth(true)
|
farmbuyer@16
|
2657 scontainer:SetFullHeight(false)
|
farmbuyer@16
|
2658 scontainer:SetAutoAdjustHeight(false)
|
farmbuyer@16
|
2659 scontainer:SetHeight(40) -- no relative height available anymore
|
farmbuyer@16
|
2660 scontainer:SetLayout("Fill")
|
farmbuyer@16
|
2661 local scroll = GUI:Create("ScrollFrame")
|
farmbuyer@16
|
2662 scroll:SetLayout("List")
|
farmbuyer@16
|
2663 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
|
farmbuyer@16
|
2664 if saved then for i,s in ipairs(saved) do
|
farmbuyer@16
|
2665 local il = GUI:Create("InteractiveLabel")
|
farmbuyer@16
|
2666 il:SetFullWidth(true)
|
farmbuyer@16
|
2667 il:SetText(s.name)
|
farmbuyer@16
|
2668 il:SetUserData("num",i)
|
farmbuyer@16
|
2669 il:SetHighlight(1,1,1,0.4)
|
farmbuyer@16
|
2670 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
|
farmbuyer@16
|
2671 il:SetCallback("OnEnter", function() setstatus(str) end)
|
farmbuyer@16
|
2672 il:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@16
|
2673 il:SetCallback("OnClick", function(_il)
|
farmbuyer@16
|
2674 local prev = _d:GetUserData("saved selection")
|
farmbuyer@16
|
2675 if prev then
|
farmbuyer@16
|
2676 prev.highlight:Hide()
|
farmbuyer@16
|
2677 prev:SetColor()
|
farmbuyer@16
|
2678 end
|
farmbuyer@16
|
2679 _il:SetColor(0,1,0)
|
farmbuyer@16
|
2680 _il.highlight:Show()
|
farmbuyer@16
|
2681 _d:SetUserData("saved selection",_il)
|
farmbuyer@16
|
2682 _d:GetUserData("Load"):SetDisabled(false)
|
farmbuyer@16
|
2683 _d:GetUserData("Delete"):SetDisabled(false)
|
farmbuyer@16
|
2684 end)
|
farmbuyer@16
|
2685 scroll:AddChild(il)
|
farmbuyer@16
|
2686 end end
|
farmbuyer@16
|
2687 scontainer:AddChild(scroll)
|
farmbuyer@16
|
2688 control:AddChild(scontainer)
|
farmbuyer@16
|
2689 end
|
farmbuyer@1
|
2690
|
farmbuyer@1
|
2691 b = mkbutton("Load",
|
farmbuyer@1
|
2692 [[Load previously saved text. +REPLACES> all current loot information!]])
|
farmbuyer@1
|
2693 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2694 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2695 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2696 self:save_restore(num)
|
farmbuyer@1
|
2697 self:BuildMainDisplay()
|
farmbuyer@1
|
2698 end)
|
farmbuyer@1
|
2699 b:SetDisabled(true)
|
farmbuyer@1
|
2700 control:AddChild(b)
|
farmbuyer@1
|
2701 b = mkbutton("Delete",
|
farmbuyer@1
|
2702 [[Delete previously saved text.]])
|
farmbuyer@1
|
2703 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2704 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2705 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2706 self:save_delete(num)
|
farmbuyer@1
|
2707 self:BuildMainDisplay()
|
farmbuyer@1
|
2708 end)
|
farmbuyer@1
|
2709 b:SetDisabled(true)
|
farmbuyer@1
|
2710 control:AddChild(b)
|
farmbuyer@1
|
2711
|
farmbuyer@1
|
2712 b = GUI:Create("Spacer")
|
farmbuyer@1
|
2713 b:SetFullWidth(true)
|
farmbuyer@16
|
2714 b:SetHeight(10)
|
farmbuyer@1
|
2715 control:AddChild(b)
|
farmbuyer@1
|
2716
|
farmbuyer@1
|
2717 -- Other stuff on right-hand side
|
farmbuyer@1
|
2718 local tab_specials = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
2719 tab_specials:SetLayout("Flow")
|
farmbuyer@1
|
2720 tab_specials:SetFullWidth(true)
|
farmbuyer@1
|
2721 control:AddChild(tab_specials)
|
farmbuyer@1
|
2722 control:ResumeLayout()
|
farmbuyer@1
|
2723
|
farmbuyer@1
|
2724 ----- Left-hand group
|
farmbuyer@1
|
2725 local tabs = GUI:Create("TabGroup")
|
farmbuyer@1
|
2726 tabs:SetLayout("Flow")
|
farmbuyer@1
|
2727 tabs.alignoffset = 25
|
farmbuyer@49
|
2728 local titletext_orig_fo = tabs.titletext:GetFontObject()
|
farmbuyer@49
|
2729 tabs.titletext:SetFontObject(GameFontNormalSmall)
|
farmbuyer@49
|
2730 tabs:SetCallback("OnRelease", function(_tabs)
|
farmbuyer@49
|
2731 tabs.titletext:SetFontObject(titletext_orig_fo)
|
farmbuyer@49
|
2732 end)
|
farmbuyer@1
|
2733 tabs:SetRelativeWidth(0.99-rhs_width)
|
farmbuyer@1
|
2734 tabs:SetFullHeight(true)
|
farmbuyer@1
|
2735 tabs:SetTabs(tabgroup_tabs)
|
farmbuyer@1
|
2736 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
|
farmbuyer@1
|
2737 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
|
farmbuyer@1
|
2738 setstatus(_tabtexts[value].desc)
|
farmbuyer@1
|
2739 end)
|
farmbuyer@1
|
2740 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
|
farmbuyer@1
|
2741 tabs:SetUserData("special buttons group",tab_specials)
|
farmbuyer@76
|
2742 tabs:SelectTab((opt_tabselect and #opt_tabselect>0)
|
farmbuyer@76
|
2743 and opt_tabselect or "eoi")
|
farmbuyer@1
|
2744
|
farmbuyer@1
|
2745 display:AddChildren (tabs, control)
|
farmbuyer@1
|
2746 display:ApplyStatus()
|
farmbuyer@1
|
2747
|
farmbuyer@1
|
2748 display:Show() -- without this, only appears every *other* function call
|
farmbuyer@1
|
2749 return display
|
farmbuyer@1
|
2750 end
|
farmbuyer@1
|
2751
|
farmbuyer@88
|
2752 function addon:OpenMainDisplayToTab (text, opt_arg)
|
farmbuyer@44
|
2753 text = '^'..text:lower()
|
farmbuyer@1
|
2754 for tab,v in pairs(_tabtexts) do
|
farmbuyer@1
|
2755 if v.title:lower():find(text) then
|
farmbuyer@1
|
2756 self:BuildMainDisplay(tab)
|
farmbuyer@88
|
2757 if opt_arg and tabs_CLI_special[tab] then
|
farmbuyer@88
|
2758 tabs_CLI_special[tab](opt_arg)
|
farmbuyer@88
|
2759 end
|
farmbuyer@1
|
2760 return true
|
farmbuyer@1
|
2761 end
|
farmbuyer@1
|
2762 end
|
farmbuyer@1
|
2763 end
|
farmbuyer@1
|
2764
|
farmbuyer@1
|
2765 -- Essentially a re-click on the current tab (if the current tab were clickable).
|
farmbuyer@1
|
2766 function addon:redisplay ()
|
farmbuyer@1
|
2767 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
|
farmbuyer@1
|
2768 end
|
farmbuyer@1
|
2769
|
farmbuyer@1
|
2770
|
farmbuyer@1
|
2771 ------ Popup dialogs
|
farmbuyer@75
|
2772 local function build_my_slider_widget()
|
farmbuyer@75
|
2773 local s = CreateFrame("Slider", "OuroLootSlider", nil, "OptionsSliderTemplate")
|
farmbuyer@75
|
2774 s.text = OuroLootSliderText
|
farmbuyer@75
|
2775 s.low = OuroLootSliderLow
|
farmbuyer@75
|
2776 s.high = OuroLootSliderHigh
|
farmbuyer@75
|
2777 s:SetScript("OnValueChanged", function (_s, value)
|
farmbuyer@75
|
2778 _s.value = value -- conveniently, this is already of numeric type
|
farmbuyer@75
|
2779 --_s.text:SetText(tostring(value))
|
farmbuyer@75
|
2780 if _s.DoOnValueChanged then
|
farmbuyer@75
|
2781 _s:DoOnValueChanged()
|
farmbuyer@75
|
2782 end
|
farmbuyer@75
|
2783 end)
|
farmbuyer@75
|
2784 build_my_slider_widget = nil
|
farmbuyer@75
|
2785 return s
|
farmbuyer@75
|
2786 end
|
farmbuyer@75
|
2787
|
farmbuyer@1
|
2788 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
|
farmbuyer@1
|
2789 text = "Clear current loot information and text?",
|
farmbuyer@16
|
2790 button1 = YES,
|
farmbuyer@16
|
2791 button2 = NO,
|
farmbuyer@1
|
2792 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2793 addon:Clear(--[[verbose_p=]]true)
|
farmbuyer@1
|
2794 end,
|
farmbuyer@1
|
2795 }
|
farmbuyer@1
|
2796
|
farmbuyer@37
|
2797 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2798 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2799 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@75
|
2800 .. "%s|r, and generate it anew from current loot?",
|
farmbuyer@37
|
2801 button1 = YES,
|
farmbuyer@37
|
2802 button2 = NO,
|
farmbuyer@37
|
2803 OnAccept = function (dialog, addon, data2)
|
farmbuyer@37
|
2804 data2(addon)
|
farmbuyer@37
|
2805 addon:Print("%s history has been regenerated.", addon.history.realm)
|
farmbuyer@37
|
2806 addon:redisplay()
|
farmbuyer@37
|
2807 end,
|
farmbuyer@37
|
2808 }
|
farmbuyer@37
|
2809
|
farmbuyer@16
|
2810 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
|
farmbuyer@37
|
2811 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2812 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2813 button1 = YES,
|
farmbuyer@16
|
2814 button2 = NO,
|
farmbuyer@16
|
2815 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2816 data2(addon)
|
farmbuyer@16
|
2817 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
|
farmbuyer@16
|
2818 addon:redisplay()
|
farmbuyer@16
|
2819 end,
|
farmbuyer@16
|
2820 }
|
farmbuyer@16
|
2821
|
farmbuyer@16
|
2822 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2823 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2824 text = "This will erase all but the latest "
|
farmbuyer@75
|
2825 .. ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
|
farmbuyer@75
|
2826 .. "%s|r for each player on "
|
farmbuyer@75
|
2827 .. ITEM_QUALITY_COLORS[5].hex .. "%s|r. " .. CONTINUE .. "?",
|
farmbuyer@16
|
2828 button1 = YES,
|
farmbuyer@16
|
2829 button2 = NO,
|
farmbuyer@75
|
2830 OnShow = function (dialog, addon)
|
farmbuyer@75
|
2831 local thistable = StaticPopupDialogs[dialog.which]
|
farmbuyer@75
|
2832 -- StaticPopup_Resize does not take extraFrame into account, so we
|
farmbuyer@89
|
2833 -- monkeypatch the sizing method that _Resize calls at the end.
|
farmbuyer@75
|
2834 dialog.saved_setheight = dialog.SetHeight
|
farmbuyer@75
|
2835 dialog.SetHeight = function (d, h)
|
farmbuyer@75
|
2836 return d.saved_setheight(d,h+35)
|
farmbuyer@75
|
2837 end
|
farmbuyer@75
|
2838 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2839 dialog.extraFrame:SetPoint("TOP", dialog.text, "BOTTOM")
|
farmbuyer@75
|
2840 dialog.extraFrame:SetWidth(150)
|
farmbuyer@75
|
2841 dialog.extraFrame:SetHeight(35)
|
farmbuyer@75
|
2842 dialog.extraFrame:Show()
|
farmbuyer@75
|
2843 local slider = _G.OuroLootSlider or build_my_slider_widget()
|
farmbuyer@75
|
2844 slider.DoOnValueChanged = function(s)
|
farmbuyer@75
|
2845 dialog.text:SetFormattedText (thistable.text,
|
farmbuyer@75
|
2846 s.value == 1 and "single entry" or (s.value .. " entries"),
|
farmbuyer@75
|
2847 addon.history.realm)
|
farmbuyer@75
|
2848 StaticPopup_Resize (dialog, "OUROL_HIST_PREEN")
|
farmbuyer@75
|
2849 end
|
farmbuyer@75
|
2850 slider:SetOrientation('HORIZONTAL')
|
farmbuyer@75
|
2851 slider:SetMinMaxValues(1,30)
|
farmbuyer@75
|
2852 slider:SetValueStep(1)
|
farmbuyer@75
|
2853 slider.low:SetText("1")
|
farmbuyer@75
|
2854 slider.high:SetText("30")
|
farmbuyer@75
|
2855 --slider.tooltipText = ???
|
farmbuyer@75
|
2856 slider:SetParent(dialog.extraFrame)
|
farmbuyer@75
|
2857 slider:ClearAllPoints()
|
farmbuyer@75
|
2858 slider:SetPoint("TOPLEFT",dialog.extraFrame,"TOPLEFT",0, -15)
|
farmbuyer@75
|
2859 slider:SetPoint("BOTTOMRIGHT",dialog.extraFrame,"BOTTOMRIGHT",0, 0)
|
farmbuyer@75
|
2860 slider:Show()
|
farmbuyer@75
|
2861 -- This causes OnValueChanged to fire, reformatting the text. Except
|
farmbuyer@75
|
2862 -- IF the slider has already been shown, and IF at the time it was hidden
|
farmbuyer@75
|
2863 -- it had the same value here, THEN there is technically no "change"
|
farmbuyer@75
|
2864 -- and no event is fired. We work around this clever optimization by
|
farmbuyer@75
|
2865 -- doing a pair of set's, forcing the last one to fire OVC.
|
farmbuyer@75
|
2866 slider:SetValue(1)
|
farmbuyer@75
|
2867 slider:SetValue(5)
|
farmbuyer@75
|
2868 end,
|
farmbuyer@75
|
2869 OnAccept = function (dialog, addon, callback)
|
farmbuyer@75
|
2870 local howmany = assert(tonumber(_G.OuroLootSlider.value))
|
farmbuyer@75
|
2871 callback (addon, howmany)
|
farmbuyer@75
|
2872 addon:Print("All loot prior to the most recent %d |4entry:entries; has been erased.", howmany)
|
farmbuyer@16
|
2873 addon:redisplay()
|
farmbuyer@16
|
2874 end,
|
farmbuyer@75
|
2875 OnHide = function (dialog, addon)
|
farmbuyer@75
|
2876 dialog.SetHeight = nil
|
farmbuyer@75
|
2877 dialog.saved_setheight = nil
|
farmbuyer@75
|
2878 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2879 _G.OuroLootSlider:Hide() -- parent is hidden, why is this required?
|
farmbuyer@75
|
2880 _G.OuroLootSlider:ClearAllPoints()
|
farmbuyer@75
|
2881 _G.OuroLootSlider:SetParent(nil)
|
farmbuyer@75
|
2882 end,
|
farmbuyer@16
|
2883 }
|
farmbuyer@16
|
2884
|
farmbuyer@27
|
2885 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
|
farmbuyer@27
|
2886 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
|
farmbuyer@27
|
2887 button1 = OKAY,
|
farmbuyer@27
|
2888 timeout = 0,
|
farmbuyer@27
|
2889 whileDead = true,
|
farmbuyer@27
|
2890 hideOnEscape = true,
|
farmbuyer@27
|
2891 enterClicksFirstButton = true,
|
farmbuyer@27
|
2892 hasEditBox = true,
|
farmbuyer@27
|
2893 editBoxWidth = 350,
|
farmbuyer@53
|
2894 preferredIndex = 3,
|
farmbuyer@27
|
2895 OnShow = function (dialog, url)
|
farmbuyer@27
|
2896 dialog.editBox:SetText(url)
|
farmbuyer@27
|
2897 dialog.editBox:SetFocus()
|
farmbuyer@27
|
2898 dialog.editBox:HighlightText()
|
farmbuyer@27
|
2899 end,
|
farmbuyer@27
|
2900 }
|
farmbuyer@27
|
2901
|
farmbuyer@1
|
2902 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
|
farmbuyer@77
|
2903 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
|
2904 button1 = "Activate recording", -- "accept", left
|
farmbuyer@69
|
2905 button2 = "Broadcast Only", -- "cancel", middle
|
farmbuyer@69
|
2906 button3 = HELP_LABEL, -- "alt", right
|
farmbuyer@1
|
2907 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2908 addon:Activate()
|
farmbuyer@1
|
2909 end,
|
farmbuyer@69
|
2910 noCancelOnEscape = true,
|
farmbuyer@69
|
2911 OnCancel = function (dialog, addon)
|
farmbuyer@1
|
2912 addon:Activate(nil,true)
|
farmbuyer@1
|
2913 end,
|
farmbuyer@69
|
2914 OnAlt = function (dialog, addon)
|
farmbuyer@1
|
2915 -- hitting escape also calls this, but the 3rd arg would be "clicked"
|
farmbuyer@1
|
2916 -- in both cases, not useful here.
|
farmbuyer@89
|
2917 if MouseIsOver(dialog.button3) then
|
farmbuyer@1
|
2918 -- they actually clicked the button (or at least the mouse was over "Help"
|
farmbuyer@1
|
2919 -- when they hit escape... sigh)
|
farmbuyer@1
|
2920 addon:BuildMainDisplay('help')
|
farmbuyer@1
|
2921 else
|
farmbuyer@1
|
2922 addon.popped = true
|
farmbuyer@1
|
2923 end
|
farmbuyer@1
|
2924 end,
|
farmbuyer@1
|
2925 }
|
farmbuyer@1
|
2926
|
farmbuyer@69
|
2927 -- Callback for each Next/Accept stage of inserting a new loot or boss row via
|
farmbuyer@69
|
2928 -- dropdown. Thanks to noCancelOnReuse, each Show done here will technically
|
farmbuyer@69
|
2929 -- Hide and redisplay the same dialog, passing along the same 'data' structure
|
farmbuyer@69
|
2930 -- each time. The topmost call to our OnAccept will then finish by hiding the
|
farmbuyer@69
|
2931 -- (very last) dialog.
|
farmbuyer@69
|
2932 --
|
farmbuyer@69
|
2933 -- This is really, really hideous to read.
|
farmbuyer@69
|
2934 local function eoi_st_insert_OnAccept_boss (dialog, data, data2)
|
farmbuyer@69
|
2935 if data.all_done then
|
farmbuyer@69
|
2936 -- It'll probably be the final entry in the table, but there might have
|
farmbuyer@73
|
2937 -- been real loot happening while the user was clicking and typing.
|
farmbuyer@69
|
2938 local boss_index = addon._addBossEntry{
|
farmbuyer@69
|
2939 kind = 'boss',
|
farmbuyer@69
|
2940 bossname = (OuroLootSV_opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
|
farmbuyer@69
|
2941 reason = 'kill',
|
farmbuyer@69
|
2942 instance = data.instance,
|
farmbuyer@69
|
2943 duration = 0,
|
farmbuyer@69
|
2944 maxsize = data.max_raid_size,
|
farmbuyer@69
|
2945 raidersnap = data.yes_snap or {},
|
farmbuyer@69
|
2946 }
|
farmbuyer@69
|
2947 local entry = tremove(g_loot,boss_index)
|
farmbuyer@69
|
2948 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@69
|
2949 addon:_mark_boss_kill(data.rowindex)
|
farmbuyer@69
|
2950 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
|
farmbuyer@69
|
2951 dialog.data = nil -- free up memory
|
farmbuyer@78
|
2952 addon:Print("Inserted %s %s at entry %d.", data.kind, data.name, data.rowindex)
|
farmbuyer@69
|
2953 return
|
farmbuyer@69
|
2954 end
|
farmbuyer@69
|
2955
|
farmbuyer@69
|
2956 -- third click
|
farmbuyer@69
|
2957 if data.name and data.instance then
|
farmbuyer@69
|
2958 data.all_done = true
|
farmbuyer@69
|
2959 -- this is how we distinguish OnAccept from OnCancel ("clicked"); the
|
farmbuyer@69
|
2960 -- 3rd param is handled all in StaticPopup_OnClick
|
farmbuyer@69
|
2961 if data2 ~= 'clicked' then
|
farmbuyer@69
|
2962 data.yes_snap = data.maybe_snap
|
farmbuyer@69
|
2963 end
|
farmbuyer@69
|
2964 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2965 end
|
farmbuyer@69
|
2966
|
farmbuyer@69
|
2967 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2968
|
farmbuyer@69
|
2969 -- second click
|
farmbuyer@69
|
2970 if data.name and text then
|
farmbuyer@69
|
2971 data.instance = text
|
farmbuyer@92
|
2972 -- not "reusing" this dialog in the same sense as with loot
|
farmbuyer@69
|
2973 dialog.data = nil
|
farmbuyer@69
|
2974 dialog:Hide()
|
farmbuyer@69
|
2975 local getsnap = StaticPopup_Show("OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP")
|
farmbuyer@69
|
2976 getsnap.data = data
|
farmbuyer@69
|
2977 return true
|
farmbuyer@69
|
2978 end
|
farmbuyer@69
|
2979
|
farmbuyer@69
|
2980 -- first click
|
farmbuyer@69
|
2981 if text then
|
farmbuyer@69
|
2982 data.name = text
|
farmbuyer@69
|
2983 local maybe_instance
|
farmbuyer@69
|
2984 data.maybe_snap, data.max_raid_size, maybe_instance = addon:snapshot_raid()
|
farmbuyer@69
|
2985 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
|
farmbuyer@69
|
2986 getinstance.data = data
|
farmbuyer@69
|
2987 getinstance.editBox:SetText(maybe_instance)
|
farmbuyer@69
|
2988 -- This suppresses auto-hide (which would cause the getinstance dialog
|
farmbuyer@69
|
2989 -- to go away), but only when mouse clicking. OnEnter is on its own.
|
farmbuyer@69
|
2990 return true
|
farmbuyer@69
|
2991 end
|
farmbuyer@69
|
2992 end
|
farmbuyer@69
|
2993
|
farmbuyer@69
|
2994 local function eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2995 if data.all_done then
|
farmbuyer@69
|
2996 data.display:Hide()
|
farmbuyer@73
|
2997 local loot_index = assert(addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes))
|
farmbuyer@69
|
2998 local entry = tremove(g_loot,loot_index)
|
farmbuyer@69
|
2999 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@69
|
3000 addon:_fill_out_eoi_data(data.rowindex)
|
farmbuyer@69
|
3001 addon:BuildMainDisplay()
|
farmbuyer@79
|
3002 local clicky = _new_rebroadcast_hyperlink (entry.unique)
|
farmbuyer@69
|
3003 dialog.data = nil
|
farmbuyer@78
|
3004 addon:Print ("Inserted %s %s at entry %d. %s",
|
farmbuyer@78
|
3005 data.kind, data.name, data.rowindex, tostring(clicky))
|
farmbuyer@69
|
3006 return
|
farmbuyer@69
|
3007 end
|
farmbuyer@69
|
3008
|
farmbuyer@69
|
3009 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
3010
|
farmbuyer@69
|
3011 -- third click
|
farmbuyer@69
|
3012 if data.name and data.recipient and text then
|
farmbuyer@69
|
3013 data.notes = (text ~= "<none>") and text or nil
|
farmbuyer@69
|
3014 data.all_done = true
|
farmbuyer@69
|
3015 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
3016 end
|
farmbuyer@69
|
3017
|
farmbuyer@69
|
3018 -- second click
|
farmbuyer@69
|
3019 if data.name and text then
|
farmbuyer@69
|
3020 data.recipient = text
|
farmbuyer@69
|
3021 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
|
farmbuyer@69
|
3022 getnotes.data = data
|
farmbuyer@69
|
3023 getnotes.editBox:SetText("<none>")
|
farmbuyer@69
|
3024 getnotes.editBox:HighlightText()
|
farmbuyer@69
|
3025 return true
|
farmbuyer@69
|
3026 end
|
farmbuyer@69
|
3027
|
farmbuyer@69
|
3028 -- first click
|
farmbuyer@69
|
3029 if text then
|
farmbuyer@69
|
3030 data.name = text
|
farmbuyer@69
|
3031 dialog:Hide() -- technically a "different" one about to be shown
|
farmbuyer@78
|
3032 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams =
|
farmbuyer@93
|
3033 AUTOCOMPLETE_LIST_TEMPLATES[IsInRaid() and "IN_GROUP" or "IN_GUILD"]
|
farmbuyer@69
|
3034 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
|
farmbuyer@78
|
3035 StaticPopupDialogs["OUROL_EOI_INSERT"].autoCompleteParams = nil
|
farmbuyer@69
|
3036 getrecipient.data = data
|
farmbuyer@69
|
3037 getrecipient.editBox:SetText("")
|
farmbuyer@69
|
3038 return true
|
farmbuyer@69
|
3039 end
|
farmbuyer@69
|
3040 end
|
farmbuyer@69
|
3041
|
farmbuyer@69
|
3042 local function eoi_st_insert_OnAccept (dialog, data)
|
farmbuyer@69
|
3043 if data.kind == 'boss' then
|
farmbuyer@69
|
3044 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
3045 elseif data.kind == 'loot' then
|
farmbuyer@69
|
3046 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
3047 end
|
farmbuyer@69
|
3048 end
|
farmbuyer@69
|
3049
|
farmbuyer@1
|
3050 -- The data member here is a table built with:
|
farmbuyer@1
|
3051 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
|
farmbuyer@1
|
3052 do
|
farmbuyer@1
|
3053 local t = flib.StaticPopup{
|
farmbuyer@75
|
3054 text = "Enter name of new %s, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@75
|
3055 button1 = CONTINUE.." ->",
|
farmbuyer@1
|
3056 button2 = CANCEL,
|
farmbuyer@1
|
3057 hasEditBox = true,
|
farmbuyer@16
|
3058 editBoxWidth = 350,
|
farmbuyer@1
|
3059 maxLetters = 50,
|
farmbuyer@1
|
3060 noCancelOnReuse = true,
|
farmbuyer@1
|
3061 }
|
farmbuyer@1
|
3062 t.EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@39
|
3063 if editbox:GetText() == "" then return end
|
farmbuyer@1
|
3064 local dialog = editbox:GetParent()
|
farmbuyer@1
|
3065 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
|
farmbuyer@1
|
3066 dialog:Hide() -- replicate OnAccept click behavior
|
farmbuyer@1
|
3067 end
|
farmbuyer@1
|
3068 end
|
farmbuyer@1
|
3069 t.enterClicksFirstButton = nil -- no effect with editbox focused
|
farmbuyer@1
|
3070 t.OnAccept = eoi_st_insert_OnAccept
|
farmbuyer@1
|
3071 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
|
farmbuyer@1
|
3072
|
farmbuyer@69
|
3073 -- This seems to be gratuitous use of metatables, really.
|
farmbuyer@1
|
3074 local OEIL = {
|
farmbuyer@75
|
3075 text = "Paste the new item into here, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@1
|
3076 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
|
farmbuyer@1
|
3077 }
|
farmbuyer@1
|
3078 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
|
farmbuyer@1
|
3079
|
farmbuyer@1
|
3080 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
|
farmbuyer@1
|
3081 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
|
farmbuyer@1
|
3082 if dialogname then
|
farmbuyer@16
|
3083 _G[dialogname.."EditBox"]:SetText(link)
|
farmbuyer@1
|
3084 return true
|
farmbuyer@1
|
3085 end
|
farmbuyer@1
|
3086 end)
|
farmbuyer@69
|
3087
|
farmbuyer@69
|
3088 t = flib.StaticPopup{
|
farmbuyer@69
|
3089 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@69
|
3090 text = "Include a snapshot of the " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@77
|
3091 .. "CURRENT|r raid?|n|nClicking '" .. YES .. "' will allow this entry to "
|
farmbuyer@69
|
3092 .. "appear in attendance lists, but with the roster as it is NOW, not as it "
|
farmbuyer@69
|
3093 .. "was THEN. Clicking '" .. NO .."' means this kill cannot be included in "
|
farmbuyer@77
|
3094 .. "attendance.|n|n(Enter = '" .. YES .."', Escape = '" .. CANCEL .. "')",
|
farmbuyer@69
|
3095 button1 = YES, -- "accept", left
|
farmbuyer@69
|
3096 button2 = NO, -- "cancel", middle
|
farmbuyer@69
|
3097 button3 = CANCEL, -- "alt", right
|
farmbuyer@69
|
3098 }
|
farmbuyer@69
|
3099 -- Hitting Escape still hides the frame, but doesn't run OnCancel (which
|
farmbuyer@69
|
3100 -- is for the "No" button, not the "Cancel"/OnAlt button). Dizzy yet?
|
farmbuyer@69
|
3101 t.noCancelOnEscape = true
|
farmbuyer@69
|
3102 t.OnAccept = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
3103 t.OnCancel = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
3104 StaticPopupDialogs["OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP"] = t
|
farmbuyer@1
|
3105 end
|
farmbuyer@1
|
3106
|
farmbuyer@1
|
3107 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
|
farmbuyer@1
|
3108 text = "Enter the player name:",
|
farmbuyer@1
|
3109 button1 = ACCEPT,
|
farmbuyer@1
|
3110 button2 = CANCEL,
|
farmbuyer@1
|
3111 hasEditBox = true,
|
farmbuyer@1
|
3112 OnAccept = function(dialog, data)
|
farmbuyer@1
|
3113 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@81
|
3114 addon:reassign_loot ("local", data.index, name)
|
farmbuyer@1
|
3115 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.index)
|
farmbuyer@1
|
3116 end,
|
farmbuyer@1
|
3117 }
|
farmbuyer@1
|
3118
|
farmbuyer@1
|
3119 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
|
farmbuyer@1
|
3120 text = "Enter a name for the loot collection:",
|
farmbuyer@1
|
3121 button1 = ACCEPT,
|
farmbuyer@1
|
3122 button2 = CANCEL,
|
farmbuyer@1
|
3123 hasEditBox = true,
|
farmbuyer@1
|
3124 maxLetters = 30,
|
farmbuyer@1
|
3125 OnAccept = function(dialog)--, data)
|
farmbuyer@1
|
3126 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@1
|
3127 addon:save_saveas(name)
|
farmbuyer@1
|
3128 addon:BuildMainDisplay()
|
farmbuyer@1
|
3129 end,
|
farmbuyer@1
|
3130 OnCancel = function(dialog)--, data, reason)
|
farmbuyer@1
|
3131 addon:BuildMainDisplay()
|
farmbuyer@1
|
3132 end,
|
farmbuyer@1
|
3133 }
|
farmbuyer@1
|
3134
|
farmbuyer@25
|
3135
|
farmbuyer@25
|
3136 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
|
farmbuyer@25
|
3137 if true then
|
farmbuyer@25
|
3138 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
|
farmbuyer@25
|
3139 -- tagged with CHANGE.
|
farmbuyer@25
|
3140 local function onenter (self, motion)
|
farmbuyer@25
|
3141 if ( self.hasArrow ) then
|
farmbuyer@25
|
3142 local level = self:GetParent():GetID() + 1;
|
farmbuyer@25
|
3143 local listFrame = _G["DropDownList"..level];
|
farmbuyer@25
|
3144 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
|
farmbuyer@25
|
3145 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
|
farmbuyer@25
|
3146 end
|
farmbuyer@25
|
3147 else
|
farmbuyer@25
|
3148 CloseDropDownMenus(self:GetParent():GetID() + 1);
|
farmbuyer@25
|
3149 end
|
farmbuyer@25
|
3150 _G[self:GetName().."Highlight"]:Show();
|
farmbuyer@25
|
3151 UIDropDownMenu_StopCounting(self:GetParent());
|
farmbuyer@25
|
3152 if ( self.tooltipTitle ) then
|
farmbuyer@25
|
3153 if ( self.tooltipOnButton ) then
|
farmbuyer@25
|
3154 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
farmbuyer@25
|
3155 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
|
farmbuyer@25
|
3156 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
|
farmbuyer@25
|
3157 GameTooltip:Show();
|
farmbuyer@25
|
3158 else
|
farmbuyer@25
|
3159 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
|
farmbuyer@25
|
3160 end
|
farmbuyer@25
|
3161 end
|
farmbuyer@25
|
3162 end
|
farmbuyer@25
|
3163 -- end verbatime copy
|
farmbuyer@25
|
3164
|
farmbuyer@25
|
3165 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
|
farmbuyer@25
|
3166 local list = _G["DropDownList"..i]
|
farmbuyer@25
|
3167 if list then
|
farmbuyer@25
|
3168 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
|
farmbuyer@25
|
3169 local button = _G["DropDownList"..i.."Button"..j]
|
farmbuyer@25
|
3170 if button then
|
farmbuyer@25
|
3171 --print("button fixup",i,j)
|
farmbuyer@25
|
3172 button:SetScript("OnEnter",onenter)
|
farmbuyer@25
|
3173 end
|
farmbuyer@25
|
3174 end
|
farmbuyer@25
|
3175 end
|
farmbuyer@25
|
3176 end
|
farmbuyer@25
|
3177 end
|
farmbuyer@25
|
3178
|
farmbuyer@1
|
3179 -- vim:noet
|