annotate gui.lua @ 122:fb4bda3ad05c

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