SEBWIN-320: Implemented progress animation for reset utility.
This commit is contained in:
parent
86a3e9ce3c
commit
2754cdcc56
10 changed files with 70 additions and 14 deletions
|
@ -26,7 +26,7 @@ namespace SafeExamBrowser.ResetUtility
|
||||||
|
|
||||||
internal void BuildObjectGraph()
|
internal void BuildObjectGraph()
|
||||||
{
|
{
|
||||||
var context = new Context();
|
var context = new ProcedureContext();
|
||||||
|
|
||||||
InitializeLogging();
|
InitializeLogging();
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ namespace SafeExamBrowser.ResetUtility
|
||||||
logger?.Log($"# Application terminated at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
|
logger?.Log($"# Application terminated at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private IList<MainMenuOption> BuildMainMenu(Context context)
|
private IList<MainMenuOption> BuildMainMenu(ProcedureContext context)
|
||||||
{
|
{
|
||||||
return new List<MainMenuOption>
|
return new List<MainMenuOption>
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
{
|
{
|
||||||
private static readonly Mutex mutex = new Mutex(true, "safe_exam_browser_reset_mutex");
|
private static readonly Mutex mutex = new Mutex(true, "safe_exam_browser_reset_mutex");
|
||||||
|
|
||||||
public Initialization(Context context) : base(context)
|
public Initialization(ProcedureContext context) : base(context)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
{
|
{
|
||||||
internal class Log : ProcedureStep
|
internal class Log : ProcedureStep
|
||||||
{
|
{
|
||||||
public Log(Context context) : base(context)
|
public Log(ProcedureContext context) : base(context)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
{
|
{
|
||||||
internal class MainMenu : ProcedureStep
|
internal class MainMenu : ProcedureStep
|
||||||
{
|
{
|
||||||
public MainMenu(Context context) : base(context)
|
public MainMenu(ProcedureContext context) : base(context)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,11 +10,10 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using SafeExamBrowser.Contracts.Lockdown;
|
using SafeExamBrowser.Contracts.Lockdown;
|
||||||
using SafeExamBrowser.Contracts.Logging;
|
using SafeExamBrowser.Contracts.Logging;
|
||||||
using SafeExamBrowser.ResetUtility.Procedure;
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.ResetUtility
|
namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
{
|
{
|
||||||
internal class Context
|
internal class ProcedureContext
|
||||||
{
|
{
|
||||||
internal Func<string, IFeatureConfigurationBackup> CreateBackup { get; set; }
|
internal Func<string, IFeatureConfigurationBackup> CreateBackup { get; set; }
|
||||||
internal ILogger Logger { get; set; }
|
internal ILogger Logger { get; set; }
|
|
@ -9,18 +9,23 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using SafeExamBrowser.Contracts.Logging;
|
using SafeExamBrowser.Contracts.Logging;
|
||||||
|
|
||||||
namespace SafeExamBrowser.ResetUtility.Procedure
|
namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
{
|
{
|
||||||
internal abstract class ProcedureStep
|
internal abstract class ProcedureStep
|
||||||
{
|
{
|
||||||
protected Context Context { get; }
|
private CancellationTokenSource progressAnimationToken;
|
||||||
|
private Task progressAnimation;
|
||||||
|
|
||||||
|
protected ProcedureContext Context { get; }
|
||||||
protected ILogger Logger => Context.Logger;
|
protected ILogger Logger => Context.Logger;
|
||||||
protected ConsoleColor BackgroundColor => ConsoleColor.White;
|
protected ConsoleColor BackgroundColor => ConsoleColor.White;
|
||||||
protected ConsoleColor ForegroundColor => ConsoleColor.Black;
|
protected ConsoleColor ForegroundColor => ConsoleColor.Black;
|
||||||
|
|
||||||
internal ProcedureStep(Context context)
|
internal ProcedureStep(ProcedureContext context)
|
||||||
{
|
{
|
||||||
Context = context;
|
Context = context;
|
||||||
}
|
}
|
||||||
|
@ -87,6 +92,18 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
Console.Write($"[{new String('■', (int) progress)}{new String('─', (int) remaining)}] {current * 100 / total}%");
|
Console.Write($"[{new String('■', (int) progress)}{new String('─', (int) remaining)}] {current * 100 / total}%");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void StartProgressAnimation()
|
||||||
|
{
|
||||||
|
progressAnimationToken = new CancellationTokenSource();
|
||||||
|
progressAnimation = Task.Run(new Action(ProgressAnimation));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void StopProgressAnimation()
|
||||||
|
{
|
||||||
|
progressAnimationToken?.Cancel();
|
||||||
|
progressAnimation?.Wait();
|
||||||
|
}
|
||||||
|
|
||||||
private void PrintMenu(IList<MenuOption> options, int left, int top, bool showInstructions)
|
private void PrintMenu(IList<MenuOption> options, int left, int top, bool showInstructions)
|
||||||
{
|
{
|
||||||
Console.SetCursorPosition(left, top);
|
Console.SetCursorPosition(left, top);
|
||||||
|
@ -109,6 +126,43 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ProgressAnimation()
|
||||||
|
{
|
||||||
|
var length = 12;
|
||||||
|
var max = Console.BufferWidth - 8;
|
||||||
|
var min = 1;
|
||||||
|
var left = 1;
|
||||||
|
var operand = 1;
|
||||||
|
|
||||||
|
Console.Write($"[{new String('■', length)}{new String('─', max - length)}]");
|
||||||
|
|
||||||
|
while (!progressAnimationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(left, Console.CursorTop);
|
||||||
|
Console.Write(new String('─', length));
|
||||||
|
|
||||||
|
if (left + length > max)
|
||||||
|
{
|
||||||
|
operand = -1;
|
||||||
|
}
|
||||||
|
else if (left <= min)
|
||||||
|
{
|
||||||
|
operand = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
left += operand;
|
||||||
|
|
||||||
|
Console.SetCursorPosition(left, Console.CursorTop);
|
||||||
|
Console.Write(new String('■', length));
|
||||||
|
|
||||||
|
Thread.Sleep(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.SetCursorPosition(0, Console.CursorTop);
|
||||||
|
Console.WriteLine(new String(' ', Console.BufferWidth));
|
||||||
|
Console.SetCursorPosition(0, Console.CursorTop - 2);
|
||||||
|
}
|
||||||
|
|
||||||
private void SelectNextOption(ConsoleKey key, IList<MenuOption> options)
|
private void SelectNextOption(ConsoleKey key, IList<MenuOption> options)
|
||||||
{
|
{
|
||||||
var current = options.First(o => o.IsSelected);
|
var current = options.First(o => o.IsSelected);
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
{
|
{
|
||||||
internal class Reset : ProcedureStep
|
internal class Reset : ProcedureStep
|
||||||
{
|
{
|
||||||
public Reset(Context context) : base(context)
|
public Reset(ProcedureContext context) : base(context)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
{
|
{
|
||||||
private ProcedureStep next;
|
private ProcedureStep next;
|
||||||
|
|
||||||
public Restore(Context context) : base(context)
|
public Restore(ProcedureContext context) : base(context)
|
||||||
{
|
{
|
||||||
next = new MainMenu(Context);
|
next = new MainMenu(Context);
|
||||||
}
|
}
|
||||||
|
@ -67,6 +67,7 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
|
|
||||||
Logger.Info($"Found backup file '{filePath}' with {configurations.Count} items. Initiating restore procedure...");
|
Logger.Info($"Found backup file '{filePath}' with {configurations.Count} items. Initiating restore procedure...");
|
||||||
Console.WriteLine($"Found backup file with {configurations.Count} items.");
|
Console.WriteLine($"Found backup file with {configurations.Count} items.");
|
||||||
|
Console.WriteLine();
|
||||||
Console.WriteLine("Initiating restore procedure...");
|
Console.WriteLine("Initiating restore procedure...");
|
||||||
|
|
||||||
foreach (var configuration in configurations)
|
foreach (var configuration in configurations)
|
||||||
|
@ -106,7 +107,9 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
Logger.Info("Starting system configuration update...");
|
Logger.Info("Starting system configuration update...");
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
Console.WriteLine("Performing system configuration update, please wait...");
|
Console.WriteLine("Performing system configuration update, please wait...");
|
||||||
|
StartProgressAnimation();
|
||||||
Context.Update.Execute();
|
Context.Update.Execute();
|
||||||
|
StopProgressAnimation();
|
||||||
Logger.Info("Update completed.");
|
Logger.Info("Update completed.");
|
||||||
Console.WriteLine("Update completed.");
|
Console.WriteLine("Update completed.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace SafeExamBrowser.ResetUtility.Procedure
|
||||||
{
|
{
|
||||||
internal class Version : ProcedureStep
|
internal class Version : ProcedureStep
|
||||||
{
|
{
|
||||||
public Version(Context context) : base(context)
|
public Version(ProcedureContext context) : base(context)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Context.cs" />
|
<Compile Include="Procedure\ProcedureContext.cs" />
|
||||||
<Compile Include="CompositionRoot.cs" />
|
<Compile Include="CompositionRoot.cs" />
|
||||||
<Compile Include="NativeMethods.cs" />
|
<Compile Include="NativeMethods.cs" />
|
||||||
<Compile Include="Procedure\Initialization.cs" />
|
<Compile Include="Procedure\Initialization.cs" />
|
||||||
|
|
Loading…
Reference in a new issue