annotate gui.lua @ 40:dc3a66688e50

More debug message tweaks. Put comm and loot caches on separate-but-related expirations; comm is now a bit shorter and loot is now a bit longer. Check cache expirations more often (possibly revert this).
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Fri, 30 Dec 2011 21:29:44 +0000
parents 8f7ec6ccf5e3
children 4f1e71f62776
rev   line source
farmbuyer@1 1 local addon = select(2,...)
farmbuyer@1 2
farmbuyer@1 3 --[[
farmbuyer@1 4 Purely the AceGUI-related routines, and the subroutines needed for support.
farmbuyer@1 5 ------ Constants
farmbuyer@6 6 ------ Globals
farmbuyer@1 7 ------ Behind the scenes routines
farmbuyer@1 8 ------ Main GUI Window
farmbuyer@1 9 ------ Popup dialogs
farmbuyer@1 10 ]]
farmbuyer@1 11
farmbuyer@1 12 ------ Constants
farmbuyer@1 13 local eoi_st_rowheight = 20
farmbuyer@16 14 local eoi_st_displayed_rows = math.floor(416/eoi_st_rowheight) --math.floor(366/eoi_st_rowheight)
farmbuyer@1 15 local eoi_st_textured_item_format = "|T%s:"..(eoi_st_rowheight-2).."|t %s[%s]|r%s"
farmbuyer@1 16 local eoi_st_otherrow_bgcolortable = {
farmbuyer@1 17 wipe = { ["r"] = 0.3, ["g"] = 0.3, ["b"] = 0.3},
farmbuyer@1 18 kill = { ["r"] = 0.2, ["g"] = 0.2, ["b"] = 0.2},
farmbuyer@1 19 time = { ["r"] = 0x0/255, ["g"] = 0x0/255, ["b"] = 1, ["a"] = 0.3},
farmbuyer@1 20 }
farmbuyer@1 21 eoi_st_otherrow_bgcolortable[""] = eoi_st_otherrow_bgcolortable["kill"]
farmbuyer@4 22 --eoi_st_otherrow_bgcolortable["realm"] = eoi_st_otherrow_bgcolortable["time"]
farmbuyer@1 23 local eoi_st_otherrow_bgcolortable_default
farmbuyer@1 24 local eoi_st_lootrow_col3_colortable = {
farmbuyer@1 25 [""] = { text = "", r = 1.0, g = 1.0, b = 1.0, a = 1.0 },
farmbuyer@1 26 shard = { text = "shard", r = 0xa3/255, g = 0x35/255, b = 0xee/255, a = 1.0 },
farmbuyer@1 27 offspec = { text = "offspec", r = 0.78, g = 0.61, b = 0.43, a = 1.0 },
farmbuyer@1 28 gvault = { text = "guild vault", r = 0x33/255, g = 1.0, b = 0x99/255, a = 1.0 },
farmbuyer@1 29 }
farmbuyer@1 30 local function eoi_st_lootrow_col3_colortable_func (data, cols, realrow, column, table)
farmbuyer@1 31 local disp = data[realrow].disposition
farmbuyer@1 32 return eoi_st_lootrow_col3_colortable[disp or ""]
farmbuyer@1 33 end
farmbuyer@1 34 addon.time_column1_used_mt = { __index = {
farmbuyer@1 35 [2] = {value=""},
farmbuyer@1 36 [3] = {value=""},
farmbuyer@1 37 } }
farmbuyer@1 38 local time_column1_used_mt = addon.time_column1_used_mt
farmbuyer@1 39
farmbuyer@1 40
farmbuyer@6 41 ------ Globals
farmbuyer@1 42 local GUI = LibStub("AceGUI-3.0")
farmbuyer@1 43 local flib = LibStub("LibFarmbuyer")
farmbuyer@1 44
farmbuyer@1 45 local g_loot = nil
farmbuyer@1 46 local g_generated = nil
farmbuyer@17 47 local window_title = "Ouro Loot"
farmbuyer@1 48
farmbuyer@1 49 local pairs, ipairs, tinsert, tremove, tonumber = pairs, ipairs, table.insert, table.remove, tonumber
farmbuyer@1 50
farmbuyer@1 51 local pprint, tabledump = addon.pprint, flib.tabledump
farmbuyer@11 52 local GetItemInfo, ITEM_QUALITY_COLORS = GetItemInfo, ITEM_QUALITY_COLORS
farmbuyer@1 53
farmbuyer@1 54 -- En masse forward decls of symbols defined inside local blocks
farmbuyer@1 55 local _generate_text, _populate_text_specials
farmbuyer@1 56 local _tabtexts, _taborder -- filled out in gui block scope
farmbuyer@1 57
farmbuyer@1 58 -- Working around this bug:
farmbuyer@1 59 -- http://forums.wowace.com/showpost.php?p=295202&postcount=31
farmbuyer@1 60 do
farmbuyer@37 61 local function fix_frame_level (level, ...)
farmbuyer@1 62 for i = 1, select("#", ...) do
farmbuyer@1 63 local button = select(i, ...)
farmbuyer@1 64 button:SetFrameLevel(level)
farmbuyer@1 65 end
farmbuyer@1 66 end
farmbuyer@1 67
farmbuyer@37 68 local function fix_menu_frame_levels()
farmbuyer@37 69 local f = _G.DropDownList1
farmbuyer@1 70 local i = 1
farmbuyer@1 71 while f do
farmbuyer@37 72 fix_frame_level (f:GetFrameLevel() + 2, f:GetChildren())
farmbuyer@1 73 i = i + 1
farmbuyer@1 74 f = _G["DropDownList"..i]
farmbuyer@1 75 end
farmbuyer@1 76 end
farmbuyer@1 77
farmbuyer@1 78 -- To fix Blizzard's bug caused by the new "self:SetFrameLevel(2);"
farmbuyer@37 79 hooksecurefunc("UIDropDownMenu_CreateFrames", fix_menu_frame_levels)
farmbuyer@1 80 end
farmbuyer@1 81
farmbuyer@1 82
farmbuyer@1 83 ------ Behind the scenes routines
farmbuyer@1 84 -- Text generation
farmbuyer@1 85 do
farmbuyer@1 86 local next_insertion_position = 2 -- position in _taborder
farmbuyer@1 87 local text_gen_funcs, specials_gen_funcs = {}, {}
farmbuyer@1 88 local accumulator = {}
farmbuyer@1 89
farmbuyer@1 90 -- Can do clever things by passing other halting points as zero
farmbuyer@1 91 function addon:zero_printed_fenceposts(zero)
farmbuyer@1 92 for t in pairs(text_gen_funcs) do
farmbuyer@1 93 g_loot.printed[t] = zero or g_loot.printed[t] or 0
farmbuyer@1 94 end
farmbuyer@1 95 end
farmbuyer@1 96
farmbuyer@10 97 function addon:registered_textgen_iter()
farmbuyer@10 98 return pairs(text_gen_funcs)
farmbuyer@10 99 end
farmbuyer@10 100
farmbuyer@1 101 -- This function is called during load, so be careful!
farmbuyer@1 102 function addon:register_text_generator (text_type, title, description, generator, opt_specgen)
farmbuyer@1 103 if type(generator) ~= 'function' then
farmbuyer@1 104 error(("Generator for text type '%s' must be a function!"):format(text_type))
farmbuyer@1 105 end
farmbuyer@1 106 _tabtexts[text_type] = { title=title, desc=description }
farmbuyer@1 107 tinsert (_taborder, next_insertion_position, text_type)
farmbuyer@1 108 next_insertion_position = next_insertion_position + 1
farmbuyer@1 109 text_gen_funcs[text_type] = generator
farmbuyer@1 110 specials_gen_funcs[text_type] = opt_specgen
farmbuyer@1 111 end
farmbuyer@1 112
farmbuyer@1 113 -- Called by tabs_generated_text_OGS
farmbuyer@1 114 function _generate_text (text_type)
farmbuyer@1 115 local f = text_gen_funcs[text_type]
farmbuyer@1 116 if not f then
farmbuyer@1 117 error(("Generator called for unregistered text type '%s'."):format(text_type))
farmbuyer@1 118 end
farmbuyer@1 119 g_generated = g_generated or {}
farmbuyer@1 120 g_loot[text_type] = g_loot[text_type] or ""
farmbuyer@1 121
farmbuyer@1 122 if g_loot.printed[text_type] >= #g_loot then return false end
farmbuyer@1 123 assert(addon.loot_clean == #g_loot, tostring(addon.loot_clean) .. " ~= " .. #g_loot)
farmbuyer@1 124 -- if glc is nil, #==0 test already returned
farmbuyer@1 125
farmbuyer@1 126 local ok,ret = pcall (f, text_type, g_loot, g_loot.printed[text_type], g_generated, accumulator)
farmbuyer@1 127 if not ok then
farmbuyer@1 128 error(("ERROR: text generator '%s' failed: %s"):format(text_type, ret))
farmbuyer@1 129 return false
farmbuyer@1 130 end
farmbuyer@1 131 if ret then
farmbuyer@1 132 g_loot.printed[text_type] = #g_loot
farmbuyer@1 133 g_generated[text_type] = (g_generated[text_type] or "") .. table.concat(accumulator,'\n') .. '\n'
farmbuyer@1 134 end
farmbuyer@1 135 wipe(accumulator)
farmbuyer@1 136 return ret
farmbuyer@1 137 end
farmbuyer@1 138 function _populate_text_specials (editbox, specials, mkb, text_type)
farmbuyer@1 139 local f = specials_gen_funcs[text_type]
farmbuyer@1 140 if not f then return end
farmbuyer@1 141 pcall (f, text_type, editbox, specials, mkb)
farmbuyer@1 142 end
farmbuyer@1 143 end
farmbuyer@1 144
farmbuyer@1 145 --[[
farmbuyer@1 146 The g_loot table is populated only with "behavior-relevant" data (names,
farmbuyer@1 147 links, etc). This function runs through it and fills out the "display-
farmbuyer@1 148 relevant" bits (icons, user-friendly labels, etc). Everything from the
farmbuyer@1 149 loot_clean index to the end of the table is filled out, loot_clean is
farmbuyer@1 150 updated. Override the starting point with the argument.
farmbuyer@1 151
farmbuyer@1 152 XXX blizzard's scrolling update and lib-st keep finding some way of displaying
farmbuyer@1 153 the grid without ever calling the hooked refresh, thereby skipping this
farmbuyer@1 154 function and erroring on missing columnar data. fuckit. from now on
farmbuyer@1 155 this function gets called everywhere, all the time, and loops over the
farmbuyer@1 156 entire goddamn table each time. If we can't find blizz's scrollframe bugs,
farmbuyer@1 157 we'll just work around them. Sorry for your smoking CPU.
farmbuyer@1 158
farmbuyer@1 159 FIXME just move this functionality to a per-entry function and call it once
farmbuyer@1 160 in _addlootentry. --actually no, then the columnar data won't be updated once
farmbuyer@1 161 the backend data is changed on the fly.
farmbuyer@1 162 ]]
farmbuyer@1 163 do
farmbuyer@1 164 local grammar = { -- not worth making a mt for this
farmbuyer@1 165 [2] = "nd",
farmbuyer@1 166 [3] = "rd",
farmbuyer@1 167 }
farmbuyer@1 168
farmbuyer@1 169 function addon:_fill_out_eoi_data (opt_starting_index)
farmbuyer@1 170 if #g_loot < 1 then
farmbuyer@1 171 --pprint('_f_o_e_d', "#g_loot<1")
farmbuyer@1 172 self.loot_clean = nil
farmbuyer@1 173 opt_starting_index = nil
farmbuyer@1 174 end
farmbuyer@1 175 for i = (opt_starting_index or self.loot_clean or 1), #g_loot do
farmbuyer@1 176 local e = g_loot[i]
farmbuyer@1 177 if e == nil then
farmbuyer@1 178 self.loot_clean = nil
farmbuyer@1 179 pprint('_f_o_e_d', "index",i,"somehow still in loop past",#g_loot,"bailing")
farmbuyer@1 180 return
farmbuyer@1 181 end
farmbuyer@1 182
farmbuyer@1 183 -- XXX FIXME a major weakness here is that we're constantly replacing
farmbuyer@1 184 -- what's already been created. Lots of garbage. Trying to detect what
farmbuyer@1 185 -- actually needs to be replaced is even worse. We'll live with
farmbuyer@1 186 -- garbage for now.
farmbuyer@1 187 if e.kind == 'loot' then
farmbuyer@11 188 local textured = eoi_st_textured_item_format:format (e.itexture, ITEM_QUALITY_COLORS[e.quality].hex, e.itemname, e.count or "")
farmbuyer@1 189 e.cols = {
farmbuyer@1 190 {value = textured},
farmbuyer@1 191 {value = e.person},
farmbuyer@1 192 { color = eoi_st_lootrow_col3_colortable_func }
farmbuyer@1 193 }
farmbuyer@1 194 -- This is horrible. Must do better.
farmbuyer@1 195 if e.extratext then for k,v in pairs(eoi_st_lootrow_col3_colortable) do
farmbuyer@1 196 if v.text == e.extratext then
farmbuyer@1 197 e.disposition = k
farmbuyer@1 198 --e.extratext = nil, not feasible
farmbuyer@1 199 break
farmbuyer@1 200 end
farmbuyer@1 201 end end
farmbuyer@1 202 local ex = eoi_st_lootrow_col3_colortable[e.disposition or ""].text
farmbuyer@1 203 if e.bcast_from and e.extratext then
farmbuyer@1 204 ex = e.extratext .. " (from " .. e.bcast_from .. ")"
farmbuyer@1 205 elseif e.bcast_from then
farmbuyer@1 206 ex = "(from " .. e.bcast_from .. ")"
farmbuyer@1 207 elseif e.extratext then
farmbuyer@1 208 ex = e.extratext
farmbuyer@1 209 end
farmbuyer@1 210 e.cols[3].value = ex
farmbuyer@1 211
farmbuyer@1 212 elseif e.kind == 'boss' then
farmbuyer@1 213 local v
farmbuyer@1 214 if e.reason == 'kill' then
farmbuyer@1 215 if e.attempts == 1 then
farmbuyer@1 216 v = "one-shot"
farmbuyer@1 217 else
farmbuyer@16 218 v = ("kill on %d%s attempt"):format(e.attempts or 0, grammar[e.attempts] or "th")
farmbuyer@1 219 end
farmbuyer@1 220 v = ("%s (%d:%.2d)"):format(v, math.floor(e.duration/60), math.floor(e.duration%60))
farmbuyer@1 221 elseif e.reason == 'wipe' then
farmbuyer@1 222 v = ("wipe (%d:%.2d)"):format(math.floor(e.duration/60), math.floor(e.duration%60))
farmbuyer@1 223 end
farmbuyer@1 224 e.cols = {
farmbuyer@1 225 {value = e.bosskill},
farmbuyer@1 226 {value = e.instance},
farmbuyer@1 227 {value = v or ""},
farmbuyer@1 228 }
farmbuyer@1 229
farmbuyer@1 230 elseif e.kind == 'time' then
farmbuyer@1 231 e.cols = setmetatable({
farmbuyer@1 232 {value=e.startday.text},
farmbuyer@1 233 }, time_column1_used_mt)
farmbuyer@1 234 --[[e.cols = {
farmbuyer@1 235 {value=e.startday.text},
farmbuyer@1 236 {value=""},
farmbuyer@1 237 {value=""},
farmbuyer@1 238 }]]
farmbuyer@1 239
farmbuyer@1 240 end
farmbuyer@1 241 end
farmbuyer@1 242 self.loot_clean = #g_loot
farmbuyer@1 243 end
farmbuyer@1 244 end
farmbuyer@1 245
farmbuyer@1 246 do
farmbuyer@1 247 function addon:_fill_out_hist_data (opt_starting_index)
farmbuyer@6 248 local new, del = flib.new, flib.del
farmbuyer@6 249
farmbuyer@1 250 -- Clearing history finishes this function with #hist==0 and hist_clean==0.
farmbuyer@1 251 -- The next call typically detects this (#<1) and handles it. If loot is
farmbuyer@1 252 -- recorded before then, it results in hist_clean==0 and #hist==1, which
farmbuyer@1 253 -- breaks the first iteration of the loop. Thus, the "extra" test here:
farmbuyer@1 254 if #self.history < 1 or self.hist_clean == 0 then
farmbuyer@1 255 self.hist_clean = nil
farmbuyer@1 256 opt_starting_index = nil
farmbuyer@1 257 end
farmbuyer@1 258 if not self.history.st then
farmbuyer@6 259 --print"creating ST!"
farmbuyer@1 260 self.history.st = {
farmbuyer@4 261 --[[{ kind = "realm",
farmbuyer@1 262 cols = setmetatable({
farmbuyer@1 263 { value = self.history.realm },
farmbuyer@1 264 }, time_column1_used_mt)
farmbuyer@4 265 }]]
farmbuyer@1 266 }
farmbuyer@1 267 end
farmbuyer@6 268
farmbuyer@6 269 -- for now
farmbuyer@6 270 if self.hist_clean == #self.history then return end
farmbuyer@6 271
farmbuyer@1 272 local st = self.history.st
farmbuyer@6 273 --print("starting history loop, #st ==", #st, "#history ==", #self.history)
farmbuyer@6 274 for i,t in ipairs(st) do
farmbuyer@6 275 del(t.cols[1])
farmbuyer@6 276 del(t.cols[2])
farmbuyer@6 277 del(t.cols[3])
farmbuyer@6 278 del(t.cols)
farmbuyer@6 279 del(t)
farmbuyer@6 280 st[i] = nil
farmbuyer@6 281 end
farmbuyer@1 282
farmbuyer@6 283 --for i = (opt_starting_index or self.hist_clean or 1), #self.history do
farmbuyer@6 284 local cache_okay = true
farmbuyer@6 285 for pi,player in ipairs(self.history) do
farmbuyer@6 286 local col1 = new()
farmbuyer@6 287 col1.OLi = pi
farmbuyer@6 288 col1.OLn = #player
farmbuyer@6 289 col1.value = player.name -- may spiffy this up in future
farmbuyer@1 290
farmbuyer@6 291 for li,loot in ipairs(player) do
farmbuyer@6 292 local col2 = new()
farmbuyer@6 293 col2.OLi = li
farmbuyer@6 294 local col3 = new()
farmbuyer@6 295 col3.value = loot.when
farmbuyer@6 296
farmbuyer@6 297 local itexture = GetItemIcon(loot.id)
farmbuyer@6 298 local iname, ilink, iquality = GetItemInfo(loot.id)
farmbuyer@4 299 local textured
farmbuyer@4 300 if itexture and iname then
farmbuyer@6 301 textured = eoi_st_textured_item_format:format (itexture,
farmbuyer@11 302 ITEM_QUALITY_COLORS[iquality].hex, iname, loot.count or "")
farmbuyer@4 303 else
farmbuyer@6 304 textured = eoi_st_textured_item_format:format ([[ICONS\INV_Misc_QuestionMark]],
farmbuyer@19 305 ITEM_QUALITY_COLORS[ITEM_QUALITY_COMMON].hex, 'UNKNOWN - REDISPLAY LATER', "")
farmbuyer@6 306 cache_okay = false
farmbuyer@4 307 end
farmbuyer@6 308 col2.value = textured
farmbuyer@6 309
farmbuyer@6 310 local dotcols = new (col1, col2, col3)
farmbuyer@6 311 local st_entry = new()
farmbuyer@6 312 st_entry.kind = 'history'
farmbuyer@6 313 st_entry.OLwho = player.name
farmbuyer@6 314 st_entry.cols = dotcols
farmbuyer@16 315 st_entry.itemlink = ilink -- for onenter and onclick
farmbuyer@6 316 tinsert (st, st_entry)
farmbuyer@1 317 end
farmbuyer@6 318 end
farmbuyer@1 319
farmbuyer@6 320 --print("finished history loop, #st ==", #st)
farmbuyer@6 321 self.hist_clean = cache_okay and #self.history or nil
farmbuyer@1 322 end
farmbuyer@6 323
farmbuyer@6 324
farmbuyer@1 325 end
farmbuyer@1 326
farmbuyer@1 327
farmbuyer@1 328 ------ Main GUI Window
farmbuyer@37 329 local _d -- display when it's open, eoiST when it's not
farmbuyer@1 330 local function setstatus(txt) _d:SetStatusText(txt) end
farmbuyer@1 331 local function statusy_OnLeave() setstatus("") end
farmbuyer@1 332 local tabgroup_tabs
farmbuyer@1 333
farmbuyer@1 334 --[[
farmbuyer@1 335 Controls for the tabs on the left side of the main display.
farmbuyer@1 336 ]]
farmbuyer@1 337 _tabtexts = {
farmbuyer@1 338 ["eoi"] = {title=[[Loot]], desc=[[Observed loot, plus boss kills and other events of interest]]},
farmbuyer@1 339 ["hist"] = {title=[[History]], desc=[[A short semi-permanent record]]},
farmbuyer@1 340 ["help"] = {title=[[Help]], desc=[[Instructions, reminders, and tips for non-obvious features]]},
farmbuyer@1 341 ["opt"] = {title=[[Options]], desc=[[Options for fine-tuning behavior]]},
farmbuyer@1 342 --["adv"] = {title=[[Advanced]], desc=[[Debugging and testing]]},
farmbuyer@1 343 }
farmbuyer@6 344 --if addon.author_debug then
farmbuyer@1 345 _taborder = { "eoi", "hist", "help", "opt" }
farmbuyer@6 346 --else _taborder = { "eoi", "help", "opt" } end
farmbuyer@1 347
farmbuyer@1 348 --[[
farmbuyer@1 349 This is a table of callback functions, each responsible for drawing a tab
farmbuyer@1 350 into the container passed in the first argument. Special-purpose buttons
farmbuyer@1 351 can optionally be created (mkbutton) and added to the container in the second
farmbuyer@1 352 argument.
farmbuyer@1 353 ]]
farmbuyer@1 354 local tabs_OnGroupSelected = {}
farmbuyer@1 355 local mkbutton
farmbuyer@1 356 local tabs_OnGroupSelected_func, tabs_generated_text_OGS
farmbuyer@1 357
farmbuyer@1 358 function addon:gui_init (loot_pointer)
farmbuyer@1 359 g_loot = loot_pointer
farmbuyer@1 360 g_generated = nil
farmbuyer@1 361 tabgroup_tabs = {}
farmbuyer@17 362 window_title = "Ouro Loot " .. self.revision
farmbuyer@1 363 for _,v in ipairs(_taborder) do
farmbuyer@1 364 tinsert (tabgroup_tabs, {value=v, text=_tabtexts[v].title})
farmbuyer@1 365 -- By default, tabs are editboxes with generated text
farmbuyer@1 366 if not tabs_OnGroupSelected[v] then
farmbuyer@1 367 tabs_OnGroupSelected[v] = tabs_generated_text_OGS
farmbuyer@1 368 end
farmbuyer@1 369 end
farmbuyer@1 370 end
farmbuyer@1 371
farmbuyer@37 372 --[[
farmbuyer@37 373 Dropdown menu handling
farmbuyer@37 374 ]]
farmbuyer@37 375 -- forward decls
farmbuyer@1 376 local eoi_editcell
farmbuyer@1 377
farmbuyer@37 378 local dropdownfuncs
farmbuyer@37 379 do
farmbuyer@37 380 local ddf_mt = {
farmbuyer@37 381 __index = {
farmbuyer@37 382 -- more stuff should be moved into this table
farmbuyer@37 383 [CLOSE] = function() CloseDropDownMenus() end,
farmbuyer@37 384 }
farmbuyer@37 385 }
farmbuyer@37 386 dropdownfuncs = function(t)
farmbuyer@37 387 return setmetatable(t, ddf_mt)
farmbuyer@37 388 end
farmbuyer@37 389 end
farmbuyer@37 390
farmbuyer@1 391 local function dropdownmenu_handler (ddbutton, subfunc, arg)
farmbuyer@26 392 local i = _d and _d.GetUserData and _d:GetUserData("DD loot index")
farmbuyer@26 393 if i then
farmbuyer@26 394 subfunc(i,arg)
farmbuyer@26 395 _d:GetUserData("eoiST"):OuroLoot_Refresh(i)
farmbuyer@26 396 end
farmbuyer@1 397 end
farmbuyer@1 398
farmbuyer@1 399 local function gen_easymenu_table (initial, list, funcs)
farmbuyer@1 400 for _,tag in ipairs(list) do
farmbuyer@1 401 local name, arg, tiptext
farmbuyer@1 402 name, tiptext = strsplit('|',tag)
farmbuyer@1 403 name, arg = strsplit('%',name)
farmbuyer@1 404 if name == "--" then
farmbuyer@1 405 tinsert (initial, {
farmbuyer@6 406 disabled = true, notCheckable = true, text = "",
farmbuyer@1 407 })
farmbuyer@1 408 else
farmbuyer@1 409 if not funcs[name] then
farmbuyer@1 410 error(("'%s' not defined as a dropdown function"):format(name))
farmbuyer@1 411 end
farmbuyer@1 412 tinsert (initial, {
farmbuyer@1 413 text = name,
farmbuyer@1 414 func = dropdownmenu_handler,
farmbuyer@1 415 arg1 = funcs[name],
farmbuyer@1 416 arg2 = arg,
farmbuyer@1 417 notCheckable = true,
farmbuyer@25 418 tooltipOnButton = true,
farmbuyer@25 419 tooltipWhileDisabled = true,
farmbuyer@1 420 tooltipTitle = tiptext and name or nil,
farmbuyer@1 421 tooltipText = tiptext,
farmbuyer@1 422 })
farmbuyer@1 423 end
farmbuyer@1 424 end
farmbuyer@1 425 return initial
farmbuyer@1 426 end
farmbuyer@1 427
farmbuyer@1 428 local dropdownmenuframe = CreateFrame("Frame", "OuroLootDropDownMenu", nil, "UIDropDownMenuTemplate")
farmbuyer@1 429
farmbuyer@37 430
farmbuyer@37 431 -- Tab 1: Events Of Interest
farmbuyer@37 432 -- This actually takes up quite a bit of the file.
farmbuyer@37 433 local eoi_dropdownfuncs
farmbuyer@37 434 eoi_dropdownfuncs = dropdownfuncs{
farmbuyer@1 435 df_INSERT = function(rowi,text)
farmbuyer@1 436 local which = (text == 'loot') and "OUROL_EOI_INSERT_LOOT" or "OUROL_EOI_INSERT"
farmbuyer@1 437 local dialog = StaticPopup_Show(which,text)
farmbuyer@16 438 dialog.editBox:SetScript("OnTextChanged",StaticPopup_EditBoxOnTextChanged)
farmbuyer@1 439 dialog.data = {rowindex=rowi, display=_d, kind=text}
farmbuyer@1 440 end,
farmbuyer@1 441
farmbuyer@1 442 df_DELETE = function(rowi)
farmbuyer@1 443 local gone = tremove(g_loot,rowi)
farmbuyer@1 444 addon:Print("Removed %s.",
farmbuyer@1 445 gone.itemlink or gone.bosskill or gone.startday.text)
farmbuyer@36 446 if gone.kind == 'loot' and IsShiftKeyDown() then
farmbuyer@36 447 addon:_delHistoryEntry (rowi, gone)
farmbuyer@36 448 end
farmbuyer@1 449 end,
farmbuyer@1 450
farmbuyer@1 451 ["Delete remaining entries for this day"] = function(rowi,kind)
farmbuyer@28 452 -- if kind is boss, also need to stop at new timestamp
farmbuyer@28 453 local fencepost = addon._find_timeboss_fencepost (kind, rowi)
farmbuyer@1 454 local count = fencepost and (fencepost-rowi) or (#g_loot-rowi+1)
farmbuyer@1 455 repeat
farmbuyer@37 456 eoi_dropdownfuncs.df_DELETE(rowi)
farmbuyer@1 457 count = count - 1
farmbuyer@1 458 until count < 1
farmbuyer@1 459 end,
farmbuyer@1 460
farmbuyer@1 461 ["Rebroadcast this loot entry"] = function(rowi)
farmbuyer@1 462 local e = g_loot[rowi]
farmbuyer@1 463 -- This only works because GetItemInfo accepts multiple argument formats
farmbuyer@1 464 addon:broadcast('loot', e.person, e.itemlink, e.count, e.cols[3].value)
farmbuyer@28 465 addon:Print("Rebroadcast entry", rowi, e.itemlink)
farmbuyer@1 466 end,
farmbuyer@1 467
farmbuyer@1 468 ["Rebroadcast this boss"] = function(rowi,kind)
farmbuyer@28 469 -- if kind is boss, also need to stop at new timestamp
farmbuyer@28 470 local fencepost = addon._find_timeboss_fencepost (kind, rowi) or #g_loot
farmbuyer@28 471 -- this could be a lot of traffic, but frankly it's counterproductive
farmbuyer@28 472 -- to try to micromanage when ChatThrottleLib is already doing so
farmbuyer@28 473 repeat
farmbuyer@28 474 local e = g_loot[rowi]
farmbuyer@28 475 if e.kind == 'boss' then
farmbuyer@28 476 addon:broadcast('boss', e.reason, e.bosskill, e.instance)
farmbuyer@28 477 elseif e.kind == 'loot' then
farmbuyer@28 478 -- This only works because GetItemInfo accepts multiple argument formats
farmbuyer@28 479 addon:broadcast('loot', e.person, e.itemlink, e.count, e.cols[3].value)
farmbuyer@28 480 end
farmbuyer@28 481 addon:Print("Rebroadcast entry", rowi, e.itemlink or e.bosskill or UNKNOWN)
farmbuyer@28 482 rowi = rowi + 1
farmbuyer@28 483 until rowi >= fencepost
farmbuyer@1 484 end,
farmbuyer@1 485
farmbuyer@1 486 ["Mark as normal"] = function(rowi,disp) -- broadcast the change? ugh
farmbuyer@25 487 local olddisp = g_loot[rowi].disposition
farmbuyer@1 488 g_loot[rowi].disposition = disp
farmbuyer@1 489 g_loot[rowi].bcast_from = nil
farmbuyer@1 490 g_loot[rowi].extratext = nil
farmbuyer@25 491 addon:history_handle_disposition (rowi, olddisp)
farmbuyer@1 492 end,
farmbuyer@1 493
farmbuyer@1 494 ["Show only this player"] = function(rowi)
farmbuyer@1 495 local st = _d:GetUserData("eoiST")
farmbuyer@1 496 _d:SetUserData("player filter name", g_loot[rowi].person)
farmbuyer@1 497 st:SetFilter(_d:GetUserData("player filter by name"))
farmbuyer@1 498 _d:GetUserData("eoi_filter_reset"):SetDisabled(false)
farmbuyer@1 499 end,
farmbuyer@1 500
farmbuyer@1 501 ["Change from 'wipe' to 'kill'"] = function(rowi)
farmbuyer@1 502 addon:_mark_boss_kill(rowi)
farmbuyer@1 503 -- the fillout function called automatically will start too far down the list
farmbuyer@1 504 _d:GetUserData("eoiST"):OuroLoot_Refresh()
farmbuyer@1 505 end,
farmbuyer@1 506
farmbuyer@1 507 ["Edit note"] = function(rowi)
farmbuyer@1 508 eoi_editcell (rowi, _d:GetUserData("DD loot cell"))
farmbuyer@1 509 end,
farmbuyer@1 510
farmbuyer@1 511 df_REASSIGN = function(rowi,to_whom)
farmbuyer@24 512 addon:reassign_loot (rowi, to_whom)
farmbuyer@1 513 CloseDropDownMenus() -- also need to close parent menu
farmbuyer@1 514 end,
farmbuyer@1 515 ["Enter name..."] = function(rowi)
farmbuyer@25 516 CloseDropDownMenus() -- also need to close parent menu
farmbuyer@1 517 local dialog = StaticPopup_Show "OUROL_REASSIGN_ENTER"
farmbuyer@1 518 dialog.data = {index=rowi, display=_d}
farmbuyer@1 519 end,
farmbuyer@1 520 }
farmbuyer@1 521 -- Would be better to move the %arg to this list rather than below, but
farmbuyer@1 522 -- that's a lot of extra effort that doesn't buy much in return.
farmbuyer@37 523 eoi_dropdownfuncs["Delete this loot event"] = eoi_dropdownfuncs.df_DELETE
farmbuyer@37 524 eoi_dropdownfuncs["Delete this boss event"] = eoi_dropdownfuncs.df_DELETE
farmbuyer@37 525 eoi_dropdownfuncs["Insert new loot entry"] = eoi_dropdownfuncs.df_INSERT
farmbuyer@37 526 eoi_dropdownfuncs["Insert new boss kill event"] = eoi_dropdownfuncs.df_INSERT
farmbuyer@37 527 eoi_dropdownfuncs["Mark as disenchanted"] = eoi_dropdownfuncs["Mark as normal"]
farmbuyer@37 528 eoi_dropdownfuncs["Mark as guild vault"] = eoi_dropdownfuncs["Mark as normal"]
farmbuyer@37 529 eoi_dropdownfuncs["Mark as offspec"] = eoi_dropdownfuncs["Mark as normal"]
farmbuyer@37 530 eoi_dropdownfuncs["Delete remaining entries for this boss"] =
farmbuyer@37 531 eoi_dropdownfuncs["Delete remaining entries for this day"]
farmbuyer@37 532 eoi_dropdownfuncs["Rebroadcast this day"] = eoi_dropdownfuncs["Rebroadcast this boss"]
farmbuyer@1 533 local eoi_time_dropdown = gen_easymenu_table(
farmbuyer@1 534 {{
farmbuyer@1 535 -- this is the dropdown title, text filled in on the fly
farmbuyer@1 536 isTitle = true,
farmbuyer@1 537 notClickable = true,
farmbuyer@1 538 notCheckable = true,
farmbuyer@1 539 }},
farmbuyer@1 540 {
farmbuyer@25 541 "Rebroadcast this day%time|Broadcasts everything from here down until a new day.",
farmbuyer@25 542 "Delete remaining entries for this day%time|Erases everything from here down until a new day.",
farmbuyer@25 543 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
farmbuyer@25 544 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
farmbuyer@1 545 CLOSE
farmbuyer@37 546 }, eoi_dropdownfuncs)
farmbuyer@1 547 local eoi_loot_dropdown = gen_easymenu_table(
farmbuyer@1 548 {{
farmbuyer@1 549 -- this is the dropdown title, text filled in on the fly
farmbuyer@1 550 notClickable = true,
farmbuyer@1 551 notCheckable = true,
farmbuyer@1 552 }},
farmbuyer@1 553 {
farmbuyer@1 554 "Mark as disenchanted%shard",
farmbuyer@1 555 "Mark as offspec%offspec",
farmbuyer@1 556 "Mark as guild vault%gvault",
farmbuyer@25 557 "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 558 "--",
farmbuyer@1 559 "Rebroadcast this loot entry|Sends this loot event, including special notes, as if it just happened.",
farmbuyer@36 560 "Delete this loot event|Permanent, no going back!\n\nHold down the Shift key to also delete the player's corresponding History entry.",
farmbuyer@25 561 "Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day.",
farmbuyer@25 562 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
farmbuyer@25 563 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
farmbuyer@25 564 "Edit note|Same as double-clicking in the notes column.",
farmbuyer@1 565 "--",
farmbuyer@1 566 CLOSE
farmbuyer@37 567 }, eoi_dropdownfuncs)
farmbuyer@1 568 local eoi_player_dropdown = gen_easymenu_table(
farmbuyer@1 569 {
farmbuyer@1 570 {
farmbuyer@1 571 -- this is the dropdown title, text filled in on the fly
farmbuyer@1 572 isTitle = true,
farmbuyer@1 573 notClickable = true,
farmbuyer@1 574 notCheckable = true,
farmbuyer@1 575 },
farmbuyer@1 576 {
farmbuyer@1 577 text = "Reassign to...",
farmbuyer@1 578 hasArrow = true,
farmbuyer@1 579 --menuList = filled in in the fly,
farmbuyer@25 580 tooltipOnButton = true,
farmbuyer@25 581 tooltipWhileDisabled = true,
farmbuyer@1 582 },
farmbuyer@1 583 },
farmbuyer@1 584 {
farmbuyer@1 585 "Show only this player",
farmbuyer@1 586 CLOSE
farmbuyer@37 587 }, eoi_dropdownfuncs)
farmbuyer@1 588 local eoi_boss_dropdown = gen_easymenu_table(
farmbuyer@1 589 {{
farmbuyer@1 590 -- this is the dropdown title, text filled in on the fly
farmbuyer@1 591 isTitle = true,
farmbuyer@1 592 notClickable = true,
farmbuyer@1 593 notCheckable = true,
farmbuyer@1 594 }},
farmbuyer@1 595 {
farmbuyer@25 596 "Change from 'wipe' to 'kill'|Also collapses other wipe entries.",
farmbuyer@28 597 "Rebroadcast this boss%boss|Broadcasts the kill event and all subsequent loot until next boss.",
farmbuyer@1 598 "Delete this boss event|Permanent, no going back!",
farmbuyer@25 599 "Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day.",
farmbuyer@25 600 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
farmbuyer@25 601 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
farmbuyer@1 602 "--",
farmbuyer@1 603 CLOSE
farmbuyer@37 604 }, eoi_dropdownfuncs)
farmbuyer@1 605
farmbuyer@1 606 --[[ quoted verbatim from lib-st docs:
farmbuyer@1 607 rowFrame This is the UI Frame table for the row.
farmbuyer@1 608 cellFrame This is the UI Frame table for the cell in the row.
farmbuyer@1 609 data This is the data table supplied to the scrolling table (in case you lost it :) )
farmbuyer@1 610 cols This is the cols table supplied to the scrolling table (again, in case you lost it :) )
farmbuyer@1 611 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 612 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 613 column This is the index of which column the event was triggered in.
farmbuyer@1 614 table This is a reference to the scrollingtable table.
farmbuyer@1 615 ... Any arguments generated by the '''NORMAL''' Blizzard event triggered by the frame are passed as is.
farmbuyer@1 616 ]]
farmbuyer@1 617 local function eoi_st_OnEnter (rowFrame, cellFrame, data, cols, row, realrow, column, table, button, ...)
farmbuyer@1 618 if (row == nil) or (realrow == nil) then return end -- mouseover column header
farmbuyer@1 619 local e = data[realrow]
farmbuyer@1 620 local kind = e.kind
farmbuyer@1 621
farmbuyer@16 622 if (kind == 'loot' and column == 1) or (kind == 'history' and column == 2) then
farmbuyer@19 623 GameTooltip:SetOwner (cellFrame, "ANCHOR_RIGHT", -20, 0)
farmbuyer@19 624 if e.cache_miss then
farmbuyer@19 625 GameTooltip:ClearLines()
farmbuyer@19 626 GameTooltip:AddLine("Missing Cache Data")
farmbuyer@19 627 GameTooltip:AddLine([[Wait a few seconds, then type]], 0.8, 0.8, 0.8, 1)
farmbuyer@19 628 GameTooltip:AddLine([[/ouroloot fixcache]], 0, 1, 64/255, nil)
farmbuyer@19 629 GameTooltip:AddLine([[and redisplay this window.]], 0.8, 0.8, 0.8, 1)
farmbuyer@19 630 GameTooltip:Show()
farmbuyer@19 631 elseif e.itemlink then
farmbuyer@16 632 GameTooltip:SetHyperlink (e.itemlink)
farmbuyer@16 633 end
farmbuyer@1 634
farmbuyer@1 635 elseif kind == 'loot' and column == 2 then
farmbuyer@1 636 GameTooltip:SetOwner (cellFrame, "ANCHOR_BOTTOMRIGHT", -50, 5)
farmbuyer@1 637 GameTooltip:ClearLines()
farmbuyer@1 638 GameTooltip:AddLine(e.person.." Loot:")
farmbuyer@1 639 local counter = 0
farmbuyer@1 640 for i,e2 in ipairs(data) do
farmbuyer@1 641 if e2.person == e.person then -- would be awesome to test for alts
farmbuyer@1 642 if counter > 10 then
farmbuyer@1 643 GameTooltip:AddLine("...")
farmbuyer@1 644 break
farmbuyer@1 645 else
farmbuyer@1 646 -- textures screw up too badly, strip them
farmbuyer@1 647 local textured = e2.cols[1].value
farmbuyer@1 648 local space = textured:find(" ")
farmbuyer@1 649 GameTooltip:AddLine(textured:sub(space+1))
farmbuyer@1 650 counter = counter + 1
farmbuyer@1 651 end
farmbuyer@1 652 end
farmbuyer@1 653 end
farmbuyer@1 654 GameTooltip:Show()
farmbuyer@1 655
farmbuyer@1 656 elseif kind == 'loot' and column == 3 then
farmbuyer@1 657 setstatus(e.cols[column].value)
farmbuyer@1 658
farmbuyer@1 659 end
farmbuyer@1 660
farmbuyer@1 661 return false -- continue with default highlighting behavior
farmbuyer@1 662 end
farmbuyer@1 663 local function eoi_st_OnLeave (rowFrame, cellFrame, data, cols, row, realrow, column, table, button, ...)
farmbuyer@1 664 GameTooltip:Hide()
farmbuyer@1 665 if row and realrow and data[realrow].kind ~= 'loot' then
farmbuyer@1 666 table:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[data[realrow].reason or data[realrow].kind])
farmbuyer@1 667 return true -- do not do anything further
farmbuyer@1 668 else
farmbuyer@1 669 --setstatus("")
farmbuyer@1 670 return false -- continue with default un-highlighting behavior
farmbuyer@1 671 end
farmbuyer@1 672 end
farmbuyer@1 673
farmbuyer@1 674 local function eoi_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
farmbuyer@1 675 if (row == nil) or (realrow == nil) then return true end -- click column header, suppress reordering
farmbuyer@1 676 local e = data[realrow]
farmbuyer@1 677 local kind = e.kind
farmbuyer@1 678
farmbuyer@1 679 -- Check for shift-clicking a loot line
farmbuyer@16 680 if IsModifiedClick("CHATLINK") and
farmbuyer@16 681 ((kind == 'loot' and column == 1) or (kind == 'history' and column == 2))
farmbuyer@16 682 then
farmbuyer@1 683 ChatEdit_InsertLink (e.itemlink)
farmbuyer@1 684 return true -- do not do anything further
farmbuyer@1 685 end
farmbuyer@1 686
farmbuyer@1 687 -- Remaining actions are all right-click
farmbuyer@1 688 if button ~= "RightButton" then return true end
farmbuyer@1 689 _d:SetUserData("DD loot index", realrow)
farmbuyer@1 690
farmbuyer@1 691 if kind == 'loot' and (column == 1 or column == 3) then
farmbuyer@1 692 _d:SetUserData("DD loot cell", cellFrame)
farmbuyer@1 693 eoi_loot_dropdown[1].text = e.itemlink
farmbuyer@1 694 EasyMenu (eoi_loot_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
farmbuyer@1 695
farmbuyer@1 696 elseif kind == 'loot' and column == 2 then
farmbuyer@1 697 eoi_player_dropdown[1].text = e.person
farmbuyer@1 698 local raiders = {}
farmbuyer@1 699 for i = 1, GetNumRaidMembers() do
farmbuyer@1 700 tinsert (raiders, (GetRaidRosterInfo(i)))
farmbuyer@1 701 end
farmbuyer@1 702 table.sort(raiders)
farmbuyer@1 703 for i = 1, #raiders do
farmbuyer@1 704 local name = raiders[i]
farmbuyer@1 705 raiders[i] = {
farmbuyer@1 706 text = name,
farmbuyer@1 707 func = dropdownmenu_handler,
farmbuyer@37 708 arg1 = eoi_dropdownfuncs.df_REASSIGN,
farmbuyer@1 709 arg2 = name,
farmbuyer@1 710 notCheckable = true,
farmbuyer@1 711 }
farmbuyer@1 712 end
farmbuyer@1 713 eoi_player_dropdown[2].menuList =
farmbuyer@37 714 gen_easymenu_table (raiders, {"Enter name...",CLOSE}, eoi_dropdownfuncs)
farmbuyer@25 715 if e.disposition == 'shard' or e.disposition == 'gvault' then
farmbuyer@25 716 eoi_player_dropdown[2].disabled = true
farmbuyer@25 717 eoi_player_dropdown[2].tooltipTitle = "Cannot Reassign"
farmbuyer@25 718 eoi_player_dropdown[2].tooltipText = "You must first mark this item as 'normal' or 'offspec' before reassignment."
farmbuyer@25 719 else
farmbuyer@25 720 eoi_player_dropdown[2].disabled = nil
farmbuyer@25 721 eoi_player_dropdown[2].tooltipTitle = nil
farmbuyer@25 722 eoi_player_dropdown[2].tooltipText = nil
farmbuyer@25 723 end
farmbuyer@1 724 EasyMenu (eoi_player_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
farmbuyer@1 725
farmbuyer@1 726 elseif kind == 'boss' then
farmbuyer@1 727 eoi_boss_dropdown[1].text = e.bosskill
farmbuyer@1 728 EasyMenu (eoi_boss_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
farmbuyer@1 729
farmbuyer@1 730 elseif kind == 'time' then
farmbuyer@1 731 eoi_time_dropdown[1].text = e.startday.text
farmbuyer@1 732 EasyMenu (eoi_time_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
farmbuyer@1 733
farmbuyer@16 734 elseif kind == 'history' then -- XXX need to move this into new onclick handler
farmbuyer@16 735 _d:SetUserData("DD loot cell", cellFrame)
farmbuyer@16 736 hist_dropdown[1].text = e.itemlink
farmbuyer@16 737 EasyMenu (hist_dropdown, dropdownmenuframe, cellFrame, 0, 0, "MENU")
farmbuyer@1 738 end
farmbuyer@1 739
farmbuyer@1 740 return true -- do not do anything further
farmbuyer@1 741 end
farmbuyer@1 742
farmbuyer@1 743 function eoi_editcell (row_index, cell_frame)
farmbuyer@1 744 local e = g_loot[row_index]
farmbuyer@1 745 if not e then return end -- how the hell could we get this far?
farmbuyer@1 746 local celldata = e.cols[3]
farmbuyer@1 747 local box = GUI:Create("EditBox")
farmbuyer@1 748 box:SetText(celldata.value)
farmbuyer@1 749 box:SetUserData("old show", box.editbox:GetScript("OnShow"))
farmbuyer@1 750 box:SetUserData("old escape", box.editbox:GetScript("OnEscapePressed"))
farmbuyer@1 751 box.editbox:SetScript("OnShow", box.editbox.SetFocus)
farmbuyer@1 752 box.editbox:SetScript("OnEscapePressed", function(_be)
farmbuyer@1 753 _be:ClearFocus()
farmbuyer@1 754 _be.obj:Release()
farmbuyer@1 755 end)
farmbuyer@1 756 box:SetCallback("OnEnterPressed", function(_b,event,value)
farmbuyer@1 757 e.extratext = value
farmbuyer@1 758 celldata.value = value
farmbuyer@1 759 e.bcast_from = nil -- things get screwy if this field is still present. sigh.
farmbuyer@1 760 e.extratext_byhand = true
farmbuyer@1 761 value = value and value:match("^(x%d+)")
farmbuyer@1 762 if value then e.count = value end
farmbuyer@1 763 _b:Release()
farmbuyer@1 764 return _d:GetUserData("eoiST"):OuroLoot_Refresh(row_index)
farmbuyer@1 765 end)
farmbuyer@1 766 box:SetCallback("OnRelease", function(_b)
farmbuyer@1 767 _b.editbox:ClearFocus()
farmbuyer@1 768 _b.editbox:SetScript("OnShow", _b:GetUserData("old show"))
farmbuyer@1 769 _b.editbox:SetScript("OnEscapePressed", _b:GetUserData("old escape"))
farmbuyer@1 770 setstatus("")
farmbuyer@1 771 end)
farmbuyer@1 772 box.frame:SetAllPoints(cell_frame)
farmbuyer@1 773 box.frame:SetParent(cell_frame)
farmbuyer@1 774 box.frame:SetFrameLevel(cell_frame:GetFrameLevel()+1)
farmbuyer@1 775 box.frame:Show()
farmbuyer@1 776 setstatus("Press Enter or click Okay to accept changes, or press Escape to cancel them.")
farmbuyer@1 777 end
farmbuyer@1 778
farmbuyer@1 779 local function eoi_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
farmbuyer@1 780 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
farmbuyer@1 781 local e = data[realrow]
farmbuyer@1 782 local kind = e.kind
farmbuyer@1 783
farmbuyer@1 784 --_d:SetUserData("DD loot index", realrow)
farmbuyer@1 785 if kind == 'loot' and column == 3 and button == "LeftButton" then
farmbuyer@1 786 eoi_editcell (realrow, cellFrame)
farmbuyer@1 787 end
farmbuyer@1 788
farmbuyer@1 789 return true -- do not do anything further
farmbuyer@1 790 end
farmbuyer@1 791
farmbuyer@1 792 -- Used for EOI column 2 and Hist column 1. Both are player name columns.
farmbuyer@6 793 local function eoi_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
farmbuyer@1 794 if not fShow then
farmbuyer@1 795 cellFrame.text:SetText("")
farmbuyer@1 796 if cellFrame.icontexture then
farmbuyer@1 797 cellFrame.icontexture:Hide()
farmbuyer@1 798 end
farmbuyer@1 799 return
farmbuyer@1 800 end
farmbuyer@1 801
farmbuyer@1 802 local e = data[realrow]
farmbuyer@1 803 local cell = e.cols[column]
farmbuyer@1 804
farmbuyer@1 805 cellFrame.text:SetText(cell.value)
farmbuyer@1 806 cellFrame.text:SetTextColor(1,1,1,1)
farmbuyer@1 807
farmbuyer@1 808 if e.person_class then
farmbuyer@1 809 local icon
farmbuyer@1 810 if cellFrame.icontexture then
farmbuyer@1 811 icon = cellFrame.icontexture
farmbuyer@1 812 else
farmbuyer@1 813 icon = cellFrame:CreateTexture(nil,"BACKGROUND")
farmbuyer@1 814 icon:SetPoint("LEFT", cellFrame, "LEFT")
farmbuyer@1 815 icon:SetHeight(eoi_st_rowheight-4)
farmbuyer@1 816 icon:SetWidth(eoi_st_rowheight-4)
farmbuyer@1 817 icon:SetTexture("Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes")
farmbuyer@1 818 cellFrame.icontexture = icon
farmbuyer@1 819 end
farmbuyer@1 820 icon:SetTexCoord(unpack(CLASS_ICON_TCOORDS[e.person_class]))
farmbuyer@1 821 icon:Show()
farmbuyer@1 822 cellFrame.text:SetPoint("LEFT", icon, "RIGHT", 1, 0)
farmbuyer@1 823 else
farmbuyer@1 824 if cellFrame.icontexture then
farmbuyer@1 825 cellFrame.icontexture:Hide()
farmbuyer@1 826 cellFrame.text:SetPoint("LEFT", cellFrame, "LEFT")
farmbuyer@1 827 end
farmbuyer@1 828 end
farmbuyer@1 829
farmbuyer@1 830 --if e.kind ~= 'loot' then
farmbuyer@1 831 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[e.reason or e.kind or ""])
farmbuyer@1 832 --else
farmbuyer@1 833 -- table:SetHighLightColor (rowFrame, table:GetDefaultHighlightBlank())
farmbuyer@1 834 --end
farmbuyer@1 835 end
farmbuyer@1 836
farmbuyer@1 837 local eoi_st_cols = {
farmbuyer@1 838 { -- col 1
farmbuyer@1 839 name = "Item",
farmbuyer@1 840 width = 250,
farmbuyer@1 841 },
farmbuyer@1 842 { -- col 2
farmbuyer@1 843 name = "Player",
farmbuyer@1 844 width = 130,
farmbuyer@1 845 DoCellUpdate = eoi_st_col2_DoCellUpdate,
farmbuyer@1 846 },
farmbuyer@1 847 { -- col 3
farmbuyer@1 848 name = "Notes",
farmbuyer@3 849 width = 250,
farmbuyer@1 850 },
farmbuyer@1 851 }
farmbuyer@1 852
farmbuyer@6 853 local player_filter_all
farmbuyer@6 854 local player_filter_by_name = function (st, e)
farmbuyer@1 855 if e.kind ~= 'loot' then return true end
farmbuyer@1 856 return e.person == _d:GetUserData("player filter name")
farmbuyer@1 857 end
farmbuyer@1 858
farmbuyer@1 859 -- Tab 1: Events Of Interest (implementation)
farmbuyer@1 860 tabs_OnGroupSelected["eoi"] = function(ocontainer,specials)
farmbuyer@1 861 if (not addon.rebroadcast) and (not addon.enabled) and (#g_loot < 1) then
farmbuyer@40 862 addon.dprint('flow', "Nothing to show in first tab, skipping creation")
farmbuyer@40 863 return
farmbuyer@1 864 end
farmbuyer@1 865
farmbuyer@1 866 -- The first time this function is called, we set up a persistent ST
farmbuyer@1 867 -- object and store it. Any other delayed setup work is done, and then
farmbuyer@1 868 -- this function replaces itself with a smaller, sleeker, sexier one.
farmbuyer@1 869 -- This function will later be garbage collected.
farmbuyer@1 870 local ST = LibStub("ScrollingTable"):CreateST(eoi_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
farmbuyer@1 871 _d:SetUserData("eoiST",ST)
farmbuyer@1 872 if addon.author_debug then
farmbuyer@1 873 _G.OLST = ST
farmbuyer@1 874 end
farmbuyer@1 875
farmbuyer@1 876 if not eoi_st_otherrow_bgcolortable_default then
farmbuyer@1 877 eoi_st_otherrow_bgcolortable_default = ST:GetDefaultHighlightBlank()
farmbuyer@1 878 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
farmbuyer@1 879 return eoi_st_otherrow_bgcolortable_default
farmbuyer@1 880 end})
farmbuyer@1 881 end
farmbuyer@1 882
farmbuyer@1 883 -- Calling SetData breaks (trying to call Refresh) if g_loot hasn't gone
farmbuyer@1 884 -- through this loop.
farmbuyer@1 885 addon:_fill_out_eoi_data(1)
farmbuyer@1 886 -- safety check begin
farmbuyer@1 887 for i,e in ipairs(g_loot) do
farmbuyer@1 888 if type(e.cols) ~= 'table' then
farmbuyer@1 889 addon:Print("ARGH, index",i,"bad in eoi_OGS, type",type(e.cols),
farmbuyer@1 890 "entry kind", e.kind, "data", e.itemname or e.bosskill or e.startday.text,
farmbuyer@1 891 "-- please take a screenshot and send to Farmbuyer.")
farmbuyer@1 892 tabledump(e)
farmbuyer@1 893 end
farmbuyer@1 894 end
farmbuyer@1 895 -- safety check end
farmbuyer@1 896 ST:SetData(g_loot)
farmbuyer@1 897 ST:RegisterEvents{
farmbuyer@1 898 OnEnter = eoi_st_OnEnter,
farmbuyer@1 899 OnLeave = eoi_st_OnLeave,
farmbuyer@1 900 OnClick = eoi_st_OnClick,
farmbuyer@1 901 OnDoubleClick = eoi_st_OnDoubleClick,
farmbuyer@1 902 }
farmbuyer@1 903
farmbuyer@1 904 -- We want a single "update and redraw" function for the ST. Also, the
farmbuyer@1 905 -- given refresh function is badly named and does nothing; the actual
farmbuyer@1 906 -- function is SortData (also badly named when no sorting is being done),
farmbuyer@1 907 -- which unconditionally calls the *hooked* Refresh.
farmbuyer@1 908 local oldrefresh = ST.Refresh
farmbuyer@1 909 ST.Refresh = function (self, opt_index)
farmbuyer@1 910 addon:_fill_out_eoi_data(opt_index)
farmbuyer@1 911 return oldrefresh(self)
farmbuyer@1 912 end
farmbuyer@1 913 ST.OuroLoot_Refresh = function (self, opt_index)
farmbuyer@1 914 addon:_fill_out_eoi_data(opt_index)
farmbuyer@1 915 -- safety check begin
farmbuyer@1 916 for i,e in ipairs(g_loot) do
farmbuyer@1 917 if type(e.cols) ~= 'table' then
farmbuyer@4 918 addon:Print("ARGH, index",i,"bad in eoi refresh, refreshed at", opt_index, "type",type(e.cols),
farmbuyer@1 919 "entry kind", e.kind, "data", e.itemname or e.bosskill or e.startday.text,
farmbuyer@1 920 "-- please take a screenshot and send to Farmbuyer.")
farmbuyer@1 921 tabledump(e)
farmbuyer@1 922 end
farmbuyer@1 923 end
farmbuyer@1 924 -- safety check end
farmbuyer@1 925 self:SortData() -- calls hooked refresh
farmbuyer@1 926 end
farmbuyer@1 927
farmbuyer@1 928 -- No need to keep creating function closures that all just "return true",
farmbuyer@1 929 -- instead we grab the one made inside lib-st. There's no "get filter" API
farmbuyer@1 930 -- so we just reach inside.
farmbuyer@6 931 player_filter_all = ST.Filter
farmbuyer@1 932
farmbuyer@1 933 -- Now set up the future drawing function...
farmbuyer@1 934 tabs_OnGroupSelected["eoi"] = function(container,specials)
farmbuyer@1 935 local st_widget = GUI:Create("lib-st")
farmbuyer@1 936 local st = _d:GetUserData("eoiST")
farmbuyer@1 937
farmbuyer@1 938 -- This is actually required each time
farmbuyer@6 939 _d:SetUserData ("player filter clear", player_filter_all)
farmbuyer@6 940 _d:SetUserData ("player filter by name", player_filter_by_name)
farmbuyer@1 941
farmbuyer@1 942 st:OuroLoot_Refresh()
farmbuyer@1 943 st_widget:WrapST(st)
farmbuyer@3 944 st_widget.head_offset = 15
farmbuyer@3 945 st_widget.tail_offset = 0
farmbuyer@1 946
farmbuyer@1 947 if OuroLootSV_opts.scroll_to_bottom then
farmbuyer@1 948 local scrollbar = _G[st.scrollframe:GetName().."ScrollBar"]
farmbuyer@1 949 if scrollbar then
farmbuyer@1 950 local _,max = scrollbar:GetMinMaxValues()
farmbuyer@1 951 scrollbar:SetValue(max) -- also calls hooked Refresh
farmbuyer@1 952 end
farmbuyer@1 953 end
farmbuyer@1 954
farmbuyer@1 955 container:SetLayout("Fill")
farmbuyer@1 956 container:AddChild(st_widget)
farmbuyer@1 957
farmbuyer@1 958 local b = mkbutton('eoi_filter_reset', "Reset Player Filter",
farmbuyer@1 959 [[Return to showing complete loot information.]])
farmbuyer@1 960 b:SetFullWidth(true)
farmbuyer@1 961 b:SetCallback("OnClick", function (_b)
farmbuyer@1 962 local st = _d:GetUserData("eoiST")
farmbuyer@6 963 st:SetFilter(player_filter_all)
farmbuyer@1 964 _b:SetDisabled(true)
farmbuyer@1 965 end)
farmbuyer@6 966 b:SetDisabled(st.Filter == player_filter_all)
farmbuyer@1 967 specials:AddChild(b)
farmbuyer@1 968
farmbuyer@1 969 local people = { "<nobody>" }
farmbuyer@1 970 for i=1,GetNumRaidMembers() do
farmbuyer@1 971 tinsert(people,(GetRaidRosterInfo(i)))
farmbuyer@1 972 end
farmbuyer@1 973 table.sort(people)
farmbuyer@1 974 local initial
farmbuyer@1 975 for i,n in ipairs(people) do
farmbuyer@1 976 if n == addon.sharder then initial = i end
farmbuyer@1 977 end
farmbuyer@1 978 b = mkbutton("Dropdown", nil, "",
farmbuyer@1 979 [[If set, items received by this person will be automatically marked as disenchanted.]])
farmbuyer@1 980 b:SetFullWidth(true)
farmbuyer@1 981 b:SetLabel("Auto-mark as shard:")
farmbuyer@1 982 b:SetList(people)
farmbuyer@1 983 b:SetValue(initial or 1)
farmbuyer@1 984 b:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@1 985 addon.sharder = (choice ~= 1) and people[choice] or nil
farmbuyer@1 986 end)
farmbuyer@1 987 specials:AddChild(b)
farmbuyer@1 988
farmbuyer@1 989 local b = mkbutton('eoi_bcast_req', "Request B'casters",
farmbuyer@1 990 [[Sends out a request for others to enable loot rebroadcasting if they have not already done so.]])
farmbuyer@1 991 b:SetFullWidth(true)
farmbuyer@1 992 b:SetCallback("OnClick", function ()
farmbuyer@1 993 addon:Print("Sending request!")
farmbuyer@1 994 addon.requesting = true
farmbuyer@1 995 addon:broadcast('bcast_req')
farmbuyer@1 996 end)
farmbuyer@1 997 b:SetDisabled(not addon.enabled)
farmbuyer@1 998 specials:AddChild(b)
farmbuyer@1 999 end
farmbuyer@1 1000 -- ...and call it.
farmbuyer@1 1001 return tabs_OnGroupSelected["eoi"](ocontainer,specials)
farmbuyer@1 1002 end
farmbuyer@1 1003
farmbuyer@37 1004
farmbuyer@1 1005 -- Tab 2/3 (generated text)
farmbuyer@1 1006 function tabs_generated_text_OGS (container, specials, text_kind)
farmbuyer@1 1007 container:SetLayout("Fill")
farmbuyer@1 1008 local box = GUI:Create("MultiLineEditBox")
farmbuyer@1 1009 box:SetFullWidth(true)
farmbuyer@1 1010 box:SetFullHeight(true)
farmbuyer@1 1011 box:SetLabel("Pressing the Escape key while typing will return keystroke control to the usual chat window.")
farmbuyer@1 1012 box:DisableButton(true)
farmbuyer@1 1013 addon:_fill_out_eoi_data(1)
farmbuyer@1 1014
farmbuyer@1 1015 -- Update the savedvar copy of the text before presenting it for editing,
farmbuyer@1 1016 -- then save it again when editing finishes. This way if the user goes
farmbuyer@1 1017 -- offline while editing, at least the unedited version is saved instead
farmbuyer@1 1018 -- of all the new text being lost entirely. (Yes, it's happened.)
farmbuyer@1 1019 --
farmbuyer@1 1020 -- No good local-ish place to store the cursor position that will also
farmbuyer@1 1021 -- survive the entire display being released. Abuse the generated text
farmbuyer@1 1022 -- cache for this purpose.
farmbuyer@1 1023 local pos = text_kind.."_pos"
farmbuyer@1 1024 if _generate_text(text_kind) then
farmbuyer@1 1025 g_loot[text_kind] = g_loot[text_kind] .. g_generated[text_kind]
farmbuyer@1 1026 g_generated[text_kind] = nil
farmbuyer@1 1027 end
farmbuyer@1 1028 box:SetText(g_loot[text_kind])
farmbuyer@1 1029 box.editBox:SetCursorPosition(g_generated[pos] or 0)
farmbuyer@1 1030 box.editBox:SetScript("OnShow", box.editBox.SetFocus)
farmbuyer@1 1031 box:SetCallback("OnRelease", function(_box)
farmbuyer@1 1032 box.editBox:ClearFocus()
farmbuyer@1 1033 g_loot[text_kind] = _box:GetText()
farmbuyer@1 1034 g_generated[pos] = _box.editBox:GetCursorPosition()
farmbuyer@1 1035 end)
farmbuyer@1 1036 container:AddChild(box)
farmbuyer@1 1037
farmbuyer@1 1038 local w = mkbutton("Regenerate",
farmbuyer@1 1039 [[+DISCARD> all text in this tab, and regenerate it from the current loot information.]])
farmbuyer@1 1040 w:SetFullWidth(true)
farmbuyer@1 1041 w:SetDisabled ((#g_loot == 0) and (box:GetText() == ""))
farmbuyer@1 1042 w:SetCallback("OnClick", function(_w)
farmbuyer@1 1043 box:SetText("")
farmbuyer@1 1044 g_loot[text_kind] = ""
farmbuyer@1 1045 g_loot.printed[text_kind] = 0
farmbuyer@1 1046 g_generated.last_instance = nil
farmbuyer@1 1047 g_generated[pos] = nil
farmbuyer@1 1048 addon:Print("'%s' has been regenerated.", _tabtexts[text_kind].title)
farmbuyer@1 1049 return addon:redisplay()
farmbuyer@1 1050 --return tabs_OnGroupSelected_func(container,"OnGroupSelected",text_kind)
farmbuyer@1 1051 end)
farmbuyer@1 1052 specials:AddChild(w)
farmbuyer@1 1053 _populate_text_specials (box, specials, mkbutton, text_kind)
farmbuyer@1 1054 end
farmbuyer@1 1055
farmbuyer@37 1056
farmbuyer@1 1057 -- Tab 4: History
farmbuyer@1 1058 -- Much of the implementation here follows a similar desgin for the first
farmbuyer@4 1059 -- tab's handling of ST objects. We will even reuse its controlling tables
farmbuyer@4 1060 -- when feasible.
farmbuyer@37 1061 local histST, hist_dropdownfuncs
farmbuyer@1 1062
farmbuyer@37 1063 hist_dropdownfuncs = dropdownfuncs{
farmbuyer@37 1064 ["Delete this loot history"] = function(rowi)
farmbuyer@37 1065 --local gone = tremove(g_loot,rowi)
farmbuyer@37 1066 --addon:Print("Removed %s.",
farmbuyer@37 1067 --gone.itemlink or gone.bosskill or gone.startday.text)
farmbuyer@37 1068 end,
farmbuyer@37 1069 }
farmbuyer@37 1070 local hist_dropdown = gen_easymenu_table(
farmbuyer@37 1071 {{
farmbuyer@37 1072 -- this is the dropdown title, text filled in on the fly
farmbuyer@37 1073 notClickable = true,
farmbuyer@37 1074 notCheckable = true,
farmbuyer@37 1075 }},
farmbuyer@37 1076 {
farmbuyer@37 1077 "Delete this loot history|Permanent, no going back!",
farmbuyer@37 1078 --"Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day",
farmbuyer@37 1079 "--",
farmbuyer@37 1080 CLOSE
farmbuyer@37 1081 }, hist_dropdownfuncs)
farmbuyer@6 1082
farmbuyer@37 1083 local hist_st_cols = {
farmbuyer@37 1084 { -- col 1
farmbuyer@37 1085 name = "Player",
farmbuyer@37 1086 width = 130,
farmbuyer@37 1087 DoCellUpdate = eoi_st_col2_DoCellUpdate,
farmbuyer@37 1088 },
farmbuyer@37 1089 { -- col 2
farmbuyer@37 1090 name = "Most Recent Loot",
farmbuyer@37 1091 width = 250,
farmbuyer@37 1092 DoCellUpdate = hist_st_col2_DoCellUpdate,
farmbuyer@37 1093 },
farmbuyer@37 1094 { -- col 3
farmbuyer@37 1095 name = "When",
farmbuyer@37 1096 width = 250,
farmbuyer@37 1097 DoCellUpdate = hist_st_col3_DoCellUpdate,
farmbuyer@37 1098 defaultsort = "asc",
farmbuyer@37 1099 sort = "asc",
farmbuyer@37 1100 sortnext = 1,
farmbuyer@37 1101 },
farmbuyer@37 1102 }
farmbuyer@37 1103
farmbuyer@37 1104 local hist_normal_status =
farmbuyer@37 1105 [[Click on a row to view all history for that player only. (Click column headers to re-sort.)]]
farmbuyer@37 1106 local hist_name_status =
farmbuyer@37 1107 [[Right-click on any row to return to normal history display.]]
farmbuyer@37 1108
farmbuyer@37 1109 local history_filter_by_recent = function (st, e)
farmbuyer@37 1110 if e.kind ~= 'history' then return true end
farmbuyer@37 1111 return e.cols[2].OLi == 1
farmbuyer@37 1112 end
farmbuyer@37 1113
farmbuyer@37 1114 local history_filter_who
farmbuyer@37 1115 local history_filter_by_name = function (st, e)
farmbuyer@37 1116 if e.kind ~= 'history' then return true end
farmbuyer@37 1117 return e.OLwho == history_filter_who
farmbuyer@37 1118 end
farmbuyer@37 1119
farmbuyer@37 1120 -- Loot column
farmbuyer@37 1121 local function hist_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
farmbuyer@37 1122 print("col2 DCU", realrow)
farmbuyer@37 1123 end
farmbuyer@37 1124
farmbuyer@37 1125 -- Formatted timestamp column
farmbuyer@37 1126 local function hist_st_col3_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
farmbuyer@37 1127 print("col3 DCU", realrow)
farmbuyer@37 1128 if not fShow then
farmbuyer@37 1129 cellFrame.text:SetText("")
farmbuyer@37 1130 return
farmbuyer@6 1131 end
farmbuyer@6 1132
farmbuyer@37 1133 local d = data[realrow]
farmbuyer@37 1134 local cell = d.cols[column]
farmbuyer@37 1135
farmbuyer@37 1136 cellFrame.text:SetText(cell.value)
farmbuyer@37 1137 cellFrame.text:SetTextColor(1,1,1,1)
farmbuyer@37 1138
farmbuyer@37 1139 --if d.kind ~= 'loot' then
farmbuyer@37 1140 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[d.kind])
farmbuyer@37 1141 --else
farmbuyer@37 1142 -- table:SetHighLightColor (rowFrame, table:GetDefaultHighlightBlank())
farmbuyer@37 1143 --end
farmbuyer@37 1144 end
farmbuyer@37 1145
farmbuyer@37 1146 local function hist_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
farmbuyer@37 1147 if (row == nil) or (realrow == nil) then return false end -- click column header, do default resorting
farmbuyer@37 1148 local h = data[realrow]
farmbuyer@37 1149 local kind = h.kind
farmbuyer@37 1150
farmbuyer@37 1151 if history_filter_who and button == "RightButton" then -- now filtering and wanting not to
farmbuyer@37 1152 history_filter_who = nil
farmbuyer@37 1153 stable:SetFilter(history_filter_by_recent)
farmbuyer@37 1154 setstatus(hist_normal_status)
farmbuyer@37 1155 elseif (not history_filter_who) and button == "LeftButton" then -- not filtering and wanting to
farmbuyer@37 1156 history_filter_who = h.OLwho
farmbuyer@37 1157 stable:SetFilter(history_filter_by_name)
farmbuyer@37 1158 setstatus(hist_name_status)
farmbuyer@6 1159 end
farmbuyer@6 1160
farmbuyer@37 1161 return true -- do not do anything further
farmbuyer@37 1162 end
farmbuyer@37 1163
farmbuyer@37 1164 --[[
farmbuyer@37 1165 local function hist_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
farmbuyer@37 1166 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
farmbuyer@37 1167 local h = data[realrow]
farmbuyer@37 1168 local kind = h.kind
farmbuyer@37 1169
farmbuyer@37 1170 return true -- do not do anything further
farmbuyer@37 1171 end]]
farmbuyer@37 1172
farmbuyer@37 1173 -- Tab 4: History (implementation)
farmbuyer@37 1174 tabs_OnGroupSelected["hist"] = function(container,specials)
farmbuyer@37 1175 histST = LibStub("ScrollingTable"):CreateST(hist_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
farmbuyer@37 1176 _d:SetUserData("histST",histST)
farmbuyer@37 1177 if addon.author_debug then
farmbuyer@37 1178 _G.OLHST = histST
farmbuyer@1 1179 end
farmbuyer@1 1180
farmbuyer@37 1181 if not eoi_st_otherrow_bgcolortable_default then
farmbuyer@37 1182 eoi_st_otherrow_bgcolortable_default = histST:GetDefaultHighlightBlank()
farmbuyer@37 1183 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
farmbuyer@37 1184 return eoi_st_otherrow_bgcolortable_default
farmbuyer@37 1185 end})
farmbuyer@1 1186 end
farmbuyer@1 1187
farmbuyer@37 1188 addon:_build_history_names()
farmbuyer@37 1189 addon:_fill_out_hist_data(1)
farmbuyer@37 1190 histST:SetData(addon.history.st)
farmbuyer@37 1191 histST:RegisterEvents{
farmbuyer@37 1192 OnEnter = eoi_st_OnEnter,
farmbuyer@37 1193 OnLeave = eoi_st_OnLeave,
farmbuyer@37 1194 OnClick = hist_st_OnClick,
farmbuyer@37 1195 --OnDoubleClick = hist_st_OnDoubleClick,
farmbuyer@37 1196 }
farmbuyer@37 1197 local oldrefresh = histST.Refresh
farmbuyer@37 1198 histST.Refresh = function (self, opt_index)
farmbuyer@37 1199 addon:_fill_out_hist_data(opt_index)
farmbuyer@37 1200 return oldrefresh(self)
farmbuyer@37 1201 end
farmbuyer@37 1202 histST.OuroLoot_Refresh = function (self, opt_index)
farmbuyer@37 1203 addon:_fill_out_hist_data(opt_index)
farmbuyer@37 1204 self:SortData() -- calls hooked refresh
farmbuyer@6 1205 end
farmbuyer@6 1206
farmbuyer@37 1207 histST:SetFilter(history_filter_by_recent)
farmbuyer@6 1208
farmbuyer@37 1209 -- Zaps history for the given realm, or the current (current-playing
farmbuyer@37 1210 -- realm, not currently-displayed realm) one if not specified.
farmbuyer@37 1211 local function reset_current_realm (opt_realmname)
farmbuyer@37 1212 local r = assert(opt_realmname or GetRealmName())
farmbuyer@37 1213 -- new .history table:
farmbuyer@37 1214 addon.history_all[r] = addon:_prep_new_history_category (nil, r)
farmbuyer@37 1215 addon.history = addon.history_all[r]
farmbuyer@37 1216 addon.hist_clean = nil
farmbuyer@37 1217 -- new .history.st table:
farmbuyer@37 1218 histST:OuroLoot_Refresh()
farmbuyer@37 1219 histST:SetData(addon.history.st)
farmbuyer@37 1220 end
farmbuyer@6 1221
farmbuyer@1 1222 tabs_OnGroupSelected["hist"] = function(container,specials)
farmbuyer@37 1223 local st_widget = GUI:Create("lib-st")
farmbuyer@37 1224 -- don't need _d:GetUserData("histST") here, as it's already a local
farmbuyer@37 1225 histST:OuroLoot_Refresh()
farmbuyer@37 1226 st_widget:WrapST(histST)
farmbuyer@37 1227 st_widget.head_offset = 15
farmbuyer@37 1228 st_widget.tail_offset = 0
farmbuyer@37 1229 container:SetLayout("Fill")
farmbuyer@37 1230 container:AddChild(st_widget)
farmbuyer@37 1231 setstatus(hist_normal_status)
farmbuyer@1 1232
farmbuyer@37 1233 local b
farmbuyer@37 1234 do
farmbuyer@37 1235 local realms,current = {},1
farmbuyer@37 1236 for realmname,histtable in pairs(addon.history_all) do
farmbuyer@37 1237 if type(histtable) == 'table' then
farmbuyer@37 1238 tinsert(realms,realmname)
farmbuyer@37 1239 if addon.history == histtable then current = #realms end
farmbuyer@4 1240 end
farmbuyer@4 1241 end
farmbuyer@37 1242 b = mkbutton("Dropdown", nil, "", [[Which realm to display]])
farmbuyer@1 1243 b:SetFullWidth(true)
farmbuyer@37 1244 b:SetLabel() -- required even when empty, see ace3 ticket #234
farmbuyer@37 1245 b:SetList(realms)
farmbuyer@37 1246 b:SetValue(current)
farmbuyer@37 1247 b:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@37 1248 local r = realms[choice]
farmbuyer@37 1249 addon.history = addon:_prep_new_history_category (addon.history_all[r], r)
farmbuyer@37 1250 addon.hist_clean = nil
farmbuyer@6 1251 histST:OuroLoot_Refresh()
farmbuyer@6 1252 histST:SetData(addon.history.st)
farmbuyer@37 1253 -- Reset filters to normal
farmbuyer@37 1254 history_filter_who = nil
farmbuyer@37 1255 histST:SetFilter(history_filter_by_recent)
farmbuyer@37 1256 setstatus(hist_normal_status)
farmbuyer@1 1257 return addon:redisplay()
farmbuyer@1 1258 end)
farmbuyer@1 1259 specials:AddChild(b)
farmbuyer@37 1260 end
farmbuyer@1 1261
farmbuyer@37 1262 --[[ b = GUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]]
farmbuyer@4 1263
farmbuyer@37 1264 b = mkbutton("Regenerate",
farmbuyer@37 1265 [[Erases all history entries from the displayed realm, and regenerates it from current loot information.]])
farmbuyer@37 1266 b:SetFullWidth(true)
farmbuyer@37 1267 b:SetDisabled (#addon.history == 0)
farmbuyer@37 1268 b:SetCallback("OnClick", function(_b)
farmbuyer@37 1269 local dialog = StaticPopup_Show("OUROL_HIST_REGEN", addon.history.realm)
farmbuyer@37 1270 dialog.data = addon
farmbuyer@37 1271 dialog.data2 = function(_addon)
farmbuyer@37 1272 _addon:rewrite_history (_addon.history.realm)
farmbuyer@37 1273 histST:OuroLoot_Refresh()
farmbuyer@37 1274 histST:SetData(_addon.history.st)
farmbuyer@37 1275 end
farmbuyer@37 1276 end)
farmbuyer@37 1277 specials:AddChild(b)
farmbuyer@1 1278
farmbuyer@37 1279 b = mkbutton('hist_clear', "Clear Realm History",
farmbuyer@37 1280 [[|cffff1010Erases absolutely all> history entries from the displayed realm.]])
farmbuyer@37 1281 b:SetFullWidth(true)
farmbuyer@37 1282 b:SetCallback("OnClick", function (_b)
farmbuyer@37 1283 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", addon.history.realm)
farmbuyer@37 1284 dialog.data = addon
farmbuyer@37 1285 dialog.data2 = function(_addon)
farmbuyer@37 1286 reset_current_realm(_addon.history.realm)
farmbuyer@37 1287 end
farmbuyer@37 1288 end)
farmbuyer@37 1289 specials:AddChild(b)
farmbuyer@37 1290
farmbuyer@37 1291 b = mkbutton('hist_clear_all', "Clear All History",
farmbuyer@37 1292 [[|cffff1010Erases absolutely all> history entries from ALL realms.]])
farmbuyer@37 1293 b:SetFullWidth(true)
farmbuyer@37 1294 b:SetCallback("OnClick", function (_b)
farmbuyer@37 1295 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", "ALL realms")
farmbuyer@37 1296 dialog.data = addon
farmbuyer@37 1297 dialog.data2 = function(_addon)
farmbuyer@37 1298 _addon.history_all = {}
farmbuyer@37 1299 reset_current_realm()
farmbuyer@37 1300 end
farmbuyer@37 1301 end)
farmbuyer@37 1302 specials:AddChild(b)
farmbuyer@37 1303
farmbuyer@37 1304 b = mkbutton('hist_clear_old', "Clear Older",
farmbuyer@37 1305 [[Preserves only the latest loot entry for each player on the displayed realm, removing all earlier ones.]])
farmbuyer@37 1306 b:SetFullWidth(true)
farmbuyer@37 1307 b:SetCallback("OnClick", function (_b)
farmbuyer@37 1308 local dialog = StaticPopup_Show("OUROL_HIST_PREEN", addon.history.realm)
farmbuyer@37 1309 dialog.data = addon
farmbuyer@37 1310 dialog.data2 = function(_addon)
farmbuyer@37 1311 _addon:preen_history(_addon.history.realm)
farmbuyer@37 1312 _addon.hist_clean = nil
farmbuyer@37 1313 histST:OuroLoot_Refresh()
farmbuyer@37 1314 end
farmbuyer@37 1315 end)
farmbuyer@37 1316 specials:AddChild(b)
farmbuyer@1 1317 end
farmbuyer@37 1318 return tabs_OnGroupSelected["hist"](container,specials)
farmbuyer@1 1319 end
farmbuyer@1 1320
farmbuyer@37 1321
farmbuyer@6 1322 -- Tab 5: Help (content in verbage.lua)
farmbuyer@1 1323 do
farmbuyer@1 1324 local tabs_help_OnGroupSelected_func = function (treeg,event,category)
farmbuyer@1 1325 treeg:ReleaseChildren()
farmbuyer@1 1326 local txt = GUI:Create("Label")
farmbuyer@1 1327 txt:SetFullWidth(true)
farmbuyer@1 1328 txt:SetFontObject(GameFontNormal)--Highlight)
farmbuyer@1 1329 txt:SetText(addon.helptext[category])
farmbuyer@1 1330 local sf = GUI:Create("ScrollFrame")
farmbuyer@1 1331 local sfstat = _d:GetUserData("help tab scroll status") or {}
farmbuyer@1 1332 sf:SetStatusTable(sfstat)
farmbuyer@1 1333 _d:SetUserData("help tab scroll status",sfstat)
farmbuyer@1 1334 sf:SetLayout("Fill")
farmbuyer@1 1335 -- This forces the scrolling area to be bigger than the visible area; else
farmbuyer@1 1336 -- some of the text gets cut off.
farmbuyer@1 1337 sf.content:SetHeight(700)
farmbuyer@1 1338 sf:AddChild(txt)
farmbuyer@1 1339 treeg:AddChild(sf)
farmbuyer@1 1340 if treeg:GetUserData("help restore scroll") then
farmbuyer@1 1341 sfstat = sfstat.scrollvalue
farmbuyer@1 1342 if sfstat then sf:SetScroll(sfstat) end
farmbuyer@1 1343 treeg:SetUserData("help restore scroll", false)
farmbuyer@1 1344 else
farmbuyer@1 1345 sf:SetScroll(0)
farmbuyer@1 1346 end
farmbuyer@1 1347 end
farmbuyer@1 1348 tabs_OnGroupSelected["help"] = function(container,specials)
farmbuyer@1 1349 container:SetLayout("Fill")
farmbuyer@1 1350 local left = GUI:Create("TreeGroup")
farmbuyer@1 1351 local leftstat = _d:GetUserData("help tab select status")
farmbuyer@1 1352 or {treewidth=145}
farmbuyer@1 1353 left:SetStatusTable(leftstat)
farmbuyer@1 1354 _d:SetUserData("help tab select status",leftstat)
farmbuyer@1 1355 left:SetLayout("Fill")
farmbuyer@1 1356 left:SetFullWidth(true)
farmbuyer@1 1357 left:SetFullHeight(true)
farmbuyer@1 1358 left:EnableButtonTooltips(false)
farmbuyer@1 1359 left:SetTree(addon.helptree)
farmbuyer@1 1360 left:SetCallback("OnGroupSelected", tabs_help_OnGroupSelected_func)
farmbuyer@1 1361 container:AddChild(left)
farmbuyer@1 1362 leftstat = leftstat.selected
farmbuyer@1 1363 if leftstat then
farmbuyer@1 1364 left:SetUserData("help restore scroll", true)
farmbuyer@1 1365 left:SelectByValue(leftstat)
farmbuyer@1 1366 else
farmbuyer@1 1367 left:SelectByValue("basic")
farmbuyer@1 1368 end
farmbuyer@1 1369 end
farmbuyer@1 1370 end
farmbuyer@1 1371
farmbuyer@37 1372
farmbuyer@1 1373 -- Tab 6: Options / Advanced
farmbuyer@1 1374 do
farmbuyer@1 1375 local function mkoption (opt, label, width, desc, opt_func)
farmbuyer@1 1376 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc)
farmbuyer@1 1377 w:SetRelativeWidth(width)
farmbuyer@1 1378 w:SetType("checkbox")
farmbuyer@1 1379 w:SetLabel(label)
farmbuyer@1 1380 if opt then
farmbuyer@1 1381 w:SetValue(OuroLootSV_opts[opt])
farmbuyer@1 1382 w:SetCallback("OnValueChanged", opt_func or (function(_w,event,value)
farmbuyer@1 1383 OuroLootSV_opts[opt] = value
farmbuyer@1 1384 end))
farmbuyer@1 1385 end
farmbuyer@1 1386 return w
farmbuyer@1 1387 end
farmbuyer@1 1388
farmbuyer@1 1389 local function adv_careful_OnTextChanged (ebox,event,value)
farmbuyer@1 1390 -- The EditBox widget's code will call an internal ShowButton routine
farmbuyer@1 1391 -- after this callback returns. ShowButton will test for this flag:
farmbuyer@1 1392 ebox:DisableButton (value == "")
farmbuyer@1 1393 end
farmbuyer@1 1394
farmbuyer@1 1395 -- Like the first tab, we use a pair of functions; first and repeating.
farmbuyer@1 1396 local function adv_real (container, specials)
farmbuyer@1 1397 local grp, w
farmbuyer@1 1398
farmbuyer@1 1399 grp = GUI:Create("InlineGroup")
farmbuyer@1 1400 grp:SetLayout("Flow")
farmbuyer@1 1401 grp:PauseLayout()
farmbuyer@1 1402 grp:SetFullWidth(true)
farmbuyer@1 1403 grp:SetTitle("Debugging/Testing Options [not saved across sessions]")
farmbuyer@1 1404
farmbuyer@1 1405 w = mkbutton("EditBox", 'comm_ident', addon.ident,
farmbuyer@1 1406 [[Disable the addon, change this field (click Okay or press Enter), then re-enable the addon.]])
farmbuyer@1 1407 w:SetRelativeWidth(0.2)
farmbuyer@1 1408 w:SetLabel("Addon channel ID")
farmbuyer@1 1409 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@1 1410 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@1 1411 -- if they set it to blank spaces, they're boned. oh well.
farmbuyer@1 1412 -- Re-enabling will take care of propogating this new value.
farmbuyer@1 1413 addon.ident = (value == "") and "OuroLoot2" or value
farmbuyer@1 1414 _w:SetText(addon.ident)
farmbuyer@1 1415 addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.")
farmbuyer@1 1416 end)
farmbuyer@1 1417 w:SetDisabled(addon.enabled or addon.rebroadcast)
farmbuyer@1 1418 grp:AddChild(w)
farmbuyer@1 1419
farmbuyer@40 1420 w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache TTL]])
farmbuyer@1 1421 w:SetRelativeWidth(0.05)
farmbuyer@1 1422 w:SetLabel("ttl")
farmbuyer@1 1423 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@1 1424 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@1 1425 value = tonumber(value) or addon.recent_messages.ttl
farmbuyer@1 1426 addon.recent_messages.ttl = value
farmbuyer@1 1427 _w:SetText(tostring(value))
farmbuyer@1 1428 end)
farmbuyer@1 1429 grp:AddChild(w)
farmbuyer@1 1430
farmbuyer@1 1431 w = mkbutton("load nsaab1548", [[Cursed Darkhound]])
farmbuyer@1 1432 w:SetRelativeWidth(0.25)
farmbuyer@1 1433 w:SetCallback("OnClick", function()
farmbuyer@1 1434 for i, v in ipairs(DBM.AddOns) do
farmbuyer@1 1435 if v.modId == "DBM-NotScaryAtAll" then
farmbuyer@1 1436 DBM:LoadMod(v)
farmbuyer@1 1437 break
farmbuyer@1 1438 end
farmbuyer@1 1439 end
farmbuyer@1 1440 local mod = DBM:GetModByName("NotScaryAtAll")
farmbuyer@1 1441 if mod then
farmbuyer@1 1442 mod:EnableMod()
farmbuyer@1 1443 addon:Print("Now tracking ID",mod.creatureId)
farmbuyer@1 1444 else addon:Print("Can do nothing; DBM testing mod wasn't loaded.") end
farmbuyer@1 1445 end)
farmbuyer@5 1446 w:SetDisabled(addon.bossmod_registered ~= 'DBM')
farmbuyer@1 1447 grp:AddChild(w)
farmbuyer@1 1448
farmbuyer@1 1449 w = mkbutton("GC", [[full GC cycle]])
farmbuyer@1 1450 w:SetRelativeWidth(0.1)
farmbuyer@1 1451 w:SetCallback("OnClick", function() collectgarbage() end)
farmbuyer@1 1452 grp:AddChild(w)
farmbuyer@1 1453
farmbuyer@20 1454 --[==[ this has been well and truly debugged by now
farmbuyer@1 1455 w = mkbutton("EditBox", nil, addon.loot_pattern:sub(17), [[]])
farmbuyer@1 1456 w:SetRelativeWidth(0.35)
farmbuyer@1 1457 w:SetLabel("CML pattern suffix")
farmbuyer@1 1458 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@1 1459 addon.loot_pattern = addon.loot_pattern:sub(1,16) .. value
farmbuyer@1 1460 end)
farmbuyer@20 1461 grp:AddChild(w) ]==]
farmbuyer@20 1462
farmbuyer@20 1463 w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(1) grp:AddChild(w)
farmbuyer@1 1464
farmbuyer@1 1465 local simple = GUI:Create("SimpleGroup")
farmbuyer@1 1466 simple:SetLayout("List")
farmbuyer@1 1467 simple:SetRelativeWidth(0.3)
farmbuyer@1 1468 w = GUI:Create("CheckBoxSmallLabel")
farmbuyer@1 1469 w:SetFullWidth(true)
farmbuyer@1 1470 w:SetType("checkbox")
farmbuyer@19 1471 w:SetLabel("debug toggle")
farmbuyer@1 1472 w:SetValue(addon.DEBUG_PRINT)
farmbuyer@19 1473 w:SetCallback("OnValueChanged", function(_w,event,value)
farmbuyer@19 1474 addon.DEBUG_PRINT = value
farmbuyer@19 1475 addon:redisplay()
farmbuyer@19 1476 end)
farmbuyer@19 1477 simple:AddChild(w)
farmbuyer@19 1478 w = GUI:Create("CheckBoxSmallLabel")
farmbuyer@19 1479 w:SetFullWidth(true)
farmbuyer@19 1480 w:SetType("checkbox")
farmbuyer@19 1481 w:SetLabel("GOP history mode")
farmbuyer@19 1482 w:SetValue(false)
farmbuyer@19 1483 w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end)
farmbuyer@1 1484 simple:AddChild(w)
farmbuyer@1 1485 w = mkbutton("Clear All & Reload",
farmbuyer@1 1486 [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and reloads the UI.]])
farmbuyer@1 1487 w:SetFullWidth(true)
farmbuyer@1 1488 w:SetCallback("OnClick", function()
farmbuyer@8 1489 addon:_clear_SVs() -- reloads
farmbuyer@1 1490 end)
farmbuyer@1 1491 simple:AddChild(w)
farmbuyer@1 1492 grp:AddChild(simple)
farmbuyer@1 1493
farmbuyer@1 1494 simple = GUI:Create("SimpleGroup")
farmbuyer@1 1495 simple:SetLayout("List")
farmbuyer@1 1496 simple:SetRelativeWidth(0.5)
farmbuyer@1 1497 for d,v in pairs(addon.debug) do
farmbuyer@1 1498 w = GUI:Create("CheckBoxSmallLabel")
farmbuyer@1 1499 w:SetFullWidth(true)
farmbuyer@1 1500 w:SetType("checkbox")
farmbuyer@1 1501 w:SetLabel(d)
farmbuyer@1 1502 if d == "notraid" then
farmbuyer@39 1503 w:SetDescription[[Tick this before enabling to make the addon work outside of raid groups]]
farmbuyer@19 1504 else
farmbuyer@40 1505 if d == "alsolog" then
farmbuyer@40 1506 w:SetDescription[[Also log all debug messages to disk. See print_log.lua in the addon folder for later viewing.]]
farmbuyer@40 1507 end
farmbuyer@19 1508 w:SetDisabled(not addon.DEBUG_PRINT)
farmbuyer@1 1509 end
farmbuyer@1 1510 w:SetValue(v)
farmbuyer@1 1511 w:SetCallback("OnValueChanged", function(_w,event,value) addon.debug[d] = value end)
farmbuyer@1 1512 simple:AddChild(w)
farmbuyer@1 1513 end
farmbuyer@1 1514 grp:AddChild(simple)
farmbuyer@10 1515
farmbuyer@10 1516 simple = GUI:Create("SimpleGroup")
farmbuyer@10 1517 simple:SetLayout("Flow")
farmbuyer@10 1518 simple:SetRelativeWidth(0.85)
farmbuyer@10 1519 w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]])
farmbuyer@10 1520 w:SetRelativeWidth(0.15)
farmbuyer@10 1521 w:SetCallback("OnClick", function()
farmbuyer@10 1522 PlaySoundFile[[Sound\Music\WorldEvents\HordeFirepole.mp3]]
farmbuyer@10 1523 end)
farmbuyer@10 1524 simple:AddChild(w)
farmbuyer@10 1525 w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]])
farmbuyer@10 1526 w:SetRelativeWidth(0.15)
farmbuyer@10 1527 w:SetCallback("OnClick", function()
farmbuyer@10 1528 PlaySoundFile[[Sound\Music\WorldEvents\AllianceFirepole.mp3]]
farmbuyer@10 1529 end)
farmbuyer@10 1530 simple:AddChild(w)
farmbuyer@10 1531 grp:AddChild(simple)
farmbuyer@10 1532
farmbuyer@1 1533 grp:ResumeLayout()
farmbuyer@1 1534 container:AddChild(grp)
farmbuyer@1 1535 GUI:ClearFocus()
farmbuyer@1 1536 end
farmbuyer@1 1537
farmbuyer@1 1538 -- Initial lower panel function
farmbuyer@1 1539 local function adv_lower (container, specials)
farmbuyer@1 1540 local speedbump = GUI:Create("InteractiveLabel")
farmbuyer@1 1541 speedbump:SetFullWidth(true)
farmbuyer@1 1542 speedbump:SetFontObject(GameFontHighlightLarge)
farmbuyer@1 1543 speedbump:SetImage("Interface\\DialogFrame\\DialogAlertIcon")
farmbuyer@1 1544 speedbump:SetImageSize(50,50)
farmbuyer@1 1545 speedbump:SetText("The debugging/testing settings on the rest of this panel can"
farmbuyer@1 1546 .." seriously bork up the addon if you make a mistake. If you're okay"
farmbuyer@1 1547 .." with the possibility of losing data, click this warning to load the panel.")
farmbuyer@1 1548 speedbump:SetCallback("OnClick", function (_sb)
farmbuyer@1 1549 adv_lower = adv_real
farmbuyer@1 1550 return addon:redisplay()
farmbuyer@1 1551 --return tabs_OnGroupSelected_func(container.parent,"OnGroupSelected","opt")
farmbuyer@1 1552 end)
farmbuyer@1 1553 container:AddChild(speedbump)
farmbuyer@1 1554 end
farmbuyer@1 1555
farmbuyer@1 1556 tabs_OnGroupSelected["opt"] = function(container,specials)
farmbuyer@1 1557 --container:SetLayout("List")
farmbuyer@1 1558 container:SetLayout("Fill")
farmbuyer@1 1559 local scroll, grp, w
farmbuyer@1 1560
farmbuyer@1 1561 scroll = GUI:Create("ScrollFrame")
farmbuyer@1 1562 scroll:SetLayout("Flow")
farmbuyer@1 1563
farmbuyer@1 1564 grp = GUI:Create("InlineGroup")
farmbuyer@1 1565 grp:SetLayout("Flow")
farmbuyer@1 1566 grp:SetFullWidth(true)
farmbuyer@1 1567 grp:SetTitle("User Options [these are saved across sessions]")
farmbuyer@1 1568
farmbuyer@10 1569 -- The relative width fields used to be done to take up less vertical space, but
farmbuyer@10 1570 -- that turned out to look messy. Now they're just a straight line for the most part.
farmbuyer@10 1571
farmbuyer@1 1572 -- reminder popup
farmbuyer@16 1573 w = mkoption ('popup_on_join', "Show reminder popup", 0.49,
farmbuyer@1 1574 [[When joining a raid and not already tracking, display a dialog asking for instructions.]])
farmbuyer@1 1575 grp:AddChild(w)
farmbuyer@1 1576
farmbuyer@1 1577 -- toggle scroll-to-bottom on first tab
farmbuyer@16 1578 w = mkoption('scroll_to_bottom', "Scroll to bottom when opening display", 0.49,
farmbuyer@1 1579 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]])
farmbuyer@1 1580 grp:AddChild(w)
farmbuyer@1 1581
farmbuyer@1 1582 -- /loot option
farmbuyer@16 1583 w = mkoption('register_slashloot', "Register /loot slash command on login", 0.49,
farmbuyer@1 1584 [[Register "/loot" as a slash command in addition to the normal "/ouroloot". Relog to take effect.]])
farmbuyer@1 1585 grp:AddChild(w)
farmbuyer@1 1586
farmbuyer@1 1587 -- chatty mode
farmbuyer@16 1588 w = mkoption('chatty_on_kill', "Be chatty on boss kill", 0.49,
farmbuyer@1 1589 [[Print something to chat output when DBM tells Ouro Loot about a successful boss kill.]])
farmbuyer@1 1590 grp:AddChild(w)
farmbuyer@1 1591
farmbuyer@1 1592 -- less noise in main panel
farmbuyer@16 1593 w = mkoption('no_tracking_wipes', "Do not track wipes", 0.49,
farmbuyer@1 1594 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]])
farmbuyer@1 1595 grp:AddChild(w)
farmbuyer@1 1596
farmbuyer@1 1597 -- cutesy abbrevs
farmbuyer@16 1598 w = mkoption('snarky_boss', "Use snarky boss names", 0.49,
farmbuyer@1 1599 [[Irreverent replacement names for boss events.]])
farmbuyer@1 1600 grp:AddChild(w)
farmbuyer@1 1601
farmbuyer@1 1602 -- possible keybindings
farmbuyer@1 1603 do
farmbuyer@1 1604 local pair = GUI:Create("SimpleGroup")
farmbuyer@1 1605 pair:SetLayout("Flow")
farmbuyer@10 1606 pair:SetRelativeWidth(0.95)
farmbuyer@1 1607 local editbox, checkbox
farmbuyer@1 1608 editbox = mkbutton("EditBox", nil, OuroLootSV_opts.keybinding_text,
farmbuyer@1 1609 [[Keybinding text format is fragile! Relog to take effect.]])
farmbuyer@1 1610 editbox:SetRelativeWidth(0.5)
farmbuyer@1 1611 editbox:SetLabel("Keybinding text")
farmbuyer@1 1612 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@1 1613 OuroLootSV_opts.keybinding_text = value
farmbuyer@1 1614 end)
farmbuyer@1 1615 editbox:SetDisabled(not OuroLootSV_opts.keybinding)
farmbuyer@1 1616 checkbox = mkoption('keybinding', "Register keybinding", 0.5,
farmbuyer@1 1617 [[Register a keybinding to toggle the loot display. Relog to take effect.]],
farmbuyer@1 1618 function (_w,_,value)
farmbuyer@1 1619 OuroLootSV_opts.keybinding = value
farmbuyer@1 1620 editbox:SetDisabled(not OuroLootSV_opts.keybinding)
farmbuyer@1 1621 end)
farmbuyer@1 1622 pair:AddChild(checkbox)
farmbuyer@1 1623 pair:AddChild(editbox)
farmbuyer@1 1624 grp:AddChild(pair)
farmbuyer@1 1625 end
farmbuyer@1 1626
farmbuyer@3 1627 -- boss mod selection
farmbuyer@3 1628 w = GUI:Create("Spacer")
farmbuyer@3 1629 w:SetFullWidth(true)
farmbuyer@3 1630 w:SetHeight(20)
farmbuyer@3 1631 grp:AddChild(w)
farmbuyer@3 1632 do
farmbuyer@3 1633 local list = {}
farmbuyer@3 1634 local current
farmbuyer@3 1635 for k,v in ipairs(addon.bossmods) do
farmbuyer@3 1636 list[k] = v.n
farmbuyer@3 1637 if v.n == OuroLootSV_opts.bossmod then
farmbuyer@3 1638 current = k
farmbuyer@3 1639 end
farmbuyer@3 1640 end
farmbuyer@3 1641 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
farmbuyer@3 1642 w:SetRelativeWidth(0.2)
farmbuyer@3 1643 w:SetLabel("Boss Mod:")
farmbuyer@3 1644 w:SetList(list)
farmbuyer@3 1645 w:SetValue(current)
farmbuyer@3 1646 w:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@3 1647 OuroLootSV_opts.bossmod = list[choice]
farmbuyer@3 1648 end)
farmbuyer@3 1649 grp:AddChild(w)
farmbuyer@3 1650 end
farmbuyer@3 1651
farmbuyer@1 1652 -- item filter
farmbuyer@1 1653 w = GUI:Create("Spacer")
farmbuyer@1 1654 w:SetFullWidth(true)
farmbuyer@1 1655 w:SetHeight(20)
farmbuyer@1 1656 grp:AddChild(w)
farmbuyer@1 1657 do
farmbuyer@1 1658 local list = {}
farmbuyer@1 1659 for id in pairs(OuroLootSV_opts.itemfilter) do
farmbuyer@1 1660 local iname, _, iquality = GetItemInfo(id)
farmbuyer@2 1661 if iname then
farmbuyer@11 1662 list[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@2 1663 end
farmbuyer@1 1664 end
farmbuyer@1 1665 w = GUI:Create("EditBoxDropDown")
farmbuyer@1 1666 w:SetRelativeWidth(0.4)
farmbuyer@1 1667 w:SetText("Item filter")
farmbuyer@1 1668 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
farmbuyer@1 1669 w:SetList(list)
farmbuyer@1 1670 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
farmbuyer@1 1671 local iname, ilink, iquality = GetItemInfo(strtrim(text))
farmbuyer@1 1672 if not iname then
farmbuyer@1 1673 return addon:Print("Error: %s is not a valid item name/link!", text)
farmbuyer@1 1674 end
farmbuyer@1 1675 local id = tonumber(ilink:match("item:(%d+)"))
farmbuyer@11 1676 list[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@1 1677 OuroLootSV_opts.itemfilter[id] = true
farmbuyer@1 1678 addon:Print("Now filtering out", ilink)
farmbuyer@1 1679 end)
farmbuyer@1 1680 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
farmbuyer@1 1681 --local ilink = select(2,GetItemInfo(key_id))
farmbuyer@1 1682 OuroLootSV_opts.itemfilter[tonumber(key_id)] = nil
farmbuyer@1 1683 --addon:Print("No longer filtering out", ilink)
farmbuyer@1 1684 addon:Print("No longer filtering out", val_name)
farmbuyer@1 1685 end)
farmbuyer@1 1686 grp:AddChild(w)
farmbuyer@1 1687 end
farmbuyer@1 1688
farmbuyer@1 1689 addon.sender_list.sort()
farmbuyer@1 1690 if #addon.sender_list.namesI > 0 then
farmbuyer@1 1691 local senders = table.concat(addon.sender_list.namesI,'\n') -- sigh
farmbuyer@1 1692 -- If 39 other people in the raid are running this, the label will
farmbuyer@1 1693 -- explode... is it likely enough to care about? No.
farmbuyer@1 1694 w = GUI:Create("Spacer")
farmbuyer@1 1695 w:SetFullWidth(true)
farmbuyer@1 1696 w:SetHeight(20)
farmbuyer@1 1697 grp:AddChild(w)
farmbuyer@1 1698 w = GUI:Create("Label")
farmbuyer@1 1699 w:SetRelativeWidth(0.4)
farmbuyer@11 1700 w:SetText(ITEM_QUALITY_COLORS[3].hex .."Echo from latest ping:|r\n"..senders)
farmbuyer@1 1701 grp:AddChild(w)
farmbuyer@1 1702 end
farmbuyer@1 1703
farmbuyer@6 1704 scroll:AddChild(grp)
farmbuyer@6 1705
farmbuyer@1 1706 w = mkbutton("ReloadUI", [[Does what you think it does. Loot information is written out and restored.]])
farmbuyer@1 1707 w:SetFullWidth(true)
farmbuyer@1 1708 w:SetCallback("OnClick", ReloadUI)
farmbuyer@1 1709 specials:AddChild(w)
farmbuyer@1 1710
farmbuyer@1 1711 w = mkbutton("Ping!",
farmbuyer@1 1712 [[Asks other raid users for their addon version and current status. Results displayed on User Options panel.]])
farmbuyer@1 1713 w:SetFullWidth(true)
farmbuyer@1 1714 w:SetCallback("OnClick", function(_w)
farmbuyer@1 1715 _w:SetText("5... 4... 3...")
farmbuyer@1 1716 _w:SetDisabled(true)
farmbuyer@23 1717 addon:DoPing()
farmbuyer@1 1718 addon:ScheduleTimer(function(b)
farmbuyer@1 1719 if b:IsVisible() then
farmbuyer@1 1720 return addon:redisplay()
farmbuyer@1 1721 --return tabs_OnGroupSelected_func(container,"OnGroupSelected","opt")
farmbuyer@1 1722 end
farmbuyer@1 1723 end, 5, _w)
farmbuyer@1 1724 end)
farmbuyer@1 1725 specials:AddChild(w)
farmbuyer@1 1726
farmbuyer@1 1727 -- Add appropriate lower panel
farmbuyer@1 1728 adv_lower (scroll, specials)
farmbuyer@1 1729
farmbuyer@1 1730 -- Finish up
farmbuyer@1 1731 container:AddChild(scroll)
farmbuyer@1 1732 end
farmbuyer@1 1733 end
farmbuyer@1 1734
farmbuyer@1 1735
farmbuyer@1 1736 -- Simply to avoid recreating the same function over and over
farmbuyer@1 1737 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
farmbuyer@1 1738 tabs_OnGroupSelected_func = function (tabs,event,group)
farmbuyer@1 1739 tabs_OnGroupSelected_func_args[1] = tabs
farmbuyer@1 1740 tabs_OnGroupSelected_func_args[3] = group
farmbuyer@1 1741 tabs:ReleaseChildren()
farmbuyer@1 1742 local spec = tabs:GetUserData("special buttons group")
farmbuyer@1 1743 spec:ReleaseChildren()
farmbuyer@1 1744 local h = GUI:Create("Heading")
farmbuyer@1 1745 h:SetFullWidth(true)
farmbuyer@1 1746 h:SetText(_tabtexts[group].title)
farmbuyer@1 1747 spec:AddChild(h)
farmbuyer@1 1748 return tabs_OnGroupSelected[group](tabs,spec,group)
farmbuyer@1 1749 --[====[
farmbuyer@1 1750 Unfortunately, :GetHeight() called on anything useful out of a TabGroup
farmbuyer@1 1751 returns the static default size (about 50 pixels) until the refresh
farmbuyer@1 1752 cycle *after* all the frames are shown. Trying to fix it up after a
farmbuyer@1 1753 single OnUpdate doesn't work either. So for now it's all hardcoded.
farmbuyer@1 1754
farmbuyer@1 1755 Using this to determine the actual height of the usable area.
farmbuyer@1 1756 366 pixels
farmbuyer@1 1757 if group == "eoi" then
farmbuyer@1 1758 local stframe = tabs.children[1].frame
farmbuyer@1 1759 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
farmbuyer@1 1760 stframe:GetTop()-stframe:GetBottom())
farmbuyer@1 1761 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
farmbuyer@1 1762 stframe:GetRight()-stframe:GetLeft())
farmbuyer@1 1763 end
farmbuyer@1 1764 ]====]
farmbuyer@1 1765 end
farmbuyer@1 1766
farmbuyer@1 1767 --[[
farmbuyer@1 1768 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
farmbuyer@1 1769 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
farmbuyer@1 1770 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
farmbuyer@1 1771 ]]
farmbuyer@1 1772 do
farmbuyer@1 1773 local replacement_colors = { ["+"]="|cffffffff", ["<"]="|cff00ff00", [">"]="|r" }
farmbuyer@1 1774 function mkbutton (opt_widget_type, opt_key, label, status)
farmbuyer@1 1775 if not label then
farmbuyer@1 1776 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
farmbuyer@1 1777 elseif not status then
farmbuyer@1 1778 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
farmbuyer@1 1779 end
farmbuyer@1 1780 local button = GUI:Create(opt_widget_type)
farmbuyer@1 1781 if button.SetText then button:SetText(tostring(label)) end
farmbuyer@1 1782 status = status:gsub("[%+<>]",replacement_colors)
farmbuyer@1 1783 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
farmbuyer@1 1784 button:SetCallback("OnLeave", statusy_OnLeave)
farmbuyer@1 1785 -- retrieval key may be specified as nil if all the parameters are given
farmbuyer@1 1786 if opt_key then _d:SetUserData (opt_key, button) end
farmbuyer@1 1787 return button
farmbuyer@1 1788 end
farmbuyer@1 1789 end
farmbuyer@1 1790
farmbuyer@1 1791 --[[
farmbuyer@1 1792 Creates the main window.
farmbuyer@1 1793 ]]
farmbuyer@1 1794 function addon:BuildMainDisplay (opt_tabselect)
farmbuyer@1 1795 if self.display then
farmbuyer@1 1796 -- try to get everything to update, rebuild, refresh... ugh, no
farmbuyer@1 1797 self.display:Hide()
farmbuyer@1 1798 end
farmbuyer@1 1799
farmbuyer@25 1800 -- This probably causes taint... hm.
farmbuyer@25 1801 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
farmbuyer@25 1802 UIDROPDOWNMENU_SHOW_TIME = 4
farmbuyer@25 1803
farmbuyer@1 1804 local display = GUI:Create("Frame")
farmbuyer@1 1805 if _d then
farmbuyer@1 1806 display:SetUserData("eoiST",_d) -- warning! warning! kludge detected!
farmbuyer@1 1807 end
farmbuyer@1 1808 _d = display
farmbuyer@1 1809 self.display = display
farmbuyer@17 1810 display:SetTitle(window_title)
farmbuyer@1 1811 display:SetStatusText(self.status_text)
farmbuyer@1 1812 display:SetLayout("Flow")
farmbuyer@16 1813 display:SetStatusTable{width=900,height=550} -- default height is 500
farmbuyer@36 1814 if display.EnableResize then -- FIXME after next Ace3 release, this can be assumed
farmbuyer@36 1815 display:EnableResize(false)
farmbuyer@36 1816 end
farmbuyer@1 1817 display:SetCallback("OnClose", function(_display)
farmbuyer@25 1818 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
farmbuyer@1 1819 _d = _display:GetUserData("eoiST")
farmbuyer@1 1820 self.display = nil
farmbuyer@1 1821 GUI:Release(_display)
farmbuyer@6 1822 flib.clear()
farmbuyer@1 1823 collectgarbage()
farmbuyer@1 1824 end)
farmbuyer@1 1825
farmbuyer@1 1826 ----- Right-hand panel
farmbuyer@1 1827 local rhs_width = 0.20
farmbuyer@1 1828 local control = GUI:Create("SimpleGroup")
farmbuyer@1 1829 control:SetLayout("Flow")
farmbuyer@1 1830 control:SetRelativeWidth(rhs_width)
farmbuyer@1 1831 control.alignoffset = 25
farmbuyer@1 1832 control:PauseLayout()
farmbuyer@1 1833 local h,b
farmbuyer@1 1834
farmbuyer@1 1835 --- Main ---
farmbuyer@1 1836 h = GUI:Create("Heading")
farmbuyer@1 1837 h:SetFullWidth(true)
farmbuyer@1 1838 h:SetText("Main")
farmbuyer@1 1839 control:AddChild(h)
farmbuyer@1 1840
farmbuyer@1 1841 do
farmbuyer@1 1842 b = mkbutton("Dropdown", nil, "",
farmbuyer@1 1843 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
farmbuyer@1 1844 b:SetFullWidth(true)
farmbuyer@1 1845 b:SetLabel("On/Off:")
farmbuyer@1 1846 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
farmbuyer@1 1847 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
farmbuyer@1 1848 b:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@1 1849 if choice == 1 then self:Activate()
farmbuyer@1 1850 elseif choice == 2 then self:Activate(nil,true)
farmbuyer@1 1851 else self:Deactivate()
farmbuyer@1 1852 end
farmbuyer@1 1853 _w = display:GetUserData('comm_ident')
farmbuyer@1 1854 if _w and _w:IsVisible() then
farmbuyer@1 1855 _w:SetDisabled(self.enabled or self.rebroadcast)
farmbuyer@1 1856 end
farmbuyer@1 1857 _w = display:GetUserData('eoi_bcast_req')
farmbuyer@1 1858 if _w and _w:IsVisible() then
farmbuyer@1 1859 _w:SetDisabled(not self.enabled)
farmbuyer@1 1860 end
farmbuyer@1 1861 end)
farmbuyer@1 1862 control:AddChild(b)
farmbuyer@1 1863 end
farmbuyer@1 1864
farmbuyer@1 1865 b = mkbutton("Dropdown", 'threshold', "",
farmbuyer@1 1866 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
farmbuyer@1 1867 b:SetFullWidth(true)
farmbuyer@1 1868 b:SetLabel("Threshold:")
farmbuyer@1 1869 b:SetList(self.thresholds)
farmbuyer@1 1870 b:SetValue(self.threshold)
farmbuyer@1 1871 b:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@1 1872 self:SetThreshold(choice)
farmbuyer@1 1873 end)
farmbuyer@1 1874 control:AddChild(b)
farmbuyer@1 1875
farmbuyer@4 1876 b = mkbutton("Clear Loot",
farmbuyer@1 1877 [[+Erases> all current loot information and generated text (but not saved texts).]])
farmbuyer@1 1878 b:SetFullWidth(true)
farmbuyer@1 1879 b:SetCallback("OnClick", function()
farmbuyer@1 1880 StaticPopup_Show("OUROL_CLEAR").data = self
farmbuyer@1 1881 end)
farmbuyer@1 1882 control:AddChild(b)
farmbuyer@1 1883
farmbuyer@1 1884 b = GUI:Create("Spacer")
farmbuyer@1 1885 b:SetFullWidth(true)
farmbuyer@16 1886 b:SetHeight(10)
farmbuyer@1 1887 control:AddChild(b)
farmbuyer@1 1888
farmbuyer@1 1889 --[[
farmbuyer@1 1890 --- Saved Texts ---
farmbuyer@1 1891 [ Save Current As... ]
farmbuyer@1 1892 saved1
farmbuyer@1 1893 saved2
farmbuyer@1 1894 ...
farmbuyer@1 1895 [ Load ] [ Delete ]
farmbuyer@1 1896 ]]
farmbuyer@1 1897 h = GUI:Create("Heading")
farmbuyer@1 1898 h:SetFullWidth(true)
farmbuyer@1 1899 h:SetText("Saved Texts")
farmbuyer@1 1900 control:AddChild(h)
farmbuyer@1 1901 b = mkbutton("Save Current As...",
farmbuyer@1 1902 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
farmbuyer@1 1903 b:SetFullWidth(true)
farmbuyer@1 1904 b:SetCallback("OnClick", function()
farmbuyer@1 1905 StaticPopup_Show "OUROL_SAVE_SAVEAS"
farmbuyer@1 1906 _d:Hide()
farmbuyer@1 1907 end)
farmbuyer@1 1908 control:AddChild(b)
farmbuyer@1 1909
farmbuyer@16 1910 do
farmbuyer@16 1911 local scontainer = GUI:Create("SimpleGroup")
farmbuyer@16 1912 scontainer:SetFullWidth(true)
farmbuyer@16 1913 scontainer:SetFullHeight(false)
farmbuyer@16 1914 scontainer:SetAutoAdjustHeight(false)
farmbuyer@16 1915 scontainer:SetHeight(40) -- no relative height available anymore
farmbuyer@16 1916 scontainer:SetLayout("Fill")
farmbuyer@16 1917 local scroll = GUI:Create("ScrollFrame")
farmbuyer@16 1918 scroll:SetLayout("List")
farmbuyer@16 1919 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
farmbuyer@16 1920 if saved then for i,s in ipairs(saved) do
farmbuyer@16 1921 local il = GUI:Create("InteractiveLabel")
farmbuyer@16 1922 il:SetFullWidth(true)
farmbuyer@16 1923 il:SetText(s.name)
farmbuyer@16 1924 il:SetUserData("num",i)
farmbuyer@16 1925 il:SetHighlight(1,1,1,0.4)
farmbuyer@16 1926 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
farmbuyer@16 1927 il:SetCallback("OnEnter", function() setstatus(str) end)
farmbuyer@16 1928 il:SetCallback("OnLeave", statusy_OnLeave)
farmbuyer@16 1929 il:SetCallback("OnClick", function(_il)
farmbuyer@16 1930 local prev = _d:GetUserData("saved selection")
farmbuyer@16 1931 if prev then
farmbuyer@16 1932 prev.highlight:Hide()
farmbuyer@16 1933 prev:SetColor()
farmbuyer@16 1934 end
farmbuyer@16 1935 _il:SetColor(0,1,0)
farmbuyer@16 1936 _il.highlight:Show()
farmbuyer@16 1937 _d:SetUserData("saved selection",_il)
farmbuyer@16 1938 _d:GetUserData("Load"):SetDisabled(false)
farmbuyer@16 1939 _d:GetUserData("Delete"):SetDisabled(false)
farmbuyer@16 1940 end)
farmbuyer@16 1941 scroll:AddChild(il)
farmbuyer@16 1942 end end
farmbuyer@16 1943 scontainer:AddChild(scroll)
farmbuyer@16 1944 control:AddChild(scontainer)
farmbuyer@16 1945 end
farmbuyer@1 1946
farmbuyer@1 1947 b = mkbutton("Load",
farmbuyer@1 1948 [[Load previously saved text. +REPLACES> all current loot information!]])
farmbuyer@1 1949 b:SetRelativeWidth(0.5)
farmbuyer@1 1950 b:SetCallback("OnClick", function()
farmbuyer@1 1951 local num = _d:GetUserData("saved selection"):GetUserData("num")
farmbuyer@1 1952 self:save_restore(num)
farmbuyer@1 1953 self:BuildMainDisplay()
farmbuyer@1 1954 end)
farmbuyer@1 1955 b:SetDisabled(true)
farmbuyer@1 1956 control:AddChild(b)
farmbuyer@1 1957 b = mkbutton("Delete",
farmbuyer@1 1958 [[Delete previously saved text.]])
farmbuyer@1 1959 b:SetRelativeWidth(0.5)
farmbuyer@1 1960 b:SetCallback("OnClick", function()
farmbuyer@1 1961 local num = _d:GetUserData("saved selection"):GetUserData("num")
farmbuyer@1 1962 self:save_delete(num)
farmbuyer@1 1963 self:BuildMainDisplay()
farmbuyer@1 1964 end)
farmbuyer@1 1965 b:SetDisabled(true)
farmbuyer@1 1966 control:AddChild(b)
farmbuyer@1 1967
farmbuyer@1 1968 b = GUI:Create("Spacer")
farmbuyer@1 1969 b:SetFullWidth(true)
farmbuyer@16 1970 b:SetHeight(10)
farmbuyer@1 1971 control:AddChild(b)
farmbuyer@1 1972
farmbuyer@1 1973 -- Other stuff on right-hand side
farmbuyer@1 1974 local tab_specials = GUI:Create("SimpleGroup")
farmbuyer@1 1975 tab_specials:SetLayout("Flow")
farmbuyer@1 1976 tab_specials:SetFullWidth(true)
farmbuyer@1 1977 control:AddChild(tab_specials)
farmbuyer@1 1978 control:ResumeLayout()
farmbuyer@1 1979
farmbuyer@1 1980 ----- Left-hand group
farmbuyer@1 1981 local tabs = GUI:Create("TabGroup")
farmbuyer@1 1982 tabs:SetLayout("Flow")
farmbuyer@1 1983 tabs.alignoffset = 25
farmbuyer@1 1984 tabs.titletext:SetFontObject(GameFontNormalSmall) -- XXX
farmbuyer@1 1985 do
farmbuyer@1 1986 self.sender_list.sort()
farmbuyer@1 1987 tabs.titletext:SetFormattedText("Received broadcast data from %d |4player:players;.",
farmbuyer@1 1988 self.sender_list.activeI)
farmbuyer@1 1989 end
farmbuyer@1 1990 tabs:SetRelativeWidth(0.99-rhs_width)
farmbuyer@1 1991 tabs:SetFullHeight(true)
farmbuyer@1 1992 tabs:SetTabs(tabgroup_tabs)
farmbuyer@1 1993 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
farmbuyer@1 1994 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
farmbuyer@1 1995 setstatus(_tabtexts[value].desc)
farmbuyer@1 1996 end)
farmbuyer@1 1997 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
farmbuyer@1 1998 tabs:SetUserData("special buttons group",tab_specials)
farmbuyer@1 1999 tabs:SelectTab(opt_tabselect or "eoi")
farmbuyer@1 2000
farmbuyer@1 2001 display:AddChildren (tabs, control)
farmbuyer@1 2002 display:ApplyStatus()
farmbuyer@1 2003
farmbuyer@1 2004 display:Show() -- without this, only appears every *other* function call
farmbuyer@1 2005 return display
farmbuyer@1 2006 end
farmbuyer@1 2007
farmbuyer@1 2008 function addon:OpenMainDisplayToTab (text)
farmbuyer@1 2009 text = '^'..text
farmbuyer@1 2010 for tab,v in pairs(_tabtexts) do
farmbuyer@1 2011 if v.title:lower():find(text) then
farmbuyer@1 2012 self:BuildMainDisplay(tab)
farmbuyer@1 2013 return true
farmbuyer@1 2014 end
farmbuyer@1 2015 end
farmbuyer@1 2016 end
farmbuyer@1 2017
farmbuyer@1 2018 -- Essentially a re-click on the current tab (if the current tab were clickable).
farmbuyer@1 2019 function addon:redisplay ()
farmbuyer@1 2020 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
farmbuyer@1 2021 end
farmbuyer@1 2022
farmbuyer@1 2023
farmbuyer@1 2024 ------ Popup dialogs
farmbuyer@1 2025 -- Callback for each Next/Accept stage of inserting a new loot row via dropdown
farmbuyer@1 2026 local function eoi_st_insert_OnAccept_boss (dialog, data)
farmbuyer@1 2027 if data.all_done then
farmbuyer@1 2028 -- It'll probably be the final entry in the table, but there might have
farmbuyer@1 2029 -- been real loot happening at the same time.
farmbuyer@1 2030 local boss_index = addon._addLootEntry{
farmbuyer@1 2031 kind = 'boss',
farmbuyer@1 2032 bosskill = (OuroLootSV_opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
farmbuyer@1 2033 reason = 'kill',
farmbuyer@1 2034 instance = data.instance,
farmbuyer@1 2035 duration = 0,
farmbuyer@1 2036 }
farmbuyer@1 2037 local entry = tremove(g_loot,boss_index)
farmbuyer@1 2038 tinsert(g_loot,data.rowindex,entry)
farmbuyer@1 2039 addon:_mark_boss_kill(data.rowindex)
farmbuyer@1 2040 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
farmbuyer@1 2041 dialog.data = nil -- free up memory
farmbuyer@1 2042 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
farmbuyer@1 2043 return
farmbuyer@1 2044 end
farmbuyer@1 2045
farmbuyer@16 2046 local text = dialog.editBox:GetText()
farmbuyer@1 2047
farmbuyer@1 2048 -- second click
farmbuyer@1 2049 if data.name and text then
farmbuyer@1 2050 data.instance = text
farmbuyer@1 2051 data.all_done = true
farmbuyer@1 2052 -- in future do one more thing, for now just jump to the check
farmbuyer@1 2053 return eoi_st_insert_OnAccept_boss (dialog, data)
farmbuyer@1 2054 end
farmbuyer@1 2055
farmbuyer@1 2056 -- first click
farmbuyer@1 2057 if text then
farmbuyer@1 2058 data.name = text
farmbuyer@1 2059 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
farmbuyer@1 2060 getinstance.data = data
farmbuyer@16 2061 getinstance.editBox:SetText(addon.instance_tag())
farmbuyer@1 2062 -- This suppresses auto-hide (which would case the getinstance dialog
farmbuyer@1 2063 -- to go away), but only when mouse clicking. OnEnter is on its own.
farmbuyer@1 2064 return true
farmbuyer@1 2065 end
farmbuyer@1 2066 end
farmbuyer@1 2067
farmbuyer@1 2068 local function eoi_st_insert_OnAccept_loot (dialog, data)
farmbuyer@1 2069 if data.all_done then
farmbuyer@1 2070 --local real_rebroadcast, real_enabled = addon.rebroadcast, addon.enabled
farmbuyer@1 2071 --g_rebroadcast, g_enabled = false, true
farmbuyer@1 2072 data.display:Hide()
farmbuyer@1 2073 local loot_index = addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes)
farmbuyer@1 2074 --g_rebroadcast, g_enabled = real_g_rebroadcast, real_g_enabled
farmbuyer@1 2075 local entry = tremove(g_loot,loot_index)
farmbuyer@1 2076 tinsert(g_loot,data.rowindex,entry)
farmbuyer@1 2077 --data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
farmbuyer@1 2078 addon:_fill_out_eoi_data(data.rowindex)
farmbuyer@1 2079 addon:BuildMainDisplay()
farmbuyer@1 2080 dialog.data = nil
farmbuyer@1 2081 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
farmbuyer@1 2082 return
farmbuyer@1 2083 end
farmbuyer@1 2084
farmbuyer@16 2085 local text = dialog.editBox:GetText():trim()
farmbuyer@1 2086
farmbuyer@1 2087 -- third click
farmbuyer@1 2088 if data.name and data.recipient and text then
farmbuyer@1 2089 data.notes = (text ~= "<none>") and text or nil
farmbuyer@1 2090 data.all_done = true
farmbuyer@1 2091 return eoi_st_insert_OnAccept_loot (dialog, data)
farmbuyer@1 2092 end
farmbuyer@1 2093
farmbuyer@1 2094 -- second click
farmbuyer@1 2095 if data.name and text then
farmbuyer@1 2096 data.recipient = text
farmbuyer@1 2097 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
farmbuyer@1 2098 getnotes.data = data
farmbuyer@16 2099 getnotes.editBox:SetText("<none>")
farmbuyer@16 2100 getnotes.editBox:HighlightText()
farmbuyer@1 2101 return true
farmbuyer@1 2102 end
farmbuyer@1 2103
farmbuyer@1 2104 -- first click
farmbuyer@1 2105 if text then
farmbuyer@1 2106 data.name = text
farmbuyer@1 2107 dialog:Hide() -- technically a "different" one about to be shown
farmbuyer@1 2108 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
farmbuyer@1 2109 getrecipient.data = data
farmbuyer@16 2110 getrecipient.editBox:SetText("")
farmbuyer@1 2111 return true
farmbuyer@1 2112 end
farmbuyer@1 2113 end
farmbuyer@1 2114
farmbuyer@1 2115 local function eoi_st_insert_OnAccept (dialog, data)
farmbuyer@1 2116 if data.kind == 'boss' then
farmbuyer@1 2117 return eoi_st_insert_OnAccept_boss (dialog, data)
farmbuyer@1 2118 elseif data.kind == 'loot' then
farmbuyer@1 2119 return eoi_st_insert_OnAccept_loot (dialog, data)
farmbuyer@1 2120 end
farmbuyer@1 2121 end
farmbuyer@1 2122
farmbuyer@1 2123 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
farmbuyer@1 2124 text = "Clear current loot information and text?",
farmbuyer@16 2125 button1 = YES,
farmbuyer@16 2126 button2 = NO,
farmbuyer@1 2127 OnAccept = function (dialog, addon)
farmbuyer@1 2128 addon:Clear(--[[verbose_p=]]true)
farmbuyer@1 2129 end,
farmbuyer@1 2130 }
farmbuyer@1 2131
farmbuyer@37 2132 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
farmbuyer@37 2133 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
farmbuyer@37 2134 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r, and generate it anew from current loot?",
farmbuyer@37 2135 button1 = YES,
farmbuyer@37 2136 button2 = NO,
farmbuyer@37 2137 OnAccept = function (dialog, addon, data2)
farmbuyer@37 2138 data2(addon)
farmbuyer@37 2139 addon:Print("%s history has been regenerated.", addon.history.realm)
farmbuyer@37 2140 addon:redisplay()
farmbuyer@37 2141 end,
farmbuyer@37 2142 }
farmbuyer@37 2143
farmbuyer@16 2144 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
farmbuyer@37 2145 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
farmbuyer@37 2146 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
farmbuyer@16 2147 button1 = YES,
farmbuyer@16 2148 button2 = NO,
farmbuyer@16 2149 OnAccept = function (dialog, addon, data2)
farmbuyer@16 2150 data2(addon)
farmbuyer@16 2151 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
farmbuyer@16 2152 addon:redisplay()
farmbuyer@16 2153 end,
farmbuyer@16 2154 }
farmbuyer@16 2155
farmbuyer@16 2156 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
farmbuyer@37 2157 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
farmbuyer@37 2158 text = "Erase all but the latest entry for players on " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
farmbuyer@16 2159 button1 = YES,
farmbuyer@16 2160 button2 = NO,
farmbuyer@16 2161 OnAccept = function (dialog, addon, data2)
farmbuyer@16 2162 data2(addon)
farmbuyer@16 2163 addon:Print("All loot prior to the most recent entries has been erased.")
farmbuyer@16 2164 addon:redisplay()
farmbuyer@16 2165 end,
farmbuyer@16 2166 }
farmbuyer@16 2167
farmbuyer@27 2168 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
farmbuyer@27 2169 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
farmbuyer@27 2170 button1 = OKAY,
farmbuyer@27 2171 timeout = 0,
farmbuyer@27 2172 whileDead = true,
farmbuyer@27 2173 hideOnEscape = true,
farmbuyer@27 2174 enterClicksFirstButton = true,
farmbuyer@27 2175 hasEditBox = true,
farmbuyer@27 2176 editBoxWidth = 350,
farmbuyer@27 2177 OnShow = function (dialog, url)
farmbuyer@27 2178 dialog.editBox:SetText(url)
farmbuyer@27 2179 dialog.editBox:SetFocus()
farmbuyer@27 2180 dialog.editBox:HighlightText()
farmbuyer@27 2181 end,
farmbuyer@27 2182 }
farmbuyer@27 2183
farmbuyer@1 2184 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
farmbuyer@1 2185 text = "Do you wish to activate Ouro Loot?\n\n(Hit the Escape key to close this window without clicking)",
farmbuyer@1 2186 button1 = "Activate recording", -- "accept", left
farmbuyer@1 2187 button3 = "Broadcast only", -- "alt", middle
farmbuyer@1 2188 button2 = "Help", -- "cancel", right
farmbuyer@1 2189 OnAccept = function (dialog, addon)
farmbuyer@1 2190 addon:Activate()
farmbuyer@1 2191 end,
farmbuyer@1 2192 OnAlt = function (dialog, addon)
farmbuyer@1 2193 addon:Activate(nil,true)
farmbuyer@1 2194 end,
farmbuyer@1 2195 OnCancel = function (dialog, addon)
farmbuyer@1 2196 -- hitting escape also calls this, but the 3rd arg would be "clicked"
farmbuyer@1 2197 -- in both cases, not useful here.
farmbuyer@1 2198 local helpbutton = dialog.button2
farmbuyer@1 2199 local ismousing = MouseIsOver(helpbutton)
farmbuyer@1 2200 if ismousing then
farmbuyer@1 2201 -- they actually clicked the button (or at least the mouse was over "Help"
farmbuyer@1 2202 -- when they hit escape... sigh)
farmbuyer@1 2203 addon:BuildMainDisplay('help')
farmbuyer@1 2204 else
farmbuyer@1 2205 addon.popped = true
farmbuyer@1 2206 end
farmbuyer@1 2207 end,
farmbuyer@1 2208 }
farmbuyer@1 2209
farmbuyer@1 2210 -- The data member here is a table built with:
farmbuyer@1 2211 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
farmbuyer@1 2212 do
farmbuyer@1 2213 local t = flib.StaticPopup{
farmbuyer@1 2214 text = "Enter name of new %s, then click Next or press Enter:",
farmbuyer@1 2215 button1 = "Next >",
farmbuyer@1 2216 button2 = CANCEL,
farmbuyer@1 2217 hasEditBox = true,
farmbuyer@16 2218 editBoxWidth = 350,
farmbuyer@1 2219 maxLetters = 50,
farmbuyer@1 2220 noCancelOnReuse = true,
farmbuyer@1 2221 --[[ XXX still needed?
farmbuyer@1 2222 OnShow = function(dialog)
farmbuyer@1 2223 dialog.wideEditBox:SetText("")
farmbuyer@1 2224 dialog.wideEditBox:SetFocus()
farmbuyer@1 2225 end,]]
farmbuyer@1 2226 }
farmbuyer@1 2227 t.EditBoxOnEnterPressed = function(editbox)
farmbuyer@39 2228 if editbox:GetText() == "" then return end
farmbuyer@1 2229 local dialog = editbox:GetParent()
farmbuyer@1 2230 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
farmbuyer@1 2231 dialog:Hide() -- replicate OnAccept click behavior
farmbuyer@1 2232 end
farmbuyer@1 2233 end
farmbuyer@1 2234 t.enterClicksFirstButton = nil -- no effect with editbox focused
farmbuyer@1 2235 t.OnAccept = eoi_st_insert_OnAccept
farmbuyer@1 2236 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
farmbuyer@1 2237 end
farmbuyer@1 2238
farmbuyer@1 2239 -- This seems to be gratuitous use of metatables, really.
farmbuyer@1 2240 do
farmbuyer@1 2241 local OEIL = {
farmbuyer@1 2242 text = "Paste the new item into here, then click Next or press Enter:",
farmbuyer@1 2243 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
farmbuyer@1 2244 }
farmbuyer@1 2245 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
farmbuyer@1 2246
farmbuyer@1 2247 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
farmbuyer@1 2248 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
farmbuyer@1 2249 if dialogname then
farmbuyer@16 2250 _G[dialogname.."EditBox"]:SetText(link)
farmbuyer@1 2251 return true
farmbuyer@1 2252 end
farmbuyer@1 2253 end)
farmbuyer@1 2254 end
farmbuyer@1 2255
farmbuyer@1 2256 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
farmbuyer@1 2257 text = "Enter the player name:",
farmbuyer@1 2258 button1 = ACCEPT,
farmbuyer@1 2259 button2 = CANCEL,
farmbuyer@1 2260 hasEditBox = true,
farmbuyer@1 2261 --[[ XXX needed?
farmbuyer@1 2262 OnShow = function(dialog)
farmbuyer@1 2263 dialog.editBox:SetText("")
farmbuyer@1 2264 dialog.editBox:SetFocus()
farmbuyer@1 2265 end,]]
farmbuyer@1 2266 OnAccept = function(dialog, data)
farmbuyer@1 2267 local name = dialog.usertext --editBox:GetText()
farmbuyer@24 2268 addon:reassign_loot (data.index, name)
farmbuyer@1 2269 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.index)
farmbuyer@1 2270 end,
farmbuyer@1 2271 }
farmbuyer@1 2272
farmbuyer@1 2273 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
farmbuyer@1 2274 text = "Enter a name for the loot collection:",
farmbuyer@1 2275 button1 = ACCEPT,
farmbuyer@1 2276 button2 = CANCEL,
farmbuyer@1 2277 hasEditBox = true,
farmbuyer@1 2278 maxLetters = 30,
farmbuyer@1 2279 --[[ XXX
farmbuyer@1 2280 OnShow = function(dialog)
farmbuyer@1 2281 dialog.editBox:SetText("")
farmbuyer@1 2282 dialog.editBox:SetFocus()
farmbuyer@1 2283 end,]]
farmbuyer@1 2284 OnAccept = function(dialog)--, data)
farmbuyer@1 2285 local name = dialog.usertext --editBox:GetText()
farmbuyer@1 2286 addon:save_saveas(name)
farmbuyer@1 2287 addon:BuildMainDisplay()
farmbuyer@1 2288 end,
farmbuyer@1 2289 OnCancel = function(dialog)--, data, reason)
farmbuyer@1 2290 addon:BuildMainDisplay()
farmbuyer@1 2291 end,
farmbuyer@1 2292 --[[XXX
farmbuyer@1 2293 EditBoxOnEnterPressed = function(editbox)
farmbuyer@1 2294 local dialog = editbox:GetParent()
farmbuyer@1 2295 StaticPopupDialogs["OUROL_SAVE_SAVEAS"].OnAccept (dialog, dialog.data)
farmbuyer@1 2296 dialog:Hide()
farmbuyer@1 2297 end,]]
farmbuyer@1 2298 }
farmbuyer@1 2299
farmbuyer@25 2300
farmbuyer@25 2301 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
farmbuyer@25 2302 if true then
farmbuyer@25 2303 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
farmbuyer@25 2304 -- tagged with CHANGE.
farmbuyer@25 2305 local function onenter (self, motion)
farmbuyer@25 2306 if ( self.hasArrow ) then
farmbuyer@25 2307 local level = self:GetParent():GetID() + 1;
farmbuyer@25 2308 local listFrame = _G["DropDownList"..level];
farmbuyer@25 2309 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
farmbuyer@25 2310 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
farmbuyer@25 2311 end
farmbuyer@25 2312 else
farmbuyer@25 2313 CloseDropDownMenus(self:GetParent():GetID() + 1);
farmbuyer@25 2314 end
farmbuyer@25 2315 _G[self:GetName().."Highlight"]:Show();
farmbuyer@25 2316 UIDropDownMenu_StopCounting(self:GetParent());
farmbuyer@25 2317 if ( self.tooltipTitle ) then
farmbuyer@25 2318 if ( self.tooltipOnButton ) then
farmbuyer@25 2319 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
farmbuyer@25 2320 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
farmbuyer@25 2321 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
farmbuyer@25 2322 GameTooltip:Show();
farmbuyer@25 2323 else
farmbuyer@25 2324 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
farmbuyer@25 2325 end
farmbuyer@25 2326 end
farmbuyer@25 2327 end
farmbuyer@25 2328 -- end verbatime copy
farmbuyer@25 2329
farmbuyer@25 2330 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
farmbuyer@25 2331 local list = _G["DropDownList"..i]
farmbuyer@25 2332 if list then
farmbuyer@25 2333 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
farmbuyer@25 2334 local button = _G["DropDownList"..i.."Button"..j]
farmbuyer@25 2335 if button then
farmbuyer@25 2336 --print("button fixup",i,j)
farmbuyer@25 2337 button:SetScript("OnEnter",onenter)
farmbuyer@25 2338 end
farmbuyer@25 2339 end
farmbuyer@25 2340 end
farmbuyer@25 2341 end
farmbuyer@25 2342 end
farmbuyer@25 2343
farmbuyer@1 2344 -- vim:noet