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