protected virtual void BuildContextualMenu(ContextualMenuPopulateEvent evt) { var placemat = evt.target as Placemat; if (placemat != null) { evt.menu.AppendAction("Edit Title", a => placemat.StartEditTitle()); evt.menu.AppendSeparator(); evt.menu.AppendAction("Change Color...", a => { GraphViewStaticBridge.ShowColorPicker(c => placemat.Color = c, placemat.Color, false); }); // Resizing section evt.menu.AppendSeparator(); evt.menu.AppendAction(placemat.Collapsed ? "Expand" : "Collapse", a => placemat.Collapsed = !placemat.Collapsed); // Gather nodes here so that we don't recycle this code in the resize functions. List <GraphElement> hoveringNodes = placemat.GetHoveringNodes(); evt.menu.AppendAction("Resize/Grow To Fit", a => placemat.GrowToFitElements(hoveringNodes), hoveringNodes.Count > 0 ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled); evt.menu.AppendAction("Resize/Shrink To Fit", a => placemat.ShrinkToFitElements(hoveringNodes), hoveringNodes.Count > 0 ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled); evt.menu.AppendAction("Resize/Grow To Fit Selection", a => placemat.ResizeToIncludeSelectedNodes(), s => { foreach (ISelectable sel in placemat.m_GraphView.selection) { var node = sel as Node; if (node != null && !hoveringNodes.Contains(node)) { return(DropdownMenuAction.Status.Normal); } } return(DropdownMenuAction.Status.Disabled); }); var status = placemat.Container.Placemats.Any() ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled; evt.menu.AppendAction("Order/Bring To Front", a => Container.BringToFront(placemat), status); evt.menu.AppendAction("Order/Bring Forward", a => Container.CyclePlacemat(placemat, PlacematContainer.CycleDirection.Up), status); evt.menu.AppendAction("Order/Send Backward", a => Container.CyclePlacemat(placemat, PlacematContainer.CycleDirection.Down), status); evt.menu.AppendAction("Order/Send To Back", a => Container.SendToBack(placemat), status); } }
void BuildNodeContextualMenu(Dictionary <IGraphElementModel, IHasGraphElementModel> selectedModels) { var selectedModelsKeys = selectedModels.Keys.ToArray(); if (!selectedModelsKeys.Any()) { return; } var models = selectedModelsKeys.OfType <NodeModel>().ToArray(); var connectedModels = models.Where(x => x.InputsByDisplayOrder.Any(y => y.IsConnected) && x.OutputsByDisplayOrder.Any(y => y.IsConnected)).ToArray(); bool canSelectionBeBypassed = connectedModels.Any(); m_Evt.menu.AppendSeparator(); m_Evt.menu.AppendAction("Align Item (Q)", menuAction => m_GraphView.AlignSelection(false)); m_Evt.menu.AppendAction("Align Hierarchy (Shift+Q)", menuAction => m_GraphView.AlignSelection(true)); var content = selectedModels.Values.OfType <GraphElement>().Where(e => (e.parent is GraphView.Layer) && (e is Unity.Modifier.GraphElements.Node || e is StickyNote)).ToList(); m_Evt.menu.AppendAction("Create Placemat Under Selection", menuAction => { Rect bounds = new Rect(); if (Unity.Modifier.GraphElements.Placemat.ComputeElementBounds(ref bounds, content)) { m_Store.Dispatch(new CreatePlacematAction(null, bounds)); } }, action => (content.Count == 0) ? DropdownMenuAction.Status.Disabled : DropdownMenuAction.Status.Normal); m_Evt.menu.AppendSeparator(); m_Evt.menu.AppendAction("Cut", menuAction => m_GraphView.InvokeCutSelectionCallback(), x => m_GraphView.CanCutSelection() ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled); m_Evt.menu.AppendAction("Copy", menuAction => m_GraphView.InvokeCopySelectionCallback(), x => m_GraphView.CanCopySelection() ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled); m_Evt.menu.AppendAction("Paste", menuAction => m_GraphView.InvokePasteCallback(), x => m_GraphView.CanPaste() ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled); m_Evt.menu.AppendSeparator(); m_Evt.menu.AppendAction("Delete", menuAction => { m_Store.Dispatch(new DeleteElementsAction(selectedModelsKeys.Cast <IGTFGraphElementModel>().ToArray())); }, eventBase => DropdownMenuAction.Status.Normal); m_Evt.menu.AppendSeparator(); if (models.Any()) { m_Evt.menu.AppendAction("Disconnect", menuAction => { m_Store.Dispatch(new DisconnectNodeAction(models)); }); } if (canSelectionBeBypassed) { m_Evt.menu.AppendAction("Remove", menuAction => { m_Store.Dispatch(new RemoveNodesAction(connectedModels, models)); }, eventBase => DropdownMenuAction.Status.Normal); } var placemats = selectedModelsKeys.OfType <PlacematModel>().ToArray(); if (models.Any() || placemats.Any()) { m_Evt.menu.AppendAction("Color/Change...", menuAction => { void ChangeNodesColor(Color pickedColor) { m_Store.Dispatch(new ChangeElementColorAction(pickedColor, models, placemats)); } var defaultColor = new Color(0.5f, 0.5f, 0.5f); if (!models.Any() && placemats.Length == 1) { defaultColor = placemats[0].Color; } else if (models.Length == 1 && !placemats.Any()) { defaultColor = models[0].Color; } GraphViewStaticBridge.ShowColorPicker(ChangeNodesColor, defaultColor, true); }, eventBase => DropdownMenuAction.Status.Normal); m_Evt.menu.AppendAction("Color/Reset", menuAction => { m_Store.Dispatch(new ResetElementColorAction(models, placemats)); }, eventBase => DropdownMenuAction.Status.Normal); } else { m_Evt.menu.AppendAction("Color", menuAction => { }, eventBase => DropdownMenuAction.Status.Disabled); } }