annotate gui.lua @ 78:f8118aa5fbb8

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