annotate gui.lua @ 5:7adbc59de8fe

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