annotate gui.lua @ 71:fb330a1fb6e9

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