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); }
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); } )); }) }); }
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); }
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(); } )); }) }); }; } } }
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); }
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(); } )); }) }); }; } } }
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); }
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); }