annotate gui.lua @ 77:a07c9dd79f3a

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