Skip to content

Commit

Permalink
Added options to run AD to export layout to image (#365)
Browse files Browse the repository at this point in the history
  • Loading branch information
Atria1234 committed Jan 17, 2022
1 parent 9de3dac commit 0db494b
Show file tree
Hide file tree
Showing 7 changed files with 195 additions and 18 deletions.
1 change: 1 addition & 0 deletions AnnoDesigner/AnnoDesigner.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
<ProjectReference Include="..\AnnoDesigner.Core\AnnoDesigner.Core.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommandLineParser" Version="2.8.0" />
<PackageReference Include="Extended.Wpf.Toolkit" Version="3.8.2" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.31" />
Expand Down
11 changes: 2 additions & 9 deletions AnnoDesigner/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ public static string ApplicationPath
}
}

public static string FilenameArgument { get; private set; }
public static object StartupArguments { get; private set; }

/// <summary>
/// The DPI information for the current monitor.
Expand All @@ -132,14 +132,7 @@ public static string ApplicationPath

private async void Application_Startup(object sender, StartupEventArgs e)
{
// retrieve file argument if given
if (e.Args.Length > 0)
{
if (!e.Args[0].Equals(Constants.Argument_Ask_For_Admin, StringComparison.OrdinalIgnoreCase))
{
FilenameArgument = e.Args[0];
}
}
StartupArguments = ArgumentParser.Parse(e.Args);

using var mutexAnnoDesigner = new Mutex(true, MutexHelper.MUTEX_ANNO_DESIGNER, out var createdNewMutex);
//Are there other processes still running?
Expand Down
69 changes: 69 additions & 0 deletions AnnoDesigner/ArgumentParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
using System.Collections.Generic;
using CommandLine;

namespace AnnoDesigner
{
[Verb("askAdmin")]
public class AdminRestartArgs
{
public const string Arguments = "askAdmin";
}

[Verb("open")]
public class OpenArgs
{
[Value(0, HelpText = "Input AD file", Required = true)]
public string Filename { get; set; }
}

[Verb("export")]
public class ExportArgs
{
[Value(0, HelpText = "Input AD file", Required = true)]
public string Filename { get; set; }

[Value(1, HelpText = "Exported png file", Required = true)]
public string ExportedFilename { get; set; }

[Option("border", Default = 1)]
public int Border { get; set; }

[Option("gridSize", Default = 20)]
public int GridSize { get; set; }

[Option("renderGrid", Default = true)]
public bool RenderGrid { get; set; }

[Option("renderHarborBlockedArea")]
public bool RenderHarborBlockedArea { get; set; }

[Option("renderIcon", Default = true)]
public bool RenderIcon { get; set; }

[Option("renderInfluences")]
public bool RenderInfluences { get; set; }

[Option("renderLabel", Default = true)]
public bool RenderLabel { get; set; }

[Option("renderPanorama")]
public bool RenderPanorama { get; set; }

[Option("renderStatistics")]
public bool RenderStatistics { get; set; }

[Option("renderTrueInfluenceRange")]
public bool RenderTrueInfluenceRange { get; set; }

[Option("renderVersion")]
public bool RenderVersion { get; set; }
}

public static class ArgumentParser
{
public static object Parse(IEnumerable<string> arguments)
{
return Parser.Default.ParseArguments<AdminRestartArgs, OpenArgs, ExportArgs>(arguments).MapResult(x => x, _ => null);
}
}
}
5 changes: 0 additions & 5 deletions AnnoDesigner/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,6 @@ public static class Constants
/// </summary>
public const int StatisticsMargin = 142;

/// <summary>
/// Used to prevent endless loop on updates.
/// </summary>
public const string Argument_Ask_For_Admin = "-askAdmin";

/// <summary>
/// The default number of recent files to show.
/// </summary>
Expand Down
27 changes: 25 additions & 2 deletions AnnoDesigner/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
using System;
using System.ComponentModel;
using System.Configuration;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using AnnoDesigner.Core.Extensions;
using AnnoDesigner.Core.Layout;
using AnnoDesigner.Core.Models;
using AnnoDesigner.ViewModels;
using NLog;
Expand Down Expand Up @@ -80,9 +83,29 @@ private void WindowLoaded(object sender, RoutedEventArgs e)
//}

// load file given by argument
if (!string.IsNullOrEmpty(App.FilenameArgument))
if (App.StartupArguments is OpenArgs startupArgs && !string.IsNullOrEmpty(startupArgs.Filename))
{
_mainViewModel.OpenFile(App.FilenameArgument);
_mainViewModel.OpenFile(startupArgs.Filename);
}

if (App.StartupArguments is ExportArgs exportArgs && !string.IsNullOrEmpty(exportArgs.Filename) && !string.IsNullOrEmpty(exportArgs.ExportedFilename))
{
var layout = new LayoutLoader().LoadLayout(exportArgs.Filename);
_mainViewModel.PrepareCanvasForRender(layout.Objects, Enumerable.Empty<AnnoObject>(), Math.Max(exportArgs.Border, 0), new Models.CanvasRenderSetting()
{
GridSize = Math.Max(Math.Min(exportArgs.GridSize, Constants.GridStepMax), Constants.GridStepMin),
RenderGrid = exportArgs.RenderGrid,
RenderHarborBlockedArea = exportArgs.RenderHarborBlockedArea,
RenderIcon = exportArgs.RenderIcon,
RenderInfluences = exportArgs.RenderInfluences,
RenderLabel = exportArgs.RenderLabel,
RenderPanorama = exportArgs.RenderPanorama,
RenderStatistics = exportArgs.RenderStatistics,
RenderTrueInfluenceRange = exportArgs.RenderTrueInfluenceRange,
RenderVersion = exportArgs.RenderVersion
}).RenderToFile(exportArgs.ExportedFilename);

Close();
}
}

Expand Down
4 changes: 2 additions & 2 deletions AnnoDesigner/ViewModels/UpdateSettingsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ private async void ExecuteDownloadPresets(object param)
if (!_commons.CanWriteInFolder())
{
//already asked for admin rights?
if (Environment.GetCommandLineArgs().Any(x => x.Trim().Equals(Constants.Argument_Ask_For_Admin, StringComparison.OrdinalIgnoreCase)))
if (App.StartupArguments is AdminRestartArgs)
{
_messageBoxService.ShowWarning($"You have no write access to the folder.{Environment.NewLine}The update can not be installed.",
_localizationHelper.GetLocalization("Error"));
Expand All @@ -200,7 +200,7 @@ private async void ExecuteDownloadPresets(object param)
_localizationHelper.GetLocalization("AdminRightsRequired"));

_appSettings.Save();
_commons.RestartApplication(true, Constants.Argument_Ask_For_Admin, App.ExecutablePath);
_commons.RestartApplication(true, AdminRestartArgs.Arguments, App.ExecutablePath);
}

//Context is required here, do not use ConfigureAwait(false)
Expand Down
96 changes: 96 additions & 0 deletions Tests/AnnoDesigner.Tests/ArgumentParserTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;

namespace AnnoDesigner.Tests
{
public class ArgumentParserTests
{
[Fact]
public void Parse_EmptyArguments_ShouldReturnNull()
{
// Arrange/Act
var parsedArguments = ArgumentParser.Parse(Enumerable.Empty<string>());

// Assert
Assert.Null(parsedArguments);
}

[Fact]
public void Parse_UnknownVerb_ShouldReturnNull()
{
// Arrange/Act
var parsedArguments = ArgumentParser.Parse(new[] { "unknown" });

// Assert
Assert.Null(parsedArguments);
}

[Fact]
public void Parse_AskAdminVerb_ShouldReturnCorrectType()
{
// Arrange/Act
var parsedArguments = ArgumentParser.Parse(new[] { "askAdmin" });

// Assert
Assert.IsType<AdminRestartArgs>(parsedArguments);
}

[Fact]
public void Parse_OpenVerb_ShouldReturnNullIfFilenameNotSpecified()
{
// Arrange/Act
var parsedArguments = ArgumentParser.Parse(new[] { "open" });

// Assert
Assert.Null(parsedArguments);
}

[Fact]
public void Parse_OpenVerb_ShouldReturnParsedFilename()
{
// Arrange/Act
var parsedArguments = ArgumentParser.Parse(new[] { "open", "filename" });

// Assert
Assert.IsType<OpenArgs>(parsedArguments);
Assert.Equal("filename", (parsedArguments as OpenArgs).Filename);
}

[Fact]
public void Parse_ExportVerb_ShouldReturnNullIfLayoutFileNotSpecified()
{
// Arrange/Act
var parsedArguments = ArgumentParser.Parse(new[] { "export" });

// Assert
Assert.Null(parsedArguments);
}

[Fact]
public void Parse_ExportVerb_ShouldReturnNullIfOutputFileNotSpecified()
{
// Arrange/Act
var parsedArguments = ArgumentParser.Parse(new[] { "export", "filename" });

// Assert
Assert.Null(parsedArguments);
}

[Fact]
public void Parse_ExportVerb_ShouldReturnParsedValues()
{
// Arrange/Act
var parsedArguments = ArgumentParser.Parse(new[] { "export", "filename", "output", "--border", "5" });

// Assert
Assert.IsType<ExportArgs>(parsedArguments);
Assert.Equal("filename", (parsedArguments as ExportArgs).Filename);
Assert.Equal("output", (parsedArguments as ExportArgs).ExportedFilename);
Assert.Equal(5, (parsedArguments as ExportArgs).Border);
}
}
}

0 comments on commit 0db494b

Please sign in to comment.