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@10
|
1878 PlaySoundFile[[Sound\Music\WorldEvents\HordeFirepole.mp3]]
|
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@10
|
1884 PlaySoundFile[[Sound\Music\WorldEvents\AllianceFirepole.mp3]]
|
farmbuyer@10
|
1885 end)
|
farmbuyer@10
|
1886 simple:AddChild(w)
|
farmbuyer@10
|
1887 grp:AddChild(simple)
|
farmbuyer@10
|
1888
|
farmbuyer@1
|
1889 grp:ResumeLayout()
|
farmbuyer@1
|
1890 container:AddChild(grp)
|
farmbuyer@1
|
1891 GUI:ClearFocus()
|
farmbuyer@73
|
1892 container:SetScroll(1000) -- scrollframe's max value
|
farmbuyer@1
|
1893 end
|
farmbuyer@1
|
1894
|
farmbuyer@76
|
1895 -- Initial lower panel function (unless debug mode is on during load, which
|
farmbuyer@76
|
1896 -- means it was almost certainly hardcoded that way, which means it's
|
farmbuyer@76
|
1897 -- probably me testing).
|
farmbuyer@76
|
1898 local adv_lower
|
farmbuyer@76
|
1899 if addon.DEBUG_PRINT then
|
farmbuyer@76
|
1900 adv_lower = adv_real
|
farmbuyer@76
|
1901 else
|
farmbuyer@76
|
1902 function adv_lower (container, specials)
|
farmbuyer@76
|
1903 local spacer = GUI:Create("Spacer")
|
farmbuyer@76
|
1904 spacer:SetFullWidth(true)
|
farmbuyer@76
|
1905 spacer:SetHeight(5)
|
farmbuyer@76
|
1906 container:AddChild(spacer)
|
farmbuyer@76
|
1907 local speedbump = GUI:Create("InteractiveLabel")
|
farmbuyer@76
|
1908 speedbump:SetFullWidth(true)
|
farmbuyer@76
|
1909 speedbump:SetFontObject(GameFontHighlightLarge)
|
farmbuyer@76
|
1910 speedbump:SetImage("Interface\\DialogFrame\\DialogAlertIcon")
|
farmbuyer@76
|
1911 speedbump:SetImageSize(50,50)
|
farmbuyer@76
|
1912 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
|
1913 speedbump:SetCallback("OnClick", function (_sb)
|
farmbuyer@76
|
1914 adv_lower = adv_real
|
farmbuyer@76
|
1915 return addon:redisplay()
|
farmbuyer@76
|
1916 --return tabs_OnGroupSelected_func(container.parent,"OnGroupSelected","opt")
|
farmbuyer@76
|
1917 end)
|
farmbuyer@76
|
1918 container:AddChild(speedbump)
|
farmbuyer@76
|
1919 spacer = GUI:Create("Spacer")
|
farmbuyer@76
|
1920 spacer:SetFullWidth(true)
|
farmbuyer@76
|
1921 spacer:SetHeight(5)
|
farmbuyer@76
|
1922 container:AddChild(spacer)
|
farmbuyer@76
|
1923 end
|
farmbuyer@1
|
1924 end
|
farmbuyer@1
|
1925
|
farmbuyer@1
|
1926 tabs_OnGroupSelected["opt"] = function(container,specials)
|
farmbuyer@65
|
1927 opts = OuroLootSV_opts
|
farmbuyer@65
|
1928
|
farmbuyer@1
|
1929 --container:SetLayout("List")
|
farmbuyer@1
|
1930 container:SetLayout("Fill")
|
farmbuyer@1
|
1931 local scroll, grp, w
|
farmbuyer@1
|
1932
|
farmbuyer@1
|
1933 scroll = GUI:Create("ScrollFrame")
|
farmbuyer@1
|
1934 scroll:SetLayout("Flow")
|
farmbuyer@1
|
1935
|
farmbuyer@1
|
1936 grp = GUI:Create("InlineGroup")
|
farmbuyer@1
|
1937 grp:SetLayout("Flow")
|
farmbuyer@1
|
1938 grp:SetFullWidth(true)
|
farmbuyer@1
|
1939 grp:SetTitle("User Options [these are saved across sessions]")
|
farmbuyer@1
|
1940
|
farmbuyer@10
|
1941 -- The relative width fields used to be done to take up less vertical space, but
|
farmbuyer@10
|
1942 -- that turned out to look messy. Now they're just a straight line for the most part.
|
farmbuyer@10
|
1943
|
farmbuyer@1
|
1944 -- reminder popup
|
farmbuyer@16
|
1945 w = mkoption ('popup_on_join', "Show reminder popup", 0.49,
|
farmbuyer@1
|
1946 [[When joining a raid and not already tracking, display a dialog asking for instructions.]])
|
farmbuyer@1
|
1947 grp:AddChild(w)
|
farmbuyer@1
|
1948
|
farmbuyer@1
|
1949 -- toggle scroll-to-bottom on first tab
|
farmbuyer@16
|
1950 w = mkoption('scroll_to_bottom', "Scroll to bottom when opening display", 0.49,
|
farmbuyer@1
|
1951 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]])
|
farmbuyer@1
|
1952 grp:AddChild(w)
|
farmbuyer@1
|
1953
|
farmbuyer@1
|
1954 -- /loot option
|
farmbuyer@16
|
1955 w = mkoption('register_slashloot', "Register /loot slash command on login", 0.49,
|
farmbuyer@1
|
1956 [[Register "/loot" as a slash command in addition to the normal "/ouroloot". Relog to take effect.]])
|
farmbuyer@1
|
1957 grp:AddChild(w)
|
farmbuyer@1
|
1958
|
farmbuyer@73
|
1959 -- chatty boss mode
|
farmbuyer@16
|
1960 w = mkoption('chatty_on_kill', "Be chatty on boss kill", 0.49,
|
farmbuyer@1
|
1961 [[Print something to chat output when DBM tells Ouro Loot about a successful boss kill.]])
|
farmbuyer@1
|
1962 grp:AddChild(w)
|
farmbuyer@1
|
1963
|
farmbuyer@1
|
1964 -- less noise in main panel
|
farmbuyer@16
|
1965 w = mkoption('no_tracking_wipes', "Do not track wipes", 0.49,
|
farmbuyer@1
|
1966 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]])
|
farmbuyer@1
|
1967 grp:AddChild(w)
|
farmbuyer@1
|
1968
|
farmbuyer@1
|
1969 -- cutesy abbrevs
|
farmbuyer@16
|
1970 w = mkoption('snarky_boss', "Use snarky boss names", 0.49,
|
farmbuyer@1
|
1971 [[Irreverent replacement names for boss events.]])
|
farmbuyer@1
|
1972 grp:AddChild(w)
|
farmbuyer@1
|
1973
|
farmbuyer@57
|
1974 -- LOD plugins in all cases
|
farmbuyer@57
|
1975 w = mkoption('display_disabled_LODs', "Include disabled plugins", 0.49,
|
farmbuyer@57
|
1976 [[Show loadable plugins even if they've been disabled (and offer to enable them). Relog to take effect.]])
|
farmbuyer@57
|
1977 grp:AddChild(w)
|
farmbuyer@57
|
1978
|
farmbuyer@65
|
1979 -- showing the "(from Rebroadcasterdude)" in the notes column
|
farmbuyer@65
|
1980 w = mkoption('display_bcast_from', "Show rebroadcasting player", 0.49,
|
farmbuyer@73
|
1981 [[Include "from PlayerName" in the Notes column for loot that was broadcast to you. (Not included in forum output).]],
|
farmbuyer@65
|
1982 function(_w,_e,value)
|
farmbuyer@65
|
1983 opts.display_bcast_from = value
|
farmbuyer@65
|
1984 addon.loot_clean = nil
|
farmbuyer@65
|
1985 end)
|
farmbuyer@65
|
1986 grp:AddChild(w)
|
farmbuyer@65
|
1987
|
farmbuyer@73
|
1988 -- prefilling g_uniques with history
|
farmbuyer@73
|
1989 w = mkoption('precache_history_uniques', "Prescan for faster handling", 0.49,
|
farmbuyer@73
|
1990 [[See description under +Help -- Handy Tips -- Prescanning> for instructions.]])
|
farmbuyer@73
|
1991 grp:AddChild(w)
|
farmbuyer@73
|
1992
|
farmbuyer@73
|
1993 w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(1) grp:AddChild(w)
|
farmbuyer@73
|
1994
|
farmbuyer@1
|
1995 -- possible keybindings
|
farmbuyer@1
|
1996 do
|
farmbuyer@73
|
1997 local pair = GUI:Create("InlineGroup")
|
farmbuyer@73
|
1998 pair:SetLayout("List")
|
farmbuyer@73
|
1999 pair:SetRelativeWidth(0.49)
|
farmbuyer@1
|
2000 local editbox, checkbox
|
farmbuyer@65
|
2001 editbox = mkbutton("EditBox", nil, opts.keybinding_text,
|
farmbuyer@1
|
2002 [[Keybinding text format is fragile! Relog to take effect.]])
|
farmbuyer@73
|
2003 editbox:SetFullWidth(true)
|
farmbuyer@1
|
2004 editbox:SetLabel("Keybinding text")
|
farmbuyer@1
|
2005 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@65
|
2006 opts.keybinding_text = value
|
farmbuyer@1
|
2007 end)
|
farmbuyer@65
|
2008 editbox:SetDisabled(not opts.keybinding)
|
farmbuyer@73
|
2009 checkbox = mkoption('keybinding', "Register keybinding", 1,
|
farmbuyer@1
|
2010 [[Register a keybinding to toggle the loot display. Relog to take effect.]],
|
farmbuyer@1
|
2011 function (_w,_,value)
|
farmbuyer@65
|
2012 opts.keybinding = value
|
farmbuyer@65
|
2013 editbox:SetDisabled(not opts.keybinding)
|
farmbuyer@1
|
2014 end)
|
farmbuyer@73
|
2015 checkbox:SetFullWidth(true)
|
farmbuyer@1
|
2016 pair:AddChild(checkbox)
|
farmbuyer@1
|
2017 pair:AddChild(editbox)
|
farmbuyer@1
|
2018 grp:AddChild(pair)
|
farmbuyer@1
|
2019 end
|
farmbuyer@1
|
2020
|
farmbuyer@73
|
2021 -- chatty disposition/assignment changes
|
farmbuyer@73
|
2022 do
|
farmbuyer@73
|
2023 local chatgroup = GUI:Create("InlineGroup")
|
farmbuyer@73
|
2024 chatgroup:SetLayout("List")
|
farmbuyer@73
|
2025 chatgroup:SetRelativeWidth(0.49)
|
farmbuyer@73
|
2026 chatgroup:SetTitle("Remote Changes Chat")
|
farmbuyer@73
|
2027 local toggle, editbox
|
farmbuyer@73
|
2028 toggle = mkoption('chatty_on_remote_changes', "Be chatty on remote changes", 1,
|
farmbuyer@73
|
2029 [[Print something to chat when other users change recorded loot.]],
|
farmbuyer@73
|
2030 function (_w,_,value)
|
farmbuyer@73
|
2031 opts.chatty_on_remote_changes = value
|
farmbuyer@73
|
2032 editbox:SetDisabled(not opts.chatty_on_remote_changes)
|
farmbuyer@73
|
2033 end)
|
farmbuyer@73
|
2034 toggle:SetFullWidth(true)
|
farmbuyer@73
|
2035 chatgroup:AddChild(toggle)
|
farmbuyer@73
|
2036 w = GUI:Create("Label")
|
farmbuyer@73
|
2037 w:SetFullWidth(true)
|
farmbuyer@73
|
2038 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
|
2039 chatgroup:AddChild(w)
|
farmbuyer@73
|
2040 editbox = mkbutton("EditBox", nil, opts.chatty_on_remote_changes_frame,
|
farmbuyer@73
|
2041 [[1 = default chat frame, 2 = combat log, etc]])
|
farmbuyer@73
|
2042 editbox:SetFullWidth(true)
|
farmbuyer@73
|
2043 editbox:SetLabel("Output Chatframe")
|
farmbuyer@73
|
2044 editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
|
farmbuyer@73
|
2045 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
|
farmbuyer@73
|
2046 local prev = opts.chatty_on_remote_changes_frame
|
farmbuyer@73
|
2047 value = value:trim()
|
farmbuyer@73
|
2048 value = tonumber(value) or value
|
farmbuyer@73
|
2049 if addon:_set_remote_change_chatframe (value) then
|
farmbuyer@73
|
2050 opts.chatty_on_remote_changes_frame = value
|
farmbuyer@73
|
2051 _w:SetText(tostring(value))
|
farmbuyer@73
|
2052 _w.editbox:ClearFocus()
|
farmbuyer@73
|
2053 else
|
farmbuyer@73
|
2054 _w:SetText(tostring(prev))
|
farmbuyer@73
|
2055 end
|
farmbuyer@73
|
2056 end)
|
farmbuyer@73
|
2057 editbox:SetDisabled(not opts.chatty_on_remote_changes)
|
farmbuyer@73
|
2058 chatgroup:AddChild(editbox)
|
farmbuyer@73
|
2059 w = mkbutton("Chat Frame Numbers",
|
farmbuyer@73
|
2060 [[Print each chat window number in its own frame, for easy reference in the editing field.]])
|
farmbuyer@73
|
2061 w:SetFullWidth(true)
|
farmbuyer@73
|
2062 --w:SetDisabled(not opts.chatty_on_remote_changes)
|
farmbuyer@73
|
2063 w:SetCallback("OnClick", function()
|
farmbuyer@73
|
2064 for i = 1, NUM_CHAT_WINDOWS do
|
farmbuyer@73
|
2065 local cf = _G['ChatFrame'..i]
|
farmbuyer@73
|
2066 if not cf then break end
|
farmbuyer@73
|
2067 addon:CFPrint (cf, "This is frame number |cffff0000%d|r.", i)
|
farmbuyer@73
|
2068 end
|
farmbuyer@73
|
2069 end)
|
farmbuyer@73
|
2070 chatgroup:AddChild(w)
|
farmbuyer@73
|
2071 grp:AddChild(chatgroup)
|
farmbuyer@73
|
2072 end
|
farmbuyer@73
|
2073
|
farmbuyer@3
|
2074 -- boss mod selection
|
farmbuyer@3
|
2075 w = GUI:Create("Spacer")
|
farmbuyer@3
|
2076 w:SetFullWidth(true)
|
farmbuyer@73
|
2077 w:SetHeight(2)
|
farmbuyer@3
|
2078 grp:AddChild(w)
|
farmbuyer@3
|
2079 do
|
farmbuyer@3
|
2080 local list = {}
|
farmbuyer@3
|
2081 local current
|
farmbuyer@3
|
2082 for k,v in ipairs(addon.bossmods) do
|
farmbuyer@3
|
2083 list[k] = v.n
|
farmbuyer@65
|
2084 if v.n == opts.bossmod then
|
farmbuyer@3
|
2085 current = k
|
farmbuyer@3
|
2086 end
|
farmbuyer@3
|
2087 end
|
farmbuyer@3
|
2088 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
|
farmbuyer@3
|
2089 w:SetRelativeWidth(0.2)
|
farmbuyer@3
|
2090 w:SetLabel("Boss Mod:")
|
farmbuyer@3
|
2091 w:SetList(list)
|
farmbuyer@3
|
2092 w:SetValue(current)
|
farmbuyer@3
|
2093 w:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@65
|
2094 opts.bossmod = list[choice]
|
farmbuyer@3
|
2095 end)
|
farmbuyer@3
|
2096 grp:AddChild(w)
|
farmbuyer@3
|
2097 end
|
farmbuyer@3
|
2098
|
farmbuyer@70
|
2099 -- item filters
|
farmbuyer@1
|
2100 w = GUI:Create("Spacer")
|
farmbuyer@1
|
2101 w:SetFullWidth(true)
|
farmbuyer@73
|
2102 w:SetHeight(2)
|
farmbuyer@1
|
2103 grp:AddChild(w)
|
farmbuyer@1
|
2104 do
|
farmbuyer@70
|
2105 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
|
2106 local cache_warn, cache_warned = false, false
|
farmbuyer@70
|
2107 local function do_warning()
|
farmbuyer@70
|
2108 if cache_warn and not cache_warned then
|
farmbuyer@70
|
2109 cache_warned = true
|
farmbuyer@70
|
2110 addon:Print(warntext)
|
farmbuyer@70
|
2111 end
|
farmbuyer@70
|
2112 end
|
farmbuyer@70
|
2113
|
farmbuyer@70
|
2114 local filterlist, vaultlist = {}, {}
|
farmbuyer@65
|
2115 for id in pairs(opts.itemfilter) do
|
farmbuyer@1
|
2116 local iname, _, iquality = GetItemInfo(id)
|
farmbuyer@2
|
2117 if iname then
|
farmbuyer@70
|
2118 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@54
|
2119 else
|
farmbuyer@54
|
2120 cache_warn = true
|
farmbuyer@2
|
2121 end
|
farmbuyer@1
|
2122 end
|
farmbuyer@70
|
2123 for id in pairs(opts.itemvault) do
|
farmbuyer@70
|
2124 local iname, _, iquality = GetItemInfo(id)
|
farmbuyer@70
|
2125 if iname then
|
farmbuyer@70
|
2126 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@70
|
2127 else
|
farmbuyer@70
|
2128 cache_warn = true
|
farmbuyer@70
|
2129 end
|
farmbuyer@70
|
2130 end
|
farmbuyer@70
|
2131
|
farmbuyer@1
|
2132 w = GUI:Create("EditBoxDropDown")
|
farmbuyer@1
|
2133 w:SetRelativeWidth(0.4)
|
farmbuyer@1
|
2134 w:SetText("Item filter")
|
farmbuyer@1
|
2135 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
|
farmbuyer@70
|
2136 w:SetList(filterlist)
|
farmbuyer@1
|
2137 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
|
farmbuyer@73
|
2138 local iname, ilink, iquality = GetItemInfo(text:trim())
|
farmbuyer@1
|
2139 if not iname then
|
farmbuyer@1
|
2140 return addon:Print("Error: %s is not a valid item name/link!", text)
|
farmbuyer@1
|
2141 end
|
farmbuyer@1
|
2142 local id = tonumber(ilink:match("item:(%d+)"))
|
farmbuyer@70
|
2143 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@65
|
2144 opts.itemfilter[id] = true
|
farmbuyer@1
|
2145 addon:Print("Now filtering out", ilink)
|
farmbuyer@1
|
2146 end)
|
farmbuyer@1
|
2147 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
|
farmbuyer@1
|
2148 --local ilink = select(2,GetItemInfo(key_id))
|
farmbuyer@65
|
2149 opts.itemfilter[tonumber(key_id)] = nil
|
farmbuyer@1
|
2150 --addon:Print("No longer filtering out", ilink)
|
farmbuyer@1
|
2151 addon:Print("No longer filtering out", val_name)
|
farmbuyer@1
|
2152 end)
|
farmbuyer@70
|
2153 w:SetCallback("OnDropdownShown",do_warning)
|
farmbuyer@70
|
2154 grp:AddChild(w)
|
farmbuyer@70
|
2155
|
farmbuyer@70
|
2156 w = GUI:Create("Spacer")
|
farmbuyer@70
|
2157 w:SetRelativeWidth(0.1)
|
farmbuyer@70
|
2158 w:SetHeight(2)
|
farmbuyer@70
|
2159 grp:AddChild(w)
|
farmbuyer@70
|
2160
|
farmbuyer@70
|
2161 w = GUI:Create("EditBoxDropDown")
|
farmbuyer@70
|
2162 w:SetRelativeWidth(0.4)
|
farmbuyer@70
|
2163 w:SetText("Vault items")
|
farmbuyer@70
|
2164 w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.")
|
farmbuyer@70
|
2165 w:SetList(vaultlist)
|
farmbuyer@70
|
2166 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
|
farmbuyer@73
|
2167 local iname, ilink, iquality = GetItemInfo(text:trim())
|
farmbuyer@70
|
2168 if not iname then
|
farmbuyer@70
|
2169 return addon:Print("Error: %s is not a valid item name/link!", text)
|
farmbuyer@54
|
2170 end
|
farmbuyer@70
|
2171 local id = tonumber(ilink:match("item:(%d+)"))
|
farmbuyer@70
|
2172 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
|
farmbuyer@70
|
2173 opts.itemvault[id] = true
|
farmbuyer@70
|
2174 addon:Print("Now auto-vaulting", ilink)
|
farmbuyer@54
|
2175 end)
|
farmbuyer@70
|
2176 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
|
farmbuyer@70
|
2177 --local ilink = select(2,GetItemInfo(key_id))
|
farmbuyer@70
|
2178 opts.itemfilter[tonumber(key_id)] = nil
|
farmbuyer@70
|
2179 --addon:Print("No longer filtering out", ilink)
|
farmbuyer@70
|
2180 addon:Print("No longer auto-vaulting", val_name)
|
farmbuyer@70
|
2181 end)
|
farmbuyer@70
|
2182 w:SetCallback("OnDropdownShown",do_warning)
|
farmbuyer@1
|
2183 grp:AddChild(w)
|
farmbuyer@1
|
2184 end
|
farmbuyer@1
|
2185
|
farmbuyer@1
|
2186 addon.sender_list.sort()
|
farmbuyer@1
|
2187 if #addon.sender_list.namesI > 0 then
|
farmbuyer@1
|
2188 local senders = table.concat(addon.sender_list.namesI,'\n') -- sigh
|
farmbuyer@1
|
2189 -- If 39 other people in the raid are running this, the label will
|
farmbuyer@1
|
2190 -- explode... is it likely enough to care about? No.
|
farmbuyer@1
|
2191 w = GUI:Create("Spacer")
|
farmbuyer@1
|
2192 w:SetFullWidth(true)
|
farmbuyer@1
|
2193 w:SetHeight(20)
|
farmbuyer@1
|
2194 grp:AddChild(w)
|
farmbuyer@1
|
2195 w = GUI:Create("Label")
|
farmbuyer@1
|
2196 w:SetRelativeWidth(0.4)
|
farmbuyer@11
|
2197 w:SetText(ITEM_QUALITY_COLORS[3].hex .."Echo from latest ping:|r\n"..senders)
|
farmbuyer@1
|
2198 grp:AddChild(w)
|
farmbuyer@1
|
2199 end
|
farmbuyer@1
|
2200
|
farmbuyer@6
|
2201 scroll:AddChild(grp)
|
farmbuyer@6
|
2202
|
farmbuyer@1
|
2203 w = mkbutton("ReloadUI", [[Does what you think it does. Loot information is written out and restored.]])
|
farmbuyer@1
|
2204 w:SetFullWidth(true)
|
farmbuyer@1
|
2205 w:SetCallback("OnClick", ReloadUI)
|
farmbuyer@1
|
2206 specials:AddChild(w)
|
farmbuyer@1
|
2207
|
farmbuyer@1
|
2208 w = mkbutton("Ping!",
|
farmbuyer@1
|
2209 [[Asks other raid users for their addon version and current status. Results displayed on User Options panel.]])
|
farmbuyer@1
|
2210 w:SetFullWidth(true)
|
farmbuyer@1
|
2211 w:SetCallback("OnClick", function(_w)
|
farmbuyer@1
|
2212 _w:SetText("5... 4... 3...")
|
farmbuyer@1
|
2213 _w:SetDisabled(true)
|
farmbuyer@23
|
2214 addon:DoPing()
|
farmbuyer@1
|
2215 addon:ScheduleTimer(function(b)
|
farmbuyer@1
|
2216 if b:IsVisible() then
|
farmbuyer@1
|
2217 return addon:redisplay()
|
farmbuyer@1
|
2218 --return tabs_OnGroupSelected_func(container,"OnGroupSelected","opt")
|
farmbuyer@1
|
2219 end
|
farmbuyer@1
|
2220 end, 5, _w)
|
farmbuyer@1
|
2221 end)
|
farmbuyer@1
|
2222 specials:AddChild(w)
|
farmbuyer@1
|
2223
|
farmbuyer@1
|
2224 -- Add appropriate lower panel
|
farmbuyer@1
|
2225 adv_lower (scroll, specials)
|
farmbuyer@1
|
2226
|
farmbuyer@1
|
2227 -- Finish up
|
farmbuyer@1
|
2228 container:AddChild(scroll)
|
farmbuyer@1
|
2229 end
|
farmbuyer@1
|
2230 end
|
farmbuyer@1
|
2231
|
farmbuyer@1
|
2232
|
farmbuyer@1
|
2233 -- Simply to avoid recreating the same function over and over
|
farmbuyer@1
|
2234 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
|
farmbuyer@1
|
2235 tabs_OnGroupSelected_func = function (tabs,event,group)
|
farmbuyer@1
|
2236 tabs_OnGroupSelected_func_args[1] = tabs
|
farmbuyer@1
|
2237 tabs_OnGroupSelected_func_args[3] = group
|
farmbuyer@1
|
2238 tabs:ReleaseChildren()
|
farmbuyer@1
|
2239 local spec = tabs:GetUserData("special buttons group")
|
farmbuyer@1
|
2240 spec:ReleaseChildren()
|
farmbuyer@1
|
2241 local h = GUI:Create("Heading")
|
farmbuyer@1
|
2242 h:SetFullWidth(true)
|
farmbuyer@1
|
2243 h:SetText(_tabtexts[group].title)
|
farmbuyer@1
|
2244 spec:AddChild(h)
|
farmbuyer@76
|
2245 do
|
farmbuyer@76
|
2246 addon.sender_list.sort()
|
farmbuyer@76
|
2247 local fmt = "Received broadcast data from %d |4player:players;."
|
farmbuyer@76
|
2248 if addon.history_suppress then
|
farmbuyer@76
|
2249 -- this is the druid class color reworked into hex
|
farmbuyer@76
|
2250 fmt = fmt .. " |cffff7d0aHistory recording suppressed.|r"
|
farmbuyer@76
|
2251 end
|
farmbuyer@76
|
2252 tabs.titletext:SetFormattedText (fmt, addon.sender_list.activeI)
|
farmbuyer@76
|
2253 end
|
farmbuyer@1
|
2254 return tabs_OnGroupSelected[group](tabs,spec,group)
|
farmbuyer@1
|
2255 --[====[
|
farmbuyer@1
|
2256 Unfortunately, :GetHeight() called on anything useful out of a TabGroup
|
farmbuyer@1
|
2257 returns the static default size (about 50 pixels) until the refresh
|
farmbuyer@1
|
2258 cycle *after* all the frames are shown. Trying to fix it up after a
|
farmbuyer@1
|
2259 single OnUpdate doesn't work either. So for now it's all hardcoded.
|
farmbuyer@1
|
2260
|
farmbuyer@1
|
2261 Using this to determine the actual height of the usable area.
|
farmbuyer@1
|
2262 366 pixels
|
farmbuyer@1
|
2263 if group == "eoi" then
|
farmbuyer@1
|
2264 local stframe = tabs.children[1].frame
|
farmbuyer@1
|
2265 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
|
farmbuyer@1
|
2266 stframe:GetTop()-stframe:GetBottom())
|
farmbuyer@1
|
2267 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
|
farmbuyer@1
|
2268 stframe:GetRight()-stframe:GetLeft())
|
farmbuyer@1
|
2269 end
|
farmbuyer@1
|
2270 ]====]
|
farmbuyer@1
|
2271 end
|
farmbuyer@1
|
2272
|
farmbuyer@1
|
2273 --[[
|
farmbuyer@1
|
2274 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2275 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2276 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
2277 ]]
|
farmbuyer@1
|
2278 do
|
farmbuyer@1
|
2279 local replacement_colors = { ["+"]="|cffffffff", ["<"]="|cff00ff00", [">"]="|r" }
|
farmbuyer@1
|
2280 function mkbutton (opt_widget_type, opt_key, label, status)
|
farmbuyer@1
|
2281 if not label then
|
farmbuyer@1
|
2282 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
|
farmbuyer@1
|
2283 elseif not status then
|
farmbuyer@1
|
2284 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
|
farmbuyer@1
|
2285 end
|
farmbuyer@47
|
2286 local button = assert(GUI:Create(opt_widget_type))
|
farmbuyer@1
|
2287 if button.SetText then button:SetText(tostring(label)) end
|
farmbuyer@1
|
2288 status = status:gsub("[%+<>]",replacement_colors)
|
farmbuyer@1
|
2289 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
|
farmbuyer@1
|
2290 button:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@1
|
2291 -- retrieval key may be specified as nil if all the parameters are given
|
farmbuyer@1
|
2292 if opt_key then _d:SetUserData (opt_key, button) end
|
farmbuyer@1
|
2293 return button
|
farmbuyer@1
|
2294 end
|
farmbuyer@1
|
2295 end
|
farmbuyer@1
|
2296
|
farmbuyer@1
|
2297 --[[
|
farmbuyer@1
|
2298 Creates the main window.
|
farmbuyer@1
|
2299 ]]
|
farmbuyer@1
|
2300 function addon:BuildMainDisplay (opt_tabselect)
|
farmbuyer@1
|
2301 if self.display then
|
farmbuyer@1
|
2302 -- try to get everything to update, rebuild, refresh... ugh, no
|
farmbuyer@1
|
2303 self.display:Hide()
|
farmbuyer@1
|
2304 end
|
farmbuyer@67
|
2305 if self.NOLOAD then return end -- don't even try
|
farmbuyer@1
|
2306
|
farmbuyer@25
|
2307 -- This probably causes taint... hm.
|
farmbuyer@25
|
2308 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
|
farmbuyer@25
|
2309 UIDROPDOWNMENU_SHOW_TIME = 4
|
farmbuyer@25
|
2310
|
farmbuyer@47
|
2311 if dirty_tabs then
|
farmbuyer@47
|
2312 self:gui_init(g_loot) -- pointer known to be good by now
|
farmbuyer@47
|
2313 self:zero_printed_fenceposts()
|
farmbuyer@47
|
2314 end
|
farmbuyer@47
|
2315
|
farmbuyer@1
|
2316 local display = GUI:Create("Frame")
|
farmbuyer@1
|
2317 if _d then
|
farmbuyer@1
|
2318 display:SetUserData("eoiST",_d) -- warning! warning! kludge detected!
|
farmbuyer@1
|
2319 end
|
farmbuyer@1
|
2320 _d = display
|
farmbuyer@1
|
2321 self.display = display
|
farmbuyer@17
|
2322 display:SetTitle(window_title)
|
farmbuyer@1
|
2323 display:SetStatusText(self.status_text)
|
farmbuyer@1
|
2324 display:SetLayout("Flow")
|
farmbuyer@16
|
2325 display:SetStatusTable{width=900,height=550} -- default height is 500
|
farmbuyer@47
|
2326 display:EnableResize(false)
|
farmbuyer@1
|
2327 display:SetCallback("OnClose", function(_display)
|
farmbuyer@25
|
2328 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
|
farmbuyer@1
|
2329 _d = _display:GetUserData("eoiST")
|
farmbuyer@1
|
2330 self.display = nil
|
farmbuyer@1
|
2331 GUI:Release(_display)
|
farmbuyer@6
|
2332 flib.clear()
|
farmbuyer@1
|
2333 collectgarbage()
|
farmbuyer@1
|
2334 end)
|
farmbuyer@1
|
2335
|
farmbuyer@1
|
2336 ----- Right-hand panel
|
farmbuyer@1
|
2337 local rhs_width = 0.20
|
farmbuyer@1
|
2338 local control = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
2339 control:SetLayout("Flow")
|
farmbuyer@1
|
2340 control:SetRelativeWidth(rhs_width)
|
farmbuyer@1
|
2341 control.alignoffset = 25
|
farmbuyer@1
|
2342 control:PauseLayout()
|
farmbuyer@1
|
2343 local h,b
|
farmbuyer@1
|
2344
|
farmbuyer@1
|
2345 --- Main ---
|
farmbuyer@1
|
2346 h = GUI:Create("Heading")
|
farmbuyer@1
|
2347 h:SetFullWidth(true)
|
farmbuyer@1
|
2348 h:SetText("Main")
|
farmbuyer@1
|
2349 control:AddChild(h)
|
farmbuyer@1
|
2350
|
farmbuyer@1
|
2351 do
|
farmbuyer@1
|
2352 b = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
2353 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
|
farmbuyer@1
|
2354 b:SetFullWidth(true)
|
farmbuyer@1
|
2355 b:SetLabel("On/Off:")
|
farmbuyer@1
|
2356 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
|
farmbuyer@1
|
2357 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
|
farmbuyer@1
|
2358 b:SetCallback("OnValueChanged", function(_w,event,choice)
|
farmbuyer@1
|
2359 if choice == 1 then self:Activate()
|
farmbuyer@1
|
2360 elseif choice == 2 then self:Activate(nil,true)
|
farmbuyer@1
|
2361 else self:Deactivate()
|
farmbuyer@1
|
2362 end
|
farmbuyer@1
|
2363 _w = display:GetUserData('comm_ident')
|
farmbuyer@1
|
2364 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2365 _w:SetDisabled(self.enabled or self.rebroadcast)
|
farmbuyer@1
|
2366 end
|
farmbuyer@1
|
2367 _w = display:GetUserData('eoi_bcast_req')
|
farmbuyer@1
|
2368 if _w and _w:IsVisible() then
|
farmbuyer@1
|
2369 _w:SetDisabled(not self.enabled)
|
farmbuyer@1
|
2370 end
|
farmbuyer@1
|
2371 end)
|
farmbuyer@1
|
2372 control:AddChild(b)
|
farmbuyer@1
|
2373 end
|
farmbuyer@1
|
2374
|
farmbuyer@1
|
2375 b = mkbutton("Dropdown", 'threshold', "",
|
farmbuyer@1
|
2376 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
|
farmbuyer@1
|
2377 b:SetFullWidth(true)
|
farmbuyer@1
|
2378 b:SetLabel("Threshold:")
|
farmbuyer@1
|
2379 b:SetList(self.thresholds)
|
farmbuyer@1
|
2380 b:SetValue(self.threshold)
|
farmbuyer@1
|
2381 b:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
2382 self:SetThreshold(choice)
|
farmbuyer@1
|
2383 end)
|
farmbuyer@1
|
2384 control:AddChild(b)
|
farmbuyer@1
|
2385
|
farmbuyer@4
|
2386 b = mkbutton("Clear Loot",
|
farmbuyer@1
|
2387 [[+Erases> all current loot information and generated text (but not saved texts).]])
|
farmbuyer@1
|
2388 b:SetFullWidth(true)
|
farmbuyer@1
|
2389 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2390 StaticPopup_Show("OUROL_CLEAR").data = self
|
farmbuyer@1
|
2391 end)
|
farmbuyer@1
|
2392 control:AddChild(b)
|
farmbuyer@1
|
2393
|
farmbuyer@1
|
2394 b = GUI:Create("Spacer")
|
farmbuyer@1
|
2395 b:SetFullWidth(true)
|
farmbuyer@16
|
2396 b:SetHeight(10)
|
farmbuyer@1
|
2397 control:AddChild(b)
|
farmbuyer@1
|
2398
|
farmbuyer@1
|
2399 --[[
|
farmbuyer@1
|
2400 --- Saved Texts ---
|
farmbuyer@1
|
2401 [ Save Current As... ]
|
farmbuyer@1
|
2402 saved1
|
farmbuyer@1
|
2403 saved2
|
farmbuyer@1
|
2404 ...
|
farmbuyer@1
|
2405 [ Load ] [ Delete ]
|
farmbuyer@1
|
2406 ]]
|
farmbuyer@1
|
2407 h = GUI:Create("Heading")
|
farmbuyer@1
|
2408 h:SetFullWidth(true)
|
farmbuyer@1
|
2409 h:SetText("Saved Texts")
|
farmbuyer@1
|
2410 control:AddChild(h)
|
farmbuyer@1
|
2411 b = mkbutton("Save Current As...",
|
farmbuyer@1
|
2412 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
|
farmbuyer@1
|
2413 b:SetFullWidth(true)
|
farmbuyer@1
|
2414 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2415 StaticPopup_Show "OUROL_SAVE_SAVEAS"
|
farmbuyer@1
|
2416 _d:Hide()
|
farmbuyer@1
|
2417 end)
|
farmbuyer@1
|
2418 control:AddChild(b)
|
farmbuyer@1
|
2419
|
farmbuyer@16
|
2420 do
|
farmbuyer@16
|
2421 local scontainer = GUI:Create("SimpleGroup")
|
farmbuyer@16
|
2422 scontainer:SetFullWidth(true)
|
farmbuyer@16
|
2423 scontainer:SetFullHeight(false)
|
farmbuyer@16
|
2424 scontainer:SetAutoAdjustHeight(false)
|
farmbuyer@16
|
2425 scontainer:SetHeight(40) -- no relative height available anymore
|
farmbuyer@16
|
2426 scontainer:SetLayout("Fill")
|
farmbuyer@16
|
2427 local scroll = GUI:Create("ScrollFrame")
|
farmbuyer@16
|
2428 scroll:SetLayout("List")
|
farmbuyer@16
|
2429 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
|
farmbuyer@16
|
2430 if saved then for i,s in ipairs(saved) do
|
farmbuyer@16
|
2431 local il = GUI:Create("InteractiveLabel")
|
farmbuyer@16
|
2432 il:SetFullWidth(true)
|
farmbuyer@16
|
2433 il:SetText(s.name)
|
farmbuyer@16
|
2434 il:SetUserData("num",i)
|
farmbuyer@16
|
2435 il:SetHighlight(1,1,1,0.4)
|
farmbuyer@16
|
2436 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
|
farmbuyer@16
|
2437 il:SetCallback("OnEnter", function() setstatus(str) end)
|
farmbuyer@16
|
2438 il:SetCallback("OnLeave", statusy_OnLeave)
|
farmbuyer@16
|
2439 il:SetCallback("OnClick", function(_il)
|
farmbuyer@16
|
2440 local prev = _d:GetUserData("saved selection")
|
farmbuyer@16
|
2441 if prev then
|
farmbuyer@16
|
2442 prev.highlight:Hide()
|
farmbuyer@16
|
2443 prev:SetColor()
|
farmbuyer@16
|
2444 end
|
farmbuyer@16
|
2445 _il:SetColor(0,1,0)
|
farmbuyer@16
|
2446 _il.highlight:Show()
|
farmbuyer@16
|
2447 _d:SetUserData("saved selection",_il)
|
farmbuyer@16
|
2448 _d:GetUserData("Load"):SetDisabled(false)
|
farmbuyer@16
|
2449 _d:GetUserData("Delete"):SetDisabled(false)
|
farmbuyer@16
|
2450 end)
|
farmbuyer@16
|
2451 scroll:AddChild(il)
|
farmbuyer@16
|
2452 end end
|
farmbuyer@16
|
2453 scontainer:AddChild(scroll)
|
farmbuyer@16
|
2454 control:AddChild(scontainer)
|
farmbuyer@16
|
2455 end
|
farmbuyer@1
|
2456
|
farmbuyer@1
|
2457 b = mkbutton("Load",
|
farmbuyer@1
|
2458 [[Load previously saved text. +REPLACES> all current loot information!]])
|
farmbuyer@1
|
2459 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2460 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2461 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2462 self:save_restore(num)
|
farmbuyer@1
|
2463 self:BuildMainDisplay()
|
farmbuyer@1
|
2464 end)
|
farmbuyer@1
|
2465 b:SetDisabled(true)
|
farmbuyer@1
|
2466 control:AddChild(b)
|
farmbuyer@1
|
2467 b = mkbutton("Delete",
|
farmbuyer@1
|
2468 [[Delete previously saved text.]])
|
farmbuyer@1
|
2469 b:SetRelativeWidth(0.5)
|
farmbuyer@1
|
2470 b:SetCallback("OnClick", function()
|
farmbuyer@1
|
2471 local num = _d:GetUserData("saved selection"):GetUserData("num")
|
farmbuyer@1
|
2472 self:save_delete(num)
|
farmbuyer@1
|
2473 self:BuildMainDisplay()
|
farmbuyer@1
|
2474 end)
|
farmbuyer@1
|
2475 b:SetDisabled(true)
|
farmbuyer@1
|
2476 control:AddChild(b)
|
farmbuyer@1
|
2477
|
farmbuyer@1
|
2478 b = GUI:Create("Spacer")
|
farmbuyer@1
|
2479 b:SetFullWidth(true)
|
farmbuyer@16
|
2480 b:SetHeight(10)
|
farmbuyer@1
|
2481 control:AddChild(b)
|
farmbuyer@1
|
2482
|
farmbuyer@1
|
2483 -- Other stuff on right-hand side
|
farmbuyer@1
|
2484 local tab_specials = GUI:Create("SimpleGroup")
|
farmbuyer@1
|
2485 tab_specials:SetLayout("Flow")
|
farmbuyer@1
|
2486 tab_specials:SetFullWidth(true)
|
farmbuyer@1
|
2487 control:AddChild(tab_specials)
|
farmbuyer@1
|
2488 control:ResumeLayout()
|
farmbuyer@1
|
2489
|
farmbuyer@1
|
2490 ----- Left-hand group
|
farmbuyer@1
|
2491 local tabs = GUI:Create("TabGroup")
|
farmbuyer@1
|
2492 tabs:SetLayout("Flow")
|
farmbuyer@1
|
2493 tabs.alignoffset = 25
|
farmbuyer@49
|
2494 local titletext_orig_fo = tabs.titletext:GetFontObject()
|
farmbuyer@49
|
2495 tabs.titletext:SetFontObject(GameFontNormalSmall)
|
farmbuyer@49
|
2496 tabs:SetCallback("OnRelease", function(_tabs)
|
farmbuyer@49
|
2497 tabs.titletext:SetFontObject(titletext_orig_fo)
|
farmbuyer@49
|
2498 end)
|
farmbuyer@1
|
2499 tabs:SetRelativeWidth(0.99-rhs_width)
|
farmbuyer@1
|
2500 tabs:SetFullHeight(true)
|
farmbuyer@1
|
2501 tabs:SetTabs(tabgroup_tabs)
|
farmbuyer@1
|
2502 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
|
farmbuyer@1
|
2503 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
|
farmbuyer@1
|
2504 setstatus(_tabtexts[value].desc)
|
farmbuyer@1
|
2505 end)
|
farmbuyer@1
|
2506 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
|
farmbuyer@1
|
2507 tabs:SetUserData("special buttons group",tab_specials)
|
farmbuyer@76
|
2508 tabs:SelectTab((opt_tabselect and #opt_tabselect>0)
|
farmbuyer@76
|
2509 and opt_tabselect or "eoi")
|
farmbuyer@1
|
2510
|
farmbuyer@1
|
2511 display:AddChildren (tabs, control)
|
farmbuyer@1
|
2512 display:ApplyStatus()
|
farmbuyer@1
|
2513
|
farmbuyer@1
|
2514 display:Show() -- without this, only appears every *other* function call
|
farmbuyer@1
|
2515 return display
|
farmbuyer@1
|
2516 end
|
farmbuyer@1
|
2517
|
farmbuyer@1
|
2518 function addon:OpenMainDisplayToTab (text)
|
farmbuyer@44
|
2519 text = '^'..text:lower()
|
farmbuyer@1
|
2520 for tab,v in pairs(_tabtexts) do
|
farmbuyer@1
|
2521 if v.title:lower():find(text) then
|
farmbuyer@1
|
2522 self:BuildMainDisplay(tab)
|
farmbuyer@1
|
2523 return true
|
farmbuyer@1
|
2524 end
|
farmbuyer@1
|
2525 end
|
farmbuyer@1
|
2526 end
|
farmbuyer@1
|
2527
|
farmbuyer@1
|
2528 -- Essentially a re-click on the current tab (if the current tab were clickable).
|
farmbuyer@1
|
2529 function addon:redisplay ()
|
farmbuyer@1
|
2530 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
|
farmbuyer@1
|
2531 end
|
farmbuyer@1
|
2532
|
farmbuyer@1
|
2533
|
farmbuyer@1
|
2534 ------ Popup dialogs
|
farmbuyer@75
|
2535 local function build_my_slider_widget()
|
farmbuyer@75
|
2536 local s = CreateFrame("Slider", "OuroLootSlider", nil, "OptionsSliderTemplate")
|
farmbuyer@75
|
2537 s.text = OuroLootSliderText
|
farmbuyer@75
|
2538 s.low = OuroLootSliderLow
|
farmbuyer@75
|
2539 s.high = OuroLootSliderHigh
|
farmbuyer@75
|
2540 s:SetScript("OnValueChanged", function (_s, value)
|
farmbuyer@75
|
2541 _s.value = value -- conveniently, this is already of numeric type
|
farmbuyer@75
|
2542 --_s.text:SetText(tostring(value))
|
farmbuyer@75
|
2543 if _s.DoOnValueChanged then
|
farmbuyer@75
|
2544 _s:DoOnValueChanged()
|
farmbuyer@75
|
2545 end
|
farmbuyer@75
|
2546 end)
|
farmbuyer@75
|
2547 build_my_slider_widget = nil
|
farmbuyer@75
|
2548 return s
|
farmbuyer@75
|
2549 end
|
farmbuyer@75
|
2550
|
farmbuyer@1
|
2551 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
|
farmbuyer@1
|
2552 text = "Clear current loot information and text?",
|
farmbuyer@16
|
2553 button1 = YES,
|
farmbuyer@16
|
2554 button2 = NO,
|
farmbuyer@1
|
2555 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2556 addon:Clear(--[[verbose_p=]]true)
|
farmbuyer@1
|
2557 end,
|
farmbuyer@1
|
2558 }
|
farmbuyer@1
|
2559
|
farmbuyer@37
|
2560 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2561 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2562 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@75
|
2563 .. "%s|r, and generate it anew from current loot?",
|
farmbuyer@37
|
2564 button1 = YES,
|
farmbuyer@37
|
2565 button2 = NO,
|
farmbuyer@37
|
2566 OnAccept = function (dialog, addon, data2)
|
farmbuyer@37
|
2567 data2(addon)
|
farmbuyer@37
|
2568 addon:Print("%s history has been regenerated.", addon.history.realm)
|
farmbuyer@37
|
2569 addon:redisplay()
|
farmbuyer@37
|
2570 end,
|
farmbuyer@37
|
2571 }
|
farmbuyer@37
|
2572
|
farmbuyer@16
|
2573 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
|
farmbuyer@37
|
2574 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@37
|
2575 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
|
farmbuyer@16
|
2576 button1 = YES,
|
farmbuyer@16
|
2577 button2 = NO,
|
farmbuyer@16
|
2578 OnAccept = function (dialog, addon, data2)
|
farmbuyer@16
|
2579 data2(addon)
|
farmbuyer@16
|
2580 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
|
farmbuyer@16
|
2581 addon:redisplay()
|
farmbuyer@16
|
2582 end,
|
farmbuyer@16
|
2583 }
|
farmbuyer@16
|
2584
|
farmbuyer@16
|
2585 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
|
farmbuyer@37
|
2586 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@75
|
2587 text = "This will erase all but the latest "
|
farmbuyer@75
|
2588 .. ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
|
farmbuyer@75
|
2589 .. "%s|r for each player on "
|
farmbuyer@75
|
2590 .. ITEM_QUALITY_COLORS[5].hex .. "%s|r. " .. CONTINUE .. "?",
|
farmbuyer@16
|
2591 button1 = YES,
|
farmbuyer@16
|
2592 button2 = NO,
|
farmbuyer@75
|
2593 OnShow = function (dialog, addon)
|
farmbuyer@75
|
2594 local thistable = StaticPopupDialogs[dialog.which]
|
farmbuyer@75
|
2595 -- StaticPopup_Resize does not take extraFrame into account, so we
|
farmbuyer@75
|
2596 -- hook the sizing method that _Resize calls at the end.
|
farmbuyer@75
|
2597 dialog.saved_setheight = dialog.SetHeight
|
farmbuyer@75
|
2598 dialog.SetHeight = function (d, h)
|
farmbuyer@75
|
2599 return d.saved_setheight(d,h+35)
|
farmbuyer@75
|
2600 end
|
farmbuyer@75
|
2601 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2602 dialog.extraFrame:SetPoint("TOP", dialog.text, "BOTTOM")
|
farmbuyer@75
|
2603 dialog.extraFrame:SetWidth(150)
|
farmbuyer@75
|
2604 dialog.extraFrame:SetHeight(35)
|
farmbuyer@75
|
2605 dialog.extraFrame:Show()
|
farmbuyer@75
|
2606 local slider = _G.OuroLootSlider or build_my_slider_widget()
|
farmbuyer@75
|
2607 slider.DoOnValueChanged = function(s)
|
farmbuyer@75
|
2608 dialog.text:SetFormattedText (thistable.text,
|
farmbuyer@75
|
2609 s.value == 1 and "single entry" or (s.value .. " entries"),
|
farmbuyer@75
|
2610 addon.history.realm)
|
farmbuyer@75
|
2611 StaticPopup_Resize (dialog, "OUROL_HIST_PREEN")
|
farmbuyer@75
|
2612 end
|
farmbuyer@75
|
2613 slider:SetOrientation('HORIZONTAL')
|
farmbuyer@75
|
2614 slider:SetMinMaxValues(1,30)
|
farmbuyer@75
|
2615 slider:SetValueStep(1)
|
farmbuyer@75
|
2616 slider.low:SetText("1")
|
farmbuyer@75
|
2617 slider.high:SetText("30")
|
farmbuyer@75
|
2618 --slider.tooltipText = ???
|
farmbuyer@75
|
2619 slider:SetParent(dialog.extraFrame)
|
farmbuyer@75
|
2620 slider:ClearAllPoints()
|
farmbuyer@75
|
2621 slider:SetPoint("TOPLEFT",dialog.extraFrame,"TOPLEFT",0, -15)
|
farmbuyer@75
|
2622 slider:SetPoint("BOTTOMRIGHT",dialog.extraFrame,"BOTTOMRIGHT",0, 0)
|
farmbuyer@75
|
2623 slider:Show()
|
farmbuyer@75
|
2624 -- This causes OnValueChanged to fire, reformatting the text. Except
|
farmbuyer@75
|
2625 -- IF the slider has already been shown, and IF at the time it was hidden
|
farmbuyer@75
|
2626 -- it had the same value here, THEN there is technically no "change"
|
farmbuyer@75
|
2627 -- and no event is fired. We work around this clever optimization by
|
farmbuyer@75
|
2628 -- doing a pair of set's, forcing the last one to fire OVC.
|
farmbuyer@75
|
2629 slider:SetValue(1)
|
farmbuyer@75
|
2630 slider:SetValue(5)
|
farmbuyer@75
|
2631 end,
|
farmbuyer@75
|
2632 OnAccept = function (dialog, addon, callback)
|
farmbuyer@75
|
2633 local howmany = assert(tonumber(_G.OuroLootSlider.value))
|
farmbuyer@75
|
2634 callback (addon, howmany)
|
farmbuyer@75
|
2635 addon:Print("All loot prior to the most recent %d |4entry:entries; has been erased.", howmany)
|
farmbuyer@16
|
2636 addon:redisplay()
|
farmbuyer@16
|
2637 end,
|
farmbuyer@75
|
2638 OnHide = function (dialog, addon)
|
farmbuyer@75
|
2639 dialog.SetHeight = nil
|
farmbuyer@75
|
2640 dialog.saved_setheight = nil
|
farmbuyer@75
|
2641 dialog.extraFrame:ClearAllPoints()
|
farmbuyer@75
|
2642 _G.OuroLootSlider:Hide() -- parent is hidden, why is this required?
|
farmbuyer@75
|
2643 _G.OuroLootSlider:ClearAllPoints()
|
farmbuyer@75
|
2644 _G.OuroLootSlider:SetParent(nil)
|
farmbuyer@75
|
2645 end,
|
farmbuyer@16
|
2646 }
|
farmbuyer@16
|
2647
|
farmbuyer@27
|
2648 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
|
farmbuyer@27
|
2649 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
|
farmbuyer@27
|
2650 button1 = OKAY,
|
farmbuyer@27
|
2651 timeout = 0,
|
farmbuyer@27
|
2652 whileDead = true,
|
farmbuyer@27
|
2653 hideOnEscape = true,
|
farmbuyer@27
|
2654 enterClicksFirstButton = true,
|
farmbuyer@27
|
2655 hasEditBox = true,
|
farmbuyer@27
|
2656 editBoxWidth = 350,
|
farmbuyer@53
|
2657 preferredIndex = 3,
|
farmbuyer@27
|
2658 OnShow = function (dialog, url)
|
farmbuyer@27
|
2659 dialog.editBox:SetText(url)
|
farmbuyer@27
|
2660 dialog.editBox:SetFocus()
|
farmbuyer@27
|
2661 dialog.editBox:HighlightText()
|
farmbuyer@27
|
2662 end,
|
farmbuyer@27
|
2663 }
|
farmbuyer@27
|
2664
|
farmbuyer@1
|
2665 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
|
farmbuyer@69
|
2666 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
|
2667 button1 = "Activate recording", -- "accept", left
|
farmbuyer@69
|
2668 button2 = "Broadcast Only", -- "cancel", middle
|
farmbuyer@69
|
2669 button3 = HELP_LABEL, -- "alt", right
|
farmbuyer@1
|
2670 OnAccept = function (dialog, addon)
|
farmbuyer@1
|
2671 addon:Activate()
|
farmbuyer@1
|
2672 end,
|
farmbuyer@69
|
2673 noCancelOnEscape = true,
|
farmbuyer@69
|
2674 OnCancel = function (dialog, addon)
|
farmbuyer@1
|
2675 addon:Activate(nil,true)
|
farmbuyer@1
|
2676 end,
|
farmbuyer@69
|
2677 OnAlt = function (dialog, addon)
|
farmbuyer@1
|
2678 -- hitting escape also calls this, but the 3rd arg would be "clicked"
|
farmbuyer@1
|
2679 -- in both cases, not useful here.
|
farmbuyer@1
|
2680 local helpbutton = dialog.button2
|
farmbuyer@1
|
2681 local ismousing = MouseIsOver(helpbutton)
|
farmbuyer@1
|
2682 if ismousing then
|
farmbuyer@1
|
2683 -- they actually clicked the button (or at least the mouse was over "Help"
|
farmbuyer@1
|
2684 -- when they hit escape... sigh)
|
farmbuyer@1
|
2685 addon:BuildMainDisplay('help')
|
farmbuyer@1
|
2686 else
|
farmbuyer@1
|
2687 addon.popped = true
|
farmbuyer@1
|
2688 end
|
farmbuyer@1
|
2689 end,
|
farmbuyer@1
|
2690 }
|
farmbuyer@1
|
2691
|
farmbuyer@69
|
2692 -- Callback for each Next/Accept stage of inserting a new loot or boss row via
|
farmbuyer@69
|
2693 -- dropdown. Thanks to noCancelOnReuse, each Show done here will technically
|
farmbuyer@69
|
2694 -- Hide and redisplay the same dialog, passing along the same 'data' structure
|
farmbuyer@69
|
2695 -- each time. The topmost call to our OnAccept will then finish by hiding the
|
farmbuyer@69
|
2696 -- (very last) dialog.
|
farmbuyer@69
|
2697 --
|
farmbuyer@69
|
2698 -- This is really, really hideous to read.
|
farmbuyer@69
|
2699 local function eoi_st_insert_OnAccept_boss (dialog, data, data2)
|
farmbuyer@69
|
2700 if data.all_done then
|
farmbuyer@69
|
2701 -- It'll probably be the final entry in the table, but there might have
|
farmbuyer@73
|
2702 -- been real loot happening while the user was clicking and typing.
|
farmbuyer@69
|
2703 local boss_index = addon._addBossEntry{
|
farmbuyer@69
|
2704 kind = 'boss',
|
farmbuyer@69
|
2705 bossname = (OuroLootSV_opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
|
farmbuyer@69
|
2706 reason = 'kill',
|
farmbuyer@69
|
2707 instance = data.instance,
|
farmbuyer@69
|
2708 duration = 0,
|
farmbuyer@69
|
2709 maxsize = data.max_raid_size,
|
farmbuyer@69
|
2710 raidersnap = data.yes_snap or {},
|
farmbuyer@69
|
2711 }
|
farmbuyer@69
|
2712 local entry = tremove(g_loot,boss_index)
|
farmbuyer@69
|
2713 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@69
|
2714 addon:_mark_boss_kill(data.rowindex)
|
farmbuyer@69
|
2715 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
|
farmbuyer@69
|
2716 dialog.data = nil -- free up memory
|
farmbuyer@69
|
2717 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
|
farmbuyer@69
|
2718 return
|
farmbuyer@69
|
2719 end
|
farmbuyer@69
|
2720
|
farmbuyer@69
|
2721 -- third click
|
farmbuyer@69
|
2722 if data.name and data.instance then
|
farmbuyer@69
|
2723 data.all_done = true
|
farmbuyer@69
|
2724 -- this is how we distinguish OnAccept from OnCancel ("clicked"); the
|
farmbuyer@69
|
2725 -- 3rd param is handled all in StaticPopup_OnClick
|
farmbuyer@69
|
2726 if data2 ~= 'clicked' then
|
farmbuyer@69
|
2727 data.yes_snap = data.maybe_snap
|
farmbuyer@69
|
2728 end
|
farmbuyer@69
|
2729 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2730 end
|
farmbuyer@69
|
2731
|
farmbuyer@69
|
2732 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2733
|
farmbuyer@69
|
2734 -- second click
|
farmbuyer@69
|
2735 if data.name and text then
|
farmbuyer@69
|
2736 data.instance = text
|
farmbuyer@69
|
2737 -- not "resuing" this dialog in the same sense as with loot
|
farmbuyer@69
|
2738 dialog.data = nil
|
farmbuyer@69
|
2739 dialog:Hide()
|
farmbuyer@69
|
2740 local getsnap = StaticPopup_Show("OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP")
|
farmbuyer@69
|
2741 getsnap.data = data
|
farmbuyer@69
|
2742 return true
|
farmbuyer@69
|
2743 end
|
farmbuyer@69
|
2744
|
farmbuyer@69
|
2745 -- first click
|
farmbuyer@69
|
2746 if text then
|
farmbuyer@69
|
2747 data.name = text
|
farmbuyer@69
|
2748 local maybe_instance
|
farmbuyer@69
|
2749 data.maybe_snap, data.max_raid_size, maybe_instance = addon:snapshot_raid()
|
farmbuyer@69
|
2750 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
|
farmbuyer@69
|
2751 getinstance.data = data
|
farmbuyer@69
|
2752 getinstance.editBox:SetText(maybe_instance)
|
farmbuyer@69
|
2753 -- This suppresses auto-hide (which would cause the getinstance dialog
|
farmbuyer@69
|
2754 -- to go away), but only when mouse clicking. OnEnter is on its own.
|
farmbuyer@69
|
2755 return true
|
farmbuyer@69
|
2756 end
|
farmbuyer@69
|
2757 end
|
farmbuyer@69
|
2758
|
farmbuyer@69
|
2759 local function eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2760 if data.all_done then
|
farmbuyer@69
|
2761 --local real_rebroadcast, real_enabled = addon.rebroadcast, addon.enabled
|
farmbuyer@69
|
2762 --g_rebroadcast, g_enabled = false, true
|
farmbuyer@69
|
2763 data.display:Hide()
|
farmbuyer@73
|
2764 local loot_index = assert(addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes))
|
farmbuyer@69
|
2765 --g_rebroadcast, g_enabled = real_g_rebroadcast, real_g_enabled
|
farmbuyer@69
|
2766 local entry = tremove(g_loot,loot_index)
|
farmbuyer@69
|
2767 tinsert(g_loot,data.rowindex,entry)
|
farmbuyer@69
|
2768 --data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
|
farmbuyer@69
|
2769 addon:_fill_out_eoi_data(data.rowindex)
|
farmbuyer@69
|
2770 addon:BuildMainDisplay()
|
farmbuyer@69
|
2771 dialog.data = nil
|
farmbuyer@69
|
2772 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
|
farmbuyer@69
|
2773 return
|
farmbuyer@69
|
2774 end
|
farmbuyer@69
|
2775
|
farmbuyer@69
|
2776 local text = dialog.editBox:GetText():trim()
|
farmbuyer@69
|
2777
|
farmbuyer@69
|
2778 -- third click
|
farmbuyer@69
|
2779 if data.name and data.recipient and text then
|
farmbuyer@69
|
2780 data.notes = (text ~= "<none>") and text or nil
|
farmbuyer@69
|
2781 data.all_done = true
|
farmbuyer@69
|
2782 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2783 end
|
farmbuyer@69
|
2784
|
farmbuyer@69
|
2785 -- second click
|
farmbuyer@69
|
2786 if data.name and text then
|
farmbuyer@69
|
2787 data.recipient = text
|
farmbuyer@69
|
2788 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
|
farmbuyer@69
|
2789 getnotes.data = data
|
farmbuyer@69
|
2790 getnotes.editBox:SetText("<none>")
|
farmbuyer@69
|
2791 getnotes.editBox:HighlightText()
|
farmbuyer@69
|
2792 return true
|
farmbuyer@69
|
2793 end
|
farmbuyer@69
|
2794
|
farmbuyer@69
|
2795 -- first click
|
farmbuyer@69
|
2796 if text then
|
farmbuyer@69
|
2797 data.name = text
|
farmbuyer@69
|
2798 dialog:Hide() -- technically a "different" one about to be shown
|
farmbuyer@69
|
2799 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
|
farmbuyer@69
|
2800 getrecipient.data = data
|
farmbuyer@69
|
2801 getrecipient.editBox:SetText("")
|
farmbuyer@69
|
2802 return true
|
farmbuyer@69
|
2803 end
|
farmbuyer@69
|
2804 end
|
farmbuyer@69
|
2805
|
farmbuyer@69
|
2806 local function eoi_st_insert_OnAccept (dialog, data)
|
farmbuyer@69
|
2807 if data.kind == 'boss' then
|
farmbuyer@69
|
2808 return eoi_st_insert_OnAccept_boss (dialog, data)
|
farmbuyer@69
|
2809 elseif data.kind == 'loot' then
|
farmbuyer@69
|
2810 return eoi_st_insert_OnAccept_loot (dialog, data)
|
farmbuyer@69
|
2811 end
|
farmbuyer@69
|
2812 end
|
farmbuyer@69
|
2813
|
farmbuyer@1
|
2814 -- The data member here is a table built with:
|
farmbuyer@1
|
2815 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
|
farmbuyer@1
|
2816 do
|
farmbuyer@1
|
2817 local t = flib.StaticPopup{
|
farmbuyer@75
|
2818 text = "Enter name of new %s, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@75
|
2819 button1 = CONTINUE.." ->",
|
farmbuyer@1
|
2820 button2 = CANCEL,
|
farmbuyer@1
|
2821 hasEditBox = true,
|
farmbuyer@16
|
2822 editBoxWidth = 350,
|
farmbuyer@1
|
2823 maxLetters = 50,
|
farmbuyer@1
|
2824 noCancelOnReuse = true,
|
farmbuyer@1
|
2825 --[[ XXX still needed?
|
farmbuyer@1
|
2826 OnShow = function(dialog)
|
farmbuyer@1
|
2827 dialog.wideEditBox:SetText("")
|
farmbuyer@1
|
2828 dialog.wideEditBox:SetFocus()
|
farmbuyer@1
|
2829 end,]]
|
farmbuyer@1
|
2830 }
|
farmbuyer@1
|
2831 t.EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@39
|
2832 if editbox:GetText() == "" then return end
|
farmbuyer@1
|
2833 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2834 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
|
farmbuyer@1
|
2835 dialog:Hide() -- replicate OnAccept click behavior
|
farmbuyer@1
|
2836 end
|
farmbuyer@1
|
2837 end
|
farmbuyer@1
|
2838 t.enterClicksFirstButton = nil -- no effect with editbox focused
|
farmbuyer@1
|
2839 t.OnAccept = eoi_st_insert_OnAccept
|
farmbuyer@1
|
2840 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
|
farmbuyer@1
|
2841
|
farmbuyer@69
|
2842 -- This seems to be gratuitous use of metatables, really.
|
farmbuyer@1
|
2843 local OEIL = {
|
farmbuyer@75
|
2844 text = "Paste the new item into here, then click "..CONTINUE.." or press Enter:",
|
farmbuyer@1
|
2845 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
|
farmbuyer@1
|
2846 }
|
farmbuyer@1
|
2847 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
|
farmbuyer@1
|
2848
|
farmbuyer@1
|
2849 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
|
farmbuyer@1
|
2850 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
|
farmbuyer@1
|
2851 if dialogname then
|
farmbuyer@16
|
2852 _G[dialogname.."EditBox"]:SetText(link)
|
farmbuyer@1
|
2853 return true
|
farmbuyer@1
|
2854 end
|
farmbuyer@1
|
2855 end)
|
farmbuyer@69
|
2856
|
farmbuyer@69
|
2857 t = flib.StaticPopup{
|
farmbuyer@69
|
2858 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
|
farmbuyer@69
|
2859 text = "Include a snapshot of the " .. ITEM_QUALITY_COLORS[5].hex
|
farmbuyer@69
|
2860 .. "CURRENT|r raid?\n\nClicking '" .. YES .. "' will allow this entry to "
|
farmbuyer@69
|
2861 .. "appear in attendance lists, but with the roster as it is NOW, not as it "
|
farmbuyer@69
|
2862 .. "was THEN. Clicking '" .. NO .."' means this kill cannot be included in "
|
farmbuyer@69
|
2863 .. "attendance.\n\n(Enter = '" .. YES .."', Escape = '" .. CANCEL .. "')",
|
farmbuyer@69
|
2864 button1 = YES, -- "accept", left
|
farmbuyer@69
|
2865 button2 = NO, -- "cancel", middle
|
farmbuyer@69
|
2866 button3 = CANCEL, -- "alt", right
|
farmbuyer@69
|
2867 }
|
farmbuyer@69
|
2868 -- Hitting Escape still hides the frame, but doesn't run OnCancel (which
|
farmbuyer@69
|
2869 -- is for the "No" button, not the "Cancel"/OnAlt button). Dizzy yet?
|
farmbuyer@69
|
2870 t.noCancelOnEscape = true
|
farmbuyer@69
|
2871 t.OnAccept = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2872 t.OnCancel = eoi_st_insert_OnAccept_boss
|
farmbuyer@69
|
2873 StaticPopupDialogs["OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP"] = t
|
farmbuyer@1
|
2874 end
|
farmbuyer@1
|
2875
|
farmbuyer@1
|
2876 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
|
farmbuyer@1
|
2877 text = "Enter the player name:",
|
farmbuyer@1
|
2878 button1 = ACCEPT,
|
farmbuyer@1
|
2879 button2 = CANCEL,
|
farmbuyer@1
|
2880 hasEditBox = true,
|
farmbuyer@1
|
2881 --[[ XXX needed?
|
farmbuyer@1
|
2882 OnShow = function(dialog)
|
farmbuyer@1
|
2883 dialog.editBox:SetText("")
|
farmbuyer@1
|
2884 dialog.editBox:SetFocus()
|
farmbuyer@1
|
2885 end,]]
|
farmbuyer@1
|
2886 OnAccept = function(dialog, data)
|
farmbuyer@1
|
2887 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@24
|
2888 addon:reassign_loot (data.index, name)
|
farmbuyer@1
|
2889 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.index)
|
farmbuyer@1
|
2890 end,
|
farmbuyer@1
|
2891 }
|
farmbuyer@1
|
2892
|
farmbuyer@1
|
2893 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
|
farmbuyer@1
|
2894 text = "Enter a name for the loot collection:",
|
farmbuyer@1
|
2895 button1 = ACCEPT,
|
farmbuyer@1
|
2896 button2 = CANCEL,
|
farmbuyer@1
|
2897 hasEditBox = true,
|
farmbuyer@1
|
2898 maxLetters = 30,
|
farmbuyer@1
|
2899 --[[ XXX
|
farmbuyer@1
|
2900 OnShow = function(dialog)
|
farmbuyer@1
|
2901 dialog.editBox:SetText("")
|
farmbuyer@1
|
2902 dialog.editBox:SetFocus()
|
farmbuyer@1
|
2903 end,]]
|
farmbuyer@1
|
2904 OnAccept = function(dialog)--, data)
|
farmbuyer@1
|
2905 local name = dialog.usertext --editBox:GetText()
|
farmbuyer@1
|
2906 addon:save_saveas(name)
|
farmbuyer@1
|
2907 addon:BuildMainDisplay()
|
farmbuyer@1
|
2908 end,
|
farmbuyer@1
|
2909 OnCancel = function(dialog)--, data, reason)
|
farmbuyer@1
|
2910 addon:BuildMainDisplay()
|
farmbuyer@1
|
2911 end,
|
farmbuyer@1
|
2912 --[[XXX
|
farmbuyer@1
|
2913 EditBoxOnEnterPressed = function(editbox)
|
farmbuyer@1
|
2914 local dialog = editbox:GetParent()
|
farmbuyer@1
|
2915 StaticPopupDialogs["OUROL_SAVE_SAVEAS"].OnAccept (dialog, dialog.data)
|
farmbuyer@1
|
2916 dialog:Hide()
|
farmbuyer@1
|
2917 end,]]
|
farmbuyer@1
|
2918 }
|
farmbuyer@1
|
2919
|
farmbuyer@25
|
2920
|
farmbuyer@25
|
2921 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
|
farmbuyer@25
|
2922 if true then
|
farmbuyer@25
|
2923 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
|
farmbuyer@25
|
2924 -- tagged with CHANGE.
|
farmbuyer@25
|
2925 local function onenter (self, motion)
|
farmbuyer@25
|
2926 if ( self.hasArrow ) then
|
farmbuyer@25
|
2927 local level = self:GetParent():GetID() + 1;
|
farmbuyer@25
|
2928 local listFrame = _G["DropDownList"..level];
|
farmbuyer@25
|
2929 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
|
farmbuyer@25
|
2930 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
|
farmbuyer@25
|
2931 end
|
farmbuyer@25
|
2932 else
|
farmbuyer@25
|
2933 CloseDropDownMenus(self:GetParent():GetID() + 1);
|
farmbuyer@25
|
2934 end
|
farmbuyer@25
|
2935 _G[self:GetName().."Highlight"]:Show();
|
farmbuyer@25
|
2936 UIDropDownMenu_StopCounting(self:GetParent());
|
farmbuyer@25
|
2937 if ( self.tooltipTitle ) then
|
farmbuyer@25
|
2938 if ( self.tooltipOnButton ) then
|
farmbuyer@25
|
2939 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
farmbuyer@25
|
2940 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
|
farmbuyer@25
|
2941 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
|
farmbuyer@25
|
2942 GameTooltip:Show();
|
farmbuyer@25
|
2943 else
|
farmbuyer@25
|
2944 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
|
farmbuyer@25
|
2945 end
|
farmbuyer@25
|
2946 end
|
farmbuyer@25
|
2947 end
|
farmbuyer@25
|
2948 -- end verbatime copy
|
farmbuyer@25
|
2949
|
farmbuyer@25
|
2950 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
|
farmbuyer@25
|
2951 local list = _G["DropDownList"..i]
|
farmbuyer@25
|
2952 if list then
|
farmbuyer@25
|
2953 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
|
farmbuyer@25
|
2954 local button = _G["DropDownList"..i.."Button"..j]
|
farmbuyer@25
|
2955 if button then
|
farmbuyer@25
|
2956 --print("button fixup",i,j)
|
farmbuyer@25
|
2957 button:SetScript("OnEnter",onenter)
|
farmbuyer@25
|
2958 end
|
farmbuyer@25
|
2959 end
|
farmbuyer@25
|
2960 end
|
farmbuyer@25
|
2961 end
|
farmbuyer@25
|
2962 end
|
farmbuyer@25
|
2963
|
farmbuyer@1
|
2964 -- vim:noet
|