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