Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }