Initial commit
This commit is contained in:
187
addons/msd_ui/lua/msd/ui/msdframe.lua
Normal file
187
addons/msd_ui/lua/msd/ui/msdframe.lua
Normal file
@@ -0,0 +1,187 @@
|
||||
local PANEL = {}
|
||||
AccessorFunc(PANEL, "m_bIsMenuComponent", "IsMenu", FORCE_BOOL)
|
||||
AccessorFunc(PANEL, "m_bDraggable", "Draggable", FORCE_BOOL)
|
||||
AccessorFunc(PANEL, "m_bSizable", "Sizable", FORCE_BOOL)
|
||||
AccessorFunc(PANEL, "m_bScreenLock", "ScreenLock", FORCE_BOOL)
|
||||
AccessorFunc(PANEL, "m_bDeleteOnClose", "DeleteOnClose", FORCE_BOOL)
|
||||
AccessorFunc(PANEL, "m_bPaintShadow", "PaintShadow", FORCE_BOOL)
|
||||
AccessorFunc(PANEL, "m_iMinWidth", "MinWidth", FORCE_NUMBER)
|
||||
AccessorFunc(PANEL, "m_iMinHeight", "MinHeight", FORCE_NUMBER)
|
||||
|
||||
function PANEL:Init()
|
||||
self:SetFocusTopLevel(true)
|
||||
self:SetPaintShadow(true)
|
||||
self:SetDraggable(true)
|
||||
self:SetSizable(false)
|
||||
self:SetScreenLock(false)
|
||||
self:SetDeleteOnClose(true)
|
||||
self:SetMinWidth(50)
|
||||
self:SetMinHeight(50)
|
||||
self:SetPaintBackgroundEnabled(false)
|
||||
self:SetPaintBorderEnabled(false)
|
||||
self.m_fCreateTime = SysTime()
|
||||
|
||||
self.WorkSpace = {
|
||||
x = 0,
|
||||
y = 52,
|
||||
w = 0,
|
||||
h = 0
|
||||
}
|
||||
|
||||
self.WorkComponents = {}
|
||||
end
|
||||
|
||||
function PANEL:Close()
|
||||
self:SetVisible(false)
|
||||
|
||||
if (self:GetDeleteOnClose()) then
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
self:OnClose()
|
||||
end
|
||||
|
||||
function PANEL:OnClose()
|
||||
end
|
||||
|
||||
function PANEL:Center()
|
||||
self:InvalidateLayout(true)
|
||||
self:CenterVertical()
|
||||
self:CenterHorizontal()
|
||||
end
|
||||
|
||||
function PANEL:IsActive()
|
||||
if (self:HasFocus()) then return true end
|
||||
if (vgui.FocusedHasParent(self)) then return true end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function PANEL:Think()
|
||||
local mousex = math.Clamp(gui.MouseX(), 1, ScrW() - 1)
|
||||
local mousey = math.Clamp(gui.MouseY(), 1, ScrH() - 1)
|
||||
|
||||
if (self.Dragging) then
|
||||
local x = mousex - self.Dragging[1]
|
||||
local y = mousey - self.Dragging[2]
|
||||
|
||||
-- Lock to screen bounds if screenlock is enabled
|
||||
if (self:GetScreenLock()) then
|
||||
x = math.Clamp(x, 0, ScrW() - self:GetWide())
|
||||
y = math.Clamp(y, 0, ScrH() - self:GetTall())
|
||||
end
|
||||
|
||||
self:SetPos(x, y)
|
||||
end
|
||||
|
||||
if (self.Sizing) then
|
||||
local x = mousex - self.Sizing[1]
|
||||
local y = mousey - self.Sizing[2]
|
||||
local px, py = self:GetPos()
|
||||
|
||||
if (x < self.m_iMinWidth) then
|
||||
x = self.m_iMinWidth
|
||||
elseif (x > ScrW() - px and self:GetScreenLock()) then
|
||||
x = ScrW() - px
|
||||
end
|
||||
|
||||
if (y < self.m_iMinHeight) then
|
||||
y = self.m_iMinHeight
|
||||
elseif (y > ScrH() - py and self:GetScreenLock()) then
|
||||
y = ScrH() - py
|
||||
end
|
||||
|
||||
self:SetSize(x, y)
|
||||
self:SetCursor("sizenwse")
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local screenX, screenY = self:LocalToScreen(0, 0)
|
||||
|
||||
if (self.Hovered and self.m_bSizable and mousex > (screenX + self:GetWide() - 20) and mousey > (screenY + self:GetTall() - 20)) then
|
||||
self:SetCursor("sizenwse")
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if (self.Hovered and self:GetDraggable() and mousey < (screenY + 24)) then
|
||||
self:SetCursor("sizeall")
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:SetCursor("arrow")
|
||||
|
||||
-- Don't allow the frame to go higher than 0
|
||||
if (self.y < 0) then
|
||||
self:SetPos(self.x, 0)
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:AddToWorkSpace(panel)
|
||||
panel:SetParent(self)
|
||||
panel:SetSize(self.WorkSpace.w, self.WorkSpace.h)
|
||||
panel:SetPos(self.WorkSpace.x, self.WorkSpace.y)
|
||||
local id = table.insert(self.WorkComponents, panel)
|
||||
|
||||
panel.OnRemove = function()
|
||||
self.WorkComponents[id] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:Paint(w, h)
|
||||
return true
|
||||
end
|
||||
|
||||
function PANEL:OnMousePressed()
|
||||
local screenX, screenY = self:LocalToScreen(0, 0)
|
||||
|
||||
if (self.m_bSizable and gui.MouseX() > (screenX + self:GetWide() - 20) and gui.MouseY() > (screenY + self:GetTall() - 20)) then
|
||||
self.Sizing = {gui.MouseX() - self:GetWide(), gui.MouseY() - self:GetTall()}
|
||||
|
||||
self:MouseCapture(true)
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if (self:GetDraggable() and gui.MouseY() < (screenY + 24)) then
|
||||
self.Dragging = {gui.MouseX() - self.x, gui.MouseY() - self.y}
|
||||
|
||||
self:MouseCapture(true)
|
||||
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:OnMouseReleased()
|
||||
self.Dragging = nil
|
||||
self.Sizing = nil
|
||||
self:MouseCapture(false)
|
||||
end
|
||||
|
||||
function PANEL:PerformLayout()
|
||||
local Wide = self:GetWide()
|
||||
local Tall = self:GetTall()
|
||||
|
||||
self.WorkSpace = {
|
||||
x = 0,
|
||||
y = 52,
|
||||
w = Wide,
|
||||
h = Tall - 52
|
||||
}
|
||||
|
||||
if self.WorkComponents and #self.WorkComponents > 0 then
|
||||
for i = 1, #self.WorkComponents do
|
||||
local panel = self.WorkComponents[i]
|
||||
|
||||
if panel and IsValid(panel) then
|
||||
panel:SetSize(self.WorkSpace.w, self.WorkSpace.h)
|
||||
panel:SetPos(self.WorkSpace.x, self.WorkSpace.y)
|
||||
panel:InvalidateLayout()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
derma.DefineControl("MSDSimpleFrame", "A simple window for msd", PANEL, "EditablePanel")
|
||||
Reference in New Issue
Block a user