annotate gui.lua @ 84:c87bf3e756f3

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