annotate gui.lua @ 125:a9cf9b2fbf9b

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