Files
wnsrc/lua/vgui/dtooltip.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

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" )