Mercurial > wow > breuesk
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) + + + +