annotate gui.lua @ 3:2753b9763882

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