annotate gui.lua @ 54:6d5fcbdc0590

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