annotate gui.lua @ 88:c9f955f9a285

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