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