mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 13:23:46 +03:00
159 lines
3.2 KiB
Lua
159 lines
3.2 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/
|
|
--]]
|
|
|
|
|
|
--
|
|
-- The delay before a tooltip appears
|
|
-- Can be overridden with PANEL:SetTooltipDelay
|
|
--
|
|
local tooltip_delay = CreateConVar( "tooltip_delay", "0.5", FCVAR_ARCHIVE + FCVAR_DONTRECORD, "Delay between hovering over a panel, and a tooltip appearing, if it has one." )
|
|
|
|
local PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
|
|
self:SetDrawOnTop( true )
|
|
self.DeleteContentsOnClose = false
|
|
self:SetText( "" )
|
|
self:SetFont( "Default" )
|
|
|
|
end
|
|
|
|
function PANEL:UpdateColours( skin )
|
|
|
|
return self:SetTextStyleColor( skin.Colours.TooltipText )
|
|
|
|
end
|
|
|
|
function PANEL:SetContents( panel, bDelete )
|
|
|
|
panel:SetParent( self )
|
|
|
|
self.Contents = panel
|
|
self.DeleteContentsOnClose = bDelete or false
|
|
self.Contents:SizeToContents()
|
|
self:InvalidateLayout( true )
|
|
|
|
self.Contents:SetVisible( false )
|
|
|
|
end
|
|
|
|
function PANEL:PerformLayout()
|
|
|
|
if ( IsValid( self.Contents ) ) then
|
|
|
|
self:SetWide( self.Contents:GetWide() + 8 )
|
|
self:SetTall( self.Contents:GetTall() + 8 )
|
|
self.Contents:SetPos( 4, 4 )
|
|
self.Contents:SetVisible( true )
|
|
|
|
else
|
|
|
|
local w, h = self:GetContentSize()
|
|
self:SetSize( w + 8, h + 6 )
|
|
self:SetContentAlignment( 5 )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
local Mat = Material( "vgui/arrow" )
|
|
|
|
function PANEL:DrawArrow( x, y )
|
|
|
|
self.Contents:SetVisible( true )
|
|
|
|
surface.SetMaterial( Mat )
|
|
surface.DrawTexturedRect( self.ArrowPosX + x, self.ArrowPosY + y, self.ArrowWide, self.ArrowTall )
|
|
|
|
end
|
|
|
|
function PANEL:PositionTooltip()
|
|
|
|
if ( !IsValid( self.TargetPanel ) ) then
|
|
self:Close()
|
|
return
|
|
end
|
|
|
|
self:InvalidateLayout( true )
|
|
|
|
local x, y = input.GetCursorPos()
|
|
local w, h = self:GetSize()
|
|
|
|
local lx, ly = self.TargetPanel:LocalToScreen( 0, 0 )
|
|
|
|
y = y - 50
|
|
|
|
y = math.min( y, ly - h - 10 )
|
|
if ( y < 2 ) then y = 2 end
|
|
|
|
-- Fixes being able to be drawn off screen
|
|
self:SetPos( math.Clamp( x - w * 0.5, 0, ScrW() - self:GetWide() ), math.Clamp( y, 0, ScrH() - self:GetTall() ) )
|
|
|
|
end
|
|
|
|
function PANEL:Paint( w, h )
|
|
|
|
self:PositionTooltip()
|
|
derma.SkinHook( "Paint", "Tooltip", self, w, h )
|
|
|
|
end
|
|
|
|
function PANEL:OpenForPanel( panel )
|
|
|
|
self.TargetPanel = panel
|
|
self.OpenDelay = isnumber( panel.numTooltipDelay ) and panel.numTooltipDelay or tooltip_delay:GetFloat()
|
|
self:PositionTooltip()
|
|
|
|
-- Use the parent panel's skin
|
|
self:SetSkin( panel:GetSkin().Name )
|
|
|
|
if ( self.OpenDelay > 0 ) then
|
|
|
|
self:SetVisible( false )
|
|
timer.Simple( self.OpenDelay, function()
|
|
|
|
if ( !IsValid( self ) ) then return end
|
|
if ( !IsValid( panel ) ) then return end
|
|
|
|
self:PositionTooltip()
|
|
self:SetVisible( true )
|
|
|
|
end )
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:Close()
|
|
|
|
if ( !self.DeleteContentsOnClose and IsValid( self.Contents ) ) then
|
|
|
|
self.Contents:SetVisible( false )
|
|
self.Contents:SetParent( nil )
|
|
|
|
end
|
|
|
|
self:Remove()
|
|
|
|
end
|
|
|
|
function PANEL:GenerateExample( ClassName, PropertySheet, Width, Height )
|
|
|
|
local ctrl = vgui.Create( "DButton" )
|
|
ctrl:SetText( "Hover me" )
|
|
ctrl:SetWide( 200 )
|
|
ctrl:SetTooltip( "This is a tooltip" )
|
|
|
|
PropertySheet:AddSheet( ClassName, ctrl, nil, true, true )
|
|
|
|
end
|
|
|
|
derma.DefineControl( "DTooltip", "", PANEL, "DLabel" )
|