using System; using System.Collections.Generic; using UnityEditor.Experimental.GraphView; using UnityEditor.ShaderGraph.Drawing.Views; using UnityEditor.ShaderGraph.Internal; using UnityEngine; using UnityEngine.UIElements; using System.Linq; using ContextualMenuManipulator = UnityEngine.UIElements.ContextualMenuManipulator; namespace UnityEditor.ShaderGraph.Drawing { sealed class SGBlackboardCategory : GraphElement, ISGControlledElement, ISelection, IComparable { // --- Begin ISGControlledElement implementation public void OnControllerChanged(ref SGControllerChangedEvent e) { } public void OnControllerEvent(SGControllerEvent e) { } public BlackboardCategoryController controller { get => m_Controller; set { if (m_Controller != value) { if (m_Controller != null) { m_Controller.UnregisterHandler(this); } m_Controller = value; if (m_Controller != null) { m_Controller.RegisterHandler(this); } } } } SGController ISGControlledElement.controller => m_Controller; // --- ISGControlledElement implementation BlackboardCategoryController m_Controller; BlackboardCategoryViewModel m_ViewModel; public BlackboardCategoryViewModel viewModel => m_ViewModel; const string k_StylePath = "Styles/SGBlackboard"; const string k_UxmlPath = "UXML/Blackboard/SGBlackboardCategory"; VisualElement m_DragIndicator; VisualElement m_MainContainer; VisualElement m_Header; Label m_TitleLabel; Foldout m_Foldout; TextField m_TextField; internal TextField textField => m_TextField; VisualElement m_RowsContainer; int m_InsertIndex; SGBlackboard blackboard => m_ViewModel.parentView as SGBlackboard; bool m_IsDragInProgress; bool m_WasHoverExpanded; bool m_DroppedOnBottomEdge; bool m_DroppedOnTopEdge; bool m_RenameInProgress; public delegate bool CanAcceptDropDelegate(ISelectable selected); public CanAcceptDropDelegate canAcceptDrop { get; set; } int InsertionIndex(Vector2 pos) { // For an empty category can always just insert at the start if (this.childCount == 0) return 0; var blackboardRows = this.Query().ToList(); for (int index = 0; index < blackboardRows.Count; index++) { var blackboardRow = blackboardRows[index]; var localPosition = this.ChangeCoordinatesTo(blackboardRow, pos); if (blackboardRow.ContainsPoint(localPosition)) { return index; } } return -1; } static VisualElement FindCategoryDirectChild(SGBlackboardCategory blackboardCategory, VisualElement element) { VisualElement directChild = element; while ((directChild != null) && (directChild != blackboardCategory)) { if (directChild.parent == blackboardCategory) { return directChild; } directChild = directChild.parent; } return null; } internal SGBlackboardCategory(BlackboardCategoryViewModel categoryViewModel, BlackboardCategoryController inController) { m_ViewModel = categoryViewModel; controller = inController; userData = controller.Model; // Setup VisualElement from Stylesheet and UXML file var tpl = Resources.Load(k_UxmlPath) as VisualTreeAsset; m_MainContainer = tpl.Instantiate(); m_MainContainer.AddToClassList("mainContainer"); m_Header = m_MainContainer.Q("categoryHeader"); m_TitleLabel = m_MainContainer.Q