annotate gui.lua @ 130:08d3d2b7c31d

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