annotate gui.lua @ 72:bb19899c65a7

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