Mercurial > wow > breuesk
changeset 63:00cb497201d0
Left side of the GUI works ...
author | John@Yosemite-PC |
---|---|
date | Mon, 26 Mar 2012 20:31:45 -0400 |
parents | 619e4b9c3cd9 |
children | f0450883c283 |
files | Gui.lua |
diffstat | 1 files changed, 106 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/Gui.lua Mon Mar 26 19:20:27 2012 -0400 +++ b/Gui.lua Mon Mar 26 20:31:45 2012 -0400 @@ -25,7 +25,7 @@ return "|cff"..tostring(color or "ffffff")..str.."|r" end -local CreateListSelector = function(OnValueChanged) +local CreateListSelector = function(SListPopulator) PersonList:RefreshRaidList() local pulldown = AceGUI:Create("Dropdown") local pull = {} @@ -44,24 +44,11 @@ end pulldown:SetWidth(175) pulldown:SetList(pull) - pulldown:SetCallback("OnValueChanged", OnValueChanged) - if ltemp > 0 then pulldown:SetValue(ltemp); OnValueChanged(nil,nil,ltemp) end -- sadly, SetValue doesn't fire a OnValueChanged + pulldown:SetCallback("OnValueChanged", function(_,_,value) SListPopulator:SetList(value) end) + if ltemp > 0 then pulldown:SetValue(ltemp); SListPopulator:SetList(ltemp) end -- sadly, SetValue doesn't fire a OnValueChanged return pulldown end -local tree = {} -local ovc = function(t1,value) - tree = {} - local l = LootLists:Select(value) - for le in l:OrderedListEntryIter() do - local line = {value=le:GetId(),text=le:GetName(),icon=[[Interface\Glues\CharacterCreate\UI-CharacterCreate-Classes]]} - line.iconCoords=_G.CLASS_ICON_TCOORDS[le:GetClass()] - line.text=colorize(line.text,_G.RAID_CLASS_COLORS[le:GetClass()]) - line.disabled = not PersonList:IsActive(le:GetId()) - table.insert(tree,line) - end - t1:SetList(tree) -end local f local escapeButton = { @@ -70,6 +57,87 @@ ["Hide"] = function(self) if f then AceGUI:Release(f); self.shown=false end end } +local function FilterEventDispatcher() +end + +SListEventDispatch = +{ + listeners= {}, + target = nil, + ["SetTarget"] = function(self,other) + self.target = other + self.target:SetCallback("OnSelectionCleared",SListListenerRebindOSC) + self.target:SetCallback("OnSelection",SListListenerRebindOS) + end, + ["RegisterListener"] = function(self,other) table.insert(self.listeners,other) end, + ["OnSelectionCleared"] = function(self,_) + self:Event("OnSelectionCleared") + end, + ["OnSelection"] = function(self,_,line) + self:Event("OnSelection",line) + end, + ["Event"] = function(self,event,arg) + if not self.target then error("Event called with no listener...") end + if not self.listeners then return end + for i,v in pairs(self.listeners) do + if type(v) == "table" then + if v[event] then + v[event](v,arg) + end + elseif type(v) == "function" then + v(event,arg) + elseif type(v) ~= "nil" then -- allow nils to pass quietly + _G.error("Bad listener - "..type(v)) + end + end + end, + ["Release"] = function(self) self.listeners = {}; target=nil end +} +function SListListenerRebindOSC(...) + SListEventDispatch:OnSelectionCleared(...) +end +function SListListenerRebindOS(...) + SListEventDispatch:OnSelection(...) +end +local SListPopulator = +{ + filtered = false, + widget = nil, + data = nil, + lref = nil, + + ["Release"] = function(self) self.filtered, self.widget, self.data, self.lref = false, nil, nil, nil end, + ["Redraw"] = function(self) + if self.lref == nil or self.widget == nil then return end -- don't do work if not fully initialized + self.data = {} + for le in self.lref:OrderedListEntryIter() do + local disabled = not PersonList:IsActive(le:GetId()) + if not self.filtered or not disabled then + local line = {value=le:GetId(),text=le:GetName(),icon=[[Interface\Glues\CharacterCreate\UI-CharacterCreate-Classes]]} + line.iconCoords=_G.CLASS_ICON_TCOORDS[le:GetClass()] + line.text=colorize(line.text,_G.RAID_CLASS_COLORS[le:GetClass()]) + line.disabled = disabled + table.insert(self.data,line) + end + end + self.widget:SetList(self.data) + end, + ["SetWidget"] = function(self,w) + if type(w) ~= "table" or w["SetList"] == nil then + _G.error("Bad SetWidget") + end + self.widget = w + end, + ["SetFiltered"] = function(self,value) + self.filtered = value + self:Redraw() + end, + ["SetList"] = function(self,value) + self.lref = LootLists:Select(value) + self:Redraw() + end +} + function CreateGUI() -- special registration procedure to be closable with the escape button --escapeButton.shown = true @@ -80,7 +148,7 @@ local admin = bsk.admin or true f = AceGUI:Create("Frame") - f:SetCallback("OnClose",function(widget) escapeButton.shown = false; AceGUI:Release(widget); f=nil end) + f:SetCallback("OnClose",function(widget) escapeButton.shown = false; AceGUI:Release(widget); f=nil; SListEventDispatch:Release(); SListPopulator:Release() end) f:SetTitle("BSK") f:SetLayout("Flow") f:SetHeight(680) @@ -102,11 +170,10 @@ t1:SetNumLines(25) t1:SetFullWidth(true) t1:SetInteractive(admin) + SListPopulator:SetWidget(t1) + SListEventDispatch:SetTarget(t1) - local listChange = function(_,_,value) - ovc(t1,value) - end - local p1 = CreateListSelector(listChange) + local p1 = CreateListSelector(SListPopulator) p1:SetFullWidth(true) left:AddChild(p1) @@ -181,9 +248,10 @@ local b1 = AceGUI:Create("SelectorList") b1:SetNumLines(6) b1:SetInteractive(admin) - local dummydata = {copy(tree[1]),copy( tree[2] ),copy( tree[3] )} - for i,v in pairs(dummydata) do v.disabled = false end - dummydata[2].text = dummydata[2].text .. " (roll 73)" + local dummydata= {} + local tree =SListPopulator.data + for i,v in pairs(tree) do dummydata[i] = copy(v); dummydata[i].disabled = false end + if dummydata[2] then dummydata[2].text = dummydata[2].text .. " (roll 73)" end b1:SetList(dummydata) local bidTitle = AceGUI:Create("Label") bidTitle:SetText("Current bids") @@ -217,16 +285,29 @@ suicideSelected = AceGUI:Create("Button") suicideSelected:SetFullWidth(true) suicideSelected:SetText("Suicide") + suicideSelected:SetDisabled(true) -- default is no selection has been made + -- use userdata + SListEventDispatch to toggle state + suicideSelected.userdata = + { + widget = suicideSelected, + ["OnSelection"] = function(self,_) self.widget:SetDisabled(false) end, + ["OnSelectionCleared"] = function(self) self.widget:SetDisabled(true) end + } + SListEventDispatch:RegisterListener(suicideSelected.userdata) undo = AceGUI:Create("Button") - undo:SetText("Undo") + undo:SetText("Undo / out of order") undo:SetFullWidth(true) + undo:SetDisabled(true) end local filter = AceGUI:Create("CheckBox") filter:SetLabel("Only show active") filter:SetFullWidth(true) + filter:SetValue(false) + SListPopulator:SetFiltered(false) + filter:SetCallback("OnValueChanged",function(widget,_,value) SListPopulator:SetFiltered(value) end) left:AddChildren(filter) if admin then left:AddChildren(suicideSelected,undo) end