annotate gui.lua @ 131:acaa01b90505 beta-mhg-5

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