using Godot; using Rokojori; using System.Collections.Generic; using System.Linq; namespace Rokojori { [Tool] [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UISelector.svg")] 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; } var containsFlag = container.GetUISelectorFlags().Contains( flag ); var needsFlag = ( Value.True == value ); // if ( container.HasDebugFlag() ) // { // this.LogInfo( // "Checking for flag", // "container:", container, // "value:",value, // "flag:", flag, // "containsFlag:", containsFlag, // "needsFlag:", needsFlag // ); // } if ( Value.True == value || Value.False == value ) { return containsFlag == needsFlag; } // 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 ( container.HasDebugFlag() ) // { // this.LogInfo( // "Context:", context, // "Hover:", hover, container.GetUISelectorFlags().Contains( UISelectorFlag.Hover ), // "Dragging:", dragging, container.GetUISelectorFlags().Contains( UISelectorFlag.Dragging ), // "Scrolling:", scrolling, container.GetUISelectorFlags().Contains( UISelectorFlag.Scrolling ), // "Focus:", focus, container.GetUISelectorFlags().Contains( UISelectorFlag.Focus ), // "Active:", active, container.GetUISelectorFlags().Contains( UISelectorFlag.Active ) // ); // } if ( ! Matches( container, hover, UISelectorFlag.Hover ) ) { // if ( container.HasDebugFlag() ) // { // this.LogInfo( context, "Hover not matching" ); // } return false; } if ( ! Matches( container, dragging, UISelectorFlag.Dragging ) ) { // if ( container.HasDebugFlag() ) // { // this.LogInfo( context,"Dragging not matching" ); // } return false; } if ( ! Matches( container, scrolling, UISelectorFlag.Scrolling ) ) { // if ( container.HasDebugFlag() ) // { // this.LogInfo( context, "Scrolling not matching" ); // } return false; } if ( ! Matches( container, focus, UISelectorFlag.Focus ) ) { // if ( container.HasDebugFlag() ) // { // this.LogInfo( context, "Focus not matching" ); // } return false; } if ( ! Matches( container, active, UISelectorFlag.Active ) ) { // if ( container.HasDebugFlag() ) // { // this.LogInfo( context, "Active not matching" ); // } return false; } if ( selectors == null || selectors.Length == 0 ) { // if ( container.HasDebugFlag() ) // { // this.LogInfo( context, "No selectors, everthing matched" ); // } return true; } foreach ( var entry in selectors ) { if ( entry == null || ! Matches( container, entry.value, entry.selectorFlag ) ) { // if ( container.HasDebugFlag() ) // { // this.LogInfo( context, "flag selector not matching", entry.value, entry.selectorFlag ); // } return false; } } // if ( container.HasDebugFlag() ) // { // this.LogInfo( context, "Flag Selectors matched" ); // } return true; } public static void UpdateParentUISelectorFlags( UIStylePropertyContainerNode target ) { if ( target != null ) { return; } var node = target as Node; var walker = NodesWalker.Get(); CombineParentFlags( target ); walker.PruneChildTraversal( node, ( Node n ) => { if ( n != node && n is UIStylePropertyContainerNode c ) { UpdateParentUISelectorFlags( c ); return false; } else { return true; } } ); } static void CombineParentFlags( UIStylePropertyContainerNode 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() ); } target.SetDirty(); } } }