annotate gui.lua @ 129:2731702567c4

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