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