diff --git a/Applications/Sigma/Sigma/InteractionModels/Diamond/DiamondDialogStates.cs b/Applications/Sigma/Sigma/InteractionModels/Diamond/DiamondDialogStates.cs index 06f1bf09a..26b6758b7 100644 --- a/Applications/Sigma/Sigma/InteractionModels/Diamond/DiamondDialogStates.cs +++ b/Applications/Sigma/Sigma/InteractionModels/Diamond/DiamondDialogStates.cs @@ -71,8 +71,8 @@ public override IEnumerable GetNextDialogActions(IInputEvent input { if (speechRecognitionInputEvent.SpeechRecognitionResult.Contains("ready")) { - yield return DialogAction.Execute(interactionModel.StartTask); - yield return DialogAction.Execute(interactionModel.ContinueWithSelectedStep); + var isKnownTask = interactionModel.TryGetKnownTask(); + yield return DialogAction.Execute(interactionModel.BeginTask(isKnownTask)); } else { @@ -129,104 +129,8 @@ public override IEnumerable GetNextDialogActions(IInputEvent input // Move to a glanceable position yield return DialogAction.Execute(interactionModel.MoveToGlanceablePosition); - if (interactionModel.Configuration.TaskGenerationPolicy == TaskGenerationPolicy.FromLibraryOnly) - { - if (isKnownTask) - { - yield return DialogAction.Execute(interactionModel.StartTask); - yield return DialogAction.Execute(interactionModel.ContinueWithSelectedStep); - } - else - { - yield return DialogAction.Speak("I'm sorry but I don't know how to help with this task."); - yield return DialogAction.Speak("Is there anything else you'd like to do today?"); - yield return DialogAction.ContinueWith(noSpeechSynthesis: true); - } - } - else if (interactionModel.Configuration.TaskGenerationPolicy == TaskGenerationPolicy.FromLibraryOrLLMGenerate) - { - if (isKnownTask) - { - yield return DialogAction.Execute(interactionModel.StartTask); - yield return DialogAction.Execute(interactionModel.ContinueWithSelectedStep); - } - else - { - // O/w if we are setup to ask context questions - if (interactionModel.Configuration.AskContextQuestionsBeforeGeneratingTask) - { - // Get the context questions - yield return DialogAction.Execute(interactionModel.GetContextQuestions); - if (interactionModel.InteractionState.ContextQuestions == null) - { - yield return DialogAction.Speak("I'm sorry but I don't think I can actually help with this task."); - yield return DialogAction.Speak("Is there anything else you'd like to do today?"); - yield return DialogAction.ContinueWith(noSpeechSynthesis: true); - } - else - { - yield return DialogAction.Speak("First, a couple of quick questions."); - yield return DialogAction.ContinueWith(); - } - } - else - { - // Generate the task - yield return DialogAction.Execute(interactionModel.GenerateTask); - if (interactionModel.InteractionState.Task == null) - { - yield return DialogAction.Speak("I'm sorry but I don't think I can actually help with this task."); - yield return DialogAction.Speak("Is there anything else you'd like to do today?"); - yield return DialogAction.ContinueWith(noSpeechSynthesis: true); - } - else - { - yield return DialogAction.Execute(interactionModel.StartTask); - yield return DialogAction.Execute(interactionModel.ContinueWithSelectedStep); - } - } - } - } - else if (interactionModel.Configuration.TaskGenerationPolicy == TaskGenerationPolicy.AlwaysLLMGenerate) - { - // O/w if we are setup to ask context questions - if (interactionModel.Configuration.AskContextQuestionsBeforeGeneratingTask) - { - // Get the context questions - yield return DialogAction.Execute(interactionModel.GetContextQuestions); - if (interactionModel.InteractionState.ContextQuestions == null) - { - yield return DialogAction.Speak("I'm sorry but I don't think I can actually help with this task."); - yield return DialogAction.Speak("Is there anything else you'd like to do today?"); - yield return DialogAction.ContinueWith(noSpeechSynthesis: true); - } - else - { - yield return DialogAction.Speak("First, a couple of quick questions."); - yield return DialogAction.ContinueWith(); - } - } - else - { - // Generate the task - yield return DialogAction.Execute(interactionModel.GenerateTask); - if (interactionModel.InteractionState.Task == null) - { - yield return DialogAction.Speak("I'm sorry but I don't think I can actually help with this task."); - yield return DialogAction.Speak("Is there anything else you'd like to do today?"); - yield return DialogAction.ContinueWith(noSpeechSynthesis: true); - } - else - { - yield return DialogAction.Execute(interactionModel.StartTask); - yield return DialogAction.Execute(interactionModel.ContinueWithSelectedStep); - } - } - } - else - { - throw new System.Exception("Unexpected GuidanceTaskGenerationPolicy."); - } + // And begin the task + yield return DialogAction.Execute(interactionModel.BeginTask(isKnownTask)); } else if (interactionModel.InteractionState.TopLevelIntent == "list") { diff --git a/Applications/Sigma/Sigma/InteractionModels/Diamond/DiamondInteractionModel.cs b/Applications/Sigma/Sigma/InteractionModels/Diamond/DiamondInteractionModel.cs index 6c5baa06d..1f8b8cf5c 100644 --- a/Applications/Sigma/Sigma/InteractionModels/Diamond/DiamondInteractionModel.cs +++ b/Applications/Sigma/Sigma/InteractionModels/Diamond/DiamondInteractionModel.cs @@ -5,6 +5,7 @@ namespace Sigma.Diamond { using System; using System.Collections.Generic; + using static Sigma.Diamond.DiamondDialogStates; /// /// Represents the interaction model for the Diamond version of the Sigma app. @@ -17,6 +18,114 @@ public class DiamondInteractionModel : SigmaInteractionModel< DiamondUserInterfaceState, DiamondUserInterfaceCommands> { + /// + /// Begins the task. + /// + /// Indicates whether this is a known (library) task. + /// The set of corresponding dialog actions. + /// An exception is thrown if the task generation policy is unknown. + public virtual IEnumerable BeginTask(bool isKnownTask) + { + if (this.Configuration.TaskGenerationPolicy == TaskGenerationPolicy.FromLibraryOnly) + { + if (isKnownTask) + { + yield return DialogAction.Execute(this.StartTask); + yield return DialogAction.Execute(this.ContinueWithSelectedStep); + } + else + { + yield return DialogAction.Speak("I'm sorry but I don't know how to help with this task."); + yield return DialogAction.Speak("Is there anything else you'd like to do today?"); + yield return DialogAction.ContinueWith(noSpeechSynthesis: true); + } + } + else if (this.Configuration.TaskGenerationPolicy == TaskGenerationPolicy.FromLibraryOrLLMGenerate) + { + if (isKnownTask) + { + yield return DialogAction.Execute(this.StartTask); + yield return DialogAction.Execute(this.ContinueWithSelectedStep); + } + else + { + // O/w if we are setup to ask context questions + if (this.Configuration.AskContextQuestionsBeforeGeneratingTask) + { + // Get the context questions + yield return DialogAction.Execute(this.GetContextQuestions); + if (this.InteractionState.ContextQuestions == null) + { + yield return DialogAction.Speak("I'm sorry but I don't think I can actually help with this task."); + yield return DialogAction.Speak("Is there anything else you'd like to do today?"); + yield return DialogAction.ContinueWith(noSpeechSynthesis: true); + } + else + { + yield return DialogAction.Speak("First, a couple of quick questions."); + yield return DialogAction.ContinueWith(); + } + } + else + { + // Generate the task + yield return DialogAction.Execute(this.GenerateTask); + if (this.InteractionState.Task == null) + { + yield return DialogAction.Speak("I'm sorry but I don't think I can actually help with this task."); + yield return DialogAction.Speak("Is there anything else you'd like to do today?"); + yield return DialogAction.ContinueWith(noSpeechSynthesis: true); + } + else + { + yield return DialogAction.Execute(this.StartTask); + yield return DialogAction.Execute(this.ContinueWithSelectedStep); + } + } + } + } + else if (this.Configuration.TaskGenerationPolicy == TaskGenerationPolicy.AlwaysLLMGenerate) + { + // O/w if we are setup to ask context questions + if (this.Configuration.AskContextQuestionsBeforeGeneratingTask) + { + // Get the context questions + yield return DialogAction.Execute(this.GetContextQuestions); + if (this.InteractionState.ContextQuestions == null) + { + yield return DialogAction.Speak("I'm sorry but I don't think I can actually help with this task."); + yield return DialogAction.Speak("Is there anything else you'd like to do today?"); + yield return DialogAction.ContinueWith(noSpeechSynthesis: true); + } + else + { + yield return DialogAction.Speak("First, a couple of quick questions."); + yield return DialogAction.ContinueWith(); + } + } + else + { + // Generate the task + yield return DialogAction.Execute(this.GenerateTask); + if (this.InteractionState.Task == null) + { + yield return DialogAction.Speak("I'm sorry but I don't think I can actually help with this task."); + yield return DialogAction.Speak("Is there anything else you'd like to do today?"); + yield return DialogAction.ContinueWith(noSpeechSynthesis: true); + } + else + { + yield return DialogAction.Execute(this.StartTask); + yield return DialogAction.Execute(this.ContinueWithSelectedStep); + } + } + } + else + { + throw new Exception("Unexpected TaskGenerationPolicy."); + } + } + /// /// Abandons the task. /// diff --git a/Applications/Sigma/Sigma/SigmaInteractionModel.cs b/Applications/Sigma/Sigma/SigmaInteractionModel.cs index 148178f3a..82db7f5a9 100644 --- a/Applications/Sigma/Sigma/SigmaInteractionModel.cs +++ b/Applications/Sigma/Sigma/SigmaInteractionModel.cs @@ -348,6 +348,7 @@ public virtual IEnumerable GenerateTask() this.InteractionState.Task = new TTask() { Name = this.InteractionState.TaskName, + Steps = new (), }; this.InteractionState.Task.Steps.Add(new GatherStep("1", "Gather", "Objects", objects)); diff --git a/Applications/Sigma/Sigma/Task/ComplexStep.cs b/Applications/Sigma/Sigma/Task/ComplexStep.cs index c5d57df2b..b7e1f3dfa 100644 --- a/Applications/Sigma/Sigma/Task/ComplexStep.cs +++ b/Applications/Sigma/Sigma/Task/ComplexStep.cs @@ -53,7 +53,12 @@ public ComplexStep(string label, string description) public override string GetSpokenInstructions() => this.Description.TrimEnd('.'); /// - public override StepPanel UpdateStepPanel(StepPanel stepPanel, TaskPanelUserInterfaceCommand taskPanelUserInterfaceCommand, TaskPanelUserInterfaceConfiguration taskPanelUserInterfaceConfiguration, string name) + public override StepPanel UpdateStepPanel( + StepPanel stepPanel, + TaskPanelUserInterfaceCommand taskPanelUserInterfaceCommand, + TaskPanelUserInterfaceConfiguration taskPanelUserInterfaceConfiguration, + float maxHeight, + string name) { // If it's a complex step panel, update var showObjectsChecklist = new List<(string Name, bool Checked, bool Highlight)>(); @@ -78,12 +83,14 @@ public override StepPanel UpdateStepPanel(StepPanel stepPanel, TaskPanelUserInte taskPanelUserInterfaceConfiguration.ComplexStepTaughtObjectTextStyle, taskPanelUserInterfaceConfiguration.SelectionColor, name); + complexStepPanel.Update( this.Label, this.GetDisplayInstructions(), taskPanelUserInterfaceCommand.SelectedSubStepIndex, showObjectsChecklist, - subSteps); + subSteps, + maxHeight); return complexStepPanel; } diff --git a/Applications/Sigma/Sigma/Task/DoStep.cs b/Applications/Sigma/Sigma/Task/DoStep.cs index cb49f83d8..41831c9fd 100644 --- a/Applications/Sigma/Sigma/Task/DoStep.cs +++ b/Applications/Sigma/Sigma/Task/DoStep.cs @@ -64,7 +64,12 @@ public DoStep(string label, string description, TimeSpan timerDuration) public override string GetDisplayInstructions() => this.Description.TrimEnd('.'); /// - public override StepPanel UpdateStepPanel(StepPanel stepPanel, TaskPanelUserInterfaceCommand taskPanelUserInterfaceCommand, TaskPanelUserInterfaceConfiguration taskPanelUserInterfaceConfiguration, string name) + public override StepPanel UpdateStepPanel( + StepPanel stepPanel, + TaskPanelUserInterfaceCommand taskPanelUserInterfaceComman, + TaskPanelUserInterfaceConfiguration taskPanelUserInterfaceConfiguration, + float maxHeight, + string name) { var doStepPanel = stepPanel as DoStepPanel ?? new DoStepPanel( taskPanelUserInterfaceConfiguration.Width, diff --git a/Applications/Sigma/Sigma/Task/GatherStep.cs b/Applications/Sigma/Sigma/Task/GatherStep.cs index 1009a0bb6..a93897170 100644 --- a/Applications/Sigma/Sigma/Task/GatherStep.cs +++ b/Applications/Sigma/Sigma/Task/GatherStep.cs @@ -62,7 +62,12 @@ public GatherStep(string label, string verb, string noun, List objects) public override string GetDisplayInstructions() => $"{this.Noun}:"; /// - public override StepPanel UpdateStepPanel(StepPanel stepPanel, TaskPanelUserInterfaceCommand taskPanelUserInterfaceCommand, TaskPanelUserInterfaceConfiguration taskPanelUserInterfaceConfiguration, string name) + public override StepPanel UpdateStepPanel( + StepPanel stepPanel, + TaskPanelUserInterfaceCommand taskPanelUserInterfaceCommand, + TaskPanelUserInterfaceConfiguration taskPanelUserInterfaceConfiguration, + float maxHeigth, + string name) { var gatherStepPanel = (stepPanel as GatherStepPanel) ?? new GatherStepPanel( taskPanelUserInterfaceConfiguration.Width, diff --git a/Applications/Sigma/Sigma/Task/Step.cs b/Applications/Sigma/Sigma/Task/Step.cs index 37ad8ba69..dd6003805 100644 --- a/Applications/Sigma/Sigma/Task/Step.cs +++ b/Applications/Sigma/Sigma/Task/Step.cs @@ -36,9 +36,15 @@ public Step() /// The step panel to update. /// The task panel user interface command. /// The task panel configuration options. + /// The maximum height for the step panel user interface. /// The name for the user interface. /// The user interface for the step. - public virtual StepPanel UpdateStepPanel(StepPanel stepPanel, TaskPanelUserInterfaceCommand taskPanelUserInterfaceCommand, TaskPanelUserInterfaceConfiguration taskPanelUserInterfaceConfiguration, string name) + public virtual StepPanel UpdateStepPanel( + StepPanel stepPanel, + TaskPanelUserInterfaceCommand taskPanelUserInterfaceCommand, + TaskPanelUserInterfaceConfiguration taskPanelUserInterfaceConfiguration, + float maxHeight, + string name) => stepPanel; /// diff --git a/Applications/Sigma/Sigma/UserInterface/ComplexStepPanel.cs b/Applications/Sigma/Sigma/UserInterface/ComplexStepPanel.cs index 97dbccfaf..2124db432 100644 --- a/Applications/Sigma/Sigma/UserInterface/ComplexStepPanel.cs +++ b/Applications/Sigma/Sigma/UserInterface/ComplexStepPanel.cs @@ -35,6 +35,9 @@ internal class ComplexStepPanel : StepPanel private string instructions; private int? selectedSubStepIndex = null; + private int topSubStepPanelIndex = 0; + private int bottomSubStepPanelIndex = 0; + /// /// Initializes a new instance of the class. /// @@ -77,12 +80,14 @@ internal class ComplexStepPanel : StepPanel /// The selected substep index. /// The objects checklist. /// The substeps for the complex step. + /// The maximum height for the complex step panel. public void Update( string label, string instructions, int? selectedSubStepIndex, List<(string Name, bool Check, bool Highlight)> objectsChecklist, - List<(string Label, string Description)> subSteps) + List<(string Label, string Description)> subSteps, + float maxHeight) { // Get the corresponding step, step index and instructions this.label = label; @@ -100,7 +105,7 @@ internal class ComplexStepPanel : StepPanel var offsetV = this.instructionsParagraph.Height; - if (objectsChecklist.Any()) + if (objectsChecklist.Count != 0) { this.physicalObjectsParagraphs.Update( Enumerable.Range(0, objectsChecklist.Count), @@ -123,8 +128,10 @@ internal class ComplexStepPanel : StepPanel this.subStepPanels.Clear(); } - else if (subSteps.Any()) + else if (subSteps.Count != 0) { + this.physicalObjectsParagraphs.Clear(); + this.selectedSubStepIndex = selectedSubStepIndex; // Update the collection of sub-step panels @@ -136,15 +143,47 @@ internal class ComplexStepPanel : StepPanel if (this.subStepPanels.Count > 0) { offsetV += this.padding; - } - for (int i = 0; i < this.subStepPanels.Count; i++) - { - this.subStepPanels[i].Update(subSteps[i].Label, subSteps[i].Description); - offsetV += this.subStepPanels[i].Height; + // If we have a selection + if (this.selectedSubStepIndex.HasValue) + { + // Recompute the topSubStepIndex so that the selected sub-step and the next sub-step are in view. + if (this.topSubStepPanelIndex > this.selectedSubStepIndex.Value) + { + this.topSubStepPanelIndex = this.selectedSubStepIndex.Value; + } + else + { + // Compute the vertical offsets for all panels starting with the top panel + // index + var verticalEndPoint = new Dictionary(); + var v = offsetV; + for (int i = this.topSubStepPanelIndex; i < this.subStepPanels.Count; i++) + { + v += this.subStepPanels[i].Height; + verticalEndPoint[i] = v; + } + + var selectedStepVerticalEndPoint = verticalEndPoint[this.selectedSubStepIndex.Value]; + var nextStepVerticalEndPoint = this.selectedSubStepIndex.Value < this.subStepPanels.Count - 1 ? verticalEndPoint[this.selectedSubStepIndex.Value + 1] : 0; + if (selectedStepVerticalEndPoint > maxHeight || nextStepVerticalEndPoint > maxHeight) + { + this.topSubStepPanelIndex = this.selectedSubStepIndex.Value; + } + } + + // Compute the bottom substep panel index + for (int i = this.topSubStepPanelIndex; + (i < this.subStepPanels.Count && i == this.topSubStepPanelIndex) || + (i < this.subStepPanels.Count && offsetV + this.subStepPanels[i].Height <= maxHeight); + i++) + { + this.bottomSubStepPanelIndex = i; + this.subStepPanels[i].Update(subSteps[i].Label, subSteps[i].Description); + offsetV += this.subStepPanels[i].Height; + } + } } - - this.physicalObjectsParagraphs.Clear(); } else { @@ -182,37 +221,38 @@ public override List Render(Renderer renderer, Co offsetV += this.physicalObjectsParagraphs[i].Height; } - // Finally, draw the steps. Draw at least one step and draw as long as we're not beyond the panel - var hasSelection = false; - var selectionOffsetV = 0f; - var selectionHeight = 0f; - + // Finally, draw the substeps if (this.subStepPanels.Count > 0) { offsetV += this.padding; - } - for (int i = 0; i < this.subStepPanels.Count; ++i) - { - // Draw the step - this.subStepPanels[i].Render(renderer, pose.ApplyUV(this.padding + this.labelCircle.Radius * 2 + this.padding, offsetV)); - offsetV += this.subStepPanels[i].Height; + // Finally, draw the steps. Draw at least one step and draw as long as we're not beyond the panel + var hasSelection = false; + var selectionOffsetV = 0f; + var selectionHeight = 0f; - // If this is the selected step - if (this.selectedSubStepIndex.HasValue && this.selectedSubStepIndex.Value == i) + for (int i = this.topSubStepPanelIndex; i <= this.bottomSubStepPanelIndex; i++) { - hasSelection = true; - selectionOffsetV = offsetV - this.subStepPanels[i].Height; - selectionHeight = this.subStepPanels[i].Height; + // Draw the step + this.subStepPanels[i].Render(renderer, pose.ApplyUV(this.padding + this.labelCircle.Radius * 2 + this.padding, offsetV)); + offsetV += this.subStepPanels[i].Height; + + // If this is the selected sub-step + if (this.selectedSubStepIndex.HasValue && this.selectedSubStepIndex.Value == i) + { + hasSelection = true; + selectionOffsetV = offsetV - this.subStepPanels[i].Height; + selectionHeight = this.subStepPanels[i].Height; + } } - } - // Now if we have a selection to render - if (hasSelection) - { - var selectionMeshPose = new CoordinateSystem(new Point3D(0, 0, -selectionOffsetV), UnitVector3D.XAxis, UnitVector3D.YAxis, UnitVector3D.ZAxis).TransformBy(pose); - var selectionMesh = this.GetOrCreateSelectionMesh(renderer, selectionHeight); - renderer.RenderMesh(selectionMeshPose, selectionMesh, this.selectionMeshMaterial); + // Now if we have a selection to render + if (hasSelection) + { + var selectionMeshPose = new CoordinateSystem(new Point3D(0, 0, -selectionOffsetV), UnitVector3D.XAxis, UnitVector3D.YAxis, UnitVector3D.ZAxis).TransformBy(pose); + var selectionMesh = this.GetOrCreateSelectionMesh(renderer, selectionHeight); + renderer.RenderMesh(selectionMeshPose, selectionMesh, this.selectionMeshMaterial); + } } return this.GetUserInterfaceState(pose); @@ -220,24 +260,25 @@ public override List Render(Renderer renderer, Co private Mesh GetOrCreateSelectionMesh(Renderer renderer, float height) { - if (!this.selectionMeshes.ContainsKey(height)) + if (!this.selectionMeshes.TryGetValue(height, out Mesh value)) { // Create the selection mesh var selectionMeshCorners = new List() { - new Point3D(-0.002f, 0, 0), - new Point3D(-0.002f, 0, -height), - new Point3D(-0.002f, this.Width, -height), - new Point3D(-0.002f, this.Width, 0), + new (-0.002f, 0, 0), + new (-0.002f, 0, -height), + new (-0.002f, this.Width, -height), + new (-0.002f, this.Width, 0), }; var indices = new List() { 0, 1, 2, 0, 2, 3 }; var selectionMesh = renderer.CreateMesh(selectionMeshCorners, indices); - this.selectionMeshes.Add(height, selectionMesh); + value = selectionMesh; + this.selectionMeshes.Add(height, value); } this.selectionMeshMaterial ??= renderer.GetOrCreateMaterial(this.selectionColor); - return this.selectionMeshes[height]; + return value; } } } diff --git a/Applications/Sigma/Sigma/UserInterface/TaskPanelUserInterface.cs b/Applications/Sigma/Sigma/UserInterface/TaskPanelUserInterface.cs index db3f5d86a..57ccc1a67 100644 --- a/Applications/Sigma/Sigma/UserInterface/TaskPanelUserInterface.cs +++ b/Applications/Sigma/Sigma/UserInterface/TaskPanelUserInterface.cs @@ -82,7 +82,7 @@ public TaskPanelUserInterface(TaskPanelUserInterfaceConfiguration configuration, /// The task library. public void Initialize(TaskLibrary taskLibrary) { - this.taskList = taskLibrary.Tasks.Select(t => t.Name).ToList(); + this.taskList = taskLibrary.Tasks?.Select(t => t.Name)?.ToList(); } /// @@ -142,12 +142,22 @@ public void Update(TaskPanelUserInterfaceCommand taskPanelCommand) // Update the collection of step panels this.stepPanels.Update( taskPanelCommand.ShowOnlySelectedStep ? new int[] { taskPanelCommand.SelectedStepIndex.Value } : Enumerable.Range(0, taskPanelCommand.Task.Steps.Count), - createKey: i => taskPanelCommand.Task.Steps[i].UpdateStepPanel(null, taskPanelCommand, this.configuration, $"{this.Name}.Step[{i}]")); + createKey: i => taskPanelCommand.Task.Steps[i].UpdateStepPanel( + null, + taskPanelCommand, + this.configuration, + this.configuration.Height - this.taskNameParagraph.Height - this.configuration.Padding, + $"{this.Name}.Step[{i}]")); // Now perform an update on each of the panels foreach (var i in this.stepPanels.Keys.ToList()) { - this.stepPanels[i] = taskPanelCommand.Task.Steps[i].UpdateStepPanel(this.stepPanels[i], taskPanelCommand, this.configuration, $"{this.Name}.Step[{i}]"); + this.stepPanels[i] = taskPanelCommand.Task.Steps[i].UpdateStepPanel( + this.stepPanels[i], + taskPanelCommand, + this.configuration, + this.configuration.Height - this.taskNameParagraph.Height - this.configuration.Padding, + $"{this.Name}.Step[{i}]"); } } } @@ -239,7 +249,7 @@ public override List Render(Renderer renderer, Co // Finally, draw the steps. Draw at least one step and draw as long as we're not beyond the panel for (int i = this.topStepPanelIndex; (i < this.stepPanels.Count && i == this.topStepPanelIndex) || - (i < this.stepPanels.Count && offsetV + this.stepPanels[i].Height < this.configuration.Height); + (i < this.stepPanels.Count && offsetV + this.stepPanels[i].Height <= this.configuration.Height); i++) { // Draw the step diff --git a/Applications/Sigma/Sigma/UserInterface/TaskPanelUserInterfaceConfiguration.cs b/Applications/Sigma/Sigma/UserInterface/TaskPanelUserInterfaceConfiguration.cs index 4f927f0e3..391ee17d3 100644 --- a/Applications/Sigma/Sigma/UserInterface/TaskPanelUserInterfaceConfiguration.cs +++ b/Applications/Sigma/Sigma/UserInterface/TaskPanelUserInterfaceConfiguration.cs @@ -34,7 +34,7 @@ public class TaskPanelUserInterfaceConfiguration /// /// Gets or sets the thickness (m) of editing handle. /// - public float Height { get; set; } = 0.15f; + public float Height { get; set; } = 0.18f; /// /// Gets or sets the text style for the task name. diff --git a/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/Properties/AssemblyInfo.cs b/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/Properties/AssemblyInfo.cs index 59c02ce28..869293165 100644 --- a/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/Properties/AssemblyInfo.cs +++ b/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Reflection; @@ -12,7 +12,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("HoloLensCaptureApp")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")]