annotate gui.lua @ 94:db1d5d09e5f5

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