annotate gui.lua @ 56:fcc0d0ff5832

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