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