annotate Gui.lua @ 75:ed1c9fd4cc95

Progress on bidding events and GUI. Slave GUIs now respond properly.
author John@Doomsday
date Mon, 09 Apr 2012 09:40:53 -0400
parents 7eb2963eea7d
children 39be9328acd0
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@63 111 local SListPopulator =
John@63 112 {
John@63 113 filtered = false,
John@63 114 widget = nil,
John@71 115 swidget = nil,
John@63 116 data = nil,
John@63 117 lref = nil,
John@63 118
John@71 119 ["Release"] = function(self) self.filtered, self.widget, self.swidget, self.data, self.lref = false, nil, nil, nil, nil end,
John@63 120 ["Redraw"] = function(self)
John@63 121 if self.lref == nil or self.widget == nil then return end -- don't do work if not fully initialized
John@63 122 self.data = {}
John@63 123 for le in self.lref:OrderedListEntryIter() do
John@63 124 local disabled = not PersonList:IsActive(le:GetId())
John@63 125 if not self.filtered or not disabled then
John@63 126 local line = {value=le:GetId(),text=le:GetName(),icon=[[Interface\Glues\CharacterCreate\UI-CharacterCreate-Classes]]}
John@63 127 line.iconCoords=_G.CLASS_ICON_TCOORDS[le:GetClass()]
John@67 128 line.textPlain = line.text
John@63 129 line.text=colorize(line.text,_G.RAID_CLASS_COLORS[le:GetClass()])
John@63 130 line.disabled = disabled
John@63 131 table.insert(self.data,line)
John@63 132 end
John@63 133 end
John@63 134 self.widget:SetList(self.data)
John@65 135 SListEventDispatch:Event("Redraw")
John@63 136 end,
John@71 137 ["SetSwidget"] = function(self,w)
John@71 138 if type(w) ~= "table" or type(w.SetList) ~= "function" then
John@71 139 _G.error("Bad SetWidget")
John@71 140 end
John@71 141 self.swidget = w
John@71 142 end,
John@63 143 ["SetWidget"] = function(self,w)
John@65 144 if type(w) ~= "table" or type(w.SetList) ~= "function" then
John@63 145 _G.error("Bad SetWidget")
John@63 146 end
John@63 147 self.widget = w
John@63 148 end,
John@63 149 ["SetFiltered"] = function(self,value)
John@63 150 self.filtered = value
John@63 151 self:Redraw()
John@63 152 end,
John@72 153 ["SelectList"] = function(self,value,nocomm)
John@71 154 self.swidget:SetValue(value)
John@72 155 local l = LootLists:Select(value)
John@72 156 if l ~= self.lref then
John@72 157 self.lref = l
John@72 158 self:Redraw()
John@72 159 end
John@72 160 if nocomm then InitiateActiveList(value) end
John@72 161 end,
John@72 162
John@72 163
John@72 164 ["PulldownEvent"] = function(self,value)
John@72 165 self:SelectList(value)
John@72 166 if admin and state == "looting" then
John@72 167 InitiateActivateList(value)
John@72 168 end
John@68 169 end,
John@68 170 ["DataEvent"] = function(self)
John@68 171 self:Redraw()
John@69 172 end,
John@72 173 ["StateEvent"] = function(self)
John@75 174 -- todo: events still happen even if the gui is closed. protect the api.
John@75 175
John@73 176 print("State event in SL: ", state, admin)
John@72 177 if state == "bidding" or (state == "looting" and not admin) then
John@72 178 self.swidget:SetDisabled(true)
John@72 179 self:SelectList(stateactivelist)
John@72 180 else
John@72 181 self.swidget:SetDisabled(false)
John@72 182 end
John@72 183 -- if bidding then disable pulldown
John@72 184 -- if looting and not admin then disable pulldown
John@72 185 -- if looting and admin then enable pulldown
John@72 186 -- otherwise enable pulldown
John@72 187 end,
John@72 188 ["ActiveListEvent"] = function(self)
John@72 189 self:SelectList(stateactivelist)
John@72 190 end,
John@72 191
John@72 192
John@72 193
John@69 194 ["GetMe"] = function(self)
John@69 195 local me = _G.UnitName("player")
John@69 196 for i,v in pairs(self.data) do
John@69 197 if v.textPlain == me then
John@69 198 return v
John@69 199 end
John@69 200 end
John@69 201 end,
John@69 202 }
John@69 203
John@69 204 local LListPopulator =
John@69 205 {
John@69 206 -- todo: set event receivers from the comm and for loot
John@69 207 data = {},
John@69 208 widget = nil,
John@69 209 ["Release"] = function(self) self.data = {}; self.widget = nil end,
John@73 210 ["ItemListEvent"] = function(self) self:Redraw() end,
John@69 211 ["Redraw"]= function(self)
John@73 212 self.data = {}
John@73 213 for i,v in pairs(stateitemlist) do
John@73 214 local entry = {value=i, text=v, link=v}
John@73 215 table.insert(self.data,entry)
John@73 216 end
John@73 217 if self.widget then
John@73 218 self.widget:SetList(self.data)
John@73 219 LListEventDispatch:Event("Redraw")
John@73 220 end
John@69 221 end,
John@69 222 ["SetWidget"] = function(self,w)
John@69 223 if type(w) ~= "table" or type(w.SetList) ~= "function" then
John@69 224 _G.error("Bad SetWidget")
John@69 225 end
John@69 226 self.widget = w
John@69 227 if debug then
John@69 228 self.data = {
John@69 229 {
John@69 230 value=1,
John@69 231 text = "|cffa335ee|Hitem:77109:4080:4009:0:0:0:0:0:85:0|h[Band of Reconstruction]|h|r",
John@69 232 link = "|cffa335ee|Hitem:77109:4080:4009:0:0:0:0:0:85:0|h[Band of Reconstruction]|h|r",
John@69 233 },
John@69 234 {
John@69 235 value=2,
John@69 236 text = "|cffa335ee|Hitem:19351:0:0:0:0:0:0:0:85:0|h[Maladath, Runed Blade of the Black Flight]|h|r",
John@69 237 link = "|cffa335ee|Hitem:19351:0:0:0:0:0:0:0:85:0|h[Maladath, Runed Blade of the Black Flight]|h|r"
John@69 238 },
John@69 239 {
John@69 240 value=3,
John@69 241 text = "|cffa335ee|Hitem:31986:0:0:0:0:0:0:0:85:0|h[Merciless Gladiator's Crossbow of the Phoenix]|h|r",
John@69 242 link = "|cffa335ee|Hitem:31986:0:0:0:0:0:0:0:85:0|h[Merciless Gladiator's Crossbow of the Phoenix]|h|r"
John@69 243 },
John@69 244 {
John@69 245 value=4,
John@69 246 text = "|cffa335ee|Hitem:65003:0:0:0:0:0:0:0:85:0|h[Reclaimed Ashkandi, Greatsword of the Brotherhood]|h|r",
John@69 247 link = "|cffa335ee|Hitem:65003:0:0:0:0:0:0:0:85:0|h[Reclaimed Ashkandi, Greatsword of the Brotherhood]|h|r"
John@69 248 },
John@69 249 {
John@69 250 value=5,
John@69 251 text = "|cffff8000|Hitem:19019:0:0:0:0:0:0:0:85:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r",
John@69 252 link = "|cffff8000|Hitem:19019:0:0:0:0:0:0:0:85:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r"
John@69 253 },
John@69 254 }
John@69 255 end
John@69 256 self:Redraw()
John@69 257 end,
John@69 258 }
John@69 259
John@69 260 local RListPopulator =
John@69 261 {
John@69 262 widget = nil,
John@71 263 ["RollEvent"] = function(self) self:Redraw() end,
John@71 264 ["Release"] = function(self) self.widget = nil end,
John@69 265 ["Redraw"] = function(self)
John@71 266 self.widget:SetList(statebids)
John@69 267 RListEventDispatch:Event("Redraw")
John@69 268 end,
John@69 269 ["SetWidget"] = function(self,w)
John@69 270 if type(w) ~= "table" or type(w.SetList) ~= "function" then
John@69 271 _G.error("Bad SetWidget")
John@69 272 end
John@69 273 self.widget = w
John@71 274 --if debug then
John@71 275 -- local dummydata = {}
John@71 276 -- local tree = SListPopulator.data
John@71 277 -- for i,v in pairs(tree) do dummydata[i] = copy(v); dummydata[i].disabled = false end
John@71 278 -- if dummydata[2] then dummydata[2].text = dummydata[2].text .. " (roll 73)" end
John@71 279 -- self.data = dummydata
John@71 280 --end
John@69 281 self:Redraw()
John@69 282 end,
John@69 283 ["Force"] = function(self,who)
John@69 284 local new = self.Convert(who,72)
John@71 285 InitiateBid(new)
John@71 286 --self:Redraw()
John@69 287 end,
John@69 288 ["Retract"] = function(self,who)
John@71 289 -- todo
John@71 290 --for i,v in pairs(self.data) do
John@71 291 -- if who.value == v.value then
John@71 292 -- table.remove(self.data,i)
John@71 293 -- end
John@71 294 --end
John@71 295 InitiateRetract(copy(who))
John@71 296 --self:Redraw()
John@69 297 end,
John@69 298 ["Convert"] = function(who,roll) -- convert an LE object into one suitable to put in a SelectorList
John@69 299 local new = copy(who)
John@69 300 new.disabled = false -- todo: should be unnessary - they can't get on the list like this
John@69 301 if roll then
John@69 302 new.text = new.text .. " (roll 73)"
John@69 303 end
John@69 304 return new
John@69 305 end,
John@63 306 }
John@63 307
John@75 308 local BZPopulator =
John@75 309 {
John@75 310 group = nil,
John@75 311 ["SetGroup"] = function(self,g)
John@75 312 if type(g) ~= "table" or type(g.AddChild) ~= "function" then
John@75 313 _G.error("Bad SetGroup for BZPopulator")
John@75 314 end
John@75 315 self.group = g
John@75 316 end,
John@75 317
John@75 318
John@75 319 ["Release"] = function(self) self.group = nil; RListEventDispatch:Release(); RListPopulator:Release() end,
John@75 320
John@75 321 ["StateEvent"] = function(self)
John@75 322 if state == "bidding" then
John@75 323
John@75 324 local spacer = AceGUI:Create("Label")
John@75 325 spacer:SetText(" ")
John@75 326 spacer:SetFullWidth(true)
John@75 327 local spacer2 = AceGUI:Create("Label")
John@75 328 spacer2:SetText(" ")
John@75 329 spacer2:SetFullWidth(true)
John@75 330
John@75 331 local label = AceGUI:Create("Label")
John@75 332 label:SetText("Bidding now open for ...")
John@75 333 local biddingOn = AceGUI:Create("InteractiveLabel")
John@75 334 biddingOn.userdata = { stateitem.link }
John@75 335 biddingOn:SetText(biddingOn.userdata[1])
John@75 336 biddingOn:SetFullWidth(true)
John@75 337 biddingOn:SetCallback("OnEnter", function(widget) _G.GameTooltip:SetOwner(widget.frame,"ANCHOR_RIGHT"); _G.GameTooltip:SetHyperlink(widget.userdata[1]); _G.GameTooltip:Show() end )
John@75 338 biddingOn:SetCallback("OnLeave", function(widget) _G.GameTooltip:Hide() end )
John@75 339 local b1 = AceGUI:Create("SelectorList")
John@75 340 b1:SetNumLines(6)
John@75 341 b1:SetInteractive(admin)
John@75 342 local bidTitle = AceGUI:Create("Label")
John@75 343 bidTitle:SetText("Current bids")
John@75 344 bidTitle:SetFullWidth(true)
John@75 345
John@75 346 local bidRetractButton = AceGUI:Create("Button")
John@75 347 bidRetractButton:SetText("Place Bid")
John@75 348 bidRetractButton:SetWidth(100)
John@75 349 bidRetractButton:SetCallback("OnClick", function(widget) RListPopulator:Force(SListPopulator:GetMe()) end) -- todo: Force is not the desired thing here.
John@75 350 local rollButton = AceGUI:Create("Button")
John@75 351 rollButton:SetText("Offset Roll")
John@75 352 rollButton:SetWidth(100)
John@75 353
John@75 354 RListEventDispatch:SetTarget(b1)
John@75 355 RListPopulator:SetWidget(b1)
John@75 356
John@75 357
John@75 358 local g1
John@75 359 if admin then
John@75 360 b1.alignoffset = 0.25 -- or else g1 won't align well
John@75 361 g1 = AceGUI:Create("SimpleGroup")
John@75 362 g1.alignoffset = 0.25
John@75 363 g1:SetWidth(120)
John@75 364 g1:SetLayout("List")
John@75 365
John@75 366 -- todo: convoluted and repetitive - surely there's a
John@75 367 -- better way than this ...
John@75 368 adminForce = AceGUI:Create("Button")
John@75 369 if SListEventDispatch:LatestValue() then
John@75 370 adminForce:SetText(sformat("Force bid (%s)",SListEventDispatch:LatestValue().textPlain))
John@75 371 adminForce:SetDisabled(false)
John@75 372 else
John@75 373 adminForce:SetText("Force bid")
John@75 374 adminForce:SetDisabled(true)
John@75 375 end
John@75 376 adminForce:SetWidth(160)
John@75 377 adminForce:SetCallback("OnClick",function(widget) RListPopulator:Force(SListEventDispatch:LatestValue()) end)
John@75 378 adminForce.userdata =
John@75 379 {
John@75 380 widget = adminForce,
John@75 381 ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.widget:SetText("Force bid") end,
John@75 382 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false); self.widget:SetText(sformat("Force bid (%s)",SListEventDispatch:LatestValue().textPlain)) end,
John@75 383 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.widget:SetText("Force bid") end
John@75 384 }
John@75 385 SListEventDispatch:RegisterListener(adminForce.userdata)
John@75 386
John@75 387 adminRetract = AceGUI:Create("Button")
John@75 388 if RListEventDispatch:LatestValue() then
John@75 389 adminRetract:SetText(sformat("Retract bid (%s)",RListEventDispatch:LatestValue().textPlain))
John@75 390 adminRetract:SetDisabled(false)
John@75 391 else
John@75 392 adminRetract:SetText("Retract bid")
John@75 393 adminRetract:SetDisabled(true)
John@75 394 end
John@75 395 adminRetract:SetWidth(160)
John@75 396 adminRetract.userdata =
John@75 397 {
John@75 398 widget = adminRetract,
John@75 399 ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.widget:SetText("Retract bid") end,
John@75 400 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false); self.widget:SetText(sformat("Retract bid (%s)",RListEventDispatch:LatestValue().textPlain)) end,
John@75 401 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.widget:SetText("Retract bid") end
John@75 402 }
John@75 403 adminRetract:SetCallback("OnClick",function(widget) RListPopulator:Retract(RListEventDispatch:LatestValue()) end)
John@75 404 RListEventDispatch:RegisterListener(adminRetract.userdata)
John@75 405 adminRetract:SetDisabled(true)
John@75 406
John@75 407 g1:AddChildren(adminForce,adminRetract)
John@75 408 end
John@75 409
John@75 410 self.group:AddChildren(spacer,label,biddingOn,bidRetractButton,rollButton,spacer2,bidTitle,b1)
John@75 411 if admin then self.group:AddChildren(g1) end
John@75 412
John@75 413 else
John@75 414
John@75 415
John@75 416 self.group:ReleaseChildren()
John@75 417 RListEventDispatch:Release()
John@75 418 RListPopulator:Release()
John@75 419 end
John@75 420
John@75 421 end,
John@75 422
John@75 423
John@75 424 }
John@75 425
John@68 426 DataEventDispatch =
John@68 427 {
John@68 428 -- todo: batch events
John@68 429 listeners = {},
John@68 430 ["DataEvent"] = function(self,_) --todo: pass along the received event
John@68 431 for i,v in pairs(self.listeners) do
John@68 432 if v and v["DataEvent"] then
John@68 433 v:DataEvent()
John@68 434 end
John@68 435 end
John@68 436 end,
John@68 437 ["RegisterListener"] = function(self,listener)
John@68 438 if not listener or not listener["DataEvent"] then
John@68 439 _G.error("Bad listener")
John@68 440 end
John@68 441 table.insert(self.listeners,listener)
John@68 442 end
John@68 443 }
John@68 444
John@68 445 function OnInitializeSetStaticData()
John@68 446 SetChangeListener(DataEventDispatch)
John@68 447 DataEventDispatch:RegisterListener(SListPopulator)
John@72 448 RegisterListenerActiveListChanged(SListPopulator)
John@72 449 RegisterListenerStateChange(SListPopulator)
John@71 450 RegisterListenerRolls(RListPopulator)
John@73 451 RegisterItemListListener(LListPopulator)
John@75 452 RegisterListenerStateChange(BZPopulator)
John@68 453 end
John@68 454
John@42 455 function CreateGUI()
John@59 456 -- special registration procedure to be closable with the escape button
John@59 457 --escapeButton.shown = true
John@59 458 --_G["BSK_ESCAPEBUTTON"] = escapeButton
John@59 459 --table.insert(_G.UISpecialFrames, "BSK_ESCAPEBUTTON")
John@59 460
John@60 461 if f then return end -- no second gui please
John@59 462 f = AceGUI:Create("Frame")
John@1 463
John@75 464 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() end)
John@56 465 f:SetTitle("BSK")
John@56 466 f:SetLayout("Flow")
John@56 467 f:SetHeight(680)
John@56 468 f:SetWidth(580)
John@1 469
John@56 470 local left = AceGUI:Create("InlineGroup")
John@56 471 left:SetLayout("List")
John@56 472 left:SetWidth(175)
John@56 473 left:SetFullHeight(true)
John@56 474 left.alignoffset=0.25 -- hack, as per http://forums.wowace.com/showthread.php?t=17114
John@1 475
John@65 476 right = AceGUI:Create("InlineGroup")
John@56 477 right:SetLayout("Flow")
John@56 478 right:SetWidth(700-175-160)
John@56 479 right:SetFullHeight(true)
John@56 480 right.alignoffset=0.25
John@38 481
John@56 482 local t1 = AceGUI:Create("SelectorList")
John@56 483 t1:SetNumLines(25)
John@56 484 t1:SetFullWidth(true)
John@56 485 t1:SetInteractive(admin)
John@69 486 SListEventDispatch:SetTarget(t1)
John@63 487 SListPopulator:SetWidget(t1)
John@38 488
John@63 489 local p1 = CreateListSelector(SListPopulator)
John@56 490 p1:SetFullWidth(true)
John@38 491
John@56 492 left:AddChild(p1)
John@56 493 left:AddChild(t1)
John@38 494
John@56 495 local t2 = AceGUI:Create("SelectorList")
John@56 496 t2:SetNumLines(7)
John@56 497 t2:SetFullWidth(true)
John@56 498 t2:EnableButtonTooltips(true)
John@65 499 LListEventDispatch:SetTarget(t2)
John@69 500 LListPopulator:SetWidget(t2)
John@65 501
John@75 502 biddingZone = AceGUI:Create("SimpleGroup")
John@65 503 biddingZone:SetLayout("Flow")
John@65 504 biddingZone:SetFullWidth(true)
John@75 505 BZPopulator:SetGroup(biddingZone)
John@38 506
John@60 507 local alb1, alb2, alb3
John@60 508 if admin then
John@60 509 alb1 = AceGUI:Create("Button")
John@60 510 alb1:SetWidth(100)
John@60 511 alb1:SetText("Open Bids")
John@65 512 alb1.userdata =
John@65 513 {
John@65 514 state = false,
John@65 515 widget = alb1,
John@65 516 ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.item = nil end,
John@65 517 ["OnSelection"] = function(self,value) self.widget:SetDisabled(false); self.item = value end,
John@65 518 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.item = nil end
John@65 519 }
John@65 520 alb1:SetDisabled(true)
John@65 521 LListEventDispatch:RegisterListener(alb1.userdata)
John@65 522 alb1:SetCallback("OnClick",
John@65 523 function(widget)
John@65 524 if widget.userdata.state then -- we were bidding when the button was pressed
John@68 525 widget:SetText("Open Bids")
John@75 526 InitiateCloseBidding() -- todo: plug in loot award, etc
John@65 527 else
John@68 528 widget:SetText("Close bids")
John@71 529 InitiateOpenBid(LListEventDispatch:LatestValue())
John@65 530 end
John@65 531 widget.userdata.state = not widget.userdata.state
John@65 532 end
John@65 533 )
John@60 534
John@60 535 alb2 = AceGUI:Create("Button")
John@60 536 alb2:SetWidth(100)
John@60 537 alb2:SetText("Assign")
John@65 538 alb2.userdata =
John@65 539 {
John@65 540 widget = alb2,
John@65 541 ["OnUpdate"] = function(self) self.widget:SetDisabled(not (self.slist.checked and self.llist.checked)) end,
John@65 542 }
John@65 543 alb2.userdata.slist =
John@65 544 {
John@65 545 parent = alb2.userdata,
John@65 546 checked = false,
John@65 547 ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@65 548 ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end,
John@65 549 ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@65 550 }
John@65 551 alb2.userdata.llist =
John@65 552 {
John@65 553 parent = alb2.userdata,
John@65 554 checked = false,
John@65 555 ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@65 556 ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end,
John@65 557 ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@65 558 }
John@65 559 SListEventDispatch:RegisterListener(alb2.userdata.slist)
John@65 560 LListEventDispatch:RegisterListener(alb2.userdata.llist)
John@60 561
John@60 562 alb3 = AceGUI:Create("Button")
John@60 563 alb3:SetWidth(100)
John@60 564 alb3:SetText("Suicide")
John@65 565 alb3.userdata = -- TODO: holy hell, come up with a pattern or something for this ....
John@65 566 {
John@65 567 widget = alb3,
John@65 568 ["OnUpdate"] = function(self) self.widget:SetDisabled(not (self.slist.checked and self.llist.checked)) end,
John@65 569 }
John@65 570 alb3.userdata.slist =
John@65 571 {
John@65 572 parent = alb3.userdata,
John@65 573 checked = false,
John@65 574 ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@65 575 ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end,
John@65 576 ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@65 577 }
John@65 578 alb3.userdata.llist =
John@65 579 {
John@65 580 parent = alb3.userdata,
John@65 581 checked = false,
John@65 582 ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@65 583 ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end,
John@65 584 ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end,
John@65 585 }
John@65 586 SListEventDispatch:RegisterListener(alb3.userdata.slist)
John@65 587 LListEventDispatch:RegisterListener(alb3.userdata.llist)
John@60 588 end
John@38 589
John@65 590 local suicideSelected, undo
John@60 591 if admin then
John@60 592
John@60 593 suicideSelected = AceGUI:Create("Button")
John@60 594 suicideSelected:SetFullWidth(true)
John@60 595 suicideSelected:SetText("Suicide")
John@68 596 suicideSelected:SetCallback("OnClick",
John@68 597 function(_)
John@68 598 local p = SListEventDispatch:LatestValue()
John@68 599 local lref = SListPopulator.lref
John@68 600 lref:SuicidePerson(p.value)
John@68 601 end
John@68 602 )
John@68 603
John@63 604 -- use userdata + SListEventDispatch to toggle state
John@63 605 suicideSelected.userdata =
John@63 606 {
John@63 607 widget = suicideSelected,
John@65 608 ["Redraw"] = function(self,_) self.widget:SetDisabled(true) end,
John@63 609 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false) end,
John@63 610 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true) end
John@63 611 }
John@63 612 SListEventDispatch:RegisterListener(suicideSelected.userdata)
John@60 613
John@60 614 undo = AceGUI:Create("Button")
John@63 615 undo:SetText("Undo / out of order")
John@60 616 undo:SetFullWidth(true)
John@63 617 undo:SetDisabled(true)
John@60 618 end
John@60 619
John@56 620 local filter = AceGUI:Create("CheckBox")
John@56 621 filter:SetLabel("Only show active")
John@56 622 filter:SetFullWidth(true)
John@63 623 filter:SetValue(false)
John@63 624 SListPopulator:SetFiltered(false)
John@63 625 filter:SetCallback("OnValueChanged",function(widget,_,value) SListPopulator:SetFiltered(value) end)
John@56 626
John@56 627 left:AddChildren(filter)
John@56 628 if admin then left:AddChildren(suicideSelected,undo) end
John@56 629 right:AddChildren(t2)
John@56 630 if admin then right:AddChildren(alb1,alb2,alb3) end
John@56 631 right:AddChildren(biddingZone)
John@56 632 f:AddChildren(left,right)
John@58 633
John@58 634
John@1 635 end