annotate gui.lua @ 19:f560cf82e7d3

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