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