Mercurial > wow > askmrrobot
comparison ui/AmrUiTabGroup.lua @ 57:01b63b8ed811 v21
total rewrite to version 21
| author | yellowfive |
|---|---|
| date | Fri, 05 Jun 2015 11:05:15 -0700 |
| parents | |
| children | 0515882856f1 |
comparison
equal
deleted
inserted
replaced
| 56:75431c084aa0 | 57:01b63b8ed811 |
|---|---|
| 1 --[[----------------------------------------------------------------------------- | |
| 2 AMR TabGroup Container | |
| 3 Container that uses tabs on top to switch between groups. | |
| 4 This is adapted from AceGUIContainer-TabGroup, but has a custom look. | |
| 5 -------------------------------------------------------------------------------]] | |
| 6 local Type, Version = "AmrUiTabGroup", 1 | |
| 7 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | |
| 8 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | |
| 9 | |
| 10 local Amr = LibStub("AceAddon-3.0"):GetAddon("AskMrRobot") | |
| 11 | |
| 12 -- Lua APIs | |
| 13 local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe | |
| 14 | |
| 15 -- WoW APIs | |
| 16 local PlaySound = PlaySound | |
| 17 local CreateFrame, UIParent = CreateFrame, UIParent | |
| 18 local _G = _G | |
| 19 | |
| 20 | |
| 21 --[[----------------------------------------------------------------------------- | |
| 22 Support functions | |
| 23 -------------------------------------------------------------------------------]] | |
| 24 | |
| 25 local function tabSetSelected(frame, selected) | |
| 26 frame.selected = selected | |
| 27 end | |
| 28 | |
| 29 local function tabSetDisabled(frame, disabled) | |
| 30 frame.disabled = disabled | |
| 31 end | |
| 32 | |
| 33 local function buildTabsOnUpdate(frame) | |
| 34 local self = frame.obj | |
| 35 self:BuildTabs() | |
| 36 frame:SetScript("OnUpdate", nil) | |
| 37 end | |
| 38 | |
| 39 | |
| 40 --[[----------------------------------------------------------------------------- | |
| 41 Scripts | |
| 42 -------------------------------------------------------------------------------]] | |
| 43 local function tabOnClick(frame) | |
| 44 if not (frame.selected or frame.disabled) then | |
| 45 PlaySound("igCharacterInfoTab") | |
| 46 frame.obj:SelectTab(frame.value) | |
| 47 end | |
| 48 end | |
| 49 | |
| 50 | |
| 51 --[[----------------------------------------------------------------------------- | |
| 52 Methods | |
| 53 -------------------------------------------------------------------------------]] | |
| 54 local methods = { | |
| 55 ["OnAcquire"] = function(self) | |
| 56 self.tabSelector:Hide() | |
| 57 self.frame:ClearAllPoints() | |
| 58 end, | |
| 59 | |
| 60 ["OnRelease"] = function(self) | |
| 61 self.status = nil | |
| 62 for k in pairs(self.localstatus) do | |
| 63 self.localstatus[k] = nil | |
| 64 end | |
| 65 self.tablist = nil | |
| 66 for _, tab in pairs(self.tabs) do | |
| 67 tab:Hide() | |
| 68 end | |
| 69 self.tabSelector:Hide() | |
| 70 end, | |
| 71 | |
| 72 ["CreateTab"] = function(self, id, style) | |
| 73 local tabname = ("AmrUiTabGroup%dTab%d"):format(self.num, id) | |
| 74 | |
| 75 local tab = CreateFrame("Button", tabname, self.border) | |
| 76 tab.obj = self | |
| 77 tab.id = id | |
| 78 | |
| 79 if style == "bold" then | |
| 80 tab:SetNormalFontObject(Amr.CreateFont("Regular", 24, Amr.Colors.TextHeaderDisabled)) | |
| 81 tab:SetHighlightFontObject(Amr.CreateFont("Regular", 24, Amr.Colors.TextHover)) | |
| 82 else | |
| 83 tab:SetNormalFontObject(Amr.CreateFont("Regular", 28, Amr.Colors.Text)) | |
| 84 tab:SetHighlightFontObject(Amr.CreateFont("Regular", 28, Amr.Colors.TextHover)) | |
| 85 end | |
| 86 | |
| 87 tab:SetScript("OnClick", tabOnClick) | |
| 88 | |
| 89 tab.SetSelected = tabSetSelected | |
| 90 tab.SetDisabled = tabSetDisabled | |
| 91 | |
| 92 return tab | |
| 93 end, | |
| 94 | |
| 95 ["SetStatusTable"] = function(self, status) | |
| 96 assert(type(status) == "table") | |
| 97 self.status = status | |
| 98 end, | |
| 99 | |
| 100 ["SelectTab"] = function(self, value) | |
| 101 local status = self.status or self.localstatus | |
| 102 | |
| 103 self.tabSelector:Hide() | |
| 104 | |
| 105 local found | |
| 106 for i, v in ipairs(self.tabs) do | |
| 107 if v.value == value then | |
| 108 v:SetSelected(true) | |
| 109 found = true | |
| 110 | |
| 111 -- show the tab selector under the proper tab | |
| 112 if v.style == "underline" then | |
| 113 self.tabSelector:SetWidth(v:GetWidth()) | |
| 114 self.tabSelector:ClearAllPoints() | |
| 115 self.tabSelector:SetPoint("TOPLEFT", v, "BOTTOMLEFT", 0, -2) | |
| 116 self.tabSelector:Show() | |
| 117 v:SetNormalFontObject(Amr.CreateFont("Regular", 28, Amr.Colors.Text)) | |
| 118 v:SetHighlightFontObject(Amr.CreateFont("Regular", 28, Amr.Colors.Text)) | |
| 119 elseif v.style == "bold" then | |
| 120 v:SetNormalFontObject(Amr.CreateFont("Bold", 28, Amr.Colors.TextHeaderActive)) | |
| 121 v:SetHighlightFontObject(Amr.CreateFont("Bold", 28, Amr.Colors.TextHeaderActive)) | |
| 122 end | |
| 123 else | |
| 124 v:SetSelected(false) | |
| 125 if v.style == "bold" then | |
| 126 v:SetNormalFontObject(Amr.CreateFont("Regular", 24, Amr.Colors.TextHeaderDisabled)) | |
| 127 v:SetHighlightFontObject(Amr.CreateFont("Regular", 24, Amr.Colors.TextHover)) | |
| 128 else | |
| 129 v:SetNormalFontObject(Amr.CreateFont("Regular", 28, Amr.Colors.Text)) | |
| 130 v:SetHighlightFontObject(Amr.CreateFont("Regular", 28, Amr.Colors.TextHover)) | |
| 131 end | |
| 132 end | |
| 133 end | |
| 134 status.selected = value | |
| 135 | |
| 136 -- call this to reposition after style change | |
| 137 self:BuildTabs() | |
| 138 | |
| 139 if found then | |
| 140 self:Fire("OnGroupSelected",value) | |
| 141 end | |
| 142 end, | |
| 143 | |
| 144 ["SetTabs"] = function(self, tabs) | |
| 145 self.tablist = tabs | |
| 146 self:BuildTabs() | |
| 147 end, | |
| 148 | |
| 149 ["BuildTabs"] = function(self) | |
| 150 local status = self.status or self.localstatus | |
| 151 local tablist = self.tablist | |
| 152 local tabs = self.tabs | |
| 153 | |
| 154 if not tablist then return end | |
| 155 | |
| 156 local first = true | |
| 157 for i, v in ipairs(tablist) do | |
| 158 local tab = tabs[i] | |
| 159 if not tab then | |
| 160 tab = self:CreateTab(i) | |
| 161 tabs[i] = tab | |
| 162 end | |
| 163 | |
| 164 local padding = 20 | |
| 165 if v.style == "bold" then padding = 0 end | |
| 166 | |
| 167 tab:Show() | |
| 168 tab:SetText(v.text) | |
| 169 tab:SetWidth(tab:GetTextWidth() + padding) | |
| 170 tab:SetHeight(tab:GetTextHeight()) | |
| 171 tab:SetDisabled(v.disabled) | |
| 172 tab.value = v.value | |
| 173 tab.style = v.style or "underline" | |
| 174 | |
| 175 tab:ClearAllPoints() | |
| 176 if first then | |
| 177 local firstOffset = 0 | |
| 178 if tab.style == "bold" then firstOffset = 4 end | |
| 179 tab:SetPoint("BOTTOMLEFT", self.border, "TOPLEFT", firstOffset, 8) | |
| 180 first = false | |
| 181 else | |
| 182 tab:SetPoint("LEFT", tabs[i - 1], "RIGHT", 30, 0) | |
| 183 end | |
| 184 end | |
| 185 end, | |
| 186 | |
| 187 ["OnWidthSet"] = function(self, width) | |
| 188 local content = self.content | |
| 189 local contentwidth = width - 60 | |
| 190 if contentwidth < 0 then | |
| 191 contentwidth = 0 | |
| 192 end | |
| 193 content:SetWidth(contentwidth) | |
| 194 content.width = contentwidth | |
| 195 self:BuildTabs(self) | |
| 196 self.frame:SetScript("OnUpdate", buildTabsOnUpdate) | |
| 197 end, | |
| 198 | |
| 199 ["OnHeightSet"] = function(self, height) | |
| 200 local content = self.content | |
| 201 local contentheight = height - (self.borderoffset + 23) | |
| 202 if contentheight < 0 then | |
| 203 contentheight = 0 | |
| 204 end | |
| 205 content:SetHeight(contentheight) | |
| 206 content.height = contentheight | |
| 207 end, | |
| 208 | |
| 209 ["LayoutFinished"] = function(self, width, height) | |
| 210 if self.noAutoHeight then return end | |
| 211 self:SetHeight((height or 0) + (self.borderoffset + 23)) | |
| 212 end, | |
| 213 | |
| 214 ["SetVisible"] = function(self, visible) | |
| 215 if visible then | |
| 216 self.frame:Show() | |
| 217 else | |
| 218 self.frame:Hide() | |
| 219 end | |
| 220 end | |
| 221 } | |
| 222 | |
| 223 --[[----------------------------------------------------------------------------- | |
| 224 Constructor | |
| 225 -------------------------------------------------------------------------------]] | |
| 226 local function Constructor() | |
| 227 local num = AceGUI:GetNextWidgetNum(Type) | |
| 228 local frame = CreateFrame("Frame",nil,UIParent) | |
| 229 frame:SetHeight(100) | |
| 230 frame:SetWidth(100) | |
| 231 frame:SetFrameStrata("FULLSCREEN_DIALOG") | |
| 232 | |
| 233 local border = CreateFrame("Frame", nil, frame) | |
| 234 local borderoffset = 30 | |
| 235 border:SetPoint("TOPLEFT", 0, -borderoffset) | |
| 236 border:SetPoint("BOTTOMRIGHT", 0, 3) | |
| 237 | |
| 238 local line = border:CreateTexture(nil, "ARTWORK") | |
| 239 line:Hide() | |
| 240 line:SetTexture(1, 1, 1, 1) | |
| 241 line:SetHeight(4) | |
| 242 | |
| 243 local content = CreateFrame("Frame", nil, border) | |
| 244 content:SetPoint("TOPLEFT", 0, 0) | |
| 245 content:SetPoint("BOTTOMRIGHT", 0, 0) | |
| 246 | |
| 247 local widget = { | |
| 248 num = num, | |
| 249 frame = frame, | |
| 250 localstatus = {}, | |
| 251 alignoffset = 18, | |
| 252 border = border, | |
| 253 borderoffset = borderoffset, | |
| 254 tabs = {}, | |
| 255 tabSelector = line, | |
| 256 content = content, | |
| 257 type = Type | |
| 258 } | |
| 259 for method, func in pairs(methods) do | |
| 260 widget[method] = func | |
| 261 end | |
| 262 | |
| 263 return AceGUI:RegisterAsContainer(widget) | |
| 264 end | |
| 265 | |
| 266 AceGUI:RegisterWidgetType(Type, Constructor, Version) |
