annotate gui.lua @ 47:1070a14cfee4

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