Mercurial > wow > breuesk
comparison Gui.lua @ 65:d3f64d7246b3
Significant effort to start making the GUI behave in an intuitive way.
But it's still completely useless ...
| author | John@Yosemite-PC |
|---|---|
| date | Mon, 26 Mar 2012 23:47:24 -0400 |
| parents | 00cb497201d0 |
| children | 8387dc2ff658 |
comparison
equal
deleted
inserted
replaced
| 64:f0450883c283 | 65:d3f64d7246b3 |
|---|---|
| 1 local AceGUI = LibStub("AceGUI-3.0") | 1 local AceGUI = LibStub("AceGUI-3.0") |
| 2 local bsk=bsk | 2 local bsk=bsk |
| 3 local _G=_G | 3 local _G=_G |
| 4 local table=table | 4 local table=table |
| 5 local pairs=pairs | 5 local pairs=pairs |
| 6 local setmetatable=setmetatable | |
| 6 local ipairs=ipairs | 7 local ipairs=ipairs |
| 7 local string=string | 8 local string=string |
| 8 local tostring=tostring | 9 local tostring=tostring |
| 9 local type=type | 10 local type=type |
| 10 local getn=getn | 11 local getn=getn |
| 47 pulldown:SetCallback("OnValueChanged", function(_,_,value) SListPopulator:SetList(value) end) | 48 pulldown:SetCallback("OnValueChanged", function(_,_,value) SListPopulator:SetList(value) end) |
| 48 if ltemp > 0 then pulldown:SetValue(ltemp); SListPopulator:SetList(ltemp) end -- sadly, SetValue doesn't fire a OnValueChanged | 49 if ltemp > 0 then pulldown:SetValue(ltemp); SListPopulator:SetList(ltemp) end -- sadly, SetValue doesn't fire a OnValueChanged |
| 49 return pulldown | 50 return pulldown |
| 50 end | 51 end |
| 51 | 52 |
| 52 local f | 53 local f, right |
| 53 local escapeButton = | 54 local escapeButton = |
| 54 { | 55 { |
| 55 shown = false, | 56 shown = false, |
| 56 ["IsShown"] = function(self) return self.shown end, | 57 ["IsShown"] = function(self) return self.shown end, |
| 57 ["Hide"] = function(self) if f then AceGUI:Release(f); self.shown=false end end | 58 ["Hide"] = function(self) if f then AceGUI:Release(f); self.shown=false end end |
| 58 } | 59 } |
| 59 | 60 |
| 60 local function FilterEventDispatcher() | 61 |
| 61 end | 62 SelectorListEventDispatcher = |
| 62 | |
| 63 SListEventDispatch = | |
| 64 { | 63 { |
| 65 listeners= {}, | 64 listeners = nil, |
| 66 target = nil, | 65 target = nil, |
| 67 ["SetTarget"] = function(self,other) | 66 ["SetTarget"] = function(self,other) |
| 68 self.target = other | 67 self.target = other |
| 69 self.target:SetCallback("OnSelectionCleared",SListListenerRebindOSC) | 68 self.target:SetCallback("OnSelectionCleared",function(...) self:OnSelectionCleared(...) end) |
| 70 self.target:SetCallback("OnSelection",SListListenerRebindOS) | 69 self.target:SetCallback("OnSelection",function(...) self:OnSelection(...) end) |
| 71 end, | 70 end, |
| 72 ["RegisterListener"] = function(self,other) table.insert(self.listeners,other) end, | 71 ["RegisterListener"] = function(self,other) table.insert(self.listeners,other) end, |
| 73 ["OnSelectionCleared"] = function(self,_) | 72 ["OnSelectionCleared"] = function(self,_) |
| 74 self:Event("OnSelectionCleared") | 73 self:Event("OnSelectionCleared") |
| 75 end, | 74 end, |
| 76 ["OnSelection"] = function(self,_,line) | 75 ["OnSelection"] = function(self,_,_,line) |
| 77 self:Event("OnSelection",line) | 76 self:Event("OnSelection",line) |
| 78 end, | 77 end, |
| 79 ["Event"] = function(self,event,arg) | 78 ["Event"] = function(self,event,arg) |
| 80 if not self.target then error("Event called with no listener...") end | 79 if not self.target then error("Event called with no listener...") end |
| 81 if not self.listeners then return end | 80 if not self.listeners then return end |
| 82 for i,v in pairs(self.listeners) do | 81 for i,v in pairs(self.listeners) do |
| 82 bsk.print("listener") | |
| 83 if type(v) == "table" then | 83 if type(v) == "table" then |
| 84 if v[event] then | 84 if v[event] then |
| 85 v[event](v,arg) | 85 v[event](v,arg) |
| 86 end | 86 end |
| 87 elseif type(v) == "function" then | 87 elseif type(v) == "function" then |
| 89 elseif type(v) ~= "nil" then -- allow nils to pass quietly | 89 elseif type(v) ~= "nil" then -- allow nils to pass quietly |
| 90 _G.error("Bad listener - "..type(v)) | 90 _G.error("Bad listener - "..type(v)) |
| 91 end | 91 end |
| 92 end | 92 end |
| 93 end, | 93 end, |
| 94 ["Release"] = function(self) self.listeners = {}; target=nil end | 94 ["Release"] = function(self) self.listeners = {}; self.target=nil end |
| 95 } | 95 } |
| 96 function SListListenerRebindOSC(...) | 96 function SelectorListEventDispatcher:new() |
| 97 SListEventDispatch:OnSelectionCleared(...) | 97 local t = {} |
| 98 setmetatable(t,SelectorListEventDispatcher) | |
| 99 self.__index = self | |
| 100 t.listeners = {} | |
| 101 return t | |
| 98 end | 102 end |
| 99 function SListListenerRebindOS(...) | 103 |
| 100 SListEventDispatch:OnSelection(...) | 104 SListEventDispatch = SelectorListEventDispatcher:new() |
| 101 end | 105 LListEventDispatch = SelectorListEventDispatcher:new() |
| 106 | |
| 107 local AdminLootEventCollector = | |
| 108 { | |
| 109 listeners = {}, | |
| 110 target1 = | |
| 111 { | |
| 112 }, | |
| 113 target2 = | |
| 114 { | |
| 115 }, | |
| 116 | |
| 117 | |
| 118 } | |
| 119 | |
| 102 local SListPopulator = | 120 local SListPopulator = |
| 103 { | 121 { |
| 104 filtered = false, | 122 filtered = false, |
| 105 widget = nil, | 123 widget = nil, |
| 106 data = nil, | 124 data = nil, |
| 119 line.disabled = disabled | 137 line.disabled = disabled |
| 120 table.insert(self.data,line) | 138 table.insert(self.data,line) |
| 121 end | 139 end |
| 122 end | 140 end |
| 123 self.widget:SetList(self.data) | 141 self.widget:SetList(self.data) |
| 142 SListEventDispatch:Event("Redraw") | |
| 124 end, | 143 end, |
| 125 ["SetWidget"] = function(self,w) | 144 ["SetWidget"] = function(self,w) |
| 126 if type(w) ~= "table" or w["SetList"] == nil then | 145 if type(w) ~= "table" or type(w.SetList) ~= "function" then |
| 127 _G.error("Bad SetWidget") | 146 _G.error("Bad SetWidget") |
| 128 end | 147 end |
| 129 self.widget = w | 148 self.widget = w |
| 130 end, | 149 end, |
| 131 ["SetFiltered"] = function(self,value) | 150 ["SetFiltered"] = function(self,value) |
| 146 | 165 |
| 147 if f then return end -- no second gui please | 166 if f then return end -- no second gui please |
| 148 local admin = bsk.admin or true | 167 local admin = bsk.admin or true |
| 149 f = AceGUI:Create("Frame") | 168 f = AceGUI:Create("Frame") |
| 150 | 169 |
| 151 f:SetCallback("OnClose",function(widget) escapeButton.shown = false; AceGUI:Release(widget); f=nil; SListEventDispatch:Release(); SListPopulator:Release() end) | 170 f:SetCallback("OnClose",function(widget) escapeButton.shown = false; AceGUI:Release(widget); f=nil; right=nil; SListEventDispatch:Release(); LListEventDispatch:Release(); SListPopulator:Release() end) |
| 152 f:SetTitle("BSK") | 171 f:SetTitle("BSK") |
| 153 f:SetLayout("Flow") | 172 f:SetLayout("Flow") |
| 154 f:SetHeight(680) | 173 f:SetHeight(680) |
| 155 f:SetWidth(580) | 174 f:SetWidth(580) |
| 156 | 175 |
| 158 left:SetLayout("List") | 177 left:SetLayout("List") |
| 159 left:SetWidth(175) | 178 left:SetWidth(175) |
| 160 left:SetFullHeight(true) | 179 left:SetFullHeight(true) |
| 161 left.alignoffset=0.25 -- hack, as per http://forums.wowace.com/showthread.php?t=17114 | 180 left.alignoffset=0.25 -- hack, as per http://forums.wowace.com/showthread.php?t=17114 |
| 162 | 181 |
| 163 local right = AceGUI:Create("InlineGroup") | 182 right = AceGUI:Create("InlineGroup") |
| 164 right:SetLayout("Flow") | 183 right:SetLayout("Flow") |
| 165 right:SetWidth(700-175-160) | 184 right:SetWidth(700-175-160) |
| 166 right:SetFullHeight(true) | 185 right:SetFullHeight(true) |
| 167 right.alignoffset=0.25 | 186 right.alignoffset=0.25 |
| 168 | 187 |
| 208 value=5, | 227 value=5, |
| 209 text = "|cffff8000|Hitem:19019:0:0:0:0:0:0:0:85:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r", | 228 text = "|cffff8000|Hitem:19019:0:0:0:0:0:0:0:85:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r", |
| 210 link = "|cffff8000|Hitem:19019:0:0:0:0:0:0:0:85:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r" | 229 link = "|cffff8000|Hitem:19019:0:0:0:0:0:0:0:85:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r" |
| 211 }, | 230 }, |
| 212 }) | 231 }) |
| 232 LListEventDispatch:SetTarget(t2) | |
| 233 | |
| 234 local biddingZone = AceGUI:Create("SimpleGroup") | |
| 235 biddingZone:SetLayout("Flow") | |
| 236 biddingZone:SetFullWidth(true) | |
| 213 | 237 |
| 214 local alb1, alb2, alb3 | 238 local alb1, alb2, alb3 |
| 215 if admin then | 239 if admin then |
| 216 alb1 = AceGUI:Create("Button") | 240 alb1 = AceGUI:Create("Button") |
| 217 alb1:SetWidth(100) | 241 alb1:SetWidth(100) |
| 218 alb1:SetText("Open Bids") | 242 alb1:SetText("Open Bids") |
| 243 alb1.userdata = | |
| 244 { | |
| 245 state = false, | |
| 246 widget = alb1, | |
| 247 ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.item = nil end, | |
| 248 ["OnSelection"] = function(self,value) self.widget:SetDisabled(false); self.item = value end, | |
| 249 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.item = nil end | |
| 250 } | |
| 251 alb1:SetDisabled(true) | |
| 252 LListEventDispatch:RegisterListener(alb1.userdata) | |
| 253 alb1:SetCallback("OnClick", | |
| 254 function(widget) | |
| 255 if widget.userdata.state then -- we were bidding when the button was pressed | |
| 256 biddingZone:ReleaseChildren() | |
| 257 else | |
| 258 local spacer = AceGUI:Create("Label") | |
| 259 spacer:SetText(" ") | |
| 260 spacer:SetFullWidth(true) | |
| 261 local spacer2 = AceGUI:Create("Label") | |
| 262 spacer2:SetText(" ") | |
| 263 spacer2:SetFullWidth(true) | |
| 264 | |
| 265 local label = AceGUI:Create("Label") | |
| 266 label:SetText("Bidding now open for ...") | |
| 267 local biddingOn = AceGUI:Create("InteractiveLabel") | |
| 268 biddingOn.userdata = { "|cffa335ee|Hitem:65003:0:0:0:0:0:0:0:85:0|h[Reclaimed Ashkandi, Greatsword of the Brotherhood]|h|r" } | |
| 269 biddingOn:SetText(biddingOn.userdata[1]) | |
| 270 biddingOn:SetFullWidth(true) | |
| 271 biddingOn:SetCallback("OnEnter", function(widget) _G.GameTooltip:SetOwner(widget.frame,"ANCHOR_RIGHT"); _G.GameTooltip:SetHyperlink(widget.userdata[1]); _G.GameTooltip:Show() end ) | |
| 272 biddingOn:SetCallback("OnLeave", function(widget) _G.GameTooltip:Hide() end ) | |
| 273 local b1 = AceGUI:Create("SelectorList") | |
| 274 b1:SetNumLines(6) | |
| 275 b1:SetInteractive(admin) | |
| 276 local dummydata= {} | |
| 277 local tree =SListPopulator.data | |
| 278 for i,v in pairs(tree) do dummydata[i] = copy(v); dummydata[i].disabled = false end | |
| 279 if dummydata[2] then dummydata[2].text = dummydata[2].text .. " (roll 73)" end | |
| 280 b1:SetList(dummydata) | |
| 281 local bidTitle = AceGUI:Create("Label") | |
| 282 bidTitle:SetText("Current bids") | |
| 283 bidTitle:SetFullWidth(true) | |
| 284 | |
| 285 local bidRetractButton = AceGUI:Create("Button") | |
| 286 bidRetractButton:SetText("Place Bid") | |
| 287 bidRetractButton:SetWidth(100) | |
| 288 local rollButton = AceGUI:Create("Button") | |
| 289 rollButton:SetText("Offset Roll") | |
| 290 rollButton:SetWidth(100) | |
| 291 | |
| 292 local g1 | |
| 293 if admin then | |
| 294 b1.alignoffset = 0.25 -- or else g1 won't align well | |
| 295 g1 = AceGUI:Create("SimpleGroup") | |
| 296 g1.alignoffset = 0.25 | |
| 297 g1:SetWidth(120) | |
| 298 g1:SetLayout("List") | |
| 299 | |
| 300 adminForce = AceGUI:Create("Button") | |
| 301 adminForce:SetText("Force bid") | |
| 302 adminForce:SetWidth(100) | |
| 303 | |
| 304 adminRetract = AceGUI:Create("Button") | |
| 305 adminRetract:SetText("Retract bid") | |
| 306 adminRetract:SetWidth(100) | |
| 307 | |
| 308 g1:AddChildren(adminForce,adminRetract) | |
| 309 end | |
| 310 | |
| 311 biddingZone:AddChildren(spacer,label,biddingOn,bidRetractButton,rollButton,spacer2,bidTitle,b1) | |
| 312 if admin then biddingZone:AddChildren(g1) end | |
| 313 | |
| 314 | |
| 315 end | |
| 316 widget.userdata.state = not widget.userdata.state | |
| 317 end | |
| 318 ) | |
| 219 | 319 |
| 220 alb2 = AceGUI:Create("Button") | 320 alb2 = AceGUI:Create("Button") |
| 221 alb2:SetWidth(100) | 321 alb2:SetWidth(100) |
| 222 alb2:SetText("Assign") | 322 alb2:SetText("Assign") |
| 323 alb2.userdata = | |
| 324 { | |
| 325 widget = alb2, | |
| 326 ["OnUpdate"] = function(self) self.widget:SetDisabled(not (self.slist.checked and self.llist.checked)) end, | |
| 327 } | |
| 328 alb2.userdata.slist = | |
| 329 { | |
| 330 parent = alb2.userdata, | |
| 331 checked = false, | |
| 332 ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end, | |
| 333 ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end, | |
| 334 ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end, | |
| 335 } | |
| 336 alb2.userdata.llist = | |
| 337 { | |
| 338 parent = alb2.userdata, | |
| 339 checked = false, | |
| 340 ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end, | |
| 341 ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end, | |
| 342 ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end, | |
| 343 } | |
| 344 SListEventDispatch:RegisterListener(alb2.userdata.slist) | |
| 345 LListEventDispatch:RegisterListener(alb2.userdata.llist) | |
| 223 | 346 |
| 224 alb3 = AceGUI:Create("Button") | 347 alb3 = AceGUI:Create("Button") |
| 225 alb3:SetWidth(100) | 348 alb3:SetWidth(100) |
| 226 alb3:SetText("Suicide") | 349 alb3:SetText("Suicide") |
| 350 alb3.userdata = -- TODO: holy hell, come up with a pattern or something for this .... | |
| 351 { | |
| 352 widget = alb3, | |
| 353 ["OnUpdate"] = function(self) self.widget:SetDisabled(not (self.slist.checked and self.llist.checked)) end, | |
| 354 } | |
| 355 alb3.userdata.slist = | |
| 356 { | |
| 357 parent = alb3.userdata, | |
| 358 checked = false, | |
| 359 ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end, | |
| 360 ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end, | |
| 361 ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end, | |
| 362 } | |
| 363 alb3.userdata.llist = | |
| 364 { | |
| 365 parent = alb3.userdata, | |
| 366 checked = false, | |
| 367 ["Redraw"] = function(self) self.checked = false; self.parent:OnUpdate() end, | |
| 368 ["OnSelection"] = function(self) self.checked = true; self.parent:OnUpdate() end, | |
| 369 ["OnSelectionCleared"] = function(self) self.checked = false; self.parent:OnUpdate() end, | |
| 370 } | |
| 371 SListEventDispatch:RegisterListener(alb3.userdata.slist) | |
| 372 LListEventDispatch:RegisterListener(alb3.userdata.llist) | |
| 227 end | 373 end |
| 228 | 374 |
| 229 local spacer = AceGUI:Create("Label") | 375 local suicideSelected, undo |
| 230 spacer:SetText(" ") | |
| 231 spacer:SetFullWidth(true) | |
| 232 local spacer2 = AceGUI:Create("Label") | |
| 233 spacer2:SetText(" ") | |
| 234 spacer2:SetFullWidth(true) | |
| 235 | |
| 236 local biddingZone = AceGUI:Create("SimpleGroup") | |
| 237 biddingZone:SetLayout("Flow") | |
| 238 biddingZone:SetFullWidth(true) | |
| 239 | |
| 240 local label = AceGUI:Create("Label") | |
| 241 label:SetText("Bidding now open for ...") | |
| 242 local biddingOn = AceGUI:Create("InteractiveLabel") | |
| 243 biddingOn.userdata = { "|cffa335ee|Hitem:65003:0:0:0:0:0:0:0:85:0|h[Reclaimed Ashkandi, Greatsword of the Brotherhood]|h|r" } | |
| 244 biddingOn:SetText(biddingOn.userdata[1]) | |
| 245 biddingOn:SetFullWidth(true) | |
| 246 biddingOn:SetCallback("OnEnter", function(widget) _G.GameTooltip:SetOwner(widget.frame,"ANCHOR_RIGHT"); _G.GameTooltip:SetHyperlink(widget.userdata[1]); _G.GameTooltip:Show() end ) | |
| 247 biddingOn:SetCallback("OnLeave", function(widget) _G.GameTooltip:Hide() end ) | |
| 248 local b1 = AceGUI:Create("SelectorList") | |
| 249 b1:SetNumLines(6) | |
| 250 b1:SetInteractive(admin) | |
| 251 local dummydata= {} | |
| 252 local tree =SListPopulator.data | |
| 253 for i,v in pairs(tree) do dummydata[i] = copy(v); dummydata[i].disabled = false end | |
| 254 if dummydata[2] then dummydata[2].text = dummydata[2].text .. " (roll 73)" end | |
| 255 b1:SetList(dummydata) | |
| 256 local bidTitle = AceGUI:Create("Label") | |
| 257 bidTitle:SetText("Current bids") | |
| 258 bidTitle:SetFullWidth(true) | |
| 259 | |
| 260 local bidRetractButton = AceGUI:Create("Button") | |
| 261 bidRetractButton:SetText("Place Bid") | |
| 262 bidRetractButton:SetWidth(100) | |
| 263 local rollButton = AceGUI:Create("Button") | |
| 264 rollButton:SetText("Offset Roll") | |
| 265 rollButton:SetWidth(100) | |
| 266 | |
| 267 local g1, suicideSelected, undo | |
| 268 if admin then | 376 if admin then |
| 269 b1.alignoffset = 0.25 -- or else g1 won't align well | |
| 270 g1 = AceGUI:Create("SimpleGroup") | |
| 271 g1.alignoffset = 0.25 | |
| 272 g1:SetWidth(120) | |
| 273 g1:SetLayout("List") | |
| 274 | |
| 275 adminForce = AceGUI:Create("Button") | |
| 276 adminForce:SetText("Force bid") | |
| 277 adminForce:SetWidth(100) | |
| 278 | |
| 279 adminRetract = AceGUI:Create("Button") | |
| 280 adminRetract:SetText("Retract bid") | |
| 281 adminRetract:SetWidth(100) | |
| 282 | |
| 283 g1:AddChildren(adminForce,adminRetract) | |
| 284 | 377 |
| 285 suicideSelected = AceGUI:Create("Button") | 378 suicideSelected = AceGUI:Create("Button") |
| 286 suicideSelected:SetFullWidth(true) | 379 suicideSelected:SetFullWidth(true) |
| 287 suicideSelected:SetText("Suicide") | 380 suicideSelected:SetText("Suicide") |
| 288 suicideSelected:SetDisabled(true) -- default is no selection has been made | |
| 289 -- use userdata + SListEventDispatch to toggle state | 381 -- use userdata + SListEventDispatch to toggle state |
| 290 suicideSelected.userdata = | 382 suicideSelected.userdata = |
| 291 { | 383 { |
| 292 widget = suicideSelected, | 384 widget = suicideSelected, |
| 385 ["Redraw"] = function(self,_) self.widget:SetDisabled(true) end, | |
| 293 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false) end, | 386 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false) end, |
| 294 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true) end | 387 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true) end |
| 295 } | 388 } |
| 296 SListEventDispatch:RegisterListener(suicideSelected.userdata) | 389 SListEventDispatch:RegisterListener(suicideSelected.userdata) |
| 297 | 390 |
| 298 undo = AceGUI:Create("Button") | 391 undo = AceGUI:Create("Button") |
| 299 undo:SetText("Undo / out of order") | 392 undo:SetText("Undo / out of order") |
| 300 undo:SetFullWidth(true) | 393 undo:SetFullWidth(true) |
| 301 undo:SetDisabled(true) | 394 undo:SetDisabled(true) |
| 302 end | 395 end |
| 303 | |
| 304 | 396 |
| 305 local filter = AceGUI:Create("CheckBox") | 397 local filter = AceGUI:Create("CheckBox") |
| 306 filter:SetLabel("Only show active") | 398 filter:SetLabel("Only show active") |
| 307 filter:SetFullWidth(true) | 399 filter:SetFullWidth(true) |
| 308 filter:SetValue(false) | 400 filter:SetValue(false) |
| 309 SListPopulator:SetFiltered(false) | 401 SListPopulator:SetFiltered(false) |
| 310 filter:SetCallback("OnValueChanged",function(widget,_,value) SListPopulator:SetFiltered(value) end) | 402 filter:SetCallback("OnValueChanged",function(widget,_,value) SListPopulator:SetFiltered(value) end) |
| 311 | 403 |
| 312 left:AddChildren(filter) | 404 left:AddChildren(filter) |
| 313 if admin then left:AddChildren(suicideSelected,undo) end | 405 if admin then left:AddChildren(suicideSelected,undo) end |
| 314 biddingZone:AddChildren(spacer,label,biddingOn,bidRetractButton,rollButton,spacer2,bidTitle,b1) | |
| 315 if admin then biddingZone:AddChildren(g1) end | |
| 316 right:AddChildren(t2) | 406 right:AddChildren(t2) |
| 317 if admin then right:AddChildren(alb1,alb2,alb3) end | 407 if admin then right:AddChildren(alb1,alb2,alb3) end |
| 318 right:AddChildren(biddingZone) | 408 right:AddChildren(biddingZone) |
| 319 f:AddChildren(left,right) | 409 f:AddChildren(left,right) |
| 320 | 410 |
