Files
wnsrc/lua/vgui/dverticaldivider.lua
lifestorm 6a58f406b1 Upload
2024-08-04 23:54:45 +03:00

185 lines
3.6 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PANEL = {}
function PANEL:Init()
self:SetCursor( "sizens" )
self:SetPaintBackground( false )
end
function PANEL:OnMousePressed( mcode )
if ( mcode == MOUSE_LEFT ) then
self:GetParent():StartGrab()
end
end
derma.DefineControl( "DVerticalDividerBar", "", PANEL, "DPanel" )
--[[---------------------------------------------------------
DVerticalDivider
-----------------------------------------------------------]]
local PANEL = {}
AccessorFunc( PANEL, "m_pTop", "Top" )
AccessorFunc( PANEL, "m_pBottom", "Bottom" )
AccessorFunc( PANEL, "m_pMiddle", "Middle" )
AccessorFunc( PANEL, "m_iDividerHeight", "DividerHeight" )
AccessorFunc( PANEL, "m_iTopHeight", "TopHeight" )
AccessorFunc( PANEL, "m_bDragging", "Dragging" )
AccessorFunc( PANEL, "m_iTopHeightMin", "TopMin" )
AccessorFunc( PANEL, "m_iTopHeightMax", "TopMax" )
AccessorFunc( PANEL, "m_iBottomHeightMin", "BottomMin" )
AccessorFunc( PANEL, "m_iHoldPos", "HoldPos" )
function PANEL:Init()
self:SetDividerHeight( 8 )
self:SetTopHeight( 100 )
self:SetTopMin( 50 )
self:SetTopMax( 4096 )
self:SetBottomMin( 50 )
self:SetPaintBackground( false )
self.m_DragBar = vgui.Create( "DVerticalDividerBar", self )
end
function PANEL:LoadCookies()
self:SetTopHeight( self:GetCookieNumber( "TopHeight", self:GetTopHeight() ) )
end
function PANEL:SetTop( pnl )
self.m_pTop = pnl
self.m_pTop:SetParent( self )
end
function PANEL:SetBottom( pnl )
self.m_pBottom = pnl
self.m_pBottom:SetParent( self )
end
function PANEL:DoConstraints()
if ( self:GetTall() == 0 ) then return end
self.m_iTopHeight = math.Clamp( self.m_iTopHeight, self:GetTopMin(), self:GetTall() - self:GetBottomMin() - self:GetDividerHeight() )
end
function PANEL:PerformLayout()
self:DoConstraints()
if ( self.m_pTop ) then
self.m_pTop:StretchToParent( 0, 0, 0, nil )
self.m_pTop:SetTall( self.m_iTopHeight )
self.m_pTop:InvalidateLayout()
end
if ( self.m_pBottom ) then
self.m_pBottom:StretchToParent( 0, self.m_iTopHeight + self.m_iDividerHeight, 0, 0 )
self.m_pBottom:InvalidateLayout()
end
self.m_DragBar:StretchToParent( 0, self.m_iTopHeight, 0, 0 )
self.m_DragBar:SetTall( self.m_iDividerHeight )
self.m_DragBar:SetZPos( -1 )
if ( self.m_pMiddle ) then
self.m_pMiddle:StretchToParent( 0, 0, 0, 0 )
self.m_pMiddle:InvalidateLayout()
end
end
function PANEL:SetMiddle( Middle )
self.m_pMiddle = Middle
if ( Middle ) then
Middle:SetParent( self.m_DragBar )
end
end
function PANEL:OnCursorMoved( x, y )
if ( !self:GetDragging() ) then return end
self.m_iTopHeight = y - self:GetHoldPos()
self.m_iTopHeight = math.min( self.m_iTopHeight, self:GetTopMax() )
self:InvalidateLayout( true )
end
function PANEL:StartGrab()
self:SetCursor( "sizens" )
local x, y = self.m_DragBar:CursorPos()
self:SetHoldPos( y )
self:SetDragging( true )
self:MouseCapture( true )
end
function PANEL:OnMouseReleased( mcode )
if ( mcode == MOUSE_LEFT ) then
self:SetCursor( "none" )
self:SetDragging( false )
self:MouseCapture( false )
self:SetCookie( "TopHeight", self.m_iTopHeight )
end
end
function PANEL:GenerateExample( ClassName, PropertySheet, Width, Height )
local ctrl = vgui.Create( ClassName )
ctrl:SetSize( 256, 256 )
ctrl:SetTop( vgui.Create( "DButton" ) )
ctrl:SetBottom( vgui.Create( "DButton" ) )
PropertySheet:AddSheet( ClassName, ctrl, nil, true, true )
end
derma.DefineControl( "DVerticalDivider", "", PANEL, "DPanel" )