annotate gui.lua @ 7:9a37bd40eb5e

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