/// <inheritdoc /> public override void OnDestroy() { _cm = null; if (_asset != null) { _asset.RemoveReference(this); _asset = null; } base.OnDestroy(); }
/// <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); }
/// <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); }
/// <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; }
/// <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; }
/// <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); }
/// <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) { }