annotate gui.lua @ 59:1cbaa1ce8253

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