113 lines
2.2 KiB
C#
113 lines
2.2 KiB
C#
|
|
using Godot;
|
|
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool]
|
|
[GlobalClass,Icon("res://addons/rokojori_action_library/Icons/MouseSensor.svg")]
|
|
public partial class MouseButtonSensor : Sensor, iOnInputSensor
|
|
{
|
|
[Export]
|
|
public MouseButton button;
|
|
|
|
[ExportGroup( "Modifiers")]
|
|
[Export]
|
|
public Trillean ctrlHold = Trillean.Any;
|
|
|
|
[Export]
|
|
public Trillean altHold = Trillean.Any;
|
|
|
|
[Export]
|
|
public Trillean shiftHold = Trillean.Any;
|
|
|
|
public bool modifiersEnabled => ! TrilleanLogic.AllAny( ctrlHold, altHold, shiftHold );
|
|
|
|
public enum ModifiersMode
|
|
{
|
|
Hold_Modifiers_Only_On_Down,
|
|
Hold_Modifiers_All_The_Time
|
|
}
|
|
|
|
[Export]
|
|
public ModifiersMode modifiersMode;
|
|
|
|
float _lastInput = 0;
|
|
|
|
|
|
bool IsWheel()
|
|
{
|
|
return button == MouseButton.WheelUp || button == MouseButton.WheelDown;
|
|
}
|
|
|
|
protected override void UpdateValue()
|
|
{
|
|
|
|
SetFloatValue( _lastInput );
|
|
|
|
if ( IsWheel() )
|
|
{
|
|
_lastInput = 0;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public void _Input( InputEvent ev )
|
|
{
|
|
|
|
var mouseEvent = ev as InputEventMouseButton;
|
|
|
|
if ( mouseEvent == null )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( mouseEvent.ButtonIndex != button )
|
|
{
|
|
return;
|
|
}
|
|
|
|
var checkModifiers = modifiersEnabled &&
|
|
(
|
|
ModifiersMode.Hold_Modifiers_All_The_Time == modifiersMode ||
|
|
_lastInput == 0 && ModifiersMode.Hold_Modifiers_Only_On_Down == modifiersMode
|
|
);
|
|
|
|
if ( checkModifiers )
|
|
{
|
|
|
|
if ( ! TrilleanLogic.Matches( ctrlHold, mouseEvent.CtrlPressed ) )
|
|
{
|
|
_lastInput = 0;
|
|
return;
|
|
}
|
|
|
|
if ( ! TrilleanLogic.Matches( altHold, mouseEvent.AltPressed ) )
|
|
{
|
|
_lastInput = 0;
|
|
return;
|
|
}
|
|
|
|
if ( ! TrilleanLogic.Matches( shiftHold, mouseEvent.ShiftPressed ) )
|
|
{
|
|
_lastInput = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
var isActive = mouseEvent.IsPressed();
|
|
|
|
if ( IsWheel() && ! isActive )
|
|
{
|
|
return;
|
|
}
|
|
|
|
_lastInput = isActive ? 1 : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
} |