annotate gui.lua @ 67:c01875b275ca

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