annotate gui.lua @ 155:bfb53b311552

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