comparison Gui.lua @ 67:8387dc2ff658

Getting the rest of the UI elements to respond intuitively
author John@Doomsday
date Tue, 27 Mar 2012 10:19:48 -0400
parents d3f64d7246b3
children a177b863ed6c
comparison
equal deleted inserted replaced
66:331b5e176d79 67:8387dc2ff658
4 local table=table 4 local table=table
5 local pairs=pairs 5 local pairs=pairs
6 local setmetatable=setmetatable 6 local setmetatable=setmetatable
7 local ipairs=ipairs 7 local ipairs=ipairs
8 local string=string 8 local string=string
9 local sformat=string.format
9 local tostring=tostring 10 local tostring=tostring
10 local type=type 11 local type=type
11 local getn=getn 12 local getn=getn
12 setfenv(1,bsk) 13 setfenv(1,bsk)
13 14
61 62
62 SelectorListEventDispatcher = 63 SelectorListEventDispatcher =
63 { 64 {
64 listeners = nil, 65 listeners = nil,
65 target = nil, 66 target = nil,
67 line = nil,
66 ["SetTarget"] = function(self,other) 68 ["SetTarget"] = function(self,other)
67 self.target = other 69 self.target = other
68 self.target:SetCallback("OnSelectionCleared",function(...) self:OnSelectionCleared(...) end) 70 self.target:SetCallback("OnSelectionCleared",function(...) self:OnSelectionCleared(...) end)
69 self.target:SetCallback("OnSelection",function(...) self:OnSelection(...) end) 71 self.target:SetCallback("OnSelection",function(...) self:OnSelection(...) end)
70 end, 72 end,
71 ["RegisterListener"] = function(self,other) table.insert(self.listeners,other) end, 73 ["RegisterListener"] = function(self,other) table.insert(self.listeners,other) end,
72 ["OnSelectionCleared"] = function(self,_) 74 ["OnSelectionCleared"] = function(self,_)
75 self.line = nil
73 self:Event("OnSelectionCleared") 76 self:Event("OnSelectionCleared")
74 end, 77 end,
75 ["OnSelection"] = function(self,_,_,line) 78 ["OnSelection"] = function(self,_,_,line)
79 self.line = line
76 self:Event("OnSelection",line) 80 self:Event("OnSelection",line)
77 end, 81 end,
78 ["Event"] = function(self,event,arg) 82 ["Event"] = function(self,event,arg)
79 if not self.target then error("Event called with no listener...") end 83 if not self.target then error("Event called with no listener...") end
80 if not self.listeners then return end 84 if not self.listeners then return end
81 for i,v in pairs(self.listeners) do 85 for i,v in pairs(self.listeners) do
82 bsk.print("listener") 86 --bsk.print("listener")
83 if type(v) == "table" then 87 if type(v) == "table" then
84 if v[event] then 88 if v[event] then
85 v[event](v,arg) 89 v[event](v,arg)
86 end 90 end
87 elseif type(v) == "function" then 91 elseif type(v) == "function" then
89 elseif type(v) ~= "nil" then -- allow nils to pass quietly 93 elseif type(v) ~= "nil" then -- allow nils to pass quietly
90 _G.error("Bad listener - "..type(v)) 94 _G.error("Bad listener - "..type(v))
91 end 95 end
92 end 96 end
93 end, 97 end,
94 ["Release"] = function(self) self.listeners = {}; self.target=nil end 98 ["Release"] = function(self) self.listeners = {}; self.target=nil; self.line=nil end,
99 ["LatestValue"] = function(self) return self.line end
95 } 100 }
96 function SelectorListEventDispatcher:new() 101 function SelectorListEventDispatcher:new()
97 local t = {} 102 local t = {}
98 setmetatable(t,SelectorListEventDispatcher) 103 setmetatable(t,SelectorListEventDispatcher)
99 self.__index = self 104 self.__index = self
101 return t 106 return t
102 end 107 end
103 108
104 SListEventDispatch = SelectorListEventDispatcher:new() 109 SListEventDispatch = SelectorListEventDispatcher:new()
105 LListEventDispatch = SelectorListEventDispatcher:new() 110 LListEventDispatch = SelectorListEventDispatcher:new()
111 RListEventDispatch = SelectorListEventDispatcher:new()
106 112
107 local AdminLootEventCollector = 113 local AdminLootEventCollector =
108 { 114 {
109 listeners = {}, 115 listeners = {},
110 target1 = 116 target1 =
131 for le in self.lref:OrderedListEntryIter() do 137 for le in self.lref:OrderedListEntryIter() do
132 local disabled = not PersonList:IsActive(le:GetId()) 138 local disabled = not PersonList:IsActive(le:GetId())
133 if not self.filtered or not disabled then 139 if not self.filtered or not disabled then
134 local line = {value=le:GetId(),text=le:GetName(),icon=[[Interface\Glues\CharacterCreate\UI-CharacterCreate-Classes]]} 140 local line = {value=le:GetId(),text=le:GetName(),icon=[[Interface\Glues\CharacterCreate\UI-CharacterCreate-Classes]]}
135 line.iconCoords=_G.CLASS_ICON_TCOORDS[le:GetClass()] 141 line.iconCoords=_G.CLASS_ICON_TCOORDS[le:GetClass()]
142 line.textPlain = line.text
136 line.text=colorize(line.text,_G.RAID_CLASS_COLORS[le:GetClass()]) 143 line.text=colorize(line.text,_G.RAID_CLASS_COLORS[le:GetClass()])
137 line.disabled = disabled 144 line.disabled = disabled
138 table.insert(self.data,line) 145 table.insert(self.data,line)
139 end 146 end
140 end 147 end
165 172
166 if f then return end -- no second gui please 173 if f then return end -- no second gui please
167 local admin = bsk.admin or true 174 local admin = bsk.admin or true
168 f = AceGUI:Create("Frame") 175 f = AceGUI:Create("Frame")
169 176
170 f:SetCallback("OnClose",function(widget) escapeButton.shown = false; AceGUI:Release(widget); f=nil; right=nil; SListEventDispatch:Release(); LListEventDispatch:Release(); SListPopulator:Release() end) 177 f:SetCallback("OnClose",function(widget) escapeButton.shown = false; AceGUI:Release(widget); f=nil; right=nil; SListEventDispatch:Release(); LListEventDispatch:Release(); SListPopulator:Release(); RListEventDispatch:Release() end)
171 f:SetTitle("BSK") 178 f:SetTitle("BSK")
172 f:SetLayout("Flow") 179 f:SetLayout("Flow")
173 f:SetHeight(680) 180 f:SetHeight(680)
174 f:SetWidth(580) 181 f:SetWidth(580)
175 182
252 LListEventDispatch:RegisterListener(alb1.userdata) 259 LListEventDispatch:RegisterListener(alb1.userdata)
253 alb1:SetCallback("OnClick", 260 alb1:SetCallback("OnClick",
254 function(widget) 261 function(widget)
255 if widget.userdata.state then -- we were bidding when the button was pressed 262 if widget.userdata.state then -- we were bidding when the button was pressed
256 biddingZone:ReleaseChildren() 263 biddingZone:ReleaseChildren()
264 RListEventDispatch:Release()
257 else 265 else
258 local spacer = AceGUI:Create("Label") 266 local spacer = AceGUI:Create("Label")
259 spacer:SetText(" ") 267 spacer:SetText(" ")
260 spacer:SetFullWidth(true) 268 spacer:SetFullWidth(true)
261 local spacer2 = AceGUI:Create("Label") 269 local spacer2 = AceGUI:Create("Label")
263 spacer2:SetFullWidth(true) 271 spacer2:SetFullWidth(true)
264 272
265 local label = AceGUI:Create("Label") 273 local label = AceGUI:Create("Label")
266 label:SetText("Bidding now open for ...") 274 label:SetText("Bidding now open for ...")
267 local biddingOn = AceGUI:Create("InteractiveLabel") 275 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" } 276 biddingOn.userdata = { LListEventDispatch:LatestValue().link }
269 biddingOn:SetText(biddingOn.userdata[1]) 277 biddingOn:SetText(biddingOn.userdata[1])
270 biddingOn:SetFullWidth(true) 278 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 ) 279 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 ) 280 biddingOn:SetCallback("OnLeave", function(widget) _G.GameTooltip:Hide() end )
273 local b1 = AceGUI:Create("SelectorList") 281 local b1 = AceGUI:Create("SelectorList")
274 b1:SetNumLines(6) 282 b1:SetNumLines(6)
275 b1:SetInteractive(admin) 283 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") 284 local bidTitle = AceGUI:Create("Label")
282 bidTitle:SetText("Current bids") 285 bidTitle:SetText("Current bids")
283 bidTitle:SetFullWidth(true) 286 bidTitle:SetFullWidth(true)
284 287
285 local bidRetractButton = AceGUI:Create("Button") 288 local bidRetractButton = AceGUI:Create("Button")
287 bidRetractButton:SetWidth(100) 290 bidRetractButton:SetWidth(100)
288 local rollButton = AceGUI:Create("Button") 291 local rollButton = AceGUI:Create("Button")
289 rollButton:SetText("Offset Roll") 292 rollButton:SetText("Offset Roll")
290 rollButton:SetWidth(100) 293 rollButton:SetWidth(100)
291 294
295 local dummydata= {}
296 local tree =SListPopulator.data
297 for i,v in pairs(tree) do dummydata[i] = copy(v); dummydata[i].disabled = false end
298 if dummydata[2] then dummydata[2].text = dummydata[2].text .. " (roll 73)" end
299 b1:SetList(dummydata)
300
292 local g1 301 local g1
293 if admin then 302 if admin then
303 RListEventDispatch:SetTarget(b1)
294 b1.alignoffset = 0.25 -- or else g1 won't align well 304 b1.alignoffset = 0.25 -- or else g1 won't align well
295 g1 = AceGUI:Create("SimpleGroup") 305 g1 = AceGUI:Create("SimpleGroup")
296 g1.alignoffset = 0.25 306 g1.alignoffset = 0.25
297 g1:SetWidth(120) 307 g1:SetWidth(120)
298 g1:SetLayout("List") 308 g1:SetLayout("List")
299 309
310 -- todo: convoluted and repetitive - surely there's a
311 -- better way than this ...
300 adminForce = AceGUI:Create("Button") 312 adminForce = AceGUI:Create("Button")
301 adminForce:SetText("Force bid") 313 if SListEventDispatch:LatestValue() then
302 adminForce:SetWidth(100) 314 adminForce:SetText(sformat("Force bid (%s)",SListEventDispatch:LatestValue().textPlain))
315 adminForce:SetDisabled(false)
316 else
317 adminForce:SetText("Force bid")
318 adminForce:SetDisabled(true)
319 end
320 adminForce:SetWidth(160)
321 adminForce.userdata =
322 {
323 widget = adminForce,
324 ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.widget:SetText("Force bid") end,
325 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false); self.widget:SetText(sformat("Force bid (%s)",SListEventDispatch:LatestValue().textPlain)) end,
326 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.widget:SetText("Force bid") end
327 }
328 SListEventDispatch:RegisterListener(adminForce.userdata)
303 329
304 adminRetract = AceGUI:Create("Button") 330 adminRetract = AceGUI:Create("Button")
305 adminRetract:SetText("Retract bid") 331 if RListEventDispatch:LatestValue() then
306 adminRetract:SetWidth(100) 332 adminRetract:SetText(sformat("Retract bid (%s)",RListEventDispatch:LatestValue().textPlain))
333 adminRetract:SetDisabled(false)
334 else
335 adminRetract:SetText("Retract bid")
336 adminRetract:SetDisabled(true)
337 end
338 adminRetract:SetWidth(160)
339 adminRetract.userdata =
340 {
341 widget = adminRetract,
342 ["Redraw"] = function(self,_) self.widget:SetDisabled(true); self.widget:SetText("Retract bid") end,
343 ["OnSelection"] = function(self,_) self.widget:SetDisabled(false); self.widget:SetText(sformat("Retract bid (%s)",RListEventDispatch:LatestValue().textPlain)) end,
344 ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true); self.widget:SetText("Retract bid") end
345 }
346 RListEventDispatch:RegisterListener(adminRetract.userdata)
347 adminRetract:SetDisabled(true)
307 348
308 g1:AddChildren(adminForce,adminRetract) 349 g1:AddChildren(adminForce,adminRetract)
309 end 350 end
310 351
311 biddingZone:AddChildren(spacer,label,biddingOn,bidRetractButton,rollButton,spacer2,bidTitle,b1) 352 biddingZone:AddChildren(spacer,label,biddingOn,bidRetractButton,rollButton,spacer2,bidTitle,b1)
312 if admin then biddingZone:AddChildren(g1) end 353 if admin then biddingZone:AddChildren(g1) end
313
314
315 end 354 end
316 widget.userdata.state = not widget.userdata.state 355 widget.userdata.state = not widget.userdata.state
317 end 356 end
318 ) 357 )
319 358