annotate gui.lua @ 76:124da015c4a2

- Some more debugging aids (logging error/assert, auto-enable of testing panel, reminder of GOP history mode) - Move (finally!) hypertext handling code out to each call site. - Fix some bugs in previous alpha code. - Initial-but-mostly-tested code to handle items that have a "unique" field which are in fact always the same (for example, elementium gem cluster). Still need to test the case in which a remote tracker sees them first. - The rest of the variable-cutoff history cleanup.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Fri, 08 Jun 2012 08:05:37 +0000
parents 676fb79a4ae2
children a07c9dd79f3a
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@10 1878 PlaySoundFile[[Sound\Music\WorldEvents\HordeFirepole.mp3]]
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@10 1884 PlaySoundFile[[Sound\Music\WorldEvents\AllianceFirepole.mp3]]
farmbuyer@10 1885 end)
farmbuyer@10 1886 simple:AddChild(w)
farmbuyer@10 1887 grp:AddChild(simple)
farmbuyer@10 1888
farmbuyer@1 1889 grp:ResumeLayout()
farmbuyer@1 1890 container:AddChild(grp)
farmbuyer@1 1891 GUI:ClearFocus()
farmbuyer@73 1892 container:SetScroll(1000) -- scrollframe's max value
farmbuyer@1 1893 end
farmbuyer@1 1894
farmbuyer@76 1895 -- Initial lower panel function (unless debug mode is on during load, which
farmbuyer@76 1896 -- means it was almost certainly hardcoded that way, which means it's
farmbuyer@76 1897 -- probably me testing).
farmbuyer@76 1898 local adv_lower
farmbuyer@76 1899 if addon.DEBUG_PRINT then
farmbuyer@76 1900 adv_lower = adv_real
farmbuyer@76 1901 else
farmbuyer@76 1902 function adv_lower (container, specials)
farmbuyer@76 1903 local spacer = GUI:Create("Spacer")
farmbuyer@76 1904 spacer:SetFullWidth(true)
farmbuyer@76 1905 spacer:SetHeight(5)
farmbuyer@76 1906 container:AddChild(spacer)
farmbuyer@76 1907 local speedbump = GUI:Create("InteractiveLabel")
farmbuyer@76 1908 speedbump:SetFullWidth(true)
farmbuyer@76 1909 speedbump:SetFontObject(GameFontHighlightLarge)
farmbuyer@76 1910 speedbump:SetImage("Interface\\DialogFrame\\DialogAlertIcon")
farmbuyer@76 1911 speedbump:SetImageSize(50,50)
farmbuyer@76 1912 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 1913 speedbump:SetCallback("OnClick", function (_sb)
farmbuyer@76 1914 adv_lower = adv_real
farmbuyer@76 1915 return addon:redisplay()
farmbuyer@76 1916 --return tabs_OnGroupSelected_func(container.parent,"OnGroupSelected","opt")
farmbuyer@76 1917 end)
farmbuyer@76 1918 container:AddChild(speedbump)
farmbuyer@76 1919 spacer = GUI:Create("Spacer")
farmbuyer@76 1920 spacer:SetFullWidth(true)
farmbuyer@76 1921 spacer:SetHeight(5)
farmbuyer@76 1922 container:AddChild(spacer)
farmbuyer@76 1923 end
farmbuyer@1 1924 end
farmbuyer@1 1925
farmbuyer@1 1926 tabs_OnGroupSelected["opt"] = function(container,specials)
farmbuyer@65 1927 opts = OuroLootSV_opts
farmbuyer@65 1928
farmbuyer@1 1929 --container:SetLayout("List")
farmbuyer@1 1930 container:SetLayout("Fill")
farmbuyer@1 1931 local scroll, grp, w
farmbuyer@1 1932
farmbuyer@1 1933 scroll = GUI:Create("ScrollFrame")
farmbuyer@1 1934 scroll:SetLayout("Flow")
farmbuyer@1 1935
farmbuyer@1 1936 grp = GUI:Create("InlineGroup")
farmbuyer@1 1937 grp:SetLayout("Flow")
farmbuyer@1 1938 grp:SetFullWidth(true)
farmbuyer@1 1939 grp:SetTitle("User Options [these are saved across sessions]")
farmbuyer@1 1940
farmbuyer@10 1941 -- The relative width fields used to be done to take up less vertical space, but
farmbuyer@10 1942 -- that turned out to look messy. Now they're just a straight line for the most part.
farmbuyer@10 1943
farmbuyer@1 1944 -- reminder popup
farmbuyer@16 1945 w = mkoption ('popup_on_join', "Show reminder popup", 0.49,
farmbuyer@1 1946 [[When joining a raid and not already tracking, display a dialog asking for instructions.]])
farmbuyer@1 1947 grp:AddChild(w)
farmbuyer@1 1948
farmbuyer@1 1949 -- toggle scroll-to-bottom on first tab
farmbuyer@16 1950 w = mkoption('scroll_to_bottom', "Scroll to bottom when opening display", 0.49,
farmbuyer@1 1951 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]])
farmbuyer@1 1952 grp:AddChild(w)
farmbuyer@1 1953
farmbuyer@1 1954 -- /loot option
farmbuyer@16 1955 w = mkoption('register_slashloot', "Register /loot slash command on login", 0.49,
farmbuyer@1 1956 [[Register "/loot" as a slash command in addition to the normal "/ouroloot". Relog to take effect.]])
farmbuyer@1 1957 grp:AddChild(w)
farmbuyer@1 1958
farmbuyer@73 1959 -- chatty boss mode
farmbuyer@16 1960 w = mkoption('chatty_on_kill', "Be chatty on boss kill", 0.49,
farmbuyer@1 1961 [[Print something to chat output when DBM tells Ouro Loot about a successful boss kill.]])
farmbuyer@1 1962 grp:AddChild(w)
farmbuyer@1 1963
farmbuyer@1 1964 -- less noise in main panel
farmbuyer@16 1965 w = mkoption('no_tracking_wipes', "Do not track wipes", 0.49,
farmbuyer@1 1966 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]])
farmbuyer@1 1967 grp:AddChild(w)
farmbuyer@1 1968
farmbuyer@1 1969 -- cutesy abbrevs
farmbuyer@16 1970 w = mkoption('snarky_boss', "Use snarky boss names", 0.49,
farmbuyer@1 1971 [[Irreverent replacement names for boss events.]])
farmbuyer@1 1972 grp:AddChild(w)
farmbuyer@1 1973
farmbuyer@57 1974 -- LOD plugins in all cases
farmbuyer@57 1975 w = mkoption('display_disabled_LODs', "Include disabled plugins", 0.49,
farmbuyer@57 1976 [[Show loadable plugins even if they've been disabled (and offer to enable them). Relog to take effect.]])
farmbuyer@57 1977 grp:AddChild(w)
farmbuyer@57 1978
farmbuyer@65 1979 -- showing the "(from Rebroadcasterdude)" in the notes column
farmbuyer@65 1980 w = mkoption('display_bcast_from', "Show rebroadcasting player", 0.49,
farmbuyer@73 1981 [[Include "from PlayerName" in the Notes column for loot that was broadcast to you. (Not included in forum output).]],
farmbuyer@65 1982 function(_w,_e,value)
farmbuyer@65 1983 opts.display_bcast_from = value
farmbuyer@65 1984 addon.loot_clean = nil
farmbuyer@65 1985 end)
farmbuyer@65 1986 grp:AddChild(w)
farmbuyer@65 1987
farmbuyer@73 1988 -- prefilling g_uniques with history
farmbuyer@73 1989 w = mkoption('precache_history_uniques', "Prescan for faster handling", 0.49,
farmbuyer@73 1990 [[See description under +Help -- Handy Tips -- Prescanning> for instructions.]])
farmbuyer@73 1991 grp:AddChild(w)
farmbuyer@73 1992
farmbuyer@73 1993 w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(1) grp:AddChild(w)
farmbuyer@73 1994
farmbuyer@1 1995 -- possible keybindings
farmbuyer@1 1996 do
farmbuyer@73 1997 local pair = GUI:Create("InlineGroup")
farmbuyer@73 1998 pair:SetLayout("List")
farmbuyer@73 1999 pair:SetRelativeWidth(0.49)
farmbuyer@1 2000 local editbox, checkbox
farmbuyer@65 2001 editbox = mkbutton("EditBox", nil, opts.keybinding_text,
farmbuyer@1 2002 [[Keybinding text format is fragile! Relog to take effect.]])
farmbuyer@73 2003 editbox:SetFullWidth(true)
farmbuyer@1 2004 editbox:SetLabel("Keybinding text")
farmbuyer@1 2005 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@65 2006 opts.keybinding_text = value
farmbuyer@1 2007 end)
farmbuyer@65 2008 editbox:SetDisabled(not opts.keybinding)
farmbuyer@73 2009 checkbox = mkoption('keybinding', "Register keybinding", 1,
farmbuyer@1 2010 [[Register a keybinding to toggle the loot display. Relog to take effect.]],
farmbuyer@1 2011 function (_w,_,value)
farmbuyer@65 2012 opts.keybinding = value
farmbuyer@65 2013 editbox:SetDisabled(not opts.keybinding)
farmbuyer@1 2014 end)
farmbuyer@73 2015 checkbox:SetFullWidth(true)
farmbuyer@1 2016 pair:AddChild(checkbox)
farmbuyer@1 2017 pair:AddChild(editbox)
farmbuyer@1 2018 grp:AddChild(pair)
farmbuyer@1 2019 end
farmbuyer@1 2020
farmbuyer@73 2021 -- chatty disposition/assignment changes
farmbuyer@73 2022 do
farmbuyer@73 2023 local chatgroup = GUI:Create("InlineGroup")
farmbuyer@73 2024 chatgroup:SetLayout("List")
farmbuyer@73 2025 chatgroup:SetRelativeWidth(0.49)
farmbuyer@73 2026 chatgroup:SetTitle("Remote Changes Chat")
farmbuyer@73 2027 local toggle, editbox
farmbuyer@73 2028 toggle = mkoption('chatty_on_remote_changes', "Be chatty on remote changes", 1,
farmbuyer@73 2029 [[Print something to chat when other users change recorded loot.]],
farmbuyer@73 2030 function (_w,_,value)
farmbuyer@73 2031 opts.chatty_on_remote_changes = value
farmbuyer@73 2032 editbox:SetDisabled(not opts.chatty_on_remote_changes)
farmbuyer@73 2033 end)
farmbuyer@73 2034 toggle:SetFullWidth(true)
farmbuyer@73 2035 chatgroup:AddChild(toggle)
farmbuyer@73 2036 w = GUI:Create("Label")
farmbuyer@73 2037 w:SetFullWidth(true)
farmbuyer@73 2038 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 2039 chatgroup:AddChild(w)
farmbuyer@73 2040 editbox = mkbutton("EditBox", nil, opts.chatty_on_remote_changes_frame,
farmbuyer@73 2041 [[1 = default chat frame, 2 = combat log, etc]])
farmbuyer@73 2042 editbox:SetFullWidth(true)
farmbuyer@73 2043 editbox:SetLabel("Output Chatframe")
farmbuyer@73 2044 editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@73 2045 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@73 2046 local prev = opts.chatty_on_remote_changes_frame
farmbuyer@73 2047 value = value:trim()
farmbuyer@73 2048 value = tonumber(value) or value
farmbuyer@73 2049 if addon:_set_remote_change_chatframe (value) then
farmbuyer@73 2050 opts.chatty_on_remote_changes_frame = value
farmbuyer@73 2051 _w:SetText(tostring(value))
farmbuyer@73 2052 _w.editbox:ClearFocus()
farmbuyer@73 2053 else
farmbuyer@73 2054 _w:SetText(tostring(prev))
farmbuyer@73 2055 end
farmbuyer@73 2056 end)
farmbuyer@73 2057 editbox:SetDisabled(not opts.chatty_on_remote_changes)
farmbuyer@73 2058 chatgroup:AddChild(editbox)
farmbuyer@73 2059 w = mkbutton("Chat Frame Numbers",
farmbuyer@73 2060 [[Print each chat window number in its own frame, for easy reference in the editing field.]])
farmbuyer@73 2061 w:SetFullWidth(true)
farmbuyer@73 2062 --w:SetDisabled(not opts.chatty_on_remote_changes)
farmbuyer@73 2063 w:SetCallback("OnClick", function()
farmbuyer@73 2064 for i = 1, NUM_CHAT_WINDOWS do
farmbuyer@73 2065 local cf = _G['ChatFrame'..i]
farmbuyer@73 2066 if not cf then break end
farmbuyer@73 2067 addon:CFPrint (cf, "This is frame number |cffff0000%d|r.", i)
farmbuyer@73 2068 end
farmbuyer@73 2069 end)
farmbuyer@73 2070 chatgroup:AddChild(w)
farmbuyer@73 2071 grp:AddChild(chatgroup)
farmbuyer@73 2072 end
farmbuyer@73 2073
farmbuyer@3 2074 -- boss mod selection
farmbuyer@3 2075 w = GUI:Create("Spacer")
farmbuyer@3 2076 w:SetFullWidth(true)
farmbuyer@73 2077 w:SetHeight(2)
farmbuyer@3 2078 grp:AddChild(w)
farmbuyer@3 2079 do
farmbuyer@3 2080 local list = {}
farmbuyer@3 2081 local current
farmbuyer@3 2082 for k,v in ipairs(addon.bossmods) do
farmbuyer@3 2083 list[k] = v.n
farmbuyer@65 2084 if v.n == opts.bossmod then
farmbuyer@3 2085 current = k
farmbuyer@3 2086 end
farmbuyer@3 2087 end
farmbuyer@3 2088 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
farmbuyer@3 2089 w:SetRelativeWidth(0.2)
farmbuyer@3 2090 w:SetLabel("Boss Mod:")
farmbuyer@3 2091 w:SetList(list)
farmbuyer@3 2092 w:SetValue(current)
farmbuyer@3 2093 w:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@65 2094 opts.bossmod = list[choice]
farmbuyer@3 2095 end)
farmbuyer@3 2096 grp:AddChild(w)
farmbuyer@3 2097 end
farmbuyer@3 2098
farmbuyer@70 2099 -- item filters
farmbuyer@1 2100 w = GUI:Create("Spacer")
farmbuyer@1 2101 w:SetFullWidth(true)
farmbuyer@73 2102 w:SetHeight(2)
farmbuyer@1 2103 grp:AddChild(w)
farmbuyer@1 2104 do
farmbuyer@70 2105 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 2106 local cache_warn, cache_warned = false, false
farmbuyer@70 2107 local function do_warning()
farmbuyer@70 2108 if cache_warn and not cache_warned then
farmbuyer@70 2109 cache_warned = true
farmbuyer@70 2110 addon:Print(warntext)
farmbuyer@70 2111 end
farmbuyer@70 2112 end
farmbuyer@70 2113
farmbuyer@70 2114 local filterlist, vaultlist = {}, {}
farmbuyer@65 2115 for id in pairs(opts.itemfilter) do
farmbuyer@1 2116 local iname, _, iquality = GetItemInfo(id)
farmbuyer@2 2117 if iname then
farmbuyer@70 2118 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@54 2119 else
farmbuyer@54 2120 cache_warn = true
farmbuyer@2 2121 end
farmbuyer@1 2122 end
farmbuyer@70 2123 for id in pairs(opts.itemvault) do
farmbuyer@70 2124 local iname, _, iquality = GetItemInfo(id)
farmbuyer@70 2125 if iname then
farmbuyer@70 2126 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@70 2127 else
farmbuyer@70 2128 cache_warn = true
farmbuyer@70 2129 end
farmbuyer@70 2130 end
farmbuyer@70 2131
farmbuyer@1 2132 w = GUI:Create("EditBoxDropDown")
farmbuyer@1 2133 w:SetRelativeWidth(0.4)
farmbuyer@1 2134 w:SetText("Item filter")
farmbuyer@1 2135 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
farmbuyer@70 2136 w:SetList(filterlist)
farmbuyer@1 2137 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
farmbuyer@73 2138 local iname, ilink, iquality = GetItemInfo(text:trim())
farmbuyer@1 2139 if not iname then
farmbuyer@1 2140 return addon:Print("Error: %s is not a valid item name/link!", text)
farmbuyer@1 2141 end
farmbuyer@1 2142 local id = tonumber(ilink:match("item:(%d+)"))
farmbuyer@70 2143 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@65 2144 opts.itemfilter[id] = true
farmbuyer@1 2145 addon:Print("Now filtering out", ilink)
farmbuyer@1 2146 end)
farmbuyer@1 2147 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
farmbuyer@1 2148 --local ilink = select(2,GetItemInfo(key_id))
farmbuyer@65 2149 opts.itemfilter[tonumber(key_id)] = nil
farmbuyer@1 2150 --addon:Print("No longer filtering out", ilink)
farmbuyer@1 2151 addon:Print("No longer filtering out", val_name)
farmbuyer@1 2152 end)
farmbuyer@70 2153 w:SetCallback("OnDropdownShown",do_warning)
farmbuyer@70 2154 grp:AddChild(w)
farmbuyer@70 2155
farmbuyer@70 2156 w = GUI:Create("Spacer")
farmbuyer@70 2157 w:SetRelativeWidth(0.1)
farmbuyer@70 2158 w:SetHeight(2)
farmbuyer@70 2159 grp:AddChild(w)
farmbuyer@70 2160
farmbuyer@70 2161 w = GUI:Create("EditBoxDropDown")
farmbuyer@70 2162 w:SetRelativeWidth(0.4)
farmbuyer@70 2163 w:SetText("Vault items")
farmbuyer@70 2164 w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.")
farmbuyer@70 2165 w:SetList(vaultlist)
farmbuyer@70 2166 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
farmbuyer@73 2167 local iname, ilink, iquality = GetItemInfo(text:trim())
farmbuyer@70 2168 if not iname then
farmbuyer@70 2169 return addon:Print("Error: %s is not a valid item name/link!", text)
farmbuyer@54 2170 end
farmbuyer@70 2171 local id = tonumber(ilink:match("item:(%d+)"))
farmbuyer@70 2172 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@70 2173 opts.itemvault[id] = true
farmbuyer@70 2174 addon:Print("Now auto-vaulting", ilink)
farmbuyer@54 2175 end)
farmbuyer@70 2176 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
farmbuyer@70 2177 --local ilink = select(2,GetItemInfo(key_id))
farmbuyer@70 2178 opts.itemfilter[tonumber(key_id)] = nil
farmbuyer@70 2179 --addon:Print("No longer filtering out", ilink)
farmbuyer@70 2180 addon:Print("No longer auto-vaulting", val_name)
farmbuyer@70 2181 end)
farmbuyer@70 2182 w:SetCallback("OnDropdownShown",do_warning)
farmbuyer@1 2183 grp:AddChild(w)
farmbuyer@1 2184 end
farmbuyer@1 2185
farmbuyer@1 2186 addon.sender_list.sort()
farmbuyer@1 2187 if #addon.sender_list.namesI > 0 then
farmbuyer@1 2188 local senders = table.concat(addon.sender_list.namesI,'\n') -- sigh
farmbuyer@1 2189 -- If 39 other people in the raid are running this, the label will
farmbuyer@1 2190 -- explode... is it likely enough to care about? No.
farmbuyer@1 2191 w = GUI:Create("Spacer")
farmbuyer@1 2192 w:SetFullWidth(true)
farmbuyer@1 2193 w:SetHeight(20)
farmbuyer@1 2194 grp:AddChild(w)
farmbuyer@1 2195 w = GUI:Create("Label")
farmbuyer@1 2196 w:SetRelativeWidth(0.4)
farmbuyer@11 2197 w:SetText(ITEM_QUALITY_COLORS[3].hex .."Echo from latest ping:|r\n"..senders)
farmbuyer@1 2198 grp:AddChild(w)
farmbuyer@1 2199 end
farmbuyer@1 2200
farmbuyer@6 2201 scroll:AddChild(grp)
farmbuyer@6 2202
farmbuyer@1 2203 w = mkbutton("ReloadUI", [[Does what you think it does. Loot information is written out and restored.]])
farmbuyer@1 2204 w:SetFullWidth(true)
farmbuyer@1 2205 w:SetCallback("OnClick", ReloadUI)
farmbuyer@1 2206 specials:AddChild(w)
farmbuyer@1 2207
farmbuyer@1 2208 w = mkbutton("Ping!",
farmbuyer@1 2209 [[Asks other raid users for their addon version and current status. Results displayed on User Options panel.]])
farmbuyer@1 2210 w:SetFullWidth(true)
farmbuyer@1 2211 w:SetCallback("OnClick", function(_w)
farmbuyer@1 2212 _w:SetText("5... 4... 3...")
farmbuyer@1 2213 _w:SetDisabled(true)
farmbuyer@23 2214 addon:DoPing()
farmbuyer@1 2215 addon:ScheduleTimer(function(b)
farmbuyer@1 2216 if b:IsVisible() then
farmbuyer@1 2217 return addon:redisplay()
farmbuyer@1 2218 --return tabs_OnGroupSelected_func(container,"OnGroupSelected","opt")
farmbuyer@1 2219 end
farmbuyer@1 2220 end, 5, _w)
farmbuyer@1 2221 end)
farmbuyer@1 2222 specials:AddChild(w)
farmbuyer@1 2223
farmbuyer@1 2224 -- Add appropriate lower panel
farmbuyer@1 2225 adv_lower (scroll, specials)
farmbuyer@1 2226
farmbuyer@1 2227 -- Finish up
farmbuyer@1 2228 container:AddChild(scroll)
farmbuyer@1 2229 end
farmbuyer@1 2230 end
farmbuyer@1 2231
farmbuyer@1 2232
farmbuyer@1 2233 -- Simply to avoid recreating the same function over and over
farmbuyer@1 2234 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
farmbuyer@1 2235 tabs_OnGroupSelected_func = function (tabs,event,group)
farmbuyer@1 2236 tabs_OnGroupSelected_func_args[1] = tabs
farmbuyer@1 2237 tabs_OnGroupSelected_func_args[3] = group
farmbuyer@1 2238 tabs:ReleaseChildren()
farmbuyer@1 2239 local spec = tabs:GetUserData("special buttons group")
farmbuyer@1 2240 spec:ReleaseChildren()
farmbuyer@1 2241 local h = GUI:Create("Heading")
farmbuyer@1 2242 h:SetFullWidth(true)
farmbuyer@1 2243 h:SetText(_tabtexts[group].title)
farmbuyer@1 2244 spec:AddChild(h)
farmbuyer@76 2245 do
farmbuyer@76 2246 addon.sender_list.sort()
farmbuyer@76 2247 local fmt = "Received broadcast data from %d |4player:players;."
farmbuyer@76 2248 if addon.history_suppress then
farmbuyer@76 2249 -- this is the druid class color reworked into hex
farmbuyer@76 2250 fmt = fmt .. " |cffff7d0aHistory recording suppressed.|r"
farmbuyer@76 2251 end
farmbuyer@76 2252 tabs.titletext:SetFormattedText (fmt, addon.sender_list.activeI)
farmbuyer@76 2253 end
farmbuyer@1 2254 return tabs_OnGroupSelected[group](tabs,spec,group)
farmbuyer@1 2255 --[====[
farmbuyer@1 2256 Unfortunately, :GetHeight() called on anything useful out of a TabGroup
farmbuyer@1 2257 returns the static default size (about 50 pixels) until the refresh
farmbuyer@1 2258 cycle *after* all the frames are shown. Trying to fix it up after a
farmbuyer@1 2259 single OnUpdate doesn't work either. So for now it's all hardcoded.
farmbuyer@1 2260
farmbuyer@1 2261 Using this to determine the actual height of the usable area.
farmbuyer@1 2262 366 pixels
farmbuyer@1 2263 if group == "eoi" then
farmbuyer@1 2264 local stframe = tabs.children[1].frame
farmbuyer@1 2265 print(stframe:GetTop(),"-",stframe:GetBottom(),"=",
farmbuyer@1 2266 stframe:GetTop()-stframe:GetBottom())
farmbuyer@1 2267 print(stframe:GetRight(),"-",stframe:GetLeft(),"=",
farmbuyer@1 2268 stframe:GetRight()-stframe:GetLeft())
farmbuyer@1 2269 end
farmbuyer@1 2270 ]====]
farmbuyer@1 2271 end
farmbuyer@1 2272
farmbuyer@1 2273 --[[
farmbuyer@1 2274 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
farmbuyer@1 2275 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
farmbuyer@1 2276 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
farmbuyer@1 2277 ]]
farmbuyer@1 2278 do
farmbuyer@1 2279 local replacement_colors = { ["+"]="|cffffffff", ["<"]="|cff00ff00", [">"]="|r" }
farmbuyer@1 2280 function mkbutton (opt_widget_type, opt_key, label, status)
farmbuyer@1 2281 if not label then
farmbuyer@1 2282 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_widget_type, opt_key
farmbuyer@1 2283 elseif not status then
farmbuyer@1 2284 opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label
farmbuyer@1 2285 end
farmbuyer@47 2286 local button = assert(GUI:Create(opt_widget_type))
farmbuyer@1 2287 if button.SetText then button:SetText(tostring(label)) end
farmbuyer@1 2288 status = status:gsub("[%+<>]",replacement_colors)
farmbuyer@1 2289 button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out
farmbuyer@1 2290 button:SetCallback("OnLeave", statusy_OnLeave)
farmbuyer@1 2291 -- retrieval key may be specified as nil if all the parameters are given
farmbuyer@1 2292 if opt_key then _d:SetUserData (opt_key, button) end
farmbuyer@1 2293 return button
farmbuyer@1 2294 end
farmbuyer@1 2295 end
farmbuyer@1 2296
farmbuyer@1 2297 --[[
farmbuyer@1 2298 Creates the main window.
farmbuyer@1 2299 ]]
farmbuyer@1 2300 function addon:BuildMainDisplay (opt_tabselect)
farmbuyer@1 2301 if self.display then
farmbuyer@1 2302 -- try to get everything to update, rebuild, refresh... ugh, no
farmbuyer@1 2303 self.display:Hide()
farmbuyer@1 2304 end
farmbuyer@67 2305 if self.NOLOAD then return end -- don't even try
farmbuyer@1 2306
farmbuyer@25 2307 -- This probably causes taint... hm.
farmbuyer@25 2308 local prev_fade_time = UIDROPDOWNMENU_SHOW_TIME
farmbuyer@25 2309 UIDROPDOWNMENU_SHOW_TIME = 4
farmbuyer@25 2310
farmbuyer@47 2311 if dirty_tabs then
farmbuyer@47 2312 self:gui_init(g_loot) -- pointer known to be good by now
farmbuyer@47 2313 self:zero_printed_fenceposts()
farmbuyer@47 2314 end
farmbuyer@47 2315
farmbuyer@1 2316 local display = GUI:Create("Frame")
farmbuyer@1 2317 if _d then
farmbuyer@1 2318 display:SetUserData("eoiST",_d) -- warning! warning! kludge detected!
farmbuyer@1 2319 end
farmbuyer@1 2320 _d = display
farmbuyer@1 2321 self.display = display
farmbuyer@17 2322 display:SetTitle(window_title)
farmbuyer@1 2323 display:SetStatusText(self.status_text)
farmbuyer@1 2324 display:SetLayout("Flow")
farmbuyer@16 2325 display:SetStatusTable{width=900,height=550} -- default height is 500
farmbuyer@47 2326 display:EnableResize(false)
farmbuyer@1 2327 display:SetCallback("OnClose", function(_display)
farmbuyer@25 2328 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
farmbuyer@1 2329 _d = _display:GetUserData("eoiST")
farmbuyer@1 2330 self.display = nil
farmbuyer@1 2331 GUI:Release(_display)
farmbuyer@6 2332 flib.clear()
farmbuyer@1 2333 collectgarbage()
farmbuyer@1 2334 end)
farmbuyer@1 2335
farmbuyer@1 2336 ----- Right-hand panel
farmbuyer@1 2337 local rhs_width = 0.20
farmbuyer@1 2338 local control = GUI:Create("SimpleGroup")
farmbuyer@1 2339 control:SetLayout("Flow")
farmbuyer@1 2340 control:SetRelativeWidth(rhs_width)
farmbuyer@1 2341 control.alignoffset = 25
farmbuyer@1 2342 control:PauseLayout()
farmbuyer@1 2343 local h,b
farmbuyer@1 2344
farmbuyer@1 2345 --- Main ---
farmbuyer@1 2346 h = GUI:Create("Heading")
farmbuyer@1 2347 h:SetFullWidth(true)
farmbuyer@1 2348 h:SetText("Main")
farmbuyer@1 2349 control:AddChild(h)
farmbuyer@1 2350
farmbuyer@1 2351 do
farmbuyer@1 2352 b = mkbutton("Dropdown", nil, "",
farmbuyer@1 2353 [[Enable full tracking, only rebroadcasting, or disable activity altogether.]])
farmbuyer@1 2354 b:SetFullWidth(true)
farmbuyer@1 2355 b:SetLabel("On/Off:")
farmbuyer@1 2356 b:SetList{"Full Tracking", "Broadcasting", "Disabled"}
farmbuyer@1 2357 b:SetValue(self.enabled and 1 or (self.rebroadcast and 2 or 3))
farmbuyer@1 2358 b:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@1 2359 if choice == 1 then self:Activate()
farmbuyer@1 2360 elseif choice == 2 then self:Activate(nil,true)
farmbuyer@1 2361 else self:Deactivate()
farmbuyer@1 2362 end
farmbuyer@1 2363 _w = display:GetUserData('comm_ident')
farmbuyer@1 2364 if _w and _w:IsVisible() then
farmbuyer@1 2365 _w:SetDisabled(self.enabled or self.rebroadcast)
farmbuyer@1 2366 end
farmbuyer@1 2367 _w = display:GetUserData('eoi_bcast_req')
farmbuyer@1 2368 if _w and _w:IsVisible() then
farmbuyer@1 2369 _w:SetDisabled(not self.enabled)
farmbuyer@1 2370 end
farmbuyer@1 2371 end)
farmbuyer@1 2372 control:AddChild(b)
farmbuyer@1 2373 end
farmbuyer@1 2374
farmbuyer@1 2375 b = mkbutton("Dropdown", 'threshold', "",
farmbuyer@1 2376 [[Items greater than or equal to this quality will be tracked/rebroadcast.]])
farmbuyer@1 2377 b:SetFullWidth(true)
farmbuyer@1 2378 b:SetLabel("Threshold:")
farmbuyer@1 2379 b:SetList(self.thresholds)
farmbuyer@1 2380 b:SetValue(self.threshold)
farmbuyer@1 2381 b:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@1 2382 self:SetThreshold(choice)
farmbuyer@1 2383 end)
farmbuyer@1 2384 control:AddChild(b)
farmbuyer@1 2385
farmbuyer@4 2386 b = mkbutton("Clear Loot",
farmbuyer@1 2387 [[+Erases> all current loot information and generated text (but not saved texts).]])
farmbuyer@1 2388 b:SetFullWidth(true)
farmbuyer@1 2389 b:SetCallback("OnClick", function()
farmbuyer@1 2390 StaticPopup_Show("OUROL_CLEAR").data = self
farmbuyer@1 2391 end)
farmbuyer@1 2392 control:AddChild(b)
farmbuyer@1 2393
farmbuyer@1 2394 b = GUI:Create("Spacer")
farmbuyer@1 2395 b:SetFullWidth(true)
farmbuyer@16 2396 b:SetHeight(10)
farmbuyer@1 2397 control:AddChild(b)
farmbuyer@1 2398
farmbuyer@1 2399 --[[
farmbuyer@1 2400 --- Saved Texts ---
farmbuyer@1 2401 [ Save Current As... ]
farmbuyer@1 2402 saved1
farmbuyer@1 2403 saved2
farmbuyer@1 2404 ...
farmbuyer@1 2405 [ Load ] [ Delete ]
farmbuyer@1 2406 ]]
farmbuyer@1 2407 h = GUI:Create("Heading")
farmbuyer@1 2408 h:SetFullWidth(true)
farmbuyer@1 2409 h:SetText("Saved Texts")
farmbuyer@1 2410 control:AddChild(h)
farmbuyer@1 2411 b = mkbutton("Save Current As...",
farmbuyer@1 2412 [[Save forum/attendance/etc texts for later retrieval. Main loot information not included.]])
farmbuyer@1 2413 b:SetFullWidth(true)
farmbuyer@1 2414 b:SetCallback("OnClick", function()
farmbuyer@1 2415 StaticPopup_Show "OUROL_SAVE_SAVEAS"
farmbuyer@1 2416 _d:Hide()
farmbuyer@1 2417 end)
farmbuyer@1 2418 control:AddChild(b)
farmbuyer@1 2419
farmbuyer@16 2420 do
farmbuyer@16 2421 local scontainer = GUI:Create("SimpleGroup")
farmbuyer@16 2422 scontainer:SetFullWidth(true)
farmbuyer@16 2423 scontainer:SetFullHeight(false)
farmbuyer@16 2424 scontainer:SetAutoAdjustHeight(false)
farmbuyer@16 2425 scontainer:SetHeight(40) -- no relative height available anymore
farmbuyer@16 2426 scontainer:SetLayout("Fill")
farmbuyer@16 2427 local scroll = GUI:Create("ScrollFrame")
farmbuyer@16 2428 scroll:SetLayout("List")
farmbuyer@16 2429 local saved = self:check_saved_table(--[[silent_on_empty=]]true)
farmbuyer@16 2430 if saved then for i,s in ipairs(saved) do
farmbuyer@16 2431 local il = GUI:Create("InteractiveLabel")
farmbuyer@16 2432 il:SetFullWidth(true)
farmbuyer@16 2433 il:SetText(s.name)
farmbuyer@16 2434 il:SetUserData("num",i)
farmbuyer@16 2435 il:SetHighlight(1,1,1,0.4)
farmbuyer@16 2436 local str = ("%s %d entries %s"):format(s.date,s.count,s.name)
farmbuyer@16 2437 il:SetCallback("OnEnter", function() setstatus(str) end)
farmbuyer@16 2438 il:SetCallback("OnLeave", statusy_OnLeave)
farmbuyer@16 2439 il:SetCallback("OnClick", function(_il)
farmbuyer@16 2440 local prev = _d:GetUserData("saved selection")
farmbuyer@16 2441 if prev then
farmbuyer@16 2442 prev.highlight:Hide()
farmbuyer@16 2443 prev:SetColor()
farmbuyer@16 2444 end
farmbuyer@16 2445 _il:SetColor(0,1,0)
farmbuyer@16 2446 _il.highlight:Show()
farmbuyer@16 2447 _d:SetUserData("saved selection",_il)
farmbuyer@16 2448 _d:GetUserData("Load"):SetDisabled(false)
farmbuyer@16 2449 _d:GetUserData("Delete"):SetDisabled(false)
farmbuyer@16 2450 end)
farmbuyer@16 2451 scroll:AddChild(il)
farmbuyer@16 2452 end end
farmbuyer@16 2453 scontainer:AddChild(scroll)
farmbuyer@16 2454 control:AddChild(scontainer)
farmbuyer@16 2455 end
farmbuyer@1 2456
farmbuyer@1 2457 b = mkbutton("Load",
farmbuyer@1 2458 [[Load previously saved text. +REPLACES> all current loot information!]])
farmbuyer@1 2459 b:SetRelativeWidth(0.5)
farmbuyer@1 2460 b:SetCallback("OnClick", function()
farmbuyer@1 2461 local num = _d:GetUserData("saved selection"):GetUserData("num")
farmbuyer@1 2462 self:save_restore(num)
farmbuyer@1 2463 self:BuildMainDisplay()
farmbuyer@1 2464 end)
farmbuyer@1 2465 b:SetDisabled(true)
farmbuyer@1 2466 control:AddChild(b)
farmbuyer@1 2467 b = mkbutton("Delete",
farmbuyer@1 2468 [[Delete previously saved text.]])
farmbuyer@1 2469 b:SetRelativeWidth(0.5)
farmbuyer@1 2470 b:SetCallback("OnClick", function()
farmbuyer@1 2471 local num = _d:GetUserData("saved selection"):GetUserData("num")
farmbuyer@1 2472 self:save_delete(num)
farmbuyer@1 2473 self:BuildMainDisplay()
farmbuyer@1 2474 end)
farmbuyer@1 2475 b:SetDisabled(true)
farmbuyer@1 2476 control:AddChild(b)
farmbuyer@1 2477
farmbuyer@1 2478 b = GUI:Create("Spacer")
farmbuyer@1 2479 b:SetFullWidth(true)
farmbuyer@16 2480 b:SetHeight(10)
farmbuyer@1 2481 control:AddChild(b)
farmbuyer@1 2482
farmbuyer@1 2483 -- Other stuff on right-hand side
farmbuyer@1 2484 local tab_specials = GUI:Create("SimpleGroup")
farmbuyer@1 2485 tab_specials:SetLayout("Flow")
farmbuyer@1 2486 tab_specials:SetFullWidth(true)
farmbuyer@1 2487 control:AddChild(tab_specials)
farmbuyer@1 2488 control:ResumeLayout()
farmbuyer@1 2489
farmbuyer@1 2490 ----- Left-hand group
farmbuyer@1 2491 local tabs = GUI:Create("TabGroup")
farmbuyer@1 2492 tabs:SetLayout("Flow")
farmbuyer@1 2493 tabs.alignoffset = 25
farmbuyer@49 2494 local titletext_orig_fo = tabs.titletext:GetFontObject()
farmbuyer@49 2495 tabs.titletext:SetFontObject(GameFontNormalSmall)
farmbuyer@49 2496 tabs:SetCallback("OnRelease", function(_tabs)
farmbuyer@49 2497 tabs.titletext:SetFontObject(titletext_orig_fo)
farmbuyer@49 2498 end)
farmbuyer@1 2499 tabs:SetRelativeWidth(0.99-rhs_width)
farmbuyer@1 2500 tabs:SetFullHeight(true)
farmbuyer@1 2501 tabs:SetTabs(tabgroup_tabs)
farmbuyer@1 2502 tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func)
farmbuyer@1 2503 tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab)
farmbuyer@1 2504 setstatus(_tabtexts[value].desc)
farmbuyer@1 2505 end)
farmbuyer@1 2506 tabs:SetCallback("OnTabLeave", statusy_OnLeave)
farmbuyer@1 2507 tabs:SetUserData("special buttons group",tab_specials)
farmbuyer@76 2508 tabs:SelectTab((opt_tabselect and #opt_tabselect>0)
farmbuyer@76 2509 and opt_tabselect or "eoi")
farmbuyer@1 2510
farmbuyer@1 2511 display:AddChildren (tabs, control)
farmbuyer@1 2512 display:ApplyStatus()
farmbuyer@1 2513
farmbuyer@1 2514 display:Show() -- without this, only appears every *other* function call
farmbuyer@1 2515 return display
farmbuyer@1 2516 end
farmbuyer@1 2517
farmbuyer@1 2518 function addon:OpenMainDisplayToTab (text)
farmbuyer@44 2519 text = '^'..text:lower()
farmbuyer@1 2520 for tab,v in pairs(_tabtexts) do
farmbuyer@1 2521 if v.title:lower():find(text) then
farmbuyer@1 2522 self:BuildMainDisplay(tab)
farmbuyer@1 2523 return true
farmbuyer@1 2524 end
farmbuyer@1 2525 end
farmbuyer@1 2526 end
farmbuyer@1 2527
farmbuyer@1 2528 -- Essentially a re-click on the current tab (if the current tab were clickable).
farmbuyer@1 2529 function addon:redisplay ()
farmbuyer@1 2530 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
farmbuyer@1 2531 end
farmbuyer@1 2532
farmbuyer@1 2533
farmbuyer@1 2534 ------ Popup dialogs
farmbuyer@75 2535 local function build_my_slider_widget()
farmbuyer@75 2536 local s = CreateFrame("Slider", "OuroLootSlider", nil, "OptionsSliderTemplate")
farmbuyer@75 2537 s.text = OuroLootSliderText
farmbuyer@75 2538 s.low = OuroLootSliderLow
farmbuyer@75 2539 s.high = OuroLootSliderHigh
farmbuyer@75 2540 s:SetScript("OnValueChanged", function (_s, value)
farmbuyer@75 2541 _s.value = value -- conveniently, this is already of numeric type
farmbuyer@75 2542 --_s.text:SetText(tostring(value))
farmbuyer@75 2543 if _s.DoOnValueChanged then
farmbuyer@75 2544 _s:DoOnValueChanged()
farmbuyer@75 2545 end
farmbuyer@75 2546 end)
farmbuyer@75 2547 build_my_slider_widget = nil
farmbuyer@75 2548 return s
farmbuyer@75 2549 end
farmbuyer@75 2550
farmbuyer@1 2551 StaticPopupDialogs["OUROL_CLEAR"] = flib.StaticPopup{
farmbuyer@1 2552 text = "Clear current loot information and text?",
farmbuyer@16 2553 button1 = YES,
farmbuyer@16 2554 button2 = NO,
farmbuyer@1 2555 OnAccept = function (dialog, addon)
farmbuyer@1 2556 addon:Clear(--[[verbose_p=]]true)
farmbuyer@1 2557 end,
farmbuyer@1 2558 }
farmbuyer@1 2559
farmbuyer@37 2560 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
farmbuyer@37 2561 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
farmbuyer@75 2562 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex
farmbuyer@75 2563 .. "%s|r, and generate it anew from current loot?",
farmbuyer@37 2564 button1 = YES,
farmbuyer@37 2565 button2 = NO,
farmbuyer@37 2566 OnAccept = function (dialog, addon, data2)
farmbuyer@37 2567 data2(addon)
farmbuyer@37 2568 addon:Print("%s history has been regenerated.", addon.history.realm)
farmbuyer@37 2569 addon:redisplay()
farmbuyer@37 2570 end,
farmbuyer@37 2571 }
farmbuyer@37 2572
farmbuyer@16 2573 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
farmbuyer@37 2574 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
farmbuyer@37 2575 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
farmbuyer@16 2576 button1 = YES,
farmbuyer@16 2577 button2 = NO,
farmbuyer@16 2578 OnAccept = function (dialog, addon, data2)
farmbuyer@16 2579 data2(addon)
farmbuyer@16 2580 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
farmbuyer@16 2581 addon:redisplay()
farmbuyer@16 2582 end,
farmbuyer@16 2583 }
farmbuyer@16 2584
farmbuyer@16 2585 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
farmbuyer@37 2586 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
farmbuyer@75 2587 text = "This will erase all but the latest "
farmbuyer@75 2588 .. ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
farmbuyer@75 2589 .. "%s|r for each player on "
farmbuyer@75 2590 .. ITEM_QUALITY_COLORS[5].hex .. "%s|r. " .. CONTINUE .. "?",
farmbuyer@16 2591 button1 = YES,
farmbuyer@16 2592 button2 = NO,
farmbuyer@75 2593 OnShow = function (dialog, addon)
farmbuyer@75 2594 local thistable = StaticPopupDialogs[dialog.which]
farmbuyer@75 2595 -- StaticPopup_Resize does not take extraFrame into account, so we
farmbuyer@75 2596 -- hook the sizing method that _Resize calls at the end.
farmbuyer@75 2597 dialog.saved_setheight = dialog.SetHeight
farmbuyer@75 2598 dialog.SetHeight = function (d, h)
farmbuyer@75 2599 return d.saved_setheight(d,h+35)
farmbuyer@75 2600 end
farmbuyer@75 2601 dialog.extraFrame:ClearAllPoints()
farmbuyer@75 2602 dialog.extraFrame:SetPoint("TOP", dialog.text, "BOTTOM")
farmbuyer@75 2603 dialog.extraFrame:SetWidth(150)
farmbuyer@75 2604 dialog.extraFrame:SetHeight(35)
farmbuyer@75 2605 dialog.extraFrame:Show()
farmbuyer@75 2606 local slider = _G.OuroLootSlider or build_my_slider_widget()
farmbuyer@75 2607 slider.DoOnValueChanged = function(s)
farmbuyer@75 2608 dialog.text:SetFormattedText (thistable.text,
farmbuyer@75 2609 s.value == 1 and "single entry" or (s.value .. " entries"),
farmbuyer@75 2610 addon.history.realm)
farmbuyer@75 2611 StaticPopup_Resize (dialog, "OUROL_HIST_PREEN")
farmbuyer@75 2612 end
farmbuyer@75 2613 slider:SetOrientation('HORIZONTAL')
farmbuyer@75 2614 slider:SetMinMaxValues(1,30)
farmbuyer@75 2615 slider:SetValueStep(1)
farmbuyer@75 2616 slider.low:SetText("1")
farmbuyer@75 2617 slider.high:SetText("30")
farmbuyer@75 2618 --slider.tooltipText = ???
farmbuyer@75 2619 slider:SetParent(dialog.extraFrame)
farmbuyer@75 2620 slider:ClearAllPoints()
farmbuyer@75 2621 slider:SetPoint("TOPLEFT",dialog.extraFrame,"TOPLEFT",0, -15)
farmbuyer@75 2622 slider:SetPoint("BOTTOMRIGHT",dialog.extraFrame,"BOTTOMRIGHT",0, 0)
farmbuyer@75 2623 slider:Show()
farmbuyer@75 2624 -- This causes OnValueChanged to fire, reformatting the text. Except
farmbuyer@75 2625 -- IF the slider has already been shown, and IF at the time it was hidden
farmbuyer@75 2626 -- it had the same value here, THEN there is technically no "change"
farmbuyer@75 2627 -- and no event is fired. We work around this clever optimization by
farmbuyer@75 2628 -- doing a pair of set's, forcing the last one to fire OVC.
farmbuyer@75 2629 slider:SetValue(1)
farmbuyer@75 2630 slider:SetValue(5)
farmbuyer@75 2631 end,
farmbuyer@75 2632 OnAccept = function (dialog, addon, callback)
farmbuyer@75 2633 local howmany = assert(tonumber(_G.OuroLootSlider.value))
farmbuyer@75 2634 callback (addon, howmany)
farmbuyer@75 2635 addon:Print("All loot prior to the most recent %d |4entry:entries; has been erased.", howmany)
farmbuyer@16 2636 addon:redisplay()
farmbuyer@16 2637 end,
farmbuyer@75 2638 OnHide = function (dialog, addon)
farmbuyer@75 2639 dialog.SetHeight = nil
farmbuyer@75 2640 dialog.saved_setheight = nil
farmbuyer@75 2641 dialog.extraFrame:ClearAllPoints()
farmbuyer@75 2642 _G.OuroLootSlider:Hide() -- parent is hidden, why is this required?
farmbuyer@75 2643 _G.OuroLootSlider:ClearAllPoints()
farmbuyer@75 2644 _G.OuroLootSlider:SetParent(nil)
farmbuyer@75 2645 end,
farmbuyer@16 2646 }
farmbuyer@16 2647
farmbuyer@27 2648 StaticPopupDialogs["OUROL_URL"] = { --flib.StaticPopup{
farmbuyer@27 2649 text = "Use Control-C or equivalent to copy this URL to your system clipboard:",
farmbuyer@27 2650 button1 = OKAY,
farmbuyer@27 2651 timeout = 0,
farmbuyer@27 2652 whileDead = true,
farmbuyer@27 2653 hideOnEscape = true,
farmbuyer@27 2654 enterClicksFirstButton = true,
farmbuyer@27 2655 hasEditBox = true,
farmbuyer@27 2656 editBoxWidth = 350,
farmbuyer@53 2657 preferredIndex = 3,
farmbuyer@27 2658 OnShow = function (dialog, url)
farmbuyer@27 2659 dialog.editBox:SetText(url)
farmbuyer@27 2660 dialog.editBox:SetFocus()
farmbuyer@27 2661 dialog.editBox:HighlightText()
farmbuyer@27 2662 end,
farmbuyer@27 2663 }
farmbuyer@27 2664
farmbuyer@1 2665 StaticPopupDialogs["OUROL_REMIND"] = flib.StaticPopup{
farmbuyer@69 2666 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 2667 button1 = "Activate recording", -- "accept", left
farmbuyer@69 2668 button2 = "Broadcast Only", -- "cancel", middle
farmbuyer@69 2669 button3 = HELP_LABEL, -- "alt", right
farmbuyer@1 2670 OnAccept = function (dialog, addon)
farmbuyer@1 2671 addon:Activate()
farmbuyer@1 2672 end,
farmbuyer@69 2673 noCancelOnEscape = true,
farmbuyer@69 2674 OnCancel = function (dialog, addon)
farmbuyer@1 2675 addon:Activate(nil,true)
farmbuyer@1 2676 end,
farmbuyer@69 2677 OnAlt = function (dialog, addon)
farmbuyer@1 2678 -- hitting escape also calls this, but the 3rd arg would be "clicked"
farmbuyer@1 2679 -- in both cases, not useful here.
farmbuyer@1 2680 local helpbutton = dialog.button2
farmbuyer@1 2681 local ismousing = MouseIsOver(helpbutton)
farmbuyer@1 2682 if ismousing then
farmbuyer@1 2683 -- they actually clicked the button (or at least the mouse was over "Help"
farmbuyer@1 2684 -- when they hit escape... sigh)
farmbuyer@1 2685 addon:BuildMainDisplay('help')
farmbuyer@1 2686 else
farmbuyer@1 2687 addon.popped = true
farmbuyer@1 2688 end
farmbuyer@1 2689 end,
farmbuyer@1 2690 }
farmbuyer@1 2691
farmbuyer@69 2692 -- Callback for each Next/Accept stage of inserting a new loot or boss row via
farmbuyer@69 2693 -- dropdown. Thanks to noCancelOnReuse, each Show done here will technically
farmbuyer@69 2694 -- Hide and redisplay the same dialog, passing along the same 'data' structure
farmbuyer@69 2695 -- each time. The topmost call to our OnAccept will then finish by hiding the
farmbuyer@69 2696 -- (very last) dialog.
farmbuyer@69 2697 --
farmbuyer@69 2698 -- This is really, really hideous to read.
farmbuyer@69 2699 local function eoi_st_insert_OnAccept_boss (dialog, data, data2)
farmbuyer@69 2700 if data.all_done then
farmbuyer@69 2701 -- It'll probably be the final entry in the table, but there might have
farmbuyer@73 2702 -- been real loot happening while the user was clicking and typing.
farmbuyer@69 2703 local boss_index = addon._addBossEntry{
farmbuyer@69 2704 kind = 'boss',
farmbuyer@69 2705 bossname = (OuroLootSV_opts.snarky_boss and addon.boss_abbrev[data.name] or data.name) or data.name,
farmbuyer@69 2706 reason = 'kill',
farmbuyer@69 2707 instance = data.instance,
farmbuyer@69 2708 duration = 0,
farmbuyer@69 2709 maxsize = data.max_raid_size,
farmbuyer@69 2710 raidersnap = data.yes_snap or {},
farmbuyer@69 2711 }
farmbuyer@69 2712 local entry = tremove(g_loot,boss_index)
farmbuyer@69 2713 tinsert(g_loot,data.rowindex,entry)
farmbuyer@69 2714 addon:_mark_boss_kill(data.rowindex)
farmbuyer@69 2715 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
farmbuyer@69 2716 dialog.data = nil -- free up memory
farmbuyer@69 2717 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
farmbuyer@69 2718 return
farmbuyer@69 2719 end
farmbuyer@69 2720
farmbuyer@69 2721 -- third click
farmbuyer@69 2722 if data.name and data.instance then
farmbuyer@69 2723 data.all_done = true
farmbuyer@69 2724 -- this is how we distinguish OnAccept from OnCancel ("clicked"); the
farmbuyer@69 2725 -- 3rd param is handled all in StaticPopup_OnClick
farmbuyer@69 2726 if data2 ~= 'clicked' then
farmbuyer@69 2727 data.yes_snap = data.maybe_snap
farmbuyer@69 2728 end
farmbuyer@69 2729 return eoi_st_insert_OnAccept_boss (dialog, data)
farmbuyer@69 2730 end
farmbuyer@69 2731
farmbuyer@69 2732 local text = dialog.editBox:GetText():trim()
farmbuyer@69 2733
farmbuyer@69 2734 -- second click
farmbuyer@69 2735 if data.name and text then
farmbuyer@69 2736 data.instance = text
farmbuyer@69 2737 -- not "resuing" this dialog in the same sense as with loot
farmbuyer@69 2738 dialog.data = nil
farmbuyer@69 2739 dialog:Hide()
farmbuyer@69 2740 local getsnap = StaticPopup_Show("OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP")
farmbuyer@69 2741 getsnap.data = data
farmbuyer@69 2742 return true
farmbuyer@69 2743 end
farmbuyer@69 2744
farmbuyer@69 2745 -- first click
farmbuyer@69 2746 if text then
farmbuyer@69 2747 data.name = text
farmbuyer@69 2748 local maybe_instance
farmbuyer@69 2749 data.maybe_snap, data.max_raid_size, maybe_instance = addon:snapshot_raid()
farmbuyer@69 2750 local getinstance = StaticPopup_Show("OUROL_EOI_INSERT","instance")
farmbuyer@69 2751 getinstance.data = data
farmbuyer@69 2752 getinstance.editBox:SetText(maybe_instance)
farmbuyer@69 2753 -- This suppresses auto-hide (which would cause the getinstance dialog
farmbuyer@69 2754 -- to go away), but only when mouse clicking. OnEnter is on its own.
farmbuyer@69 2755 return true
farmbuyer@69 2756 end
farmbuyer@69 2757 end
farmbuyer@69 2758
farmbuyer@69 2759 local function eoi_st_insert_OnAccept_loot (dialog, data)
farmbuyer@69 2760 if data.all_done then
farmbuyer@69 2761 --local real_rebroadcast, real_enabled = addon.rebroadcast, addon.enabled
farmbuyer@69 2762 --g_rebroadcast, g_enabled = false, true
farmbuyer@69 2763 data.display:Hide()
farmbuyer@73 2764 local loot_index = assert(addon:CHAT_MSG_LOOT ("manual", data.recipient, data.name, data.notes))
farmbuyer@69 2765 --g_rebroadcast, g_enabled = real_g_rebroadcast, real_g_enabled
farmbuyer@69 2766 local entry = tremove(g_loot,loot_index)
farmbuyer@69 2767 tinsert(g_loot,data.rowindex,entry)
farmbuyer@69 2768 --data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex)
farmbuyer@69 2769 addon:_fill_out_eoi_data(data.rowindex)
farmbuyer@69 2770 addon:BuildMainDisplay()
farmbuyer@69 2771 dialog.data = nil
farmbuyer@69 2772 addon:Print("Inserted %s %s (entry %d).", data.kind, data.name, data.rowindex)
farmbuyer@69 2773 return
farmbuyer@69 2774 end
farmbuyer@69 2775
farmbuyer@69 2776 local text = dialog.editBox:GetText():trim()
farmbuyer@69 2777
farmbuyer@69 2778 -- third click
farmbuyer@69 2779 if data.name and data.recipient and text then
farmbuyer@69 2780 data.notes = (text ~= "<none>") and text or nil
farmbuyer@69 2781 data.all_done = true
farmbuyer@69 2782 return eoi_st_insert_OnAccept_loot (dialog, data)
farmbuyer@69 2783 end
farmbuyer@69 2784
farmbuyer@69 2785 -- second click
farmbuyer@69 2786 if data.name and text then
farmbuyer@69 2787 data.recipient = text
farmbuyer@69 2788 local getnotes = StaticPopup_Show("OUROL_EOI_INSERT","notes")
farmbuyer@69 2789 getnotes.data = data
farmbuyer@69 2790 getnotes.editBox:SetText("<none>")
farmbuyer@69 2791 getnotes.editBox:HighlightText()
farmbuyer@69 2792 return true
farmbuyer@69 2793 end
farmbuyer@69 2794
farmbuyer@69 2795 -- first click
farmbuyer@69 2796 if text then
farmbuyer@69 2797 data.name = text
farmbuyer@69 2798 dialog:Hide() -- technically a "different" one about to be shown
farmbuyer@69 2799 local getrecipient = StaticPopup_Show("OUROL_EOI_INSERT","recipient")
farmbuyer@69 2800 getrecipient.data = data
farmbuyer@69 2801 getrecipient.editBox:SetText("")
farmbuyer@69 2802 return true
farmbuyer@69 2803 end
farmbuyer@69 2804 end
farmbuyer@69 2805
farmbuyer@69 2806 local function eoi_st_insert_OnAccept (dialog, data)
farmbuyer@69 2807 if data.kind == 'boss' then
farmbuyer@69 2808 return eoi_st_insert_OnAccept_boss (dialog, data)
farmbuyer@69 2809 elseif data.kind == 'loot' then
farmbuyer@69 2810 return eoi_st_insert_OnAccept_loot (dialog, data)
farmbuyer@69 2811 end
farmbuyer@69 2812 end
farmbuyer@69 2813
farmbuyer@1 2814 -- The data member here is a table built with:
farmbuyer@1 2815 -- {rowindex=<GUI row receiving click>, display=_d, kind=<loot/boss>}
farmbuyer@1 2816 do
farmbuyer@1 2817 local t = flib.StaticPopup{
farmbuyer@75 2818 text = "Enter name of new %s, then click "..CONTINUE.." or press Enter:",
farmbuyer@75 2819 button1 = CONTINUE.." ->",
farmbuyer@1 2820 button2 = CANCEL,
farmbuyer@1 2821 hasEditBox = true,
farmbuyer@16 2822 editBoxWidth = 350,
farmbuyer@1 2823 maxLetters = 50,
farmbuyer@1 2824 noCancelOnReuse = true,
farmbuyer@1 2825 --[[ XXX still needed?
farmbuyer@1 2826 OnShow = function(dialog)
farmbuyer@1 2827 dialog.wideEditBox:SetText("")
farmbuyer@1 2828 dialog.wideEditBox:SetFocus()
farmbuyer@1 2829 end,]]
farmbuyer@1 2830 }
farmbuyer@1 2831 t.EditBoxOnEnterPressed = function(editbox)
farmbuyer@39 2832 if editbox:GetText() == "" then return end
farmbuyer@1 2833 local dialog = editbox:GetParent()
farmbuyer@1 2834 if not eoi_st_insert_OnAccept (dialog, dialog.data) then
farmbuyer@1 2835 dialog:Hide() -- replicate OnAccept click behavior
farmbuyer@1 2836 end
farmbuyer@1 2837 end
farmbuyer@1 2838 t.enterClicksFirstButton = nil -- no effect with editbox focused
farmbuyer@1 2839 t.OnAccept = eoi_st_insert_OnAccept
farmbuyer@1 2840 StaticPopupDialogs["OUROL_EOI_INSERT"] = t
farmbuyer@1 2841
farmbuyer@69 2842 -- This seems to be gratuitous use of metatables, really.
farmbuyer@1 2843 local OEIL = {
farmbuyer@75 2844 text = "Paste the new item into here, then click "..CONTINUE.." or press Enter:",
farmbuyer@1 2845 __index = StaticPopupDialogs["OUROL_EOI_INSERT"]
farmbuyer@1 2846 }
farmbuyer@1 2847 StaticPopupDialogs["OUROL_EOI_INSERT_LOOT"] = setmetatable(OEIL,OEIL)
farmbuyer@1 2848
farmbuyer@1 2849 hooksecurefunc("ChatEdit_InsertLink", function (link,...)
farmbuyer@1 2850 local dialogname = StaticPopup_Visible "OUROL_EOI_INSERT_LOOT"
farmbuyer@1 2851 if dialogname then
farmbuyer@16 2852 _G[dialogname.."EditBox"]:SetText(link)
farmbuyer@1 2853 return true
farmbuyer@1 2854 end
farmbuyer@1 2855 end)
farmbuyer@69 2856
farmbuyer@69 2857 t = flib.StaticPopup{
farmbuyer@69 2858 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
farmbuyer@69 2859 text = "Include a snapshot of the " .. ITEM_QUALITY_COLORS[5].hex
farmbuyer@69 2860 .. "CURRENT|r raid?\n\nClicking '" .. YES .. "' will allow this entry to "
farmbuyer@69 2861 .. "appear in attendance lists, but with the roster as it is NOW, not as it "
farmbuyer@69 2862 .. "was THEN. Clicking '" .. NO .."' means this kill cannot be included in "
farmbuyer@69 2863 .. "attendance.\n\n(Enter = '" .. YES .."', Escape = '" .. CANCEL .. "')",
farmbuyer@69 2864 button1 = YES, -- "accept", left
farmbuyer@69 2865 button2 = NO, -- "cancel", middle
farmbuyer@69 2866 button3 = CANCEL, -- "alt", right
farmbuyer@69 2867 }
farmbuyer@69 2868 -- Hitting Escape still hides the frame, but doesn't run OnCancel (which
farmbuyer@69 2869 -- is for the "No" button, not the "Cancel"/OnAlt button). Dizzy yet?
farmbuyer@69 2870 t.noCancelOnEscape = true
farmbuyer@69 2871 t.OnAccept = eoi_st_insert_OnAccept_boss
farmbuyer@69 2872 t.OnCancel = eoi_st_insert_OnAccept_boss
farmbuyer@69 2873 StaticPopupDialogs["OUROL_EOI_INSERT_INCLUDE_RAIDERSNAP"] = t
farmbuyer@1 2874 end
farmbuyer@1 2875
farmbuyer@1 2876 StaticPopupDialogs["OUROL_REASSIGN_ENTER"] = flib.StaticPopup{
farmbuyer@1 2877 text = "Enter the player name:",
farmbuyer@1 2878 button1 = ACCEPT,
farmbuyer@1 2879 button2 = CANCEL,
farmbuyer@1 2880 hasEditBox = true,
farmbuyer@1 2881 --[[ XXX needed?
farmbuyer@1 2882 OnShow = function(dialog)
farmbuyer@1 2883 dialog.editBox:SetText("")
farmbuyer@1 2884 dialog.editBox:SetFocus()
farmbuyer@1 2885 end,]]
farmbuyer@1 2886 OnAccept = function(dialog, data)
farmbuyer@1 2887 local name = dialog.usertext --editBox:GetText()
farmbuyer@24 2888 addon:reassign_loot (data.index, name)
farmbuyer@1 2889 data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.index)
farmbuyer@1 2890 end,
farmbuyer@1 2891 }
farmbuyer@1 2892
farmbuyer@1 2893 StaticPopupDialogs["OUROL_SAVE_SAVEAS"] = flib.StaticPopup{
farmbuyer@1 2894 text = "Enter a name for the loot collection:",
farmbuyer@1 2895 button1 = ACCEPT,
farmbuyer@1 2896 button2 = CANCEL,
farmbuyer@1 2897 hasEditBox = true,
farmbuyer@1 2898 maxLetters = 30,
farmbuyer@1 2899 --[[ XXX
farmbuyer@1 2900 OnShow = function(dialog)
farmbuyer@1 2901 dialog.editBox:SetText("")
farmbuyer@1 2902 dialog.editBox:SetFocus()
farmbuyer@1 2903 end,]]
farmbuyer@1 2904 OnAccept = function(dialog)--, data)
farmbuyer@1 2905 local name = dialog.usertext --editBox:GetText()
farmbuyer@1 2906 addon:save_saveas(name)
farmbuyer@1 2907 addon:BuildMainDisplay()
farmbuyer@1 2908 end,
farmbuyer@1 2909 OnCancel = function(dialog)--, data, reason)
farmbuyer@1 2910 addon:BuildMainDisplay()
farmbuyer@1 2911 end,
farmbuyer@1 2912 --[[XXX
farmbuyer@1 2913 EditBoxOnEnterPressed = function(editbox)
farmbuyer@1 2914 local dialog = editbox:GetParent()
farmbuyer@1 2915 StaticPopupDialogs["OUROL_SAVE_SAVEAS"].OnAccept (dialog, dialog.data)
farmbuyer@1 2916 dialog:Hide()
farmbuyer@1 2917 end,]]
farmbuyer@1 2918 }
farmbuyer@1 2919
farmbuyer@25 2920
farmbuyer@25 2921 -- Workaround this bug: http://us.battle.net/wow/en/forum/topic/3278901991
farmbuyer@25 2922 if true then
farmbuyer@25 2923 -- Verbatim copy of UIDropDownMenuTemplates.xml:155 or so, except as
farmbuyer@25 2924 -- tagged with CHANGE.
farmbuyer@25 2925 local function onenter (self, motion)
farmbuyer@25 2926 if ( self.hasArrow ) then
farmbuyer@25 2927 local level = self:GetParent():GetID() + 1;
farmbuyer@25 2928 local listFrame = _G["DropDownList"..level];
farmbuyer@25 2929 if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
farmbuyer@25 2930 ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
farmbuyer@25 2931 end
farmbuyer@25 2932 else
farmbuyer@25 2933 CloseDropDownMenus(self:GetParent():GetID() + 1);
farmbuyer@25 2934 end
farmbuyer@25 2935 _G[self:GetName().."Highlight"]:Show();
farmbuyer@25 2936 UIDropDownMenu_StopCounting(self:GetParent());
farmbuyer@25 2937 if ( self.tooltipTitle ) then
farmbuyer@25 2938 if ( self.tooltipOnButton ) then
farmbuyer@25 2939 GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
farmbuyer@25 2940 GameTooltip:AddLine(self.tooltipTitle, 1.0, 1.0, 1.0);
farmbuyer@25 2941 GameTooltip:AddLine(self.tooltipText, nil,nil,nil,1); -- CHANGE added nil->1 arguments
farmbuyer@25 2942 GameTooltip:Show();
farmbuyer@25 2943 else
farmbuyer@25 2944 GameTooltip_AddNewbieTip(self, self.tooltipTitle, 1.0, 1.0, 1.0, self.tooltipText, 1);
farmbuyer@25 2945 end
farmbuyer@25 2946 end
farmbuyer@25 2947 end
farmbuyer@25 2948 -- end verbatime copy
farmbuyer@25 2949
farmbuyer@25 2950 for i = 1, UIDROPDOWNMENU_MAXLEVELS do
farmbuyer@25 2951 local list = _G["DropDownList"..i]
farmbuyer@25 2952 if list then
farmbuyer@25 2953 for j = 1, UIDROPDOWNMENU_MAXBUTTONS do
farmbuyer@25 2954 local button = _G["DropDownList"..i.."Button"..j]
farmbuyer@25 2955 if button then
farmbuyer@25 2956 --print("button fixup",i,j)
farmbuyer@25 2957 button:SetScript("OnEnter",onenter)
farmbuyer@25 2958 end
farmbuyer@25 2959 end
farmbuyer@25 2960 end
farmbuyer@25 2961 end
farmbuyer@25 2962 end
farmbuyer@25 2963
farmbuyer@1 2964 -- vim:noet