annotate gui.lua @ 46:0b1e703a6954

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