changeset 53:708d8a423b4c

Scroller functional
author John@Yosemite-PC
date Sat, 24 Mar 2012 14:22:01 -0400
parents 7c7e80f63b51
children c8c17286af95
files SelectorList.lua
diffstat 1 files changed, 88 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/SelectorList.lua	Sat Mar 24 13:37:29 2012 -0400
+++ b/SelectorList.lua	Sat Mar 24 14:22:01 2012 -0400
@@ -33,6 +33,29 @@
 local DEFAULT_SL_WIDTH = 175
 --local DEFAULT_TREE_SIZABLE = true
 
+local function SL_OnMouseWheel(frame, delta)
+	local self = frame.obj
+	if self.showscroll then
+		local scrollbar = self.scrollbar
+		local min, max = scrollbar:GetMinMaxValues()
+		local value = scrollbar:GetValue()
+		local newvalue = math_min(max,math_max(min,value - delta))
+		if value ~= newvalue then
+			scrollbar:SetValue(newvalue)
+		end
+	end
+end
+
+local function OnScrollValueChanged(frame, value)
+	if frame.obj.noupdate then return end
+	local self = frame.obj
+	local status = self.status or self.localstatus
+	status.scrollvalue = value
+	self:Refresh()
+	AceGUI:ClearFocus()
+end
+
+
 
 local function Layout(self)
     self:SetHeight(self.numlines * 18 + 20)
@@ -114,6 +137,7 @@
 end
 
 
+
 local methods = {
 
 	["OnAcquire"] = function(self)
@@ -137,22 +161,62 @@
 	    Layout(self)
 	end,
 	["SetList"] = function(self, list)
+	    self.lines = {}
         for i,v in ipairs(list) do
             self.lines[i] = v
         end
         self:Refresh()
 	end,
+
+	["ShowScroll"] = function(self, show)
+		self.showscroll = show
+		if show then
+			self.scrollbar:Show()
+			if self.buttons[1] then
+				self.buttons[1]:SetPoint("TOPRIGHT", self.slframe,"TOPRIGHT",-22,-10)
+			end
+		else
+			self.scrollbar:Hide()
+			if self.buttons[1] then
+				self.buttons[1]:SetPoint("TOPRIGHT", self.slframe,"TOPRIGHT",0,-10)
+			end
+		end
+	end,
+
 	["Refresh"] = function(self)
 	    local f = self.slframe
 	    local buttons = self.buttons
 	    local lines = self.lines
+		local status = self.status or self.localstatus
+
+		for i, v in ipairs(buttons) do
+			v:Hide()
+		end
+		local numlines = #lines
+		local maxlines = self.numlines
+
+		if numlines <= maxlines then
+		    status.scrollvalue = 0
+		    self:ShowScroll(false)
+			first, last = 1, numlines
+		else
+		    self:ShowScroll(true)
+		    self.noupdate = true
+		    self.scrollbar:SetMinMaxValues(0, numlines - maxlines)
+			if numlines - status.scrollvalue < maxlines then
+				status.scrollvalue = numlines - maxlines
+			end
+			self.noupdate = nil
+			first, last = status.scrollvalue+1, status.scrollvalue + maxlines
+
+			if self.scrollbar:GetValue() ~= status.scrollvalue then
+				self.scrollbar:SetValue(status.scrollvalue)
+			end
+		end
         
         local bnum = 1
-        for i=1,self.numlines do
+        for i= first, last do
             local l = lines[i]
-            if not l then
-                break
-            end
             local b = buttons[bnum]
             if not b then
                 b = CreateButton(self)
@@ -161,9 +225,12 @@
                 b:SetFrameLevel(f:GetFrameLevel()+1)
                 b:ClearAllPoints()
                 if bnum == 1 then
-                    -- todo: if scroll ...
+                    if self.showscroll then
+                        b:SetPoint("TOPRIGHT",-22,-10)
+                    else
+                        b:SetPoint("TOPRIGHT",0,-10)
+                    end
                     b:SetPoint("TOPLEFT",0,-10) 
-                    b:SetPoint("TOPRIGHT",0,-10)
                 else
                     b:SetPoint("TOPRIGHT", buttons[bnum-1], "BOTTOMRIGHT", 0, 0)
                     b:SetPoint("TOPLEFT", buttons[bnum-1], "BOTTOMLEFT", 0, 0)
@@ -197,10 +264,6 @@
 
 	local slframe = CreateFrame("Frame", nil, frame)
 	slframe:SetAllPoints()
-	--slframe:SetPoint("TOPLEFT")
-    --slframe:SetPoint("BOTTOMLEFT")
-	--slframe:SetWidth(DEFAULT_SL_WIDTH)
-	--slframe:SetHeight(DEFAULT_SL_WIDTH) -- todo
 	slframe:EnableMouseWheel(true)
 	slframe:SetBackdrop(PaneBackdrop)
 	slframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
@@ -210,49 +273,33 @@
 	--slframe:SetMaxResize(400, 1600)
 	--slframe:SetScript("OnUpdate", FirstFrameUpdate)
 	--slframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
-	--slframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
+	slframe:SetScript("OnMouseWheel", SL_OnMouseWheel)
 
-	--local scrollbar = CreateFrame("Slider", ("AceConfigDialogTreeGroup%dScrollBar"):format(num), slframe, "UIPanelScrollBarTemplate")
-	--scrollbar:SetScript("OnValueChanged", nil)
-	--scrollbar:SetPoint("TOPRIGHT", -10, -26)
-	--scrollbar:SetPoint("BOTTOMRIGHT", -10, 26)
-	--scrollbar:SetMinMaxValues(0,0)
-	--scrollbar:SetValueStep(1)
-	--scrollbar:SetValue(0)
-	--scrollbar:SetWidth(16)
-	--scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
+	local scrollbar = CreateFrame("Slider", ("SelectorList%dScrollBar"):format(num), slframe, "UIPanelScrollBarTemplate")
+	scrollbar:SetScript("OnValueChanged", nil)
+	scrollbar:SetPoint("TOPRIGHT", -10, -26)
+	scrollbar:SetPoint("BOTTOMRIGHT", -10, 26)
+	scrollbar:SetMinMaxValues(0,0)
+	scrollbar:SetValueStep(1)
+	scrollbar:SetValue(0)
+	scrollbar:SetWidth(16)
+	scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
 
-	--local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
-	--scrollbg:SetAllPoints(scrollbar)
-	--scrollbg:SetTexture(0,0,0,0.4)
-
-	--local border = CreateFrame("Frame",nil,frame)
-	--border:SetPoint("TOPLEFT", slframe, "TOPRIGHT")
-	--border:SetPoint("BOTTOMRIGHT")
-	--border:SetBackdrop(PaneBackdrop)
-	--border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	--border:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	----Container Support
-	--local content = CreateFrame("Frame", nil, border)
-	--content:SetPoint("TOPLEFT", 10, -10)
-	--content:SetPoint("BOTTOMRIGHT", -10, 10)
+	local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
+	scrollbg:SetAllPoints(scrollbar)
+	scrollbg:SetTexture(0,0,0,0.4)
 
 	local widget = {
 		frame        = frame,
 		lines        = {},
 		--levels       = {},
 		buttons      = {},
-		--hasChildren  = {},
 		localstatus  = { 
 			--groups = {}, 
 		    scrollvalue = 0 },
 		filter       = false,
 		slframe      = slframe,
-		--dragger      = dragger,
-		--scrollbar    = scrollbar,
-		--border       = border,
-		--content      = slframe, -- content is for containers
+		scrollbar    = scrollbar,
 		type         = Type
 	}
 	if methods then
@@ -261,8 +308,7 @@
 	    end
     end
     slframe.obj = widget
-	--dragger.obj = widget
-	--scrollbar.obj = widget
+    scrollbar.obj = widget
 
 	return AceGUI:RegisterAsWidget(widget)
 end