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