annotate gui.lua @ 116:fc2ff128835a

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