internal BlackboardCategoryController(CategoryData categoryData, BlackboardCategoryViewModel categoryViewModel, GraphDataStore dataStore)
            : base(categoryData, categoryViewModel, dataStore)
        {
            m_BlackboardCategoryView = new SGBlackboardCategory(categoryViewModel, this);
            blackboard = categoryViewModel.parentView as SGBlackboard;
            if (blackboard == null)
            {
                return;
            }

            blackboard.Add(m_BlackboardCategoryView);
            // These make sure that the drag indicators are disabled whenever a drag action is cancelled without completing a drop
            blackboard.RegisterCallback <MouseUpEvent>(evt =>
            {
                m_BlackboardCategoryView.OnDragActionCanceled();
            });
            blackboard.hideDragIndicatorAction += m_BlackboardCategoryView.OnDragActionCanceled;

            foreach (var categoryItem in categoryData.Children)
            {
                if (categoryItem == null)
                {
                    AssertHelpers.Fail("Failed to insert blackboard row into category due to shader input being null.");
                    continue;
                }
                InsertBlackboardRow(categoryItem);
            }
        }
        internal BlackboardSectionController(GraphData graphData, BlackboardSectionViewModel sectionViewModel, GraphDataStore dataStore)
            : base(graphData, sectionViewModel, dataStore)
        {
            m_BlackboardSectionView = new SGBlackboardSection(sectionViewModel);

            blackboard = sectionViewModel.parentView as SGBlackboard;
            if (blackboard == null)
            {
                return;
            }

            blackboard.Add(m_BlackboardSectionView);
            // These make sure that the drag indicators are disabled whenever a drag action is cancelled without completing a drop
            blackboard.RegisterCallback <MouseUpEvent>(evt =>
            {
                m_BlackboardSectionView.OnDragActionCanceled();
            });
            blackboard.hideDragIndicatorAction += m_BlackboardSectionView.OnDragActionCanceled;

            // Go through categories in Data Store
            foreach (var categoryData in graphData.categories)
            {
                // If category can be found with matching guid for this section
                // And that category contains this input
                if (categoryData.categoryGuid == ViewModel.associatedCategoryGuid)
                {
                    m_CategoryDataReference = categoryData;
                    break;
                }
            }

            foreach (var shaderInput in graphData.properties)
            {
                if (IsInputInSection(shaderInput))
                {
                    InsertBlackboardRow(shaderInput);
                }
            }

            foreach (var shaderInput in graphData.keywords)
            {
                if (IsInputInSection(shaderInput))
                {
                    InsertBlackboardRow(shaderInput);
                }
            }

            foreach (var shaderInput in graphData.dropdowns)
            {
                if (IsInputInSection(shaderInput))
                {
                    InsertBlackboardRow(shaderInput);
                }
            }
        }