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@82
|
218 local entry = {value=i, text=v.link, link=v.link, mlid=v.mlid, disabled=v.disabled}
|
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
|