Mercurial > wow > breuesk
comparison SelectorList.lua @ 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 | |
| children | 708d8a423b4c |
comparison
equal
deleted
inserted
replaced
| 51:11f18e279229 | 52:7c7e80f63b51 |
|---|---|
| 1 -- no bsk namespace here - we're hooking into AceGUI | |
| 2 | |
| 3 local Type, Version = "SelectorList", 34 | |
| 4 local AceGUI = LibStub and LibStub("AceGUI-3.0",true) | |
| 5 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | |
| 6 | |
| 7 local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type | |
| 8 local math_min, math_max, floor = math.min, math.max, floor | |
| 9 local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat | |
| 10 | |
| 11 local CreateFrame, UIParent = CreateFrame, UIParent | |
| 12 | |
| 13 local new, del | |
| 14 do | |
| 15 local pool = setmetatable({},{__mode='k'}) | |
| 16 function new() | |
| 17 local t = next(pool) | |
| 18 if t then | |
| 19 pool[t] = nil | |
| 20 return t | |
| 21 else | |
| 22 return {} | |
| 23 end | |
| 24 end | |
| 25 function del(t) | |
| 26 for k in pairs(t) do | |
| 27 t[k] = nil | |
| 28 end | |
| 29 pool[t] = true | |
| 30 end | |
| 31 end | |
| 32 | |
| 33 local DEFAULT_SL_WIDTH = 175 | |
| 34 --local DEFAULT_TREE_SIZABLE = true | |
| 35 | |
| 36 | |
| 37 local function Layout(self) | |
| 38 self:SetHeight(self.numlines * 18 + 20) | |
| 39 | |
| 40 end | |
| 41 | |
| 42 local function CreateButton(widget) | |
| 43 local num = AceGUI:GetNextWidgetNum("TreeGroupButton") | |
| 44 local button = CreateFrame("Button", ("AceGUI30TreeButton%d"):format(num), widget.slframe, "OptionsListButtonTemplate") | |
| 45 button.obj = widget | |
| 46 | |
| 47 local icon = button:CreateTexture(nil, "OVERLAY") | |
| 48 icon:SetWidth(14) | |
| 49 icon:SetHeight(14) | |
| 50 button.icon = icon | |
| 51 | |
| 52 button:SetScript("OnClick",Button_OnClick) | |
| 53 button:SetScript("OnDoubleClick", Button_OnDoubleClick) | |
| 54 button:SetScript("OnEnter",Button_OnEnter) | |
| 55 button:SetScript("OnLeave",Button_OnLeave) | |
| 56 | |
| 57 return button | |
| 58 end | |
| 59 | |
| 60 local function UpdateButton(button, line, selected) | |
| 61 local self = button.obj | |
| 62 local frame = self.frame | |
| 63 local text = line.text or "" | |
| 64 local icon = line.icon | |
| 65 local iconCoords = line.iconCoords | |
| 66 local level = line.level or 1 | |
| 67 local value = line.value | |
| 68 local uniquevalue = line.uniquevalue | |
| 69 local disabled = line.disabled | |
| 70 | |
| 71 button.line = line | |
| 72 button.value = value | |
| 73 button.uniquevalue = uniquevalue | |
| 74 if selected then | |
| 75 button:LockHighlight() | |
| 76 button.selected = true | |
| 77 else | |
| 78 button:UnlockHighlight() | |
| 79 button.selected = false | |
| 80 end | |
| 81 local normalTexture = button:GetNormalTexture() | |
| 82 local line = button.line | |
| 83 button.level = level | |
| 84 if ( level == 1 ) then | |
| 85 button:SetNormalFontObject("GameFontNormal") | |
| 86 button:SetHighlightFontObject("GameFontHighlight") | |
| 87 button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2) | |
| 88 else | |
| 89 button:SetNormalFontObject("GameFontHighlightSmall") | |
| 90 button:SetHighlightFontObject("GameFontHighlightSmall") | |
| 91 button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2) | |
| 92 end | |
| 93 | |
| 94 if disabled then | |
| 95 button:EnableMouse(false) | |
| 96 button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE) | |
| 97 else | |
| 98 button.text:SetText(text) | |
| 99 button:EnableMouse(true) | |
| 100 end | |
| 101 | |
| 102 if icon then | |
| 103 button.icon:SetTexture(icon) | |
| 104 button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1) | |
| 105 else | |
| 106 button.icon:SetTexture(nil) | |
| 107 end | |
| 108 | |
| 109 if iconCoords then | |
| 110 button.icon:SetTexCoord(unpack(iconCoords)) | |
| 111 else | |
| 112 button.icon:SetTexCoord(0, 1, 0, 1) | |
| 113 end | |
| 114 end | |
| 115 | |
| 116 | |
| 117 local methods = { | |
| 118 | |
| 119 ["OnAcquire"] = function(self) | |
| 120 self:SetWidth(DEFAULT_SL_WIDTH) | |
| 121 self:SetNumLines() | |
| 122 --self:EnableButtonTooltips(true) | |
| 123 end, | |
| 124 --["SetWidth"] = function(self, width) | |
| 125 -- self.slframe:SetWidth(width) | |
| 126 | |
| 127 -- local status = self.status or self.localstatus | |
| 128 -- status.width = width | |
| 129 -- status.treesizable = resizable | |
| 130 | |
| 131 --end, | |
| 132 ["SetNumLines"] = function(self,value) | |
| 133 if not value or value < 4 then | |
| 134 value = 4 | |
| 135 end | |
| 136 self.numlines = value | |
| 137 Layout(self) | |
| 138 end, | |
| 139 ["SetList"] = function(self, list) | |
| 140 for i,v in ipairs(list) do | |
| 141 self.lines[i] = v | |
| 142 end | |
| 143 self:Refresh() | |
| 144 end, | |
| 145 ["Refresh"] = function(self) | |
| 146 local f = self.slframe | |
| 147 local buttons = self.buttons | |
| 148 local lines = self.lines | |
| 149 | |
| 150 local bnum = 1 | |
| 151 for i=1,self.numlines do | |
| 152 local l = lines[i] | |
| 153 if not l then | |
| 154 break | |
| 155 end | |
| 156 local b = buttons[bnum] | |
| 157 if not b then | |
| 158 b = CreateButton(self) | |
| 159 buttons[bnum] = b | |
| 160 b:SetParent(f) | |
| 161 b:SetFrameLevel(f:GetFrameLevel()+1) | |
| 162 b:ClearAllPoints() | |
| 163 if bnum == 1 then | |
| 164 -- todo: if scroll ... | |
| 165 b:SetPoint("TOPLEFT",0,-10) | |
| 166 b:SetPoint("TOPRIGHT",0,-10) | |
| 167 else | |
| 168 b:SetPoint("TOPRIGHT", buttons[bnum-1], "BOTTOMRIGHT", 0, 0) | |
| 169 b:SetPoint("TOPLEFT", buttons[bnum-1], "BOTTOMLEFT", 0, 0) | |
| 170 end | |
| 171 end | |
| 172 UpdateButton(b, l) | |
| 173 b:Show() | |
| 174 bnum = bnum + 1 | |
| 175 end | |
| 176 end, | |
| 177 } | |
| 178 | |
| 179 | |
| 180 | |
| 181 | |
| 182 | |
| 183 | |
| 184 | |
| 185 | |
| 186 | |
| 187 local PaneBackdrop = { | |
| 188 bgFile = "Interface\\ChatFrame\\ChatFrameBackground", | |
| 189 edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", | |
| 190 tile = true, tileSize = 16, edgeSize = 16, | |
| 191 insets = { left = 3, right = 3, top = 5, bottom = 3 } | |
| 192 } | |
| 193 | |
| 194 local function Constructor() | |
| 195 local num = AceGUI:GetNextWidgetNum(Type) | |
| 196 local frame = CreateFrame("Frame", nil, UIParent) | |
| 197 | |
| 198 local slframe = CreateFrame("Frame", nil, frame) | |
| 199 slframe:SetAllPoints() | |
| 200 --slframe:SetPoint("TOPLEFT") | |
| 201 --slframe:SetPoint("BOTTOMLEFT") | |
| 202 --slframe:SetWidth(DEFAULT_SL_WIDTH) | |
| 203 --slframe:SetHeight(DEFAULT_SL_WIDTH) -- todo | |
| 204 slframe:EnableMouseWheel(true) | |
| 205 slframe:SetBackdrop(PaneBackdrop) | |
| 206 slframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5) | |
| 207 slframe:SetBackdropBorderColor(0.4, 0.4, 0.4) | |
| 208 --slframe:SetResizable(true) | |
| 209 --slframe:SetMinResize(100, 1) | |
| 210 --slframe:SetMaxResize(400, 1600) | |
| 211 --slframe:SetScript("OnUpdate", FirstFrameUpdate) | |
| 212 --slframe:SetScript("OnSizeChanged", Tree_OnSizeChanged) | |
| 213 --slframe:SetScript("OnMouseWheel", Tree_OnMouseWheel) | |
| 214 | |
| 215 --local scrollbar = CreateFrame("Slider", ("AceConfigDialogTreeGroup%dScrollBar"):format(num), slframe, "UIPanelScrollBarTemplate") | |
| 216 --scrollbar:SetScript("OnValueChanged", nil) | |
| 217 --scrollbar:SetPoint("TOPRIGHT", -10, -26) | |
| 218 --scrollbar:SetPoint("BOTTOMRIGHT", -10, 26) | |
| 219 --scrollbar:SetMinMaxValues(0,0) | |
| 220 --scrollbar:SetValueStep(1) | |
| 221 --scrollbar:SetValue(0) | |
| 222 --scrollbar:SetWidth(16) | |
| 223 --scrollbar:SetScript("OnValueChanged", OnScrollValueChanged) | |
| 224 | |
| 225 --local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND") | |
| 226 --scrollbg:SetAllPoints(scrollbar) | |
| 227 --scrollbg:SetTexture(0,0,0,0.4) | |
| 228 | |
| 229 --local border = CreateFrame("Frame",nil,frame) | |
| 230 --border:SetPoint("TOPLEFT", slframe, "TOPRIGHT") | |
| 231 --border:SetPoint("BOTTOMRIGHT") | |
| 232 --border:SetBackdrop(PaneBackdrop) | |
| 233 --border:SetBackdropColor(0.1, 0.1, 0.1, 0.5) | |
| 234 --border:SetBackdropBorderColor(0.4, 0.4, 0.4) | |
| 235 | |
| 236 ----Container Support | |
| 237 --local content = CreateFrame("Frame", nil, border) | |
| 238 --content:SetPoint("TOPLEFT", 10, -10) | |
| 239 --content:SetPoint("BOTTOMRIGHT", -10, 10) | |
| 240 | |
| 241 local widget = { | |
| 242 frame = frame, | |
| 243 lines = {}, | |
| 244 --levels = {}, | |
| 245 buttons = {}, | |
| 246 --hasChildren = {}, | |
| 247 localstatus = { | |
| 248 --groups = {}, | |
| 249 scrollvalue = 0 }, | |
| 250 filter = false, | |
| 251 slframe = slframe, | |
| 252 --dragger = dragger, | |
| 253 --scrollbar = scrollbar, | |
| 254 --border = border, | |
| 255 --content = slframe, -- content is for containers | |
| 256 type = Type | |
| 257 } | |
| 258 if methods then | |
| 259 for method, func in pairs(methods) do | |
| 260 widget[method] = func | |
| 261 end | |
| 262 end | |
| 263 slframe.obj = widget | |
| 264 --dragger.obj = widget | |
| 265 --scrollbar.obj = widget | |
| 266 | |
| 267 return AceGUI:RegisterAsWidget(widget) | |
| 268 end | |
| 269 | |
| 270 AceGUI:RegisterWidgetType(Type, Constructor, Version) | |
| 271 | |
| 272 | |
| 273 | |
| 274 |
