Exemplo n.º 1
0
        /// <inheritdoc />
        public override void OnDestroy()
        {
            _cm = null;
            if (_asset != null)
            {
                _asset.RemoveReference(this);
                _asset = null;
            }

            base.OnDestroy();
        }
Exemplo n.º 2
0
 /// <inheritdoc />
 public override bool OnMouseUp(Float2 location, MouseButton button)
 {
     if (base.OnMouseUp(location, button))
     {
         return(true);
     }
     if (button == MouseButton.Right && Item is AssetItem assetItem)
     {
         // Show context menu
         var proxy = Editor.Instance.ContentDatabase.GetProxy(assetItem);
         ContextMenuButton b;
         var cm = new FlaxEditor.GUI.ContextMenu.ContextMenu {
             Tag = assetItem
         };
         b = cm.AddButton("Open", () => Editor.Instance.ContentFinding.Open(Item));
         cm.AddSeparator();
         cm.AddButton("Show in explorer", () => FileSystem.ShowFileExplorer(System.IO.Path.GetDirectoryName(assetItem.Path)));
         cm.AddButton("Show in Content window", () => Editor.Instance.Windows.ContentWin.Select(assetItem, true));
         b.Enabled = proxy != null && proxy.CanReimport(assetItem);
         if (assetItem is BinaryAssetItem binaryAsset)
         {
             if (!binaryAsset.GetImportPath(out string importPath))
             {
                 string importLocation = System.IO.Path.GetDirectoryName(importPath);
                 if (!string.IsNullOrEmpty(importLocation) && System.IO.Directory.Exists(importLocation))
                 {
                     cm.AddButton("Show import location", () => FileSystem.ShowFileExplorer(importLocation));
                 }
             }
         }
         cm.AddSeparator();
         cm.AddButton("Copy asset ID", () => Clipboard.Text = FlaxEngine.Json.JsonSerializer.GetStringID(assetItem.ID));
         cm.AddButton("Select actors using this asset", () => Editor.Instance.SceneEditing.SelectActorsUsingAsset(assetItem.ID));
         cm.AddButton("Show asset references graph", () => Editor.Instance.Windows.Open(new AssetReferencesGraphWindow(Editor.Instance, assetItem)));
         cm.AddSeparator();
         proxy?.OnContentWindowContextMenu(cm, assetItem);
         assetItem.OnContextMenu(cm);
         cm.AddButton("Copy name to Clipboard", () => Clipboard.Text = assetItem.NamePath);
         cm.AddButton("Copy path to Clipboard", () => Clipboard.Text = assetItem.Path);
         cm.Show(this, location);
         _cm = cm;
         return(true);
     }
     return(false);
 }
 /// <summary>
 /// Called when editor is showing secondary context menu. Can be used to inject custom options for surface logic.
 /// </summary>
 /// <param name="controlUnderMouse">The Surface Control that is under the cursor. Used to customize the menu.</param>
 /// <param name="menu">The menu.</param>
 protected virtual void OnShowSecondaryContextMenu(FlaxEditor.GUI.ContextMenu.ContextMenu menu, SurfaceControl controlUnderMouse)
 {
 }
        /// <summary>
        /// Shows the secondary context menu.
        /// </summary>
        /// <param name="location">The location in the Surface Space.</param>
        /// <param name="controlUnderMouse">The Surface Control that is under the cursor. Used to customize the menu.</param>
        public virtual void ShowSecondaryCM(Vector2 location, SurfaceControl controlUnderMouse)
        {
            var selection = SelectedNodes;

            if (selection.Count == 0)
            {
                return;
            }

            // Create secondary context menu
            var menu = new FlaxEditor.GUI.ContextMenu.ContextMenu();

            if (_onSave != null)
            {
                menu.AddButton("Save", _onSave).Enabled = CanEdit;
                menu.AddSeparator();
            }
            _cmCopyButton = menu.AddButton("Copy", Copy);
            menu.AddButton("Paste", Paste).Enabled = CanEdit && CanPaste();
            _cmDuplicateButton         = menu.AddButton("Duplicate", Duplicate);
            _cmDuplicateButton.Enabled = CanEdit;
            var canRemove = CanEdit && selection.All(node => (node.Archetype.Flags & NodeFlags.NoRemove) == 0);

            menu.AddButton("Cut", Cut).Enabled       = canRemove;
            menu.AddButton("Delete", Delete).Enabled = canRemove;

            if (_supportsDebugging)
            {
                menu.AddSeparator();
                if (selection.Count == 1)
                {
                    menu.AddButton(selection[0].Breakpoint.Set ? "Delete breakpoint" : "Add breakpoint", () =>
                    {
                        foreach (var node in Nodes)
                        {
                            if (node.IsSelected)
                            {
                                node.Breakpoint.Set     = !node.Breakpoint.Set;
                                node.Breakpoint.Enabled = true;
                                OnNodeBreakpointEdited(node);
                                break;
                            }
                        }
                    });
                    menu.AddButton("Toggle breakpoint", () =>
                    {
                        foreach (var node in Nodes)
                        {
                            if (node.IsSelected)
                            {
                                node.Breakpoint.Enabled = !node.Breakpoint.Enabled;
                                OnNodeBreakpointEdited(node);
                                break;
                            }
                        }
                    }).Enabled = selection[0].Breakpoint.Set;
                }
                menu.AddSeparator();
                menu.AddButton("Delete all breakpoints", () =>
                {
                    foreach (var node in Nodes)
                    {
                        if (node.Breakpoint.Set)
                        {
                            node.Breakpoint.Set = false;
                            OnNodeBreakpointEdited(node);
                        }
                    }
                }).Enabled = Nodes.Any(x => x.Breakpoint.Set);
                menu.AddButton("Enable all breakpoints", () =>
                {
                    foreach (var node in Nodes)
                    {
                        if (!node.Breakpoint.Enabled)
                        {
                            node.Breakpoint.Enabled = true;
                            OnNodeBreakpointEdited(node);
                        }
                    }
                }).Enabled = Nodes.Any(x => x.Breakpoint.Set && !x.Breakpoint.Enabled);
                menu.AddButton("Disable all breakpoints", () =>
                {
                    foreach (var node in Nodes)
                    {
                        if (node.Breakpoint.Enabled)
                        {
                            node.Breakpoint.Enabled = false;
                            OnNodeBreakpointEdited(node);
                        }
                    }
                }).Enabled = Nodes.Any(x => x.Breakpoint.Set && x.Breakpoint.Enabled);
            }
            menu.AddSeparator();

            _cmFormatNodesConnectionButton         = menu.AddButton("Format node(s)", () => { FormatGraph(SelectedNodes); });
            _cmFormatNodesConnectionButton.Enabled = CanEdit && HasNodesSelection;

            _cmRemoveNodeConnectionsButton = menu.AddButton("Remove all connections to that node(s)", () =>
            {
                var nodes = ((List <SurfaceNode>)menu.Tag);

                if (Undo != null)
                {
                    var actions = new List <IUndoAction>(nodes.Count);
                    foreach (var node in nodes)
                    {
                        var action = new EditNodeConnections(Context, node);
                        node.RemoveConnections();
                        action.End();
                        actions.Add(action);
                    }
                    Undo.AddAction(new MultiUndoAction(actions, actions[0].ActionString));
                }
                else
                {
                    foreach (var node in nodes)
                    {
                        node.RemoveConnections();
                    }
                }

                MarkAsEdited();
            });
            _cmRemoveNodeConnectionsButton.Enabled = CanEdit;
            _cmRemoveBoxConnectionsButton          = menu.AddButton("Remove all connections to that box", () =>
            {
                var boxUnderMouse = (Box)_cmRemoveBoxConnectionsButton.Tag;
                if (Undo != null)
                {
                    var action = new EditNodeConnections(Context, boxUnderMouse.ParentNode);
                    boxUnderMouse.RemoveConnections();
                    action.End();
                    Undo.AddAction(action);
                }
                else
                {
                    boxUnderMouse.RemoveConnections();
                }
                MarkAsEdited();
            });
            _cmRemoveBoxConnectionsButton.Enabled = CanEdit;
            {
                var boxUnderMouse = GetChildAtRecursive(location) as Box;
                _cmRemoveBoxConnectionsButton.Enabled = boxUnderMouse != null && boxUnderMouse.HasAnyConnection;
                _cmRemoveBoxConnectionsButton.Tag     = boxUnderMouse;
            }

            controlUnderMouse?.OnShowSecondaryContextMenu(menu, controlUnderMouse.PointFromParent(location));

            OnShowSecondaryContextMenu(menu, controlUnderMouse);

            // Show secondary context menu
            _cmStartPos = location;
            menu.Tag    = selection;
            menu.MaximumItemsInViewCount = 24;
            menu.Show(this, location);
        }
Exemplo n.º 5
0
            /// <inheritdoc />
            public override bool OnMouseUp(Vector2 location, MouseButton button)
            {
                _mousePos = location;

                if (_leftMouseDown && button == MouseButton.Left)
                {
                    _leftMouseDown = false;
                    EndMouseCapture();
                    Cursor = CursorType.Default;

                    // Moving keyframes
                    if (_isMovingSelection)
                    {
                        if (_mouseMoveAmount > 3.0f)
                        {
                            _editor.OnEdited();
                            _editor.OnEditingEnd();
                        }
                    }
                    // Selecting
                    else
                    {
                        UpdateSelectionRectangle();
                    }

                    _isMovingSelection = false;
                }
                if (_rightMouseDown && button == MouseButton.Right)
                {
                    _rightMouseDown = false;
                    EndMouseCapture();
                    Cursor = CursorType.Default;

                    // Check if no move has been made at all
                    if (_mouseMoveAmount < 3.0f)
                    {
                        var selectionCount = _editor.SelectionCount;
                        var underMouse     = GetChildAt(location);
                        if (selectionCount == 0 && underMouse is KeyframePoint point)
                        {
                            // Select node
                            selectionCount = 1;
                            point.Select();
                        }

                        var viewRect = _editor._mainPanel.GetClientArea();
                        _cmShowPos = PointToKeyframes(location, ref viewRect);

                        var cm = new ContextMenu.ContextMenu();
                        cm.AddButton("Add keyframe", () => _editor.AddKeyframe(_cmShowPos)).Enabled = _editor.Keyframes.Count < _editor.MaxKeyframes;
                        if (selectionCount == 0)
                        {
                        }
                        else if (selectionCount == 1)
                        {
                            cm.AddButton("Edit keyframe", () => _editor.EditKeyframes(this, location));
                            cm.AddButton("Remove keyframe", _editor.RemoveKeyframes);
                        }
                        else
                        {
                            cm.AddButton("Edit keyframes", () => _editor.EditKeyframes(this, location));
                            cm.AddButton("Remove keyframes", _editor.RemoveKeyframes);
                        }
                        cm.AddButton("Edit all keyframes", () => _editor.EditAllKeyframes(this, location));
                        if (_editor.EnableZoom && _editor.EnablePanning)
                        {
                            cm.AddSeparator();
                            cm.AddButton("Show whole keyframes", _editor.ShowWholeKeyframes);
                            cm.AddButton("Reset view", _editor.ResetView);
                        }
                        cm.Show(this, location);
                    }
                    _mouseMoveAmount = 0;
                }

                if (base.OnMouseUp(location, button))
                {
                    // Clear flags
                    _rightMouseDown = false;
                    _leftMouseDown  = false;
                    return(true);
                }

                return(true);
            }
Exemplo n.º 6
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ItemsPanel"/> class.
 /// </summary>
 /// <param name="menu">The menu.</param>
 public ItemsPanel(ContextMenu menu)
     : base(ScrollBars.Vertical)
 {
     _menu = menu;
 }
Exemplo n.º 7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ContextMenuButton"/> class.
 /// </summary>
 /// <param name="parent">The parent context menu.</param>
 /// <param name="text">The text.</param>
 /// <param name="shortKeys">The short keys tip.</param>
 public ContextMenuButton(ContextMenu parent, string text, string shortKeys = "")
     : base(parent, 8, 22)
 {
     Text      = text;
     ShortKeys = shortKeys;
 }
Exemplo n.º 8
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ContextMenuItem"/> class.
 /// </summary>
 /// <param name="parent">The parent context menu.</param>
 /// <param name="width">The initial width.</param>
 /// <param name="height">The initial height.</param>
 protected ContextMenuItem(ContextMenu parent, float width, float height)
     : base(0, 0, width, height)
 {
     AutoFocus         = false;
     ParentContextMenu = parent;
 }
        /// <summary>
        /// Shows the secondary context menu.
        /// </summary>
        /// <param name="location">The location in the Surface Space.</param>
        /// <param name="controlUnderMouse">The Surface Control that is under the cursor. Used to customize the menu.</param>
        public virtual void ShowSecondaryCM(Vector2 location, SurfaceControl controlUnderMouse)
        {
            var selection = SelectedNodes;

            if (selection.Count == 0)
            {
                return;
            }

            // Create secondary context menu
            var menu = new FlaxEditor.GUI.ContextMenu.ContextMenu();

            menu.AddButton("Save", _onSave);
            menu.AddSeparator();
            _cmCopyButton = menu.AddButton("Copy", Copy);
            menu.AddButton("Paste", Paste).Enabled = CanPaste();
            _cmDuplicateButton = menu.AddButton("Duplicate", Duplicate);
            var canRemove = selection.All(node => (node.Archetype.Flags & NodeFlags.NoRemove) == 0);

            menu.AddButton("Cut", Cut).Enabled       = canRemove;
            menu.AddButton("Delete", Delete).Enabled = canRemove;
            menu.AddSeparator();
            _cmRemoveNodeConnectionsButton = menu.AddButton("Remove all connections to that node(s)", () =>
            {
                var nodes = ((List <SurfaceNode>)menu.Tag);

                if (Undo != null)
                {
                    var actions = new List <IUndoAction>(nodes.Count);
                    foreach (var node in nodes)
                    {
                        var action = new EditNodeConnections(Context, node);
                        node.RemoveConnections();
                        action.End();
                        actions.Add(action);
                    }
                    Undo.AddAction(new MultiUndoAction(actions, actions[0].ActionString));
                }
                else
                {
                    foreach (var node in nodes)
                    {
                        node.RemoveConnections();
                    }
                }

                MarkAsEdited();
            });
            _cmRemoveBoxConnectionsButton = menu.AddButton("Remove all connections to that box", () =>
            {
                var boxUnderMouse = (Box)_cmRemoveBoxConnectionsButton.Tag;

                if (Undo != null)
                {
                    var action = new EditNodeConnections(Context, boxUnderMouse.ParentNode);
                    boxUnderMouse.RemoveConnections();
                    action.End();
                    Undo.AddAction(action);
                }
                else
                {
                    boxUnderMouse.RemoveConnections();
                }

                MarkAsEdited();
            });
            {
                var boxUnderMouse = GetChildAtRecursive(location) as Box;
                _cmRemoveBoxConnectionsButton.Enabled = boxUnderMouse != null && boxUnderMouse.HasAnyConnection;
                _cmRemoveBoxConnectionsButton.Tag     = boxUnderMouse;
            }
            controlUnderMouse?.OnShowSecondaryContextMenu(menu, controlUnderMouse.PointFromParent(location));
            OnShowSecondaryContextMenu(menu, controlUnderMouse);

            // Show secondary context menu
            _cmStartPos = location;
            menu.Tag    = selection;
            menu.Show(this, location);
        }
Exemplo n.º 10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ContextMenuSeparator"/> class.
 /// </summary>
 /// <param name="parent">The parent context menu.</param>
 public ContextMenuSeparator(ContextMenu parent)
     : base(parent, 8, 4)
 {
 }