annotate gui.lua @ 25:cb9635999171

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