annotate gui.lua @ 65:69fd720f853e

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