annotate gui.lua @ 93:ea20a28327b5

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