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