annotate gui.lua @ 109:ce45011fab4c

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