annotate gui.lua @ 115:289c7667adab

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