annotate gui.lua @ 11:952c3ac0e783

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