annotate Gui.lua @ 81:62805e6b46c5

Fleshing out the UI for those without the addon. Announcements in the raid, bidding via whisper.
author John@Yosemite-PC
date Fri, 13 Apr 2012 22:09:17 -0400
parents 7b8fcea357d2
children db7e4ee34dce
rev   line source
John@38 1 local AceGUI = LibStub("AceGUI-3.0")
John@42 2 local bsk=bsk
John@42 3 local _G=_G
John@42 4 local table=table
John@42 5 local pairs=pairs
John@65 6 local setmetatable=setmetatable
John@42 7 local ipairs=ipairs
John@42 8 local string=string
John@67 9 local sformat=string.format
John@42 10 local tostring=tostring
John@42 11 local type=type
John@42 12 local getn=getn
John@42 13 setfenv(1,bsk)
John@1 14
John@69 15 -- todo: switching lists should close a presently-open bid
John@69 16
John@56 17 local copy = function(t)
John@56 18 local c = {}
John@56 19 if not t then return c end
John@56 20 for i,v in pairs(t) do c[i] = v end
John@56 21 return c
John@56 22 end
John@56 23 local colorize = function(str,color)
John@56 24 if str==nil or str=="" then return "" end
John@56 25 if type(color) == "table" then
John@56 26 color = string.format("%02x%02x%02x",255*color.r,255*color.g,255*color.b)
John@56 27 end
John@56 28 if color == nil then return str end
John@56 29 return "|cff"..tostring(color or "ffffff")..str.."|r"
John@56 30 end
John@1 31
John@63 32 local CreateListSelector = function(SListPopulator)
John@56 33 PersonList:RefreshRaidList()
John@56 34 local pulldown = AceGUI:Create("Dropdown")
John@56 35 local pull = {}
John@56 36 local lids = LootLists:GetAllIds()
John@56 37 for _,v in pairs(lids) do
John@56 38 local l = LootLists:Select(v)
John@56 39 pull[l:GetId()] = l:GetName()
John@56 40 --local entry = {value=i,text=v.name}
John@56 41 if l:GetLength() > 0 then
John@56 42 pulldown:SetItemDisabled(i,true)
John@51 43 end
John@1 44 end
John@56 45 pulldown:SetWidth(175)
John@56 46 pulldown:SetList(pull)
John@71 47 SListPopulator:SetSwidget(pulldown)
John@72 48 pulldown:SetCallback("OnValueChanged", function(_,_,value) SListPopulator:PulldownEvent(value) end)
John@73 49 if stateactivelist > 0 then SListPopulator:PulldownEvent(stateactivelist) end -- default value
John@56 50 return pulldown
John@1 51 end
John@1 52
John@72 53 local f, right -- important gui elements
John@59 54 local escapeButton =
John@59 55 {
John@59 56 shown = false,
John@59 57 ["IsShown"] = function(self) return self.shown end,
John@60 58 ["Hide"] = function(self) if f then AceGUI:Release(f); self.shown=false end end
John@59 59 }
John@38 60
John@65 61 SelectorListEventDispatcher =
John@63 62 {
John@65 63 listeners = nil,
John@63 64 target = nil,
John@67 65 line = nil,
John@63 66 ["SetTarget"] = function(self,other)
John@63 67 self.target = other
John@65 68 self.target:SetCallback("OnSelectionCleared",function(...) self:OnSelectionCleared(...) end)
John@65 69 self.target:SetCallback("OnSelection",function(...) self:OnSelection(...) end)
John@63 70 end,
John@63 71 ["RegisterListener"] = function(self,other) table.insert(self.listeners,other) end,
John@63 72 ["OnSelectionCleared"] = function(self,_)
John@67 73 self.line = nil
John@63 74 self:Event("OnSelectionCleared")
John@63 75 end,
John@65 76 ["OnSelection"] = function(self,_,_,line)
John@67 77 self.line = line
John@63 78 self:Event("OnSelection",line)
John@63 79 end,
John@63 80 ["Event"] = function(self,event,arg)
John@63 81 if not self.target then error("Event called with no listener...") end
John@63 82 if not self.listeners then return end
John@63 83 for i,v in pairs(self.listeners) do
John@67 84 --bsk.print("listener")
John@63 85 if type(v) == "table" then
John@63 86 if v[event] then
John@63 87 v[event](v,arg)
John@63 88 end
John@63 89 elseif type(v) == "function" then
John@63 90 v(event,arg)
John@63 91 elseif type(v) ~= "nil" then -- allow nils to pass quietly
John@63 92 _G.error("Bad listener - "..type(v))
John@63 93 end
John@63 94 end
John@63 95 end,
John@67 96 ["Release"] = function(self) self.listeners = {}; self.target=nil; self.line=nil end,
John@67 97 ["LatestValue"] = function(self) return self.line end
John@63 98 }
John@65 99 function SelectorListEventDispatcher:new()
John@65 100 local t = {}
John@65 101 setmetatable(t,SelectorListEventDispatcher)
John@65 102 self.__index = self
John@65 103 t.listeners = {}
John@65 104 return t
John@63 105 end
John@65 106
John@65 107 SListEventDispatch = SelectorListEventDispatcher:new()
John@65 108 LListEventDispatch = SelectorListEventDispatcher:new()
John@67 109 RListEventDispatch = SelectorListEventDispatcher:new()
John@65 110
John@81 111 function ConvertLe2Line(le)
John@81 112 local line = {value=le:GetId(),text=le:GetName(),icon=[[Interface\Glues\CharacterCreate\UI-CharacterCreate-Classes]]}
John@81 113 line.iconCoords=_G.CLASS_ICON_TCOORDS[le:GetClass()]
John@81 114 line.textPlain = line.text
John@81 115 line.text=colorize(line.text,_G.RAID_CLASS_COLORS[le:GetClass()])
John@81 116 return line
John@81 117 end
John@81 118
John@63 119 local SListPopulator =
John@63 120 {
John@63 121 filtered = false,
John@63 122 widget = nil,
John@71 123 swidget = nil,
John@63 124 data = nil,
John@63 125 lref = nil,
John@63 126
John@71 127 ["Release"] = function(self) self.filtered, self.widget, self.swidget, self.data, self.lref = false, nil, nil, nil, nil end,
John@63 128 ["Redraw"] = function(self)
John@63 129 if self.lref == nil or self.widget == nil then return end -- don't do work if not fully initialized
John@63 130 self.data = {}
John@63 131 for le in self.lref:OrderedListEntryIter() do
John@63 132 local disabled = not PersonList:IsActive(le:GetId())
John@63 133 if not self.filtered or not disabled then
John@81 134 local line = ConvertLe2Line(le)
John@63 135 line.disabled = disabled
John@63 136 table.insert(self.data,line)
John@63 137 end
John@63 138 end
John@63 139 self.widget:SetList(self.data)
John@65 140 SListEventDispatch:Event("Redraw")
John@63 141 end,
John@71 142 ["SetSwidget"] = function(self,w)
John@71 143 if type(w) ~= "table" or type(w.SetList) ~= "function" then
John@71 144 _G.error("Bad SetWidget")
John@71 145 end
John@71 146 self.swidget = w
John@71 147 end,
John@63 148 ["SetWidget"] = function(self,w)
John@65 149 if type(w) ~= "table" or type(w.SetList) ~= "function" then
John@63 150 _G.error("Bad SetWidget")
John@63 151 end
John@63 152 self.widget = w
John@63 153 end,
John@63 154 ["SetFiltered"] = function(self,value)
John@63 155 self.filtered = value
John@63 156 self:Redraw()
John@63 157 end,
John@72 158 ["SelectList"] = function(self,value,nocomm)
John@71 159 self.swidget:SetValue(value)
John@72 160 local l = LootLists:Select(value)
John@72 161 if l ~= self.lref then
John@72 162 self.lref = l
John@72 163 self:Redraw()
John@72 164 end
John@72 165 if nocomm then InitiateActiveList(value) end
John@72 166 end,
John@72 167
John@72 168
John@72 169 ["PulldownEvent"] = function(self,value)
John@72 170 self:SelectList(value)
John@72 171 if admin and state == "looting" then
John@72 172 InitiateActivateList(value)
John@72 173 end
John@68 174 end,
John@68 175 ["DataEvent"] = function(self)
John@68 176 self:Redraw()
John@69 177 end,
John@72 178 ["StateEvent"] = function(self)
John@75 179 -- todo: events still happen even if the gui is closed. protect the api.
John@75 180
John@73 181 print("State event in SL: ", state, admin)
John@72 182 if state == "bidding" or (state == "looting" and not admin) then
John@72 183 self.swidget:SetDisabled(true)
John@72 184 self:SelectList(stateactivelist)
John@72 185 else
John@72 186 self.swidget:SetDisabled(false)
John@72 187 end
John@72 188 -- if bidding then disable pulldown
John@72 189 -- if looting and not admin then disable pulldown
John@72 190 -- if looting and admin then enable pulldown
John@72 191 -- otherwise enable pulldown
John@72 192 end,
John@72 193 ["ActiveListEvent"] = function(self)
John@72 194 self:SelectList(stateactivelist)
John@72 195 end,
John@72 196
John@72 197
John@72 198
John@69 199 ["GetMe"] = function(self)
John@69 200 local me = _G.UnitName("player")
John@69 201 for i,v in pairs(self.data) do
John@69 202 if v.textPlain == me then
John@69 203 return v
John@69 204 end
John@69 205 end
John@69 206 end,
John@69 207 }
John@69 208
John@69 209 local LListPopulator =
John@69 210 {
John@69 211 data = {},
John@69 212 widget = nil,
John@69 213 ["Release"] = function(self) self.data = {}; self.widget = nil end,
John@73 214 ["ItemListEvent"] = function(self) self:Redraw() end,
John@69 215 ["Redraw"]= function(self)
John@73 216 self.data = {}
John@73 217 for i,v in pairs(stateitemlist) do
John@78 218 local entry = {value=i, text=v.link, link=v.link, mlid=v.mlid}
John@73 219 table.insert(self.data,entry)
John@73 220 end
John@73 221 if self.widget then
John@73 222 self.widget:SetList(self.data)
John@73 223 LListEventDispatch:Event("Redraw")
John@73 224 end
John@69 225 end,
John@69 226 ["SetWidget"] = function(self,w)
John@69 227 if type(w) ~= "table" or type(w.SetList) ~= "function" then
John@69 228 _G.error("Bad SetWidget")
John@69 229 end
John@69 230 self.widget = w
John@76 231 --if debug then
John@76 232 -- self.data = {
John@76 233 -- {
John@76 234 -- value=1,
John@76 235 -- text = "|cffa335ee|Hitem:77109:4080:4009:0:0:0:0:0:85:0|h[Band of Reconstruction]|h|r",
John@76 236 -- link = "|cffa335ee|Hitem:77109:4080:4009:0:0:0:0:0:85:0|h[Band of Reconstruction]|h|r",
John@76 237 -- },
John@76 238 -- {
John@76 239 -- value=2,
John@76 240 -- text = "|cffa335ee|Hitem:19351:0:0:0:0:0:0:0:85:0|h[Maladath, Runed Blade of the Black Flight]|h|r",
John@76 241 -- link = "|cffa335ee|Hitem:19351:0:0:0:0:0:0:0:85:0|h[Maladath, Runed Blade of the Black Flight]|h|r"
John@76 242 -- },
John@76 243 -- {
John@76 244 -- value=3,
John@76 245 -- text = "|cffa335ee|Hitem:31986:0:0:0:0:0:0:0:85:0|h[Merciless Gladiator's Crossbow of the Phoenix]|h|r",
John@76 246 -- link = "|cffa335ee|Hitem:31986:0:0:0:0:0:0:0:85:0|h[Merciless Gladiator's Crossbow of the Phoenix]|h|r"
John@76 247 -- },
John@76 248 -- {
John@76 249 -- value=4,
John@76 250 -- text = "|cffa335ee|Hitem:65003:0:0:0:0:0:0:0:85:0|h[Reclaimed Ashkandi, Greatsword of the Brotherhood]|h|r",
John@76 251 -- link = "|cffa335ee|Hitem:65003:0:0:0:0:0:0:0:85:0|h[Reclaimed Ashkandi, Greatsword of the Brotherhood]|h|r"
John@76 252 -- },
John@76 253 -- {
John@76 254 -- value=5,
John@76 255 -- text = "|cffff8000|Hitem:19019:0:0:0:0:0:0:0:85:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r",
John@76 256 -- link = "|cffff8000|Hitem:19019:0:0:0:0:0:0:0:85:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r"
John@76 257 -- },
John@76 258 -- }
John@76 259 --end
John@69 260 self:Redraw()
John@69 261 end,
John@69 262 }
John@69 263
John@69 264 local RListPopulator =
John@69 265 {
John@69 266 widget = nil,
John@71 267 ["RollEvent"] = function(self) self:Redraw() end,
John@71 268 ["Release"] = function(self) self.widget = nil end,
John@69 269 ["Redraw"] = function(self)
John@79 270 local list = {}
John@79 271 for i,v in pairs(statebids) do
John@79 272 table.insert(list,v)
John@79 273 end
John@79 274 for i,v in pairs(staterolls) do
John@79 275 local roll
John@79 276 for r,s in pairs(staterollvalues) do
John@79 277 if s.value == v.value then
John@79 278 roll = r
John@79 279 break
John@79 280 end
John@79 281 end
John@79 282 print("Inserting a roll ", v.value, roll)
John@79 283
John@79 284 local c = copy(v)
John@79 285 c.disabled = false
John@79 286 c.text = c.text .. " (roll "..roll..")"
John@79 287 table.insert(list,c)
John@79 288 end
John@79 289 self.widget:SetList(list)
John@69 290 RListEventDispatch:Event("Redraw")
John@69 291 end,
John@69 292 ["SetWidget"] = function(self,w)
John@69 293 if type(w) ~= "table" or type(w.SetList) ~= "function" then
John@69 294 _G.error("Bad SetWidget")
John@69 295 end
John@69 296 self.widget = w
John@71 297 --if debug then
John@71 298 -- local dummydata = {}
John@71 299 -- local tree = SListPopulator.data
John@71 300 -- for i,v in pairs(tree) do dummydata[i] = copy(v); dummydata[i].disabled = false end
John@71 301 -- if dummydata[2] then dummydata[2].text = dummydata[2].text .. " (roll 73)" end
John@71 302 -- self.data = dummydata
John@71 303 --end
John@69 304 self:Redraw()
John@69 305 end,
John@79 306 ["Force"] = function(self,who) -- todo: remove this and the horse it rode in on
John@69 307 local new = self.Convert(who,72)
John@71 308 InitiateBid(new)
John@71 309 --self:Redraw()
John@69 310 end,
John@79 311 ["Retract"] = function(self,who) -- todo: remove this and the horse it rode in on
John@71 312 -- todo
John@71 313 --for i,v in pairs(self.data) do
John@71 314 -- if who.value == v.value then
John@71 315 -- table.remove(self.data,i)
John@71 316 -- end
John@71 317 --end
John@71 318 InitiateRetract(copy(who))
John@71 319 --self:Redraw()
John@69 320 end,
John@69 321 ["Convert"] = function(who,roll) -- convert an LE object into one suitable to put in a SelectorList
John@69 322 local new = copy(who)
John@69 323 new.disabled = false -- todo: should be unnessary - they can't get on the list like this
John@69 324 if roll then
John@69 325 new.text = new.text .. " (roll 73)"
John@69 326 end
John@69 327 return new
John@69 328 end,
John@63 329 }
John@63 330
John@75 331 local BZPopulator =
John@75 332 {
John@75 333 group = nil,
John@75 334 ["SetGroup"] = function(self,g)
John@75 335 if type(g) ~= "table" or type(g.AddChild) ~= "function" then
John@75 336 _G.error("Bad SetGroup for BZPopulator")
John@75 337 end
John@75 338 self.group = g
John@75 339 end,
John@75 340
John@75 341
John@75 342 ["Release"] = function(self) self.group = nil; RListEventDispatch:Release(); RListPopulator:Release() end,
John@75 343
John@75 344 ["StateEvent"] = function(self)
John@75 345 if state == "bidding" then
John@75 346
John@75 347 local spacer = AceGUI:Create("Label")
John@75 348 spacer:SetText(" ")
John@75 349 spacer:SetFullWidth(true)
John@76 350 local spacer2 = AceGUI:Create("Label") -- don't try to combine this with "spacer" - you can't add a child more than once
John@75 351 spacer2:SetText(" ")
John@75 352 spacer2:SetFullWidth(true)
John@75 353
John@75 354 local label = AceGUI:Create("Label")
John@75 355 label:SetText("Bidding now open for ...")
John@75 356 local biddingOn = AceGUI:Create("InteractiveLabel")
John@75 357 biddingOn.userdata = { stateitem.link }
John@75 358 biddingOn:SetText(biddingOn.userdata[1])
John@75 359 biddingOn:SetFullWidth(true)
John@75 360 biddingOn:SetCallback("OnEnter", function(widget) _G.GameTooltip:SetOwner(widget.frame,"ANCHOR_RIGHT"); _G.GameTooltip:SetHyperlink(widget.userdata[1]); _G.GameTooltip:Show() end )
John@75 361 biddingOn:SetCallback("OnLeave", function(widget) _G.GameTooltip:Hide() end )
John@75 362 local b1 = AceGUI:Create("SelectorList")
John@75 363 b1:SetNumLines(6)
John@75 364 b1:SetInteractive(admin)
John@75 365 local bidTitle = AceGUI:Create("Label")
John@75 366 bidTitle:SetText("Current bids")
John@75 367 bidTitle:SetFullWidth(true)
John@75 368
John@75 369 local bidRetractButton = AceGUI:Create("Button")
John@75 370 bidRetractButton:SetText("Place Bid")
John@75 371 bidRetractButton:SetWidth(100)
John@76 372 bidRetractButton:SetCallback("OnClick", function(widget) InitiateBid(SListPopulator:GetMe()) end)
John@76 373
John@75 374 local rollButton = AceGUI:Create("Button")
John@75 375 rollButton:SetText("Offset Roll")
John@75 376 rollButton:SetWidth(100)
John@79 377 rollButton:SetCallback("OnClick", function(widget) InitiateRollRequest(SListPopulator:GetMe()) end) -- todo: wrong behavior. GetMe will nil if the person isn't on the currently selected loot list. this could easily happen. return a new thingy instead
John@79 378 local retractButton = AceGUI:Create("Button")
John@79 379 retractButton:SetText("Retract")
John@79 380 retractButton:SetWidth(100)
John@79 381 retractButton:SetCallback("OnClick", function(widget) InitiateRetract(SListPopulator:GetMe()) end)
John@75 382
John@75 383 RListEventDispatch:SetTarget(b1)
John@75 384 RListPopulator:SetWidget(b1)
John@75 385
John@75 386 local g1
John@75 387 if admin then
John@75 388 b1.alignoffset = 0.25 -- or else g1 won't align well
John@75 389 g1 = AceGUI:Create("SimpleGroup")
John@75 390 g1.alignoffset = 0.25
John@75 391 g1:SetWidth(120)
John@75 392 g1:SetLayout("List")
John@75 393
John@75 394 -- todo: convoluted and repetitive - surely there's a
John@75 395 -- better way than this ...
John@75 396 adminForce = AceGUI:Create("Button")
John@75 397 if SListEventDispatch:LatestValue() then
John@75 398 adminForce:SetText(sformat("Force bid (%s)",SListEventDispatch:LatestValue().textPlain))
John@75 399 adminForce:SetDisabled(false)
John@75 400 else
John@75 401 adminForce:SetText("Force bid")
John@75 402 adminForce:SetDisabled(true)
John@75 403 end
John@75 404 adminForce:SetWidth(160)
John@78 405 adminForce:SetCallback("OnClick",function(widget) InitiateBid(SListEventDispatch:LatestValue()) end)
John@75 406 adminForce.userdata =
John@75 407 {
John@75 408 widget = adminForce,
John@75 409 ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.widget:SetText("Force bid") end,
John@75 410 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false); self.widget:SetText(sformat("Force bid (%s)",SListEventDispatch:LatestValue().textPlain)) end,
John@75 411 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.widget:SetText("Force bid") end
John@75 412 }
John@75 413 SListEventDispatch:RegisterListener(adminForce.userdata)
John@75 414
John@75 415 adminRetract = AceGUI:Create("Button")
John@75 416 if RListEventDispatch:LatestValue() then
John@75 417 adminRetract:SetText(sformat("Retract bid (%s)",RListEventDispatch:LatestValue().textPlain))
John@75 418 adminRetract:SetDisabled(false)
John@75 419 else
John@75 420 adminRetract:SetText("Retract bid")
John@75 421 adminRetract:SetDisabled(true)
John@75 422 end
John@75 423 adminRetract:SetWidth(160)
John@75 424 adminRetract.userdata =
John@75 425 {
John@75 426 widget = adminRetract,
John@75 427 ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.widget:SetText("Retract bid") end,
John@75 428 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false); self.widget:SetText(sformat("Retract bid (%s)",RListEventDispatch:LatestValue().textPlain)) end,
John@75 429 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.widget:SetText("Retract bid") end
John@75 430 }
John@75 431 adminRetract:SetCallback("OnClick",function(widget) RListPopulator:Retract(RListEventDispatch:LatestValue()) end)
John@75 432 RListEventDispatch:RegisterListener(adminRetract.userdata)
John@75 433 adminRetract:SetDisabled(true)
John@75 434
John@75 435 g1:AddChildren(adminForce,adminRetract)
John@75 436 end
John@75 437
John@79 438 self.group:AddChildren(spacer,label,biddingOn,bidRetractButton,rollButton,retractButton,spacer2,bidTitle,b1)
John@75 439 if admin then self.group:AddChildren(g1) end
John@75 440
John@75 441 else
John@75 442
John@75 443
John@75 444 self.group:ReleaseChildren()
John@75 445 RListEventDispatch:Release()
John@75 446 RListPopulator:Release()
John@75 447 end
John@75 448
John@75 449 end,
John@75 450
John@75 451
John@75 452 }
John@75 453
John@68 454 DataEventDispatch =
John@68 455 {
John@68 456 -- todo: batch events
John@68 457 listeners = {},
John@68 458 ["DataEvent"] = function(self,_) --todo: pass along the received event
John@68 459 for i,v in pairs(self.listeners) do
John@68 460 if v and v["DataEvent"] then
John@68 461 v:DataEvent()
John@68 462 end
John@68 463 end
John@68 464 end,
John@68 465 ["RegisterListener"] = function(self,listener)
John@68 466 if not listener or not listener["DataEvent"] then
John@68 467 _G.error("Bad listener")
John@68 468 end
John@68 469 table.insert(self.listeners,listener)
John@68 470 end
John@68 471 }
John@68 472
John@76 473 AdminLootButtons =
John@76 474 {
John@76 475 openButton = nil,
John@76 476 assignButton = nil,
John@76 477 suicideButton = nil,
John@76 478 -- todo - open roll button
John@76 479
John@76 480 eventsFromLL =
John@76 481 {
John@76 482 ["Redraw"] = function(self) AdminLootButtons:Redraw() end,
John@76 483 ["OnSelection"] = function(self) AdminLootButtons:Redraw() end,
John@76 484 ["OnSelectionCleared"] = function(self) AdminLootButtons:Redraw() end,
John@76 485 },
John@76 486 eventsFromSL =
John@76 487 {
John@76 488 ["Redraw"] = function(self) AdminLootButtons:Redraw() end,
John@76 489 ["OnSelection"] = function(self) AdminLootButtons:Redraw() end,
John@76 490 ["OnSelectionCleared"] = function(self) AdminLootButtons:Redraw() end,
John@76 491 },
John@76 492 ["StateEvent"] = function(self) self:Redraw() end,
John@76 493 ["RollEvent"] = function(self) self:Redraw() end,
John@76 494
John@76 495 ["SetButtons"] = function(self,open,assign,suicide)
John@76 496 self.openButton = open
John@76 497 self.assignButton = assign
John@76 498 self.suicideButton = suicide
John@76 499 SListEventDispatch:RegisterListener(self.eventsFromSL)
John@76 500 LListEventDispatch:RegisterListener(self.eventsFromLL)
John@76 501 self:Redraw()
John@76 502 end,
John@76 503 ["Release"] = function(self)
John@76 504 self.openButton = nil
John@76 505 self.assignButton = nil
John@76 506 self.suicideButton = nil
John@76 507 end,
John@76 508
John@76 509 ["Redraw"] = function(self)
John@76 510 if state == "neutral" then -- gray all buttons
John@76 511 self.openButton:SetText("Open Bids")
John@76 512 self.openButton:SetDisabled(true)
John@76 513 self.assignButton:SetText("Assign")
John@76 514 self.assignButton:SetDisabled(true)
John@76 515 self.suicideButton:SetText("Suicide")
John@76 516 self.suicideButton:SetDisabled(true)
John@76 517 elseif state == "looting" then
John@76 518 if LListEventDispatch.line then
John@76 519 self.openButton:SetDisabled(false)
John@76 520 self.openButton:SetText("Open Bids")
John@76 521 self.openButton:SetCallback("OnClick", function(widget) InitiateOpenBid(LListEventDispatch:LatestValue()) end)
John@76 522 else
John@76 523 self.openButton:SetText("Open Bids")
John@76 524 self.openButton:SetDisabled(true)
John@76 525 end
John@76 526 if LListEventDispatch.line and SListEventDispatch.line then
John@76 527 self.assignButton:SetText("Assign")
John@76 528 self.assignButton:SetDisabled(false)
John@76 529 self.assignButton:SetCallback("OnClick", function(widget) FreeLoot(LListEventDispatch:LatestValue(),SListEventDispatch:LatestValue()) end)
John@76 530 self.suicideButton:SetText("Suicide")
John@76 531 self.suicideButton:SetDisabled(false)
John@78 532 self.suicideButton:SetCallback("OnClick", function(widget) DirectSuicideLoot(LListEventDispatch:LatestValue(),SListEventDispatch:LatestValue(),SListPopulator.lref) end)
John@76 533 else
John@76 534 self.assignButton:SetText("Assign")
John@76 535 self.assignButton:SetDisabled(true)
John@76 536 self.suicideButton:SetText("Suicide")
John@76 537 self.suicideButton:SetDisabled(true)
John@76 538 end
John@76 539 -- if item selected, light up Open button
John@76 540 -- if item selected and name selected, light up assign/suicide
John@76 541 -- buttons
John@76 542 elseif state == "bidding" then
John@76 543 self.openButton:SetDisabled(false)
John@76 544 self.openButton:SetText("Cancel Bidding")
John@76 545 self.openButton:SetCallback("OnClick", function(widget) InitiateCloseBidding() end)
John@76 546 self.assignButton:SetText("Finish & Assign")
John@76 547 self.assignButton:SetDisabled(not (getn(staterolls) > 0 or getn(statebids) > 0))
John@81 548 self.assignButton:SetCallback("OnClick", function(widget) ExpensiveLoot(LListEventDispatch:LatestValue(),SListPopulator.lref) end) -- todo: problem here - use stateitem instead
John@76 549 self.suicideButton:SetText(" ")
John@76 550 self.suicideButton:SetDisabled(true)
John@76 551
John@76 552 -- change open button to cancel
John@76 553 -- change assign button to award
John@76 554 -- disable ... and rename? the third button
John@76 555
John@76 556 end
John@76 557 end,
John@76 558 }
John@76 559
John@68 560 function OnInitializeSetStaticData()
John@68 561 SetChangeListener(DataEventDispatch)
John@68 562 DataEventDispatch:RegisterListener(SListPopulator)
John@72 563 RegisterListenerActiveListChanged(SListPopulator)
John@72 564 RegisterListenerStateChange(SListPopulator)
John@71 565 RegisterListenerRolls(RListPopulator)
John@73 566 RegisterItemListListener(LListPopulator)
John@75 567 RegisterListenerStateChange(BZPopulator)
John@76 568 if admin then
John@76 569 RegisterListenerStateChange(AdminLootButtons)
John@76 570 RegisterListenerRolls(AdminLootButtons)
John@76 571 end
John@68 572 end
John@68 573
John@42 574 function CreateGUI()
John@59 575 -- special registration procedure to be closable with the escape button
John@59 576 --escapeButton.shown = true
John@59 577 --_G["BSK_ESCAPEBUTTON"] = escapeButton
John@59 578 --table.insert(_G.UISpecialFrames, "BSK_ESCAPEBUTTON")
John@59 579
John@60 580 if f then return end -- no second gui please
John@59 581 f = AceGUI:Create("Frame")
John@1 582
John@76 583 f:SetCallback("OnClose",function(widget) escapeButton.shown = false; AceGUI:Release(widget); f=nil; right=nil; SListEventDispatch:Release(); LListEventDispatch:Release(); SListPopulator:Release(); RListEventDispatch:Release(); LListPopulator:Release(); RListPopulator:Release(); BZPopulator:Release(); AdminLootButtons:Release() end)
John@56 584 f:SetTitle("BSK")
John@56 585 f:SetLayout("Flow")
John@56 586 f:SetHeight(680)
John@56 587 f:SetWidth(580)
John@1 588
John@56 589 local left = AceGUI:Create("InlineGroup")
John@56 590 left:SetLayout("List")
John@56 591 left:SetWidth(175)
John@56 592 left:SetFullHeight(true)
John@56 593 left.alignoffset=0.25 -- hack, as per http://forums.wowace.com/showthread.php?t=17114
John@1 594
John@65 595 right = AceGUI:Create("InlineGroup")
John@56 596 right:SetLayout("Flow")
John@56 597 right:SetWidth(700-175-160)
John@56 598 right:SetFullHeight(true)
John@56 599 right.alignoffset=0.25
John@38 600
John@56 601 local t1 = AceGUI:Create("SelectorList")
John@56 602 t1:SetNumLines(25)
John@56 603 t1:SetFullWidth(true)
John@56 604 t1:SetInteractive(admin)
John@69 605 SListEventDispatch:SetTarget(t1)
John@63 606 SListPopulator:SetWidget(t1)
John@38 607
John@63 608 local p1 = CreateListSelector(SListPopulator)
John@56 609 p1:SetFullWidth(true)
John@38 610
John@56 611 left:AddChild(p1)
John@56 612 left:AddChild(t1)
John@38 613
John@56 614 local t2 = AceGUI:Create("SelectorList")
John@56 615 t2:SetNumLines(7)
John@56 616 t2:SetFullWidth(true)
John@56 617 t2:EnableButtonTooltips(true)
John@65 618 LListEventDispatch:SetTarget(t2)
John@69 619 LListPopulator:SetWidget(t2)
John@65 620
John@75 621 biddingZone = AceGUI:Create("SimpleGroup")
John@65 622 biddingZone:SetLayout("Flow")
John@65 623 biddingZone:SetFullWidth(true)
John@75 624 BZPopulator:SetGroup(biddingZone)
John@38 625
John@60 626 local alb1, alb2, alb3
John@60 627 if admin then
John@60 628 alb1 = AceGUI:Create("Button")
John@76 629 alb1:SetWidth(120)
John@76 630 --alb1:SetText("Open Bids")
John@76 631 --alb1.userdata =
John@76 632 --{
John@76 633 -- state = false,
John@76 634 -- widget = alb1,
John@76 635 -- ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.item = nil end,
John@76 636 -- ["OnSelection"] = function(self,value) self.widget:SetDisabled(false); self.item = value end,
John@76 637 -- ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.item = nil end
John@76 638 --}
John@76 639 --alb1:SetDisabled(true)
John@76 640 --LListEventDispatch:RegisterListener(alb1.userdata)
John@76 641 --alb1:SetCallback("OnClick",
John@76 642 -- function(widget)
John@76 643 -- if widget.userdata.state then -- we were bidding when the button was pressed
John@76 644 -- widget:SetText("Open Bids")
John@76 645 -- InitiateCloseBidding() -- todo: plug in loot award, etc
John@76 646 -- else
John@76 647 -- widget:SetText("Close bids")
John@76 648 -- InitiateOpenBid(LListEventDispatch:LatestValue())
John@76 649 -- end
John@76 650 -- widget.userdata.state = not widget.userdata.state
John@76 651 -- end
John@76 652 --)
John@60 653
John@60 654 alb2 = AceGUI:Create("Button")
John@76 655 alb2:SetWidth(120)
John@76 656 --alb2:SetText("Assign")
John@76 657 --alb2.userdata =
John@76 658 --{
John@76 659 -- widget = alb2,
John@76 660 -- ["OnUpdate"] = function(self) self.widget:SetDisabled(not (self.slist.checked and self.llist.checked)) end,
John@76 661 --}
John@76 662 --alb2.userdata.slist =
John@76 663 --{
John@76 664 -- parent = alb2.userdata,
John@76 665 -- checked = false,
John@76 666 -- ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@76 667 -- ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end,
John@76 668 -- ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@76 669 --}
John@76 670 --alb2.userdata.llist =
John@76 671 --{
John@76 672 -- parent = alb2.userdata,
John@76 673 -- checked = false,
John@76 674 -- ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@76 675 -- ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end,
John@76 676 -- ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@76 677 --}
John@76 678 --SListEventDispatch:RegisterListener(alb2.userdata.slist)
John@76 679 --LListEventDispatch:RegisterListener(alb2.userdata.llist)
John@60 680
John@60 681 alb3 = AceGUI:Create("Button")
John@76 682 alb3:SetWidth(120)
John@76 683 --alb3:SetText("Suicide")
John@76 684 --alb3.userdata = -- TODO: holy hell, come up with a pattern or something for this ....
John@76 685 --{
John@76 686 -- widget = alb3,
John@76 687 -- ["OnUpdate"] = function(self) self.widget:SetDisabled(not (self.slist.checked and self.llist.checked)) end,
John@76 688 --}
John@76 689 --alb3.userdata.slist =
John@76 690 --{
John@76 691 -- parent = alb3.userdata,
John@76 692 -- checked = false,
John@76 693 -- ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@76 694 -- ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end,
John@76 695 -- ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@76 696 --}
John@76 697 --alb3.userdata.llist =
John@76 698 --{
John@76 699 -- parent = alb3.userdata,
John@76 700 -- checked = false,
John@76 701 -- ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@76 702 -- ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end,
John@76 703 -- ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@76 704 --}
John@76 705 --SListEventDispatch:RegisterListener(alb3.userdata.slist)
John@76 706 --LListEventDispatch:RegisterListener(alb3.userdata.llist)
John@76 707 AdminLootButtons:SetButtons(alb1,alb2,alb3)
John@60 708 end
John@38 709
John@65 710 local suicideSelected, undo
John@60 711 if admin then
John@60 712
John@60 713 suicideSelected = AceGUI:Create("Button")
John@60 714 suicideSelected:SetFullWidth(true)
John@60 715 suicideSelected:SetText("Suicide")
John@68 716 suicideSelected:SetCallback("OnClick",
John@68 717 function(_)
John@68 718 local p = SListEventDispatch:LatestValue()
John@68 719 local lref = SListPopulator.lref
John@68 720 lref:SuicidePerson(p.value)
John@68 721 end
John@68 722 )
John@68 723
John@63 724 -- use userdata + SListEventDispatch to toggle state
John@63 725 suicideSelected.userdata =
John@63 726 {
John@63 727 widget = suicideSelected,
John@65 728 ["Redraw"] = function(self,_) self.widget:SetDisabled(true) end,
John@63 729 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false) end,
John@63 730 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true) end
John@63 731 }
John@63 732 SListEventDispatch:RegisterListener(suicideSelected.userdata)
John@60 733
John@60 734 undo = AceGUI:Create("Button")
John@63 735 undo:SetText("Undo / out of order")
John@60 736 undo:SetFullWidth(true)
John@63 737 undo:SetDisabled(true)
John@60 738 end
John@60 739
John@56 740 local filter = AceGUI:Create("CheckBox")
John@56 741 filter:SetLabel("Only show active")
John@56 742 filter:SetFullWidth(true)
John@63 743 filter:SetValue(false)
John@63 744 SListPopulator:SetFiltered(false)
John@63 745 filter:SetCallback("OnValueChanged",function(widget,_,value) SListPopulator:SetFiltered(value) end)
John@56 746
John@56 747 left:AddChildren(filter)
John@56 748 if admin then left:AddChildren(suicideSelected,undo) end
John@56 749 right:AddChildren(t2)
John@56 750 if admin then right:AddChildren(alb1,alb2,alb3) end
John@56 751 right:AddChildren(biddingZone)
John@56 752 f:AddChildren(left,right)
John@58 753
John@58 754
John@1 755 end