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