changeset 52:7c7e80f63b51

First pass. Taking stuff from TreeGroup that I like/need/want in order to make a standalone selection list
author John@Yosemite-PC
date Sat, 24 Mar 2012 13:37:29 -0400
parents 11f18e279229
children 708d8a423b4c
files SelectorList.lua
diffstat 1 files changed, 274 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SelectorList.lua	Sat Mar 24 13:37:29 2012 -0400
@@ -0,0 +1,274 @@
+-- no bsk namespace here - we're hooking into AceGUI
+
+local Type, Version = "SelectorList", 34
+local AceGUI = LibStub and LibStub("AceGUI-3.0",true)
+if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
+
+local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
+local math_min, math_max, floor = math.min, math.max, floor
+local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat
+
+local CreateFrame, UIParent = CreateFrame, UIParent
+
+local new, del
+do
+	local pool = setmetatable({},{__mode='k'})
+	function new()
+		local t = next(pool)
+		if t then
+			pool[t] = nil
+			return t
+		else
+			return {}
+		end
+	end
+	function del(t)
+		for k in pairs(t) do
+			t[k] = nil
+		end	
+		pool[t] = true
+	end
+end
+
+local DEFAULT_SL_WIDTH = 175
+--local DEFAULT_TREE_SIZABLE = true
+
+
+local function Layout(self)
+    self:SetHeight(self.numlines * 18 + 20)
+
+end
+
+local function CreateButton(widget)
+	local num = AceGUI:GetNextWidgetNum("TreeGroupButton")
+	local button = CreateFrame("Button", ("AceGUI30TreeButton%d"):format(num), widget.slframe, "OptionsListButtonTemplate")
+	button.obj = widget
+
+	local icon = button:CreateTexture(nil, "OVERLAY")
+	icon:SetWidth(14)
+	icon:SetHeight(14)
+	button.icon = icon
+
+	button:SetScript("OnClick",Button_OnClick)
+	button:SetScript("OnDoubleClick", Button_OnDoubleClick)
+	button:SetScript("OnEnter",Button_OnEnter)
+	button:SetScript("OnLeave",Button_OnLeave)
+
+	return button
+end
+
+local function UpdateButton(button, line, selected)
+	local self = button.obj
+	local frame = self.frame
+	local text = line.text or ""
+	local icon = line.icon
+	local iconCoords = line.iconCoords
+	local level = line.level or 1
+	local value = line.value
+	local uniquevalue = line.uniquevalue
+	local disabled = line.disabled
+	
+	button.line = line
+	button.value = value
+	button.uniquevalue = uniquevalue
+	if selected then
+		button:LockHighlight()
+		button.selected = true
+	else
+		button:UnlockHighlight()
+		button.selected = false
+	end
+	local normalTexture = button:GetNormalTexture()
+	local line = button.line
+	button.level = level
+	if ( level == 1 ) then
+		button:SetNormalFontObject("GameFontNormal")
+		button:SetHighlightFontObject("GameFontHighlight")
+		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2)
+	else
+		button:SetNormalFontObject("GameFontHighlightSmall")
+		button:SetHighlightFontObject("GameFontHighlightSmall")
+		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
+	end
+	
+	if disabled then
+		button:EnableMouse(false)
+		button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
+	else
+		button.text:SetText(text)
+		button:EnableMouse(true)
+	end
+	
+	if icon then
+		button.icon:SetTexture(icon)
+		button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
+	else
+		button.icon:SetTexture(nil)
+	end
+	
+	if iconCoords then
+		button.icon:SetTexCoord(unpack(iconCoords))
+	else
+		button.icon:SetTexCoord(0, 1, 0, 1)
+	end
+end
+
+
+local methods = {
+
+	["OnAcquire"] = function(self)
+		self:SetWidth(DEFAULT_SL_WIDTH)
+		self:SetNumLines()
+		--self:EnableButtonTooltips(true)
+	end,
+	--["SetWidth"] = function(self, width)
+	--    self.slframe:SetWidth(width)
+		
+	--    local status = self.status or self.localstatus
+	--    status.width = width
+	--    status.treesizable = resizable
+		
+	--end,
+	["SetNumLines"] = function(self,value)
+	    if not value or value < 4 then
+	        value = 4
+	    end
+	    self.numlines = value
+	    Layout(self)
+	end,
+	["SetList"] = function(self, list)
+        for i,v in ipairs(list) do
+            self.lines[i] = v
+        end
+        self:Refresh()
+	end,
+	["Refresh"] = function(self)
+	    local f = self.slframe
+	    local buttons = self.buttons
+	    local lines = self.lines
+        
+        local bnum = 1
+        for i=1,self.numlines do
+            local l = lines[i]
+            if not l then
+                break
+            end
+            local b = buttons[bnum]
+            if not b then
+                b = CreateButton(self)
+                buttons[bnum] = b
+                b:SetParent(f)
+                b:SetFrameLevel(f:GetFrameLevel()+1)
+                b:ClearAllPoints()
+                if bnum == 1 then
+                    -- todo: if scroll ...
+                    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)
+                end
+            end
+            UpdateButton(b, l)
+            b:Show()
+            bnum = bnum + 1
+        end
+	end,
+}
+
+
+
+
+
+
+
+
+
+local PaneBackdrop  = {
+	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
+	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
+	tile = true, tileSize = 16, edgeSize = 16,
+	insets = { left = 3, right = 3, top = 5, bottom = 3 }
+}
+
+local function Constructor()
+	local num = AceGUI:GetNextWidgetNum(Type)
+	local frame = CreateFrame("Frame", nil, UIParent)
+
+	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)
+	slframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
+	--slframe:SetResizable(true)
+	--slframe:SetMinResize(100, 1)
+	--slframe:SetMaxResize(400, 1600)
+	--slframe:SetScript("OnUpdate", FirstFrameUpdate)
+	--slframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
+	--slframe:SetScript("OnMouseWheel", Tree_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 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 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
+		type         = Type
+	}
+	if methods then
+	    for method, func in pairs(methods) do
+		    widget[method] = func
+	    end
+    end
+    slframe.obj = widget
+	--dragger.obj = widget
+	--scrollbar.obj = widget
+
+	return AceGUI:RegisterAsWidget(widget)
+end
+
+AceGUI:RegisterWidgetType(Type, Constructor, Version)
+
+
+
+