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