Files
sbox-public/game/addons/tools/Code/Editor/ProjectSettings/CollisionMatrixWidget.MatrixButton.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

121 lines
2.6 KiB
C#

using Sandbox.Physics;
namespace Editor.ProjectSettingPages;
public partial class CollisionMatrixWidget
{
public class MatrixButton : Widget
{
CollisionMatrixWidget Matrix;
public string Left { get; set; }
public string Right { get; set; }
public MatrixButton( CollisionMatrixWidget parent, string left, string right ) : base( parent )
{
Matrix = parent;
Left = left;
Right = right;
Cursor = CursorShape.Finger;
}
protected override void OnPaint()
{
base.OnPaint();
var rule = CurrentValue;
Paint.ClearPen();
Paint.Antialiasing = false;
var r = LocalRect.Shrink( 0, 0, 2, 2 );
if ( rule == CollisionRules.Result.Unset )
{
Paint.SetBrush( Color.White.WithAlpha( Paint.HasMouseOver ? 0.2f : 0.05f ) );
Paint.ClearPen();
Paint.DrawRect( r, 2 );
}
if ( rule == CollisionRules.Result.Ignore )
{
Paint.SetBrush( Theme.Red.WithAlpha( Paint.HasMouseOver ? 0.4f : 0.3f ) );
Paint.ClearPen();
Paint.DrawRect( r, 2 );
Paint.SetPen( Theme.Red );
Paint.DrawIcon( r, "clear", 14 );
}
if ( rule == CollisionRules.Result.Trigger )
{
Paint.SetBrush( Theme.Yellow.Desaturate( 0.4f ).Darken( Paint.HasMouseOver ? 0.4f : 0.6f ) );
Paint.ClearPen();
Paint.DrawRect( r, 2 );
Paint.SetPen( Theme.Yellow );
Paint.DrawIcon( r, "remove", 14 );
}
if ( rule == CollisionRules.Result.Collide )
{
Paint.SetBrush( Theme.Green.Darken( Paint.HasMouseOver ? 0.4f : 0.5f ) );
Paint.ClearPen();
Paint.DrawRect( r, 2 );
Paint.SetPen( Theme.Green );
Paint.DrawIcon( r, "check", 14 );
}
}
CollisionRules.Result CurrentValue
{
get
{
if ( Right != null )
return Matrix.FindPair( Left, Right );
if ( Matrix.current.Defaults.TryGetValue( Left, out var rule ) )
return rule;
return CollisionRules.Result.Unset;
}
}
protected override void OnMousePress( MouseEvent e )
{
e.Accepted = true;
var rule = CurrentValue;
if ( e.RightMouseButton )
{
rule = 0;
}
else
{
if ( rule >= CollisionRules.Result.Ignore ) rule = 0;
else rule++;
}
// power users
if ( e.HasShift ) rule = CollisionRules.Result.Collide;
if ( e.HasCtrl ) rule = CollisionRules.Result.Ignore;
if ( e.HasAlt ) rule = CollisionRules.Result.Trigger;
if ( e.HasAlt && e.HasShift ) rule = CollisionRules.Result.Unset;
Matrix.SetPair( Left, Right, rule );
}
protected override void OnMouseEnter()
{
base.OnMouseEnter();
Matrix.OnHovered( this );
}
protected override void OnMouseLeave()
{
base.OnMouseLeave();
Matrix.OnHovered( null );
}
}
}