annotate gui.lua @ 51:857aea8ae33d

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