annotate gui.lua @ 102:fe04f5c4114a

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