Exemplo n.º 1
0
        virtual public void RemoveFakeItem()
        {
            if (!HasFakeItem())
            {
                return;
            }

            var visibleRows = GetRows();
            int index       = TreeViewController.GetIndexOfID(visibleRows, m_FakeItem.id);

            if (index != -1)
            {
                visibleRows.RemoveAt(index);
            }
            m_FakeItem = null;
        }
Exemplo n.º 2
0
        void Init(TreeViewState state)
        {
            if (state == null)
            {
                throw new ArgumentNullException("state", "Invalid TreeViewState: it is null");
            }

            m_TreeView   = new TreeViewController(null, state);
            m_DataSource = new TreeViewControlDataSource(m_TreeView, this);
            m_GUI        = new TreeViewControlGUI(m_TreeView, this);
            m_Dragging   = new TreeViewControlDragging(m_TreeView, this);
            m_TreeView.Init(new Rect(), m_DataSource, m_GUI, m_Dragging);

            m_TreeView.searchChanged                    += SearchChanged;
            m_TreeView.selectionChangedCallback         += SelectionChanged;
            m_TreeView.itemSingleClickedCallback        += SingleClickedItem;
            m_TreeView.itemDoubleClickedCallback        += DoubleClickedItem;
            m_TreeView.contextClickItemCallback         += ContextClickedItem;
            m_TreeView.contextClickOutsideItemsCallback += ContextClicked;
            m_TreeView.expandedStateChanged             += ExpandedStateChanged;
            m_TreeView.keyboardInputCallback            += KeyEvent;

            m_TreeViewKeyControlID = GUIUtility.GetPermanentControlID();
        }
Exemplo n.º 3
0
 public TreeViewControlGUI(TreeViewController treeView, TreeView owner) : base(treeView)
 {
     this.m_Owner = owner;
 }
Exemplo n.º 4
0
 public TreeViewControlDataSource(TreeViewController treeView, TreeView owner) : base(treeView)
 {
     this.m_Owner      = owner;
     base.showRootItem = false;
 }
Exemplo n.º 5
0
        public void HandleUnusedMouseEventsForItem(Rect rect, TreeViewItem item, int row)
        {
            int       itemControlID  = TreeViewController.GetItemControlID(item);
            Event     current        = Event.current;
            EventType typeForControl = current.GetTypeForControl(itemControlID);

            switch (typeForControl)
            {
            case EventType.MouseDown:
                if (rect.Contains(Event.current.mousePosition))
                {
                    if (Event.current.button == 0)
                    {
                        GUIUtility.keyboardControl = this.m_KeyboardControlID;
                        this.Repaint();
                        if (Event.current.clickCount == 2)
                        {
                            if (this.itemDoubleClickedCallback != null)
                            {
                                this.itemDoubleClickedCallback(item.id);
                            }
                        }
                        else
                        {
                            List <int> newSelection = this.GetNewSelection(item, true, false);
                            bool       flag         = this.dragging != null && newSelection.Count != 0 && this.dragging.CanStartDrag(item, newSelection, Event.current.mousePosition);
                            if (flag)
                            {
                                this.m_DragSelection = newSelection;
                                DragAndDropDelay dragAndDropDelay = (DragAndDropDelay)GUIUtility.GetStateObject(typeof(DragAndDropDelay), itemControlID);
                                dragAndDropDelay.mouseDownPosition = Event.current.mousePosition;
                            }
                            else
                            {
                                this.m_DragSelection.Clear();
                                if (this.m_AllowRenameOnMouseUp)
                                {
                                    this.m_AllowRenameOnMouseUp = (this.state.selectedIDs.Count == 1 && this.state.selectedIDs[0] == item.id);
                                }
                                this.SelectionClick(item, false);
                            }
                            GUIUtility.hotControl = itemControlID;
                        }
                        current.Use();
                    }
                    else if (Event.current.button == 1)
                    {
                        bool keepMultiSelection = true;
                        this.SelectionClick(item, keepMultiSelection);
                    }
                }
                return;

            case EventType.MouseUp:
                if (GUIUtility.hotControl == itemControlID)
                {
                    bool flag2 = this.m_DragSelection.Count > 0;
                    GUIUtility.hotControl = 0;
                    this.m_DragSelection.Clear();
                    current.Use();
                    if (rect.Contains(current.mousePosition))
                    {
                        Rect       renameRect  = this.gui.GetRenameRect(rect, row, item);
                        List <int> selectedIDs = this.state.selectedIDs;
                        if (this.m_AllowRenameOnMouseUp && selectedIDs != null && selectedIDs.Count == 1 && selectedIDs[0] == item.id && renameRect.Contains(current.mousePosition) && !EditorGUIUtility.HasHolddownKeyModifiers(current))
                        {
                            this.BeginNameEditing(0.5f);
                        }
                        else if (flag2)
                        {
                            this.SelectionClick(item, false);
                        }
                    }
                }
                return;

            case EventType.MouseMove:
IL_2C:
                if (typeForControl == EventType.DragUpdated || typeForControl == EventType.DragPerform)
                {
                    bool firstItem = row == 0;
                    if (this.dragging != null && this.dragging.DragElement(item, rect, firstItem))
                    {
                        GUIUtility.hotControl = 0;
                    }
                    return;
                }
                if (typeForControl != EventType.ContextClick)
                {
                    return;
                }
                if (rect.Contains(current.mousePosition))
                {
                    if (this.contextClickItemCallback != null)
                    {
                        this.contextClickItemCallback(item.id);
                    }
                }
                return;

            case EventType.MouseDrag:
                if (GUIUtility.hotControl == itemControlID && this.dragging != null && this.m_DragSelection.Count > 0)
                {
                    DragAndDropDelay dragAndDropDelay2 = (DragAndDropDelay)GUIUtility.GetStateObject(typeof(DragAndDropDelay), itemControlID);
                    if (dragAndDropDelay2.CanStartDrag() && this.dragging.CanStartDrag(item, this.m_DragSelection, dragAndDropDelay2.mouseDownPosition))
                    {
                        this.dragging.StartDrag(item, this.m_DragSelection);
                        GUIUtility.hotControl = 0;
                    }
                    current.Use();
                }
                return;
            }
            goto IL_2C;
        }
Exemplo n.º 6
0
        public bool IsLastClickedPartOfRows()
        {
            IList <TreeViewItem> rows = this.data.GetRows();

            return(rows.Count != 0 && TreeViewController.GetIndexOfID(rows, this.state.lastClickedID) >= 0);
        }
Exemplo n.º 7
0
        // This method is called from TreeView and handles:
        // - Where the dragged items are dropped (above, below or upon)
        // - Auto expansion of collapsed items when hovering over them
        // - Setting up the render markers for drop location (horizontal lines)
        // 'targetItem' is null when not hovering over any target Item, if so the rest of the arguments are invalid
        public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, int row)
        {
            bool perform = Event.current.type == EventType.DragPerform;

            // Are we dragging outside any items
            if (targetItem == null)
            {
                // If so clear any drop markers
                if (m_DropData != null)
                {
                    m_DropData.ClearPerEventState();
                }

                // And let client decide what happens when dragging outside items
                DragAndDrop.visualMode = DoDrag(null, null, perform, DropPosition.Below);
                if (DragAndDrop.visualMode != DragAndDropVisualMode.None && perform)
                {
                    FinalizeDragPerformed(true);
                }

                return(false);
            }

            DropPosition dropPosition;

            if (!TryGetDropPosition(targetItem, targetItemRect, row, out dropPosition))
            {
                return(false);
            }

            TreeViewItem parentItem                = null;
            TreeViewItem dropRelativeToItem        = targetItem;
            bool         didChangeTargetToAncector = false;
            DropPosition originalDropPosition      = dropPosition;

            switch (dropPosition)
            {
            case DropPosition.Upon:
                // Parent change: Client must decide what happens when dropping upon: e.g: insert last or first in child list
                parentItem = dropRelativeToItem;
                break;

            case DropPosition.Below:
            case DropPosition.Above:
                // Sibling change
                if (getIndentLevelForMouseCursor != null)
                {
                    int cursorDepth = getIndentLevelForMouseCursor();
                    HandleSiblingInsertionAtAvailableDepthsAndChangeTargetIfNeeded(ref dropRelativeToItem, row, ref dropPosition, cursorDepth, out didChangeTargetToAncector);
                }
                else
                {
                    if (dropPosition == DropPosition.Below && m_TreeView.data.IsExpanded(dropRelativeToItem) && dropRelativeToItem.hasChildren)
                    {
                        // When hovering between an expanded parent and its first child then make sure we change state to match that
                        dropPosition       = DropPosition.Above;
                        dropRelativeToItem = dropRelativeToItem.children[0];
                    }
                }
                parentItem = dropRelativeToItem.parent;
                break;

            default:
                Debug.LogError("Unhandled enum. Report a bug.");
                break;
            }

            if (perform)
            {
                DragAndDropVisualMode mode = DragAndDropVisualMode.None;
                // Try Drop upon target item
                if (dropPosition == DropPosition.Upon)
                {
                    mode = DoDrag(dropRelativeToItem, dropRelativeToItem, true, dropPosition);
                }

                // Drop between items
                if (mode == DragAndDropVisualMode.None && parentItem != null)
                {
                    mode = DoDrag(parentItem, dropRelativeToItem, true, dropPosition);
                }

                // Finalize drop
                if (mode != DragAndDropVisualMode.None)
                {
                    FinalizeDragPerformed(false);
                }
                else
                {
                    DragCleanup(true);
                    m_TreeView.NotifyListenersThatDragEnded(null, false);
                }
            }
            else // DragUpdate
            {
                if (m_DropData == null)
                {
                    m_DropData = new DropData();
                }
                m_DropData.ClearPerEventState();

                // Try drop on top of items
                if (dropPosition == DropPosition.Upon)
                {
                    int itemControlID = TreeViewController.GetItemControlID(dropRelativeToItem);
                    HandleAutoExpansion(itemControlID, dropRelativeToItem, targetItemRect);

                    var mode = DoDrag(dropRelativeToItem, dropRelativeToItem, false, dropPosition);
                    if (mode != DragAndDropVisualMode.None)
                    {
                        m_DropData.dropTargetControlID = itemControlID;
                        DragAndDrop.visualMode         = mode;
                    }
                }
                // Drop between items
                else if (dropRelativeToItem != null && parentItem != null)
                {
                    var mode = DoDrag(parentItem, dropRelativeToItem, false, dropPosition);
                    if (mode != DragAndDropVisualMode.None)
                    {
                        drawRowMarkerAbove                  = dropPosition == DropPosition.Above;
                        m_DropData.rowMarkerControlID       = TreeViewController.GetItemControlID(dropRelativeToItem);
                        m_DropData.insertionMarkerYPosition = originalDropPosition == DropPosition.Above ? targetItemRect.y : targetItemRect.yMax;
                        m_DropData.insertRelativeToSibling  = dropRelativeToItem;
                        if (didChangeTargetToAncector)
                        {
                            m_DropData.ancestorControlID = TreeViewController.GetItemControlID(dropRelativeToItem);
                        }

                        DragAndDrop.visualMode = mode;
                    }
                }
            }

            Event.current.Use();
            return(true);
        }
Exemplo n.º 8
0
 public TreeViewGUI(TreeViewController treeView)
 {
     this.m_TreeView = treeView;
 }
Exemplo n.º 9
0
        public virtual bool IsRevealed(int id)
        {
            IList <TreeViewItem> rows = this.GetRows();

            return(TreeViewController.GetIndexOfID(rows, id) >= 0);
        }
Exemplo n.º 10
0
        public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, int row)
        {
            bool flag = Event.current.type == EventType.DragPerform;
            bool result;

            TreeViewDragging.DropPosition dropPosition;
            if (targetItem == null)
            {
                if (this.m_DropData != null)
                {
                    this.m_DropData.dropTargetControlID = 0;
                    this.m_DropData.rowMarkerControlID  = 0;
                }
                DragAndDrop.visualMode = this.DoDrag(null, null, flag, TreeViewDragging.DropPosition.Below);
                if (DragAndDrop.visualMode != DragAndDropVisualMode.None && flag)
                {
                    this.FinalizeDragPerformed(true);
                }
                result = false;
            }
            else if (!this.TryGetDropPosition(targetItem, targetItemRect, row, out dropPosition))
            {
                result = false;
            }
            else
            {
                TreeViewItem treeViewItem = null;
                switch (dropPosition)
                {
                case TreeViewDragging.DropPosition.Upon:
                    treeViewItem = targetItem;
                    break;

                case TreeViewDragging.DropPosition.Below:
                    if (this.m_TreeView.data.IsExpanded(targetItem) && targetItem.hasChildren)
                    {
                        treeViewItem = targetItem;
                        targetItem   = targetItem.children[0];
                        dropPosition = TreeViewDragging.DropPosition.Above;
                    }
                    else
                    {
                        treeViewItem = targetItem.parent;
                    }
                    break;

                case TreeViewDragging.DropPosition.Above:
                    treeViewItem = targetItem.parent;
                    break;
                }
                DragAndDropVisualMode dragAndDropVisualMode = DragAndDropVisualMode.None;
                if (flag)
                {
                    if (dropPosition == TreeViewDragging.DropPosition.Upon)
                    {
                        dragAndDropVisualMode = this.DoDrag(targetItem, targetItem, true, dropPosition);
                    }
                    if (dragAndDropVisualMode == DragAndDropVisualMode.None && treeViewItem != null)
                    {
                        dragAndDropVisualMode = this.DoDrag(treeViewItem, targetItem, true, dropPosition);
                    }
                    if (dragAndDropVisualMode != DragAndDropVisualMode.None)
                    {
                        this.FinalizeDragPerformed(false);
                    }
                    else
                    {
                        this.DragCleanup(true);
                        this.m_TreeView.NotifyListenersThatDragEnded(null, false);
                    }
                }
                else
                {
                    if (this.m_DropData == null)
                    {
                        this.m_DropData = new TreeViewDragging.DropData();
                    }
                    this.m_DropData.dropTargetControlID = 0;
                    this.m_DropData.rowMarkerControlID  = 0;
                    int itemControlID = TreeViewController.GetItemControlID(targetItem);
                    this.HandleAutoExpansion(itemControlID, targetItem, targetItemRect);
                    if (dropPosition == TreeViewDragging.DropPosition.Upon)
                    {
                        dragAndDropVisualMode = this.DoDrag(targetItem, targetItem, false, dropPosition);
                    }
                    if (dragAndDropVisualMode != DragAndDropVisualMode.None)
                    {
                        this.m_DropData.dropTargetControlID = itemControlID;
                        DragAndDrop.visualMode = dragAndDropVisualMode;
                    }
                    else if (targetItem != null && treeViewItem != null)
                    {
                        dragAndDropVisualMode = this.DoDrag(treeViewItem, targetItem, false, dropPosition);
                        if (dragAndDropVisualMode != DragAndDropVisualMode.None)
                        {
                            this.drawRowMarkerAbove            = (dropPosition == TreeViewDragging.DropPosition.Above);
                            this.m_DropData.rowMarkerControlID = itemControlID;
                            DragAndDrop.visualMode             = dragAndDropVisualMode;
                        }
                    }
                }
                Event.current.Use();
                result = true;
            }
            return(result);
        }
 public TreeViewControlDragging(TreeViewController treeView, TreeView owner)
     : base(treeView)
 {
     m_Owner = owner;
 }
Exemplo n.º 12
0
            // We only override DrawIconAndLabel (and not OnRowGUI) so the user only have to care about item content rendering; and not drag marker rendering, renaming and foldout button
            protected override void OnContentGUI(Rect rect, int row, TreeViewItem item, string label, bool selected, bool focused, bool useBoldFont, bool isPinging)
            {
                // We do not support pinging in the TreeView (to simplify api)
                if (isPinging)
                {
                    return;
                }

                // Make sure the GUI contents for each row is starting with its own controlID unique to its item. This prevents key-focus of a control (e.g a float field)
                // to jump from row to row when mouse scrolling (due to culling of rows and the assigning of controlIDs in call-order)
                GUIUtility.GetControlID(TreeViewController.GetItemControlID(item), FocusType.Passive);

                if (m_Owner.m_OverriddenMethods.hasRowGUI)
                {
                    var args = new RowGUIArgs
                    {
                        rowRect    = rect,
                        row        = row,
                        item       = item,
                        label      = label,
                        selected   = selected,
                        focused    = focused,
                        isRenaming = IsRenaming(item.id),
                    };

                    // For multi column header we call OnRowGUI for each cell with the cell rect
                    if (m_Owner.multiColumnHeader != null)
                    {
                        //args.columnInfo = m_ColumnInfo;
                        var visibleColumns = m_Owner.multiColumnHeader.state.visibleColumns;
                        if (m_CellRects == null || m_CellRects.Length != visibleColumns.Length)
                        {
                            m_CellRects = new Rect[visibleColumns.Length];
                        }

                        var columns    = m_Owner.multiColumnHeader.state.columns;
                        var columnRect = args.rowRect;
                        for (int i = 0; i < visibleColumns.Length; ++i)
                        {
                            var columnData = columns[visibleColumns[i]];
                            columnRect.width = columnData.width;

                            m_CellRects[i] = columnRect;

                            // Use cell margins for all columns except the column with the tree view foldouts
                            // since that column assumes full cell rect for rename overlay placement
                            if (columnIndexForTreeFoldouts != visibleColumns[i])
                            {
                                m_CellRects[i].x     += cellMargin;
                                m_CellRects[i].width -= 2 * cellMargin;
                            }

                            columnRect.x += columnData.width;
                        }

                        args.columnInfo = new RowGUIArgs.MultiColumnInfo(m_Owner.multiColumnHeader.state, m_CellRects);
                    }

                    m_Owner.RowGUI(args);
                }
                else
                {
                    // Default item gui
                    base.OnContentGUI(rect, row, item, label, selected, focused, useBoldFont, false);
                }
            }
Exemplo n.º 13
0
 public TreeViewControlGUI(TreeViewController treeView, TreeView owner)
     : base(treeView)
 {
     m_Owner    = owner;
     cellMargin = MultiColumnHeader.DefaultGUI.columnContentMargin;
 }
Exemplo n.º 14
0
        virtual protected void DoItemGUI(Rect rect, int row, TreeViewItem item, bool selected, bool focused, bool useBoldFont)
        {
            EditorGUIUtility.SetIconSize(new Vector2(k_IconWidth, k_IconWidth)); // If not set we see icons scaling down if text is being cropped

            int itemControlID = TreeViewController.GetItemControlID(item);

            bool isRenamingThisItem = IsRenaming(item.id);
            bool showFoldout        = m_TreeView.data.IsExpandable(item);

            // Adjust edit field if needed (on repaint since on layout rect.width is invalid when using GUILayout)
            if (isRenamingThisItem && Event.current.type == EventType.Repaint)
            {
                GetRenameOverlay().editFieldRect = GetRenameRect(rect, row, item);
            }

            string label = item.displayName;

            if (isRenamingThisItem)
            {
                selected = false;
                label    = "";
            }

            if (Event.current.type == EventType.Repaint)
            {
                // Draw background (can be overridden)
                DrawItemBackground(rect, row, item, selected, focused);

                // Draw selection
                if (selected && drawSelection)
                {
                    selectionStyle.Draw(rect, false, false, true, focused);
                }

                bool hasDragHandling = m_TreeView.dragging != null;
                if (hasDragHandling)
                {
                    // Draw drop marker
                    if (m_TreeView.dragging.GetDropTargetControlID() == itemControlID && m_TreeView.data.CanBeParent(item))
                    {
                        Styles.lineStyle.Draw(GetDropTargetRect(rect), GUIContent.none, true, true, false, false);
                    }

                    // Ancestor item marker is rendered after all rows in RowEndGUI - extra visual helper marker when previous sibling is far away from the cursor
                    var dragging = m_TreeView.dragging as TreeViewDragging;
                    if (dragging != null && dragging.GetAncestorControlID() == itemControlID && dragging.insertRelativeToSibling != null)
                    {
                        m_DraggingAncestorMarkerRect       = rect;
                        m_DraggingAncestorMarkerRect.xMin += extraInsertionMarkerIndent + GetContentIndent(item);
                        m_DraggingAncestorMarkerRect.y     = rect.yMax - insertionRelativeToSiblingStyle.fixedHeight * 0.5f;
                    }
                }
            }

            // Do additional ui controls (menu button, prefab arrow etc)
            OnAdditionalGUI(rect, row, item, selected, focused);

            // Do row content (icon, label, controls etc)
            OnContentGUI(rect, row, item, label, selected, focused, useBoldFont, false);

            // Do foldout
            if (showFoldout)
            {
                DoFoldout(rect, item, row);
            }

            EditorGUIUtility.SetIconSize(Vector2.zero);
        }
Exemplo n.º 15
0
        // This method is called from TreeView and handles:
        // - Where the dragged items are dropped (above, below or upon)
        // - Auto expansion of collapsed items when hovering over them
        // - Setting up the render markers for drop location (horizontal lines)
        // 'targetItem' is null when not hovering over any target Item, if so the rest of the arguments are invalid
        public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, int row)
        {
            bool perform = Event.current.type == EventType.DragPerform;

            // Are we dragging outside any items
            if (targetItem == null)
            {
                // If so clear any drop markers
                if (m_DropData != null)
                {
                    m_DropData.dropTargetControlID = 0;
                    m_DropData.rowMarkerControlID  = 0;
                }

                // And let client decide what happens when dragging outside items

                DragAndDrop.visualMode = DoDrag(null, null, perform, DropPosition.Below);
                if (DragAndDrop.visualMode != DragAndDropVisualMode.None && perform)
                {
                    FinalizeDragPerformed(true);
                }

                return(false);
            }

            DropPosition dropPosition;

            if (!TryGetDropPosition(targetItem, targetItemRect, row, out dropPosition))
            {
                return(false);
            }

            TreeViewItem parentItem = null;

            switch (dropPosition)
            {
            case DropPosition.Upon:
            {
                // Client must decide what happens when dropping upon: e.g: insert last or first in child list
                parentItem = targetItem;
            }
            break;

            case DropPosition.Below:
            {
                // When hovering between an expanded parent and its first child then make sure we change state to match that
                if (m_TreeView.data.IsExpanded(targetItem) && targetItem.hasChildren)
                {
                    parentItem   = targetItem;
                    targetItem   = targetItem.children[0];
                    dropPosition = DropPosition.Above;
                }
                else
                {
                    // Drop as next sibling to target
                    parentItem = targetItem.parent;
                }
            }
            break;

            case DropPosition.Above:
            {
                parentItem = targetItem.parent;
            }
            break;

            default:
                Assert.IsTrue(false, Constants.UnhandledEnum);
                break;
            }


            DragAndDropVisualMode mode = DragAndDropVisualMode.None;

            if (perform)
            {
                // Try Drop on top of element
                if (dropPosition == DropPosition.Upon)
                {
                    mode = DoDrag(targetItem, targetItem, true, dropPosition);
                }

                // Fall back to dropping on parent  (drop between elements)
                if (mode == DragAndDropVisualMode.None && parentItem != null)
                {
                    mode = DoDrag(parentItem, targetItem, true, dropPosition);
                }

                // Finalize drop
                if (mode != DragAndDropVisualMode.None)
                {
                    FinalizeDragPerformed(false);
                }
                else
                {
                    DragCleanup(true);
                    m_TreeView.NotifyListenersThatDragEnded(null, false);
                }
            }
            else // DragUpdate
            {
                if (m_DropData == null)
                {
                    m_DropData = new DropData();
                }
                m_DropData.dropTargetControlID = 0;
                m_DropData.rowMarkerControlID  = 0;

                int itemControlID = TreeViewController.GetItemControlID(targetItem);
                HandleAutoExpansion(itemControlID, targetItem, targetItemRect);

                // Try drop on top of element
                if (dropPosition == DropPosition.Upon)
                {
                    mode = DoDrag(targetItem, targetItem, false, dropPosition);
                }

                if (mode != DragAndDropVisualMode.None)
                {
                    m_DropData.dropTargetControlID = itemControlID;
                    DragAndDrop.visualMode         = mode;
                }
                // Fall back to dropping on parent (drop between elements)
                else if (targetItem != null && parentItem != null)
                {
                    mode = DoDrag(parentItem, targetItem, false, dropPosition);

                    if (mode != DragAndDropVisualMode.None)
                    {
                        drawRowMarkerAbove            = dropPosition == DropPosition.Above;
                        m_DropData.rowMarkerControlID = itemControlID;
                        DragAndDrop.visualMode        = mode;
                    }
                }
            }

            Event.current.Use();
            return(true);
        }
Exemplo n.º 16
0
 public LazyTreeViewDataSource(TreeViewController treeView) : base(treeView)
 {
 }
Exemplo n.º 17
0
 public TreeViewDragging(TreeViewController treeView)
 {
     m_TreeView = treeView;
 }
Exemplo n.º 18
0
        virtual protected void DoItemGUI(Rect rect, int row, TreeViewItem item, bool selected, bool focused, bool useBoldFont)
        {
            EditorGUIUtility.SetIconSize(new Vector2(k_IconWidth, k_IconWidth)); // If not set we see icons scaling down if text is being cropped

            float indent = GetFoldoutIndent(item);

            int itemControlID = TreeViewController.GetItemControlID(item);

            bool isDropTarget = false;

            if (m_TreeView.dragging != null)
            {
                isDropTarget = m_TreeView.dragging.GetDropTargetControlID() == itemControlID && m_TreeView.data.CanBeParent(item);
            }
            bool isRenamingThisItem = IsRenaming(item.id);
            bool showFoldout        = m_TreeView.data.IsExpandable(item);

            // Adjust edit field if needed (on repaint since on layout rect.width is invalid when using GUILayout)
            if (isRenamingThisItem && Event.current.type == EventType.Repaint)
            {
                GetRenameOverlay().editFieldRect = GetRenameRect(rect, row, item);
            }

            string label = item.displayName;

            if (isRenamingThisItem)
            {
                selected = false;
                label    = "";
            }

            if (Event.current.type == EventType.Repaint)
            {
                // Draw background (can be overridden)
                DrawItemBackground(rect, row, item, selected, focused);

                // Draw selection
                if (selected)
                {
                    selectionStyle.Draw(rect, false, false, true, focused);
                }

                // Draw drop marker
                if (isDropTarget)
                {
                    Styles.lineStyle.Draw(GetDropTargetRect(rect), GUIContent.none, true, true, false, false);
                }

                // Show insertion marker below this item (rendered end of rows)
                if (m_TreeView.dragging != null && m_TreeView.dragging.GetRowMarkerControlID() == itemControlID)
                {
                    float yPos = (m_TreeView.dragging.drawRowMarkerAbove ? rect.y : rect.yMax) - insertionStyle.fixedHeight * 0.5f;
                    m_DraggingInsertionMarkerRect = new Rect(rect.x + indent + extraInsertionMarkerIndent + foldoutStyleWidth + lineStyle.margin.left, yPos, rect.width - indent, rect.height);
                }
            }

            // Do row content (icon, label, controls etc)
            OnContentGUI(rect, row, item, label, selected, focused, useBoldFont, false);

            // Do foldout
            if (showFoldout)
            {
                DoFoldout(rect, item, row);
            }

            EditorGUIUtility.SetIconSize(Vector2.zero);
        }
Exemplo n.º 19
0
 public TreeViewGUI(TreeViewController treeView, bool useHorizontalScroll)
 {
     this.m_TreeView            = treeView;
     this.m_UseHorizontalScroll = useHorizontalScroll;
 }
Exemplo n.º 20
0
        public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, bool firstItem)
        {
            bool flag = Event.current.type == EventType.DragPerform;
            bool result;

            if (targetItem == null)
            {
                if (this.m_DropData != null)
                {
                    this.m_DropData.dropTargetControlID = 0;
                    this.m_DropData.rowMarkerControlID  = 0;
                }
                DragAndDrop.visualMode = this.DoDrag(null, null, flag, TreeViewDragging.DropPosition.Below);
                if (DragAndDrop.visualMode != DragAndDropVisualMode.None && flag)
                {
                    this.FinalizeDragPerformed(true);
                }
                result = false;
            }
            else
            {
                Vector2 mousePosition = Event.current.mousePosition;
                bool    flag2         = this.m_TreeView.data.CanBeParent(targetItem);
                Rect    rect          = targetItemRect;
                float   num           = (!flag2) ? (targetItemRect.height * 0.5f) : this.m_TreeView.gui.halfDropBetweenHeight;
                if (firstItem)
                {
                    rect.yMin -= num;
                }
                rect.yMax += num;
                if (!rect.Contains(mousePosition))
                {
                    result = false;
                }
                else
                {
                    TreeViewDragging.DropPosition dropPosition;
                    if (mousePosition.y >= targetItemRect.yMax - num)
                    {
                        dropPosition = TreeViewDragging.DropPosition.Below;
                    }
                    else if (firstItem && mousePosition.y <= targetItemRect.yMin + num)
                    {
                        dropPosition = TreeViewDragging.DropPosition.Above;
                    }
                    else
                    {
                        dropPosition = ((!flag2) ? TreeViewDragging.DropPosition.Above : TreeViewDragging.DropPosition.Upon);
                    }
                    TreeViewItem treeViewItem = null;
                    switch (dropPosition)
                    {
                    case TreeViewDragging.DropPosition.Upon:
                        treeViewItem = targetItem;
                        break;

                    case TreeViewDragging.DropPosition.Below:
                        if (this.m_TreeView.data.IsExpanded(targetItem) && targetItem.hasChildren)
                        {
                            treeViewItem = targetItem;
                            targetItem   = targetItem.children[0];
                            dropPosition = TreeViewDragging.DropPosition.Above;
                        }
                        else
                        {
                            treeViewItem = targetItem.parent;
                        }
                        break;

                    case TreeViewDragging.DropPosition.Above:
                        treeViewItem = targetItem.parent;
                        break;
                    }
                    DragAndDropVisualMode dragAndDropVisualMode = DragAndDropVisualMode.None;
                    if (flag)
                    {
                        if (dropPosition == TreeViewDragging.DropPosition.Upon)
                        {
                            dragAndDropVisualMode = this.DoDrag(targetItem, targetItem, true, dropPosition);
                        }
                        if (dragAndDropVisualMode == DragAndDropVisualMode.None && treeViewItem != null)
                        {
                            dragAndDropVisualMode = this.DoDrag(treeViewItem, targetItem, true, dropPosition);
                        }
                        if (dragAndDropVisualMode != DragAndDropVisualMode.None)
                        {
                            this.FinalizeDragPerformed(false);
                        }
                        else
                        {
                            this.DragCleanup(true);
                            this.m_TreeView.NotifyListenersThatDragEnded(null, false);
                        }
                    }
                    else
                    {
                        if (this.m_DropData == null)
                        {
                            this.m_DropData = new TreeViewDragging.DropData();
                        }
                        this.m_DropData.dropTargetControlID = 0;
                        this.m_DropData.rowMarkerControlID  = 0;
                        int itemControlID = TreeViewController.GetItemControlID(targetItem);
                        this.HandleAutoExpansion(itemControlID, targetItem, targetItemRect, num, mousePosition);
                        if (dropPosition == TreeViewDragging.DropPosition.Upon)
                        {
                            dragAndDropVisualMode = this.DoDrag(targetItem, targetItem, false, dropPosition);
                        }
                        if (dragAndDropVisualMode != DragAndDropVisualMode.None)
                        {
                            this.m_DropData.dropTargetControlID = itemControlID;
                            DragAndDrop.visualMode = dragAndDropVisualMode;
                        }
                        else if (targetItem != null && treeViewItem != null)
                        {
                            dragAndDropVisualMode = this.DoDrag(treeViewItem, targetItem, false, dropPosition);
                            if (dragAndDropVisualMode != DragAndDropVisualMode.None)
                            {
                                this.drawRowMarkerAbove            = (dropPosition == TreeViewDragging.DropPosition.Above);
                                this.m_DropData.rowMarkerControlID = itemControlID;
                                DragAndDrop.visualMode             = dragAndDropVisualMode;
                            }
                        }
                    }
                    Event.current.Use();
                    result = true;
                }
            }
            return(result);
        }