Esempio n. 1
0
        private void HandleCanvasContextClick(object sender, PointerGraphicalElementEventArgs e)
        {
            IList <TestableEditorElements.MenuOption> options = new List <TestableEditorElements.MenuOption>();

            options.Add(new TestableEditorElements.MenuItem(new GUIContent("Add step"), false, () =>
            {
                IStep step = EntityFactory.CreateStep("New Step");
                step.StepMetadata.Position = e.PointerPosition;
                AddStepWithUndo(step);
            }));

            if (SystemClipboard.IsStepInClipboard())
            {
                options.Add(new TestableEditorElements.MenuItem(new GUIContent("Paste step"), false, () =>
                {
                    Paste(e.PointerPosition);
                }));
            }
            else
            {
                options.Add(new TestableEditorElements.DisabledMenuItem(new GUIContent("Paste step")));
            }

            TestableEditorElements.DisplayContextMenu(options);
        }
        /// <inheritdoc />
        public override Rect Draw(Rect rect, object currentValue, Action <object> changeValueCallback, GUIContent label)
        {
            EditorGUI.BeginDisabledGroup(EditorConfigurator.Instance.AllowedMenuItemsSettings.GetBehaviorMenuOptions().Any() == false);
            if (EditorDrawingHelper.DrawAddButton(ref rect, "Add Behavior"))
            {
                IList <TestableEditorElements.MenuOption> options = ConvertFromConfigurationOptionsToGenericMenuOptions(EditorConfigurator.Instance.BehaviorsMenuContent.ToList(), currentValue, changeValueCallback);
                TestableEditorElements.DisplayContextMenu(options);
            }
            EditorGUI.EndDisabledGroup();

            if (EditorDrawingHelper.DrawHelpButton(ref rect))
            {
                Application.OpenURL("https://developers.innoactive.de/documentation/creator/latest/articles/innoactive-creator/default-behaviors.html");
            }

            if (EditorConfigurator.Instance.AllowedMenuItemsSettings.GetBehaviorMenuOptions().Any() == false)
            {
                rect.y     += rect.height + EditorDrawingHelper.VerticalSpacing;
                rect.width -= EditorDrawingHelper.IndentationWidth;
                EditorGUI.HelpBox(rect, "Your project does not contain any Behaviors. Either create one or import an Innoactive Creator Component.", MessageType.Error);
                rect.height += rect.height + EditorDrawingHelper.VerticalSpacing;
            }

            return(rect);
        }
        /// <inheritdoc />
        public override Rect Draw(Rect rect, object currentValue, Action <object> changeValueCallback, GUIContent label)
        {
            if (EditorDrawingHelper.DrawAddButton(ref rect, "Add Behavior"))
            {
                IList <TestableEditorElements.MenuOption> options = ConvertFromConfigurationOptionsToGenericMenuOptions(EditorConfigurator.Instance.BehaviorsMenuContent.ToList(), currentValue, changeValueCallback);
                TestableEditorElements.DisplayContextMenu(options);
            }

            return(rect);
        }
Esempio n. 4
0
        private void HandleCanvasContextClick(object sender, PointerGraphicalElementEventArgs e)
        {
            TestableEditorElements.DisplayContextMenu(new List <TestableEditorElements.MenuOption>
            {
                new TestableEditorElements.MenuItem(new GUIContent("Add step"), false, () =>
                {
                    IStep step = new Step("New Step");
                    step.StepMetadata.Position = e.PointerPosition;

                    RevertableChangesHandler.Do(new TrainingCommand(() =>
                    {
                        AddStep(step);
                        chapter.ChapterMetadata.LastSelectedStep = step;
                    },
                                                                    () =>
                    {
                        DeleteStep(step);
                    }
                                                                    ));
                })
            });
        }
Esempio n. 5
0
        private StepNode CreateNewStepNode(IStep step)
        {
            StepNode node = new StepNode(Graphics, step);

            node.GraphicalEventHandler.ContextClick += (sender, args) =>
            {
                TestableEditorElements.DisplayContextMenu(new List <TestableEditorElements.MenuOption>
                {
                    new TestableEditorElements.MenuItem(new GUIContent("Delete step"), false, () =>
                    {
                        IList <ITransition> incomingTransitions = chapter.Data.Steps.SelectMany(s => s.Data.Transitions.Data.Transitions).Where(transition => transition.Data.TargetStep == step).ToList();

                        bool wasFirstStep = step == chapter.Data.FirstStep;

                        RevertableChangesHandler.Do(new TrainingCommand(
                                                        () =>
                        {
                            foreach (ITransition transition in incomingTransitions)
                            {
                                transition.Data.TargetStep = null;
                            }

                            DeleteStep(step);

                            if (wasFirstStep)
                            {
                                chapter.Data.FirstStep = null;
                            }
                        },
                                                        () =>
                        {
                            AddStep(step);

                            if (wasFirstStep)
                            {
                                chapter.Data.FirstStep = step;
                            }

                            foreach (ITransition transition in incomingTransitions)
                            {
                                transition.Data.TargetStep = step;
                            }

                            UserSelectStepNode(node);
                        }
                                                        ));
                    })
                });
            };

            node.GraphicalEventHandler.PointerDown += (sender, args) =>
            {
                UserSelectStepNode(node);
            };

            node.RelativePositionChanged += (sender, args) =>
            {
                node.Step.StepMetadata.Position = node.Position;
            };

            node.GraphicalEventHandler.PointerUp += (sender, args) =>
            {
                Graphics.CalculateBoundingBox();
            };

            // ReSharper disable once ImplicitlyCapturedClosure
            node.GraphicalEventHandler.PointerDown += (sender, args) => UserSelectStepNode(node);

            node.CreateTransitionButton.GraphicalEventHandler.PointerClick += (sender, args) =>
            {
                ITransition transition = new Transition();

                RevertableChangesHandler.Do(new TrainingCommand(
                                                () =>
                {
                    step.Data.Transitions.Data.Transitions.Add(transition);
                    MarkToRefresh();
                },
                                                () =>
                {
                    step.Data.Transitions.Data.Transitions.Remove(transition);
                    MarkToRefresh();
                }
                                                ));
            };

            if (chapter.ChapterMetadata.LastSelectedStep == step)
            {
                SelectStepNode(node);
            }

            SetupNode(node, position => node.Step.StepMetadata.Position = position);

            return(node);
        }
Esempio n. 6
0
        private void SetupTransitions(IChapter chapter, EntryNode entryNode, IDictionary <IStep, StepNode> stepNodes)
        {
            if (chapter.Data.FirstStep != null)
            {
                CreateNewTransition(entryNode.ExitJoints.First(), stepNodes[chapter.Data.FirstStep].EntryJoints.First());
            }

            foreach (IStep step in stepNodes.Keys)
            {
                foreach (ITransition transition in step.Data.Transitions.Data.Transitions)
                {
                    ExitJoint joint = stepNodes[step].AddExitJoint();
                    if (transition.Data.TargetStep != null)
                    {
                        StepNode target = stepNodes[transition.Data.TargetStep];
                        CreateNewTransition(joint, target.EntryJoints.First());
                    }

                    IStep       closuredStep       = step;
                    ITransition closuredTransition = transition;
                    int         transitionIndex    = step.Data.Transitions.Data.Transitions.IndexOf(closuredTransition);

                    joint.GraphicalEventHandler.PointerDrag += (sender, args) =>
                    {
                        joint.DragDelta = args.PointerPosition - joint.Position;
                    };

                    joint.GraphicalEventHandler.PointerUp += (sender, args) =>
                    {
                        GraphicalElement elementUnderCursor = Graphics.GetGraphicalElementWithHandlerAtPoint(args.PointerPosition).FirstOrDefault();

                        EntryJoint endJoint = elementUnderCursor as EntryJoint;

                        if (endJoint == null)
                        {
                            joint.DragDelta = Vector2.zero;

                            if (elementUnderCursor != null)
                            {
                                return;
                            }
                        }

                        StepNode endJointStepNode = endJoint == null ? null : endJoint.Parent as StepNode;

                        IStep targetStep = null;
                        IStep oldStep    = closuredTransition.Data.TargetStep;

                        if (endJointStepNode != null)
                        {
                            targetStep = endJointStepNode.Step;
                        }

                        RevertableChangesHandler.Do(new TrainingCommand(() =>
                        {
                            closuredTransition.Data.TargetStep = targetStep;
                            SelectStepNode(stepNodes[closuredStep]);
                            MarkToRefresh();
                        },
                                                                        () =>
                        {
                            closuredTransition.Data.TargetStep = oldStep;
                            SelectStepNode(stepNodes[closuredStep]);
                            MarkToRefresh();
                        }
                                                                        ));

                        joint.DragDelta = Vector2.zero;
                    };

                    joint.GraphicalEventHandler.ContextClick += (sender, args) =>
                    {
                        TestableEditorElements.DisplayContextMenu(new List <TestableEditorElements.MenuOption>
                        {
                            new TestableEditorElements.MenuItem(new GUIContent("Delete transition"), false, () =>
                            {
                                RevertableChangesHandler.Do(new TrainingCommand(() =>
                                {
                                    closuredStep.Data.Transitions.Data.Transitions.Remove(closuredTransition);
                                    MarkToRefresh();
                                },
                                                                                () =>
                                {
                                    closuredStep.Data.Transitions.Data.Transitions.Insert(transitionIndex, closuredTransition);
                                    MarkToRefresh();
                                }
                                                                                ));
                            })
                        });
                    };
                }
            }
        }
Esempio n. 7
0
        private EntryNode CreateEntryNode(IChapter chapter)
        {
            EntryNode entryNode = new EntryNode(Graphics);

            ExitJoint joint = new ExitJoint(Graphics, entryNode)
            {
                RelativePosition = new Vector2(entryNode.LocalBoundingBox.xMax, entryNode.LocalBoundingBox.center.y),
            };

            entryNode.ExitJoints.Add(joint);

            entryNode.Position = chapter.ChapterMetadata.EntryNodePosition;

            entryNode.RelativePositionChanged += (sender, args) =>
            {
                chapter.ChapterMetadata.EntryNodePosition = entryNode.Position;
            };

            entryNode.GraphicalEventHandler.PointerUp += (sender, args) =>
            {
                Graphics.CalculateBoundingBox();
            };

            entryNode.GraphicalEventHandler.ContextClick += (sender, args) =>
            {
                if (chapter.Data.FirstStep == null)
                {
                    return;
                }

                TestableEditorElements.DisplayContextMenu(new List <TestableEditorElements.MenuOption>
                {
                    new TestableEditorElements.MenuItem(new GUIContent("Delete transition"), false, () =>
                    {
                        IStep firstStep = chapter.Data.FirstStep;

                        RevertableChangesHandler.Do(new TrainingCommand(() =>
                        {
                            chapter.Data.FirstStep = null;
                            MarkToRefresh();
                        },
                                                                        () =>
                        {
                            chapter.Data.FirstStep = firstStep;
                            MarkToRefresh();
                        }
                                                                        ));
                    })
                });
            };

            joint.GraphicalEventHandler.PointerDrag += (sender, args) =>
            {
                joint.DragDelta = args.PointerPosition - joint.Position;
            };

            joint.GraphicalEventHandler.PointerUp += (sender, args) =>
            {
                EntryJoint endJoint = Graphics.GetGraphicalElementWithHandlerAtPoint(args.PointerPosition).FirstOrDefault() as EntryJoint;

                if (endJoint == null)
                {
                    joint.DragDelta = Vector2.zero;
                    return;
                }

                StepNode endJointStepNode = endJoint.Parent as StepNode;

                IStep targetStep = null;
                IStep oldStep    = chapter.Data.FirstStep;

                if (endJointStepNode != null)
                {
                    targetStep = endJointStepNode.Step;
                }

                RevertableChangesHandler.Do(new TrainingCommand(() =>
                {
                    chapter.Data.FirstStep = targetStep;
                    MarkToRefresh();
                },
                                                                () =>
                {
                    chapter.Data.FirstStep = oldStep;
                    MarkToRefresh();
                }
                                                                ));

                joint.DragDelta = Vector2.zero;
            };

            SetupNode(entryNode, position => chapter.ChapterMetadata.EntryNodePosition = position);

            return(entryNode);
        }
Esempio n. 8
0
        private void SetupTransitions(IChapter chapter, EntryNode entryNode, IDictionary <IStep, StepNode> stepNodes)
        {
            if (chapter.Data.FirstStep != null)
            {
                CreateNewTransition(entryNode.ExitJoints.First(), stepNodes[chapter.Data.FirstStep].EntryJoints.First());
            }

            foreach (IStep step in stepNodes.Keys)
            {
                foreach (ITransition transition in step.Data.Transitions.Data.Transitions)
                {
                    ExitJoint joint = stepNodes[step].AddExitJoint();
                    if (transition.Data.TargetStep != null)
                    {
                        StepNode target = stepNodes[transition.Data.TargetStep];
                        CreateNewTransition(joint, target.EntryJoints.First());
                    }

                    IStep       closuredStep       = step;
                    ITransition closuredTransition = transition;
                    int         transitionIndex    = step.Data.Transitions.Data.Transitions.IndexOf(closuredTransition);

                    joint.GraphicalEventHandler.PointerDrag += (sender, args) =>
                    {
                        joint.DragDelta = args.PointerPosition - joint.Position;
                    };

                    joint.GraphicalEventHandler.PointerUp += (sender, args) =>
                    {
                        joint.DragDelta = Vector2.zero;
                        IStep oldStep = closuredTransition.Data.TargetStep;

                        if (TryGetStepForTransitionDrag(args.PointerPosition, out IStep targetStep) == false)
                        {
                            return;
                        }

                        RevertableChangesHandler.Do(new CourseCommand(() =>
                        {
                            closuredTransition.Data.TargetStep = targetStep;
                            SelectStepNode(stepNodes[closuredStep]);
                            MarkToRefresh();
                        },
                                                                      () =>
                        {
                            closuredTransition.Data.TargetStep = oldStep;
                            SelectStepNode(stepNodes[closuredStep]);
                            MarkToRefresh();
                        }
                                                                      ));
                    };

                    joint.GraphicalEventHandler.ContextClick += (sender, args) =>
                    {
                        TestableEditorElements.DisplayContextMenu(new List <TestableEditorElements.MenuOption>
                        {
                            new TestableEditorElements.MenuItem(new GUIContent("Delete transition"), false, () =>
                            {
                                bool isLast = closuredStep.Data.Transitions.Data.Transitions.Count == 1;
                                RevertableChangesHandler.Do(new CourseCommand(() =>
                                {
                                    closuredStep.Data.Transitions.Data.Transitions.Remove(closuredTransition);
                                    if (isLast)
                                    {
                                        closuredStep.Data.Transitions.Data.Transitions.Add(EntityFactory.CreateTransition());
                                    }

                                    MarkToRefresh();
                                },
                                                                              () =>
                                {
                                    if (isLast)
                                    {
                                        closuredStep.Data.Transitions.Data.Transitions.RemoveAt(0);
                                    }

                                    closuredStep.Data.Transitions.Data.Transitions.Insert(transitionIndex, closuredTransition);
                                    MarkToRefresh();
                                }
                                                                              ));
                            })
                        });
                    };
                }
            }
        }
Esempio n. 9
0
        private EntryNode CreateEntryNode(IChapter chapter)
        {
            EntryNode entryNode = new EntryNode(Graphics);

            entryNode.IsDragging = false;

            ExitJoint joint = new ExitJoint(Graphics, entryNode)
            {
                RelativePosition = new Vector2(entryNode.LocalBoundingBox.xMax, entryNode.LocalBoundingBox.center.y),
            };

            entryNode.ExitJoints.Add(joint);

            entryNode.Position = chapter.ChapterMetadata.EntryNodePosition;

            entryNode.RelativePositionChanged += (sender, args) =>
            {
                chapter.ChapterMetadata.EntryNodePosition = entryNode.Position;
            };

            entryNode.GraphicalEventHandler.PointerUp += (sender, args) =>
            {
                entryNode.IsDragging = false;
                Graphics.CalculateBoundingBox();
            };

            entryNode.GraphicalEventHandler.PointerDown += (sender, args) =>
            {
                entryNode.IsDragging = true;
                Graphics.CalculateBoundingBox();
            };

            entryNode.GraphicalEventHandler.ContextClick += (sender, args) =>
            {
                if (chapter.Data.FirstStep == null)
                {
                    return;
                }

                TestableEditorElements.DisplayContextMenu(new List <TestableEditorElements.MenuOption>
                {
                    new TestableEditorElements.MenuItem(new GUIContent("Delete transition"), false, () =>
                    {
                        IStep firstStep = chapter.Data.FirstStep;

                        RevertableChangesHandler.Do(new CourseCommand(() =>
                        {
                            chapter.Data.FirstStep = null;
                            MarkToRefresh();
                        },
                                                                      () =>
                        {
                            chapter.Data.FirstStep = firstStep;
                            MarkToRefresh();
                        }
                                                                      ));
                    })
                });
            };

            joint.GraphicalEventHandler.PointerDrag += (sender, args) =>
            {
                joint.DragDelta = args.PointerPosition - joint.Position;
            };

            joint.GraphicalEventHandler.PointerUp += (sender, args) =>
            {
                joint.DragDelta = Vector2.zero;
                IStep oldStep = chapter.Data.FirstStep;

                if (TryGetStepForTransitionDrag(args.PointerPosition, out IStep target) == false)
                {
                    return;
                }

                RevertableChangesHandler.Do(new CourseCommand(() =>
                {
                    chapter.Data.FirstStep = target;
                    MarkToRefresh();
                },
                                                              () =>
                {
                    chapter.Data.FirstStep = oldStep;
                    MarkToRefresh();
                }
                                                              ));

                joint.DragDelta = Vector2.zero;
            };

            SetupNode(entryNode, position => chapter.ChapterMetadata.EntryNodePosition = position);

            return(entryNode);
        }
Esempio n. 10
0
        private StepNode CreateNewStepNode(IStep step)
        {
            StepNode node = new StepNode(Graphics, CurrentChapter, step);

            node.GraphicalEventHandler.ContextClick += (sender, args) =>
            {
                TestableEditorElements.DisplayContextMenu(new List <TestableEditorElements.MenuOption>
                {
                    new TestableEditorElements.MenuItem(new GUIContent("Copy"), false, () =>
                    {
                        CopyStep(step);
                    }),
                    new TestableEditorElements.MenuItem(new GUIContent("Cut"), false, () =>
                    {
                        CutStep(step, node);
                    }),
                    new TestableEditorElements.MenuItem(new GUIContent("Delete"), false, () =>
                    {
                        DeleteStepWithUndo(step, node);
                    })
                });
            };

            node.GraphicalEventHandler.PointerDown += (sender, args) =>
            {
                UserSelectStepNode(node);
            };

            node.RelativePositionChanged += (sender, args) =>
            {
                node.Step.StepMetadata.Position = node.Position;
            };

            node.GraphicalEventHandler.PointerUp += (sender, args) =>
            {
                Graphics.CalculateBoundingBox();
            };

            // ReSharper disable once ImplicitlyCapturedClosure
            node.GraphicalEventHandler.PointerDown += (sender, args) => UserSelectStepNode(node);

            node.CreateTransitionButton.GraphicalEventHandler.PointerClick += (sender, args) =>
            {
                ITransition transition = EntityFactory.CreateTransition();

                RevertableChangesHandler.Do(new CourseCommand(
                                                () =>
                {
                    step.Data.Transitions.Data.Transitions.Add(transition);
                    MarkToRefresh();
                },
                                                () =>
                {
                    step.Data.Transitions.Data.Transitions.Remove(transition);
                    MarkToRefresh();
                }
                                                ));
            };

            if (CurrentChapter.ChapterMetadata.LastSelectedStep == step)
            {
                SelectStepNode(node);
            }

            SetupNode(node, position => node.Step.StepMetadata.Position = position);

            return(node);
        }