mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
Upload
This commit is contained in:
155
lua/vgui/dscrollpanel.lua
Normal file
155
lua/vgui/dscrollpanel.lua
Normal file
@@ -0,0 +1,155 @@
|
||||
--[[
|
||||
| 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 = {}
|
||||
|
||||
AccessorFunc( PANEL, "Padding", "Padding" )
|
||||
AccessorFunc( PANEL, "pnlCanvas", "Canvas" )
|
||||
|
||||
function PANEL:Init()
|
||||
|
||||
self.pnlCanvas = vgui.Create( "Panel", self )
|
||||
self.pnlCanvas.OnMousePressed = function( slf, code ) slf:GetParent():OnMousePressed( code ) end
|
||||
self.pnlCanvas:SetMouseInputEnabled( true )
|
||||
self.pnlCanvas.PerformLayout = function( pnl )
|
||||
|
||||
self:PerformLayoutInternal()
|
||||
self:InvalidateParent()
|
||||
|
||||
end
|
||||
|
||||
-- Create the scroll bar
|
||||
self.VBar = vgui.Create( "DVScrollBar", self )
|
||||
self.VBar:Dock( RIGHT )
|
||||
|
||||
self:SetPadding( 0 )
|
||||
self:SetMouseInputEnabled( true )
|
||||
|
||||
-- This turns off the engine drawing
|
||||
self:SetPaintBackgroundEnabled( false )
|
||||
self:SetPaintBorderEnabled( false )
|
||||
self:SetPaintBackground( false )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:AddItem( pnl )
|
||||
|
||||
pnl:SetParent( self:GetCanvas() )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:OnChildAdded( child )
|
||||
|
||||
self:AddItem( child )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:SizeToContents()
|
||||
|
||||
self:SetSize( self.pnlCanvas:GetSize() )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:GetVBar()
|
||||
|
||||
return self.VBar
|
||||
|
||||
end
|
||||
|
||||
function PANEL:GetCanvas()
|
||||
|
||||
return self.pnlCanvas
|
||||
|
||||
end
|
||||
|
||||
function PANEL:InnerWidth()
|
||||
|
||||
return self:GetCanvas():GetWide()
|
||||
|
||||
end
|
||||
|
||||
function PANEL:Rebuild()
|
||||
|
||||
self:GetCanvas():SizeToChildren( false, true )
|
||||
|
||||
-- Although this behaviour isn't exactly implied, center vertically too
|
||||
if ( self.m_bNoSizing && self:GetCanvas():GetTall() < self:GetTall() ) then
|
||||
|
||||
self:GetCanvas():SetPos( 0, ( self:GetTall() - self:GetCanvas():GetTall() ) * 0.5 )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:OnMouseWheeled( dlta )
|
||||
|
||||
return self.VBar:OnMouseWheeled( dlta )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:OnVScroll( iOffset )
|
||||
|
||||
self.pnlCanvas:SetPos( 0, iOffset )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:ScrollToChild( panel )
|
||||
|
||||
self:InvalidateLayout( true )
|
||||
|
||||
local x, y = self.pnlCanvas:GetChildPosition( panel )
|
||||
local w, h = panel:GetSize()
|
||||
|
||||
y = y + h * 0.5
|
||||
y = y - self:GetTall() * 0.5
|
||||
|
||||
self.VBar:AnimateTo( y, 0.5, 0, 0.5 )
|
||||
|
||||
end
|
||||
|
||||
-- Avoid an infinite loop
|
||||
function PANEL:PerformLayoutInternal()
|
||||
|
||||
local Tall = self.pnlCanvas:GetTall()
|
||||
local Wide = self:GetWide()
|
||||
local YPos = 0
|
||||
|
||||
self:Rebuild()
|
||||
|
||||
self.VBar:SetUp( self:GetTall(), self.pnlCanvas:GetTall() )
|
||||
YPos = self.VBar:GetOffset()
|
||||
|
||||
if ( self.VBar.Enabled ) then Wide = Wide - self.VBar:GetWide() end
|
||||
|
||||
self.pnlCanvas:SetPos( 0, YPos )
|
||||
self.pnlCanvas:SetWide( Wide )
|
||||
|
||||
self:Rebuild()
|
||||
|
||||
if ( Tall != self.pnlCanvas:GetTall() ) then
|
||||
self.VBar:SetScroll( self.VBar:GetScroll() ) -- Make sure we are not too far down!
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:PerformLayout()
|
||||
|
||||
self:PerformLayoutInternal()
|
||||
|
||||
end
|
||||
|
||||
function PANEL:Clear()
|
||||
|
||||
return self.pnlCanvas:Clear()
|
||||
|
||||
end
|
||||
|
||||
derma.DefineControl( "DScrollPanel", "", PANEL, "DPanel" )
|
||||
Reference in New Issue
Block a user