annotate gui.lua @ 49:fd3dd12f96ce

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