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