annotate gui.lua @ 128:dc39ce56a62d

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