annotate gui.lua @ 118:ec5174529e0f

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