annotate gui.lua @ 57:81d5449621f8

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