144 lines
2.9 KiB
C#
144 lines
2.9 KiB
C#
![]() |
|
||
|
using Godot;
|
||
|
using Rokojori;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
|
||
|
namespace Rokojori
|
||
|
{
|
||
|
|
||
|
[Tool]
|
||
|
[GlobalClass]
|
||
|
public partial class UISelector:Resource
|
||
|
{
|
||
|
public enum Value
|
||
|
{
|
||
|
___,
|
||
|
True,
|
||
|
False,
|
||
|
True_For_Any_Parent,
|
||
|
False_For_All_Parents
|
||
|
}
|
||
|
|
||
|
[Export]
|
||
|
public Value hover = Value.___;
|
||
|
|
||
|
[Export]
|
||
|
public Value dragging = Value.___;
|
||
|
|
||
|
[Export]
|
||
|
public Value scrolling = Value.___;
|
||
|
|
||
|
[Export]
|
||
|
public Value focus = Value.___;
|
||
|
|
||
|
[Export]
|
||
|
public Value active = Value.___;
|
||
|
|
||
|
[Export]
|
||
|
public UISelectorFlagEntry[] selectors = [];
|
||
|
|
||
|
|
||
|
bool Matches( UIStylePropertyContainer container, Value value, UISelectorFlag flag )
|
||
|
{
|
||
|
if ( Value.___ == value )
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if ( Value.True == value || Value.False == value )
|
||
|
{
|
||
|
return container.GetUISelectorFlags().Contains( flag ) == ( Value.True == value );
|
||
|
}
|
||
|
|
||
|
if ( Value.True_For_Any_Parent == value || Value.False_For_All_Parents == value )
|
||
|
{
|
||
|
return container.GetParentUISelectorFlags().Contains( flag ) == ( Value.True_For_Any_Parent == value );
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
|
||
|
}
|
||
|
|
||
|
public bool Selects( UIStylePropertyContainer container )
|
||
|
{
|
||
|
|
||
|
if ( ! Matches( container, hover, UISelectorFlag.Hover ) )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! Matches( container, dragging, UISelectorFlag.Dragging ) )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! Matches( container, scrolling, UISelectorFlag.Scrolling ) )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! Matches( container, focus, UISelectorFlag.Focus ) )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! Matches( container, active, UISelectorFlag.Active ) )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
foreach ( var entry in selectors )
|
||
|
{
|
||
|
if ( ! Matches( container, entry.value, entry.selectorFlag ) )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
public static void UpdateParentUISelectorFlags( UIStylePropertyContainer target )
|
||
|
{
|
||
|
var node = target as Node;
|
||
|
var walker = NodesWalker.Get();
|
||
|
|
||
|
CombineParentFlags( target );
|
||
|
|
||
|
walker.PruneChildTraversal( node,
|
||
|
( Node n ) =>
|
||
|
{
|
||
|
if ( n != node && n is UIStylePropertyContainer c )
|
||
|
{
|
||
|
UpdateParentUISelectorFlags( c );
|
||
|
return false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
static void CombineParentFlags( UIStylePropertyContainer target )
|
||
|
{
|
||
|
var parentFlags = target.GetParentUISelectorFlags();
|
||
|
parentFlags.Clear();
|
||
|
parentFlags.AddRange( target.GetUISelectorFlags() );
|
||
|
|
||
|
var parent = UI.GetStylePropertyContainerParent( target as Control);
|
||
|
|
||
|
if ( parent != null )
|
||
|
{
|
||
|
parentFlags.Union( parent.GetParentUISelectorFlags() );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|