Tercio@23: --[[----------------------------------------------------------------------------- Tercio@23: Frame Container Tercio@23: -------------------------------------------------------------------------------]] Tercio@23: local Type, Version = "Frame", 24 Tercio@23: local AceGUI = LibStub and LibStub("AceGUI-3.0", true) Tercio@23: if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end Tercio@23: Tercio@23: -- Lua APIs Tercio@23: local pairs, assert, type = pairs, assert, type Tercio@23: local wipe = table.wipe Tercio@23: Tercio@23: -- WoW APIs Tercio@23: local PlaySound = PlaySound Tercio@23: local CreateFrame, UIParent = CreateFrame, UIParent Tercio@23: Tercio@23: -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded Tercio@23: -- List them here for Mikk's FindGlobals script Tercio@23: -- GLOBALS: CLOSE Tercio@23: Tercio@23: --[[----------------------------------------------------------------------------- Tercio@23: Scripts Tercio@23: -------------------------------------------------------------------------------]] Tercio@23: local function Button_OnClick(frame) Tercio@23: PlaySound("gsTitleOptionExit") Tercio@23: frame.obj:Hide() Tercio@23: end Tercio@23: Tercio@23: local function Frame_OnClose(frame) Tercio@23: frame.obj:Fire("OnClose") Tercio@23: end Tercio@23: Tercio@23: local function Frame_OnMouseDown(frame) Tercio@23: AceGUI:ClearFocus() Tercio@23: end Tercio@23: Tercio@23: local function Title_OnMouseDown(frame) Tercio@23: frame:GetParent():StartMoving() Tercio@23: AceGUI:ClearFocus() Tercio@23: end Tercio@23: Tercio@23: local function MoverSizer_OnMouseUp(mover) Tercio@23: local frame = mover:GetParent() Tercio@23: frame:StopMovingOrSizing() Tercio@23: local self = frame.obj Tercio@23: local status = self.status or self.localstatus Tercio@23: status.width = frame:GetWidth() Tercio@23: status.height = frame:GetHeight() Tercio@23: status.top = frame:GetTop() Tercio@23: status.left = frame:GetLeft() Tercio@23: end Tercio@23: Tercio@23: local function SizerSE_OnMouseDown(frame) Tercio@23: frame:GetParent():StartSizing("BOTTOMRIGHT") Tercio@23: AceGUI:ClearFocus() Tercio@23: end Tercio@23: Tercio@23: local function SizerS_OnMouseDown(frame) Tercio@23: frame:GetParent():StartSizing("BOTTOM") Tercio@23: AceGUI:ClearFocus() Tercio@23: end Tercio@23: Tercio@23: local function SizerE_OnMouseDown(frame) Tercio@23: frame:GetParent():StartSizing("RIGHT") Tercio@23: AceGUI:ClearFocus() Tercio@23: end Tercio@23: Tercio@23: local function StatusBar_OnEnter(frame) Tercio@23: frame.obj:Fire("OnEnterStatusBar") Tercio@23: end Tercio@23: Tercio@23: local function StatusBar_OnLeave(frame) Tercio@23: frame.obj:Fire("OnLeaveStatusBar") Tercio@23: end Tercio@23: Tercio@23: --[[----------------------------------------------------------------------------- Tercio@23: Methods Tercio@23: -------------------------------------------------------------------------------]] Tercio@23: local methods = { Tercio@23: ["OnAcquire"] = function(self) Tercio@23: self.frame:SetParent(UIParent) Tercio@23: self.frame:SetFrameStrata("FULLSCREEN_DIALOG") Tercio@23: self:SetTitle() Tercio@23: self:SetStatusText() Tercio@23: self:ApplyStatus() Tercio@23: self:Show() Tercio@23: self:EnableResize(true) Tercio@23: end, Tercio@23: Tercio@23: ["OnRelease"] = function(self) Tercio@23: self.status = nil Tercio@23: wipe(self.localstatus) Tercio@23: end, Tercio@23: Tercio@23: ["OnWidthSet"] = function(self, width) Tercio@23: local content = self.content Tercio@23: local contentwidth = width - 34 Tercio@23: if contentwidth < 0 then Tercio@23: contentwidth = 0 Tercio@23: end Tercio@23: content:SetWidth(contentwidth) Tercio@23: content.width = contentwidth Tercio@23: end, Tercio@23: Tercio@23: ["OnHeightSet"] = function(self, height) Tercio@23: local content = self.content Tercio@23: local contentheight = height - 57 Tercio@23: if contentheight < 0 then Tercio@23: contentheight = 0 Tercio@23: end Tercio@23: content:SetHeight(contentheight) Tercio@23: content.height = contentheight Tercio@23: end, Tercio@23: Tercio@23: ["SetTitle"] = function(self, title) Tercio@23: self.titletext:SetText(title) Tercio@23: self.titlebg:SetWidth((self.titletext:GetWidth() or 0) + 10) Tercio@23: end, Tercio@23: Tercio@23: ["SetStatusText"] = function(self, text) Tercio@23: self.statustext:SetText(text) Tercio@23: end, Tercio@23: Tercio@23: ["Hide"] = function(self) Tercio@23: self.frame:Hide() Tercio@23: end, Tercio@23: Tercio@23: ["Show"] = function(self) Tercio@23: self.frame:Show() Tercio@23: end, Tercio@23: Tercio@23: ["EnableResize"] = function(self, state) Tercio@23: local func = state and "Show" or "Hide" Tercio@23: self.sizer_se[func](self.sizer_se) Tercio@23: self.sizer_s[func](self.sizer_s) Tercio@23: self.sizer_e[func](self.sizer_e) Tercio@23: end, Tercio@23: Tercio@23: -- called to set an external table to store status in Tercio@23: ["SetStatusTable"] = function(self, status) Tercio@23: assert(type(status) == "table") Tercio@23: self.status = status Tercio@23: self:ApplyStatus() Tercio@23: end, Tercio@23: Tercio@23: ["ApplyStatus"] = function(self) Tercio@23: local status = self.status or self.localstatus Tercio@23: local frame = self.frame Tercio@23: self:SetWidth(status.width or 700) Tercio@23: self:SetHeight(status.height or 500) Tercio@23: frame:ClearAllPoints() Tercio@23: if status.top and status.left then Tercio@23: frame:SetPoint("TOP", UIParent, "BOTTOM", 0, status.top) Tercio@23: frame:SetPoint("LEFT", UIParent, "LEFT", status.left, 0) Tercio@23: else Tercio@23: frame:SetPoint("CENTER") Tercio@23: end Tercio@23: end Tercio@23: } Tercio@23: Tercio@23: --[[----------------------------------------------------------------------------- Tercio@23: Constructor Tercio@23: -------------------------------------------------------------------------------]] Tercio@23: local FrameBackdrop = { Tercio@23: bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", Tercio@23: edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", Tercio@23: tile = true, tileSize = 32, edgeSize = 32, Tercio@23: insets = { left = 8, right = 8, top = 8, bottom = 8 } Tercio@23: } Tercio@23: Tercio@23: local PaneBackdrop = { Tercio@23: bgFile = "Interface\\ChatFrame\\ChatFrameBackground", Tercio@23: edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", Tercio@23: tile = true, tileSize = 16, edgeSize = 16, Tercio@23: insets = { left = 3, right = 3, top = 5, bottom = 3 } Tercio@23: } Tercio@23: Tercio@23: local function Constructor() Tercio@23: local frame = CreateFrame("Frame", nil, UIParent) Tercio@23: frame:Hide() Tercio@23: Tercio@23: frame:EnableMouse(true) Tercio@23: frame:SetMovable(true) Tercio@23: frame:SetResizable(true) Tercio@23: frame:SetFrameStrata("FULLSCREEN_DIALOG") Tercio@23: frame:SetBackdrop(FrameBackdrop) Tercio@23: frame:SetBackdropColor(0, 0, 0, 1) Tercio@23: frame:SetMinResize(400, 200) Tercio@23: frame:SetToplevel(true) Tercio@23: frame:SetScript("OnHide", Frame_OnClose) Tercio@23: frame:SetScript("OnMouseDown", Frame_OnMouseDown) Tercio@23: Tercio@23: local closebutton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate") Tercio@23: closebutton:SetScript("OnClick", Button_OnClick) Tercio@23: closebutton:SetPoint("BOTTOMRIGHT", -27, 17) Tercio@23: closebutton:SetHeight(20) Tercio@23: closebutton:SetWidth(100) Tercio@23: closebutton:SetText(CLOSE) Tercio@23: Tercio@23: local statusbg = CreateFrame("Button", nil, frame) Tercio@23: statusbg:SetPoint("BOTTOMLEFT", 15, 15) Tercio@23: statusbg:SetPoint("BOTTOMRIGHT", -132, 15) Tercio@23: statusbg:SetHeight(24) Tercio@23: statusbg:SetBackdrop(PaneBackdrop) Tercio@23: statusbg:SetBackdropColor(0.1,0.1,0.1) Tercio@23: statusbg:SetBackdropBorderColor(0.4,0.4,0.4) Tercio@23: statusbg:SetScript("OnEnter", StatusBar_OnEnter) Tercio@23: statusbg:SetScript("OnLeave", StatusBar_OnLeave) Tercio@23: Tercio@23: local statustext = statusbg:CreateFontString(nil, "OVERLAY", "GameFontNormal") Tercio@23: statustext:SetPoint("TOPLEFT", 7, -2) Tercio@23: statustext:SetPoint("BOTTOMRIGHT", -7, 2) Tercio@23: statustext:SetHeight(20) Tercio@23: statustext:SetJustifyH("LEFT") Tercio@23: statustext:SetText("") Tercio@23: Tercio@23: local titlebg = frame:CreateTexture(nil, "OVERLAY") Tercio@23: titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header") Tercio@23: titlebg:SetTexCoord(0.31, 0.67, 0, 0.63) Tercio@23: titlebg:SetPoint("TOP", 0, 12) Tercio@23: titlebg:SetWidth(100) Tercio@23: titlebg:SetHeight(40) Tercio@23: Tercio@23: local title = CreateFrame("Frame", nil, frame) Tercio@23: title:EnableMouse(true) Tercio@23: title:SetScript("OnMouseDown", Title_OnMouseDown) Tercio@23: title:SetScript("OnMouseUp", MoverSizer_OnMouseUp) Tercio@23: title:SetAllPoints(titlebg) Tercio@23: Tercio@23: local titletext = title:CreateFontString(nil, "OVERLAY", "GameFontNormal") Tercio@23: titletext:SetPoint("TOP", titlebg, "TOP", 0, -14) Tercio@23: Tercio@23: local titlebg_l = frame:CreateTexture(nil, "OVERLAY") Tercio@23: titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header") Tercio@23: titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63) Tercio@23: titlebg_l:SetPoint("RIGHT", titlebg, "LEFT") Tercio@23: titlebg_l:SetWidth(30) Tercio@23: titlebg_l:SetHeight(40) Tercio@23: Tercio@23: local titlebg_r = frame:CreateTexture(nil, "OVERLAY") Tercio@23: titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header") Tercio@23: titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63) Tercio@23: titlebg_r:SetPoint("LEFT", titlebg, "RIGHT") Tercio@23: titlebg_r:SetWidth(30) Tercio@23: titlebg_r:SetHeight(40) Tercio@23: Tercio@23: local sizer_se = CreateFrame("Frame", nil, frame) Tercio@23: sizer_se:SetPoint("BOTTOMRIGHT") Tercio@23: sizer_se:SetWidth(25) Tercio@23: sizer_se:SetHeight(25) Tercio@23: sizer_se:EnableMouse() Tercio@23: sizer_se:SetScript("OnMouseDown",SizerSE_OnMouseDown) Tercio@23: sizer_se:SetScript("OnMouseUp", MoverSizer_OnMouseUp) Tercio@23: Tercio@23: local line1 = sizer_se:CreateTexture(nil, "BACKGROUND") Tercio@23: line1:SetWidth(14) Tercio@23: line1:SetHeight(14) Tercio@23: line1:SetPoint("BOTTOMRIGHT", -8, 8) Tercio@23: line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border") Tercio@23: local x = 0.1 * 14/17 Tercio@23: line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5) Tercio@23: Tercio@23: local line2 = sizer_se:CreateTexture(nil, "BACKGROUND") Tercio@23: line2:SetWidth(8) Tercio@23: line2:SetHeight(8) Tercio@23: line2:SetPoint("BOTTOMRIGHT", -8, 8) Tercio@23: line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border") Tercio@23: local x = 0.1 * 8/17 Tercio@23: line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5) Tercio@23: Tercio@23: local sizer_s = CreateFrame("Frame", nil, frame) Tercio@23: sizer_s:SetPoint("BOTTOMRIGHT", -25, 0) Tercio@23: sizer_s:SetPoint("BOTTOMLEFT") Tercio@23: sizer_s:SetHeight(25) Tercio@23: sizer_s:EnableMouse(true) Tercio@23: sizer_s:SetScript("OnMouseDown", SizerS_OnMouseDown) Tercio@23: sizer_s:SetScript("OnMouseUp", MoverSizer_OnMouseUp) Tercio@23: Tercio@23: local sizer_e = CreateFrame("Frame", nil, frame) Tercio@23: sizer_e:SetPoint("BOTTOMRIGHT", 0, 25) Tercio@23: sizer_e:SetPoint("TOPRIGHT") Tercio@23: sizer_e:SetWidth(25) Tercio@23: sizer_e:EnableMouse(true) Tercio@23: sizer_e:SetScript("OnMouseDown", SizerE_OnMouseDown) Tercio@23: sizer_e:SetScript("OnMouseUp", MoverSizer_OnMouseUp) Tercio@23: Tercio@23: --Container Support Tercio@23: local content = CreateFrame("Frame", nil, frame) Tercio@23: content:SetPoint("TOPLEFT", 17, -27) Tercio@23: content:SetPoint("BOTTOMRIGHT", -17, 40) Tercio@23: Tercio@23: local widget = { Tercio@23: localstatus = {}, Tercio@23: titletext = titletext, Tercio@23: statustext = statustext, Tercio@23: titlebg = titlebg, Tercio@23: sizer_se = sizer_se, Tercio@23: sizer_s = sizer_s, Tercio@23: sizer_e = sizer_e, Tercio@23: content = content, Tercio@23: frame = frame, Tercio@23: type = Type Tercio@23: } Tercio@23: for method, func in pairs(methods) do Tercio@23: widget[method] = func Tercio@23: end Tercio@23: closebutton.obj, statusbg.obj = widget, widget Tercio@23: Tercio@23: return AceGUI:RegisterAsContainer(widget) Tercio@23: end Tercio@23: Tercio@23: AceGUI:RegisterWidgetType(Type, Constructor, Version)