1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Installer - Moved to Artemis-RGB/Artemis.Installer repository

This commit is contained in:
SpoinkyNL 2020-12-28 22:40:09 +01:00
parent 08fa87aac3
commit ed64c67271
40 changed files with 0 additions and 1727 deletions

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

View File

@ -1,77 +0,0 @@
<Application x:Class="Artemis.UI.Installer.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Artemis.UI.Installer"
xmlns:s="https://github.com/canton7/Stylet">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<s:ApplicationLoader>
<s:ApplicationLoader.Bootstrapper>
<local:Bootstrapper />
</s:ApplicationLoader.Bootstrapper>
</s:ApplicationLoader>
<!-- Material Design -->
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Teal.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Teal.xaml" />
<!-- Material design extensions -->
<ResourceDictionary Source="pack://application:,,,/MaterialDesignExtensions;component/Themes/Generic.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignExtensions;component/Themes/MaterialDesignLightTheme.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Scrollbar.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Some general convertes etc. -->
<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" />
<DrawingImage x:Key="BowIcon">
<DrawingImage.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="White"
Geometry="M1518 3378 c-48 -63 -61 -101 -66 -184 -4 -70 -1 -91 27
-170 l31 -89 -27 -20 c-32 -24 -849 -601 -981 -693 l-93 -64 -87 40
c-48 22 -91 37 -95 32 -5 -4 9 -41 29 -83 l37 -75 -28 -24 c-23 -20
-29 -35 -33 -81 l-4 -56 -82 -19 c-109 -25 -109 -41 4 -91 l85 -38 7
-64 c15 -137 90 -1279 85 -1293 -3 -7 -35 -24 -70 -35 -159 -53 -257
-168 -257 -302 0 -35 2 -38 47 -53 54 -18 185 -21 232 -5 29 10 31
14 31 58 0 26 6 56 14 66 13 18 15 18 46 -8 44 -37 78 -35 119 7 l34
35 -17 41 c-9 23 -12 39 -6 35 6 -4 43 -1 83 6 39 6 219 14 398 18
l327 6 113 57 c158 78 256 166 317 282 24 46 27 62 27 152 0 98 -1
103 -41 184 l-42 83 44 69 c24 37 51 68 59 68 9 0 44 -14 78 -32 l62
-31 -93 -44 c-58 -26 -92 -48 -90 -55 9 -27 353 -68 570 -68 108 0
108 0 108 24 0 34 -105 171 -220 286 -122 122 -238 216 -250 204 -6
-6 -1 -42 16 -98 14 -49 23 -91 19 -94 -3 -3 -36 9 -73 27 l-69 33 24
71 c13 39 23 76 23 82 0 6 28 17 63 24 279 58 399 300 314 632 -32
121 -49 155 -134 255 -37 45 -106 126 -152 180 -73 87 -241 326 -241
343 0 3 15 13 32 21 21 10 35 25 40 45 15 60 -16 103 -81 108 -43 3
-39 22 14 74 l45 43 -25 50 c-35 69 -77 114 -130 139 -63 30 -88 27
-117 -11z m215 -835 c188 -279 250 -417 250 -548 0 -133 -74 -214 -243
-265 l-55 -16 -37 -138 c-21 -76 -39 -140 -40 -141 -6 -5 -814 377 -823
390 -6 7 -19 46 -29 86 -10 41 -25 81 -33 91 -8 9 -57 35 -109 59 -52
23 -93 46 -92 51 2 4 233 169 513 366 l510 358 26 -46 c15 -25 88 -136
162 -247z m-1108 -898 c61 21 88 26 107 19 14 -5 204 -92 421 -194 l395
-185 -27 -35 c-15 -19 -53 -72 -84 -117 l-57 -81 30 -90 c39 -117 40
-179 2 -253 -45 -90 -147 -145 -347 -189 -71 -15 -435 -59 -600 -73 l
-29 -2 -37 540 c-20 297 -40 581 -43 632 l-7 92 98 -46 97 -46 81 28z" />
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
<FontFamily x:Key="RobotoMono">pack://application:,,,/Resources/Fonts/#Roboto Mono</FontFamily>
<!-- Disable tab stop/focusable on all content controls -->
<Style TargetType="ContentControl">
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Focusable" Value="False" />
</Style>
<Style TargetType="GridSplitter" BasedOn="{StaticResource MaterialDesignGridSplitter}">
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Focusable" Value="False" />
</Style>
</ResourceDictionary>
</Application.Resources>
</Application>

View File

@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace Artemis.UI.Installer
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

View File

@ -1,179 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{2AE00626-50EC-4788-9EA7-CDADB00502A3}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Artemis.UI.Installer</RootNamespace>
<AssemblyName>Artemis.UI.Installer</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentValidation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7de548da2fbae0f0, processorArchitecture=MSIL">
<HintPath>..\packages\FluentValidation.9.3.0\lib\net461\FluentValidation.dll</HintPath>
</Reference>
<Reference Include="MaterialDesignColors, Version=1.2.7.1979, Culture=neutral, PublicKeyToken=df2a72020bd7962a, processorArchitecture=MSIL">
<HintPath>..\packages\MaterialDesignColors.1.2.7\lib\net45\MaterialDesignColors.dll</HintPath>
</Reference>
<Reference Include="MaterialDesignExtensions, Version=3.3.0.0, Culture=neutral, PublicKeyToken=c5ebccebe084d64f, processorArchitecture=MSIL">
<HintPath>..\packages\MaterialDesignExtensions.3.3.0-a01\lib\net45\MaterialDesignExtensions.dll</HintPath>
</Reference>
<Reference Include="MaterialDesignThemes.Wpf, Version=3.2.0.1979, Culture=neutral, PublicKeyToken=df2a72020bd7962a, processorArchitecture=MSIL">
<HintPath>..\packages\MaterialDesignThemes.3.2.0\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
</Reference>
<Reference Include="Ookii.Dialogs.Wpf, Version=3.0.0.0, Culture=neutral, PublicKeyToken=66aa232afad40158, processorArchitecture=MSIL">
<HintPath>..\packages\Ookii.Dialogs.Wpf.3.1.0\lib\net45\Ookii.Dialogs.Wpf.dll</HintPath>
</Reference>
<Reference Include="Stylet, Version=1.3.5.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Stylet.1.3.5\lib\net45\Stylet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Design" />
<Reference Include="System.Drawing" />
<Reference Include="System.Security" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="Bootstrapper.cs" />
<Compile Include="Converters\InverseBooleanConverter.cs" />
<Compile Include="Services\Prerequisites\RedistPrerequisite.cs" />
<Compile Include="Services\Prerequisites\DotnetPrerequisite.cs" />
<Compile Include="Services\Prerequisites\Interface\IPrerequisite.cs" />
<Compile Include="Screens\RootViewModel.cs" />
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Screens\Steps\ConfigurationStep.cs" />
<Compile Include="Screens\Steps\DirectoryStepView.xaml.cs">
<DependentUpon>DirectoryStepView.xaml</DependentUpon>
</Compile>
<Compile Include="Screens\Steps\DirectoryStepViewModel.cs" />
<Compile Include="Screens\Steps\InstallStepView.xaml.cs">
<DependentUpon>InstallStepView.xaml</DependentUpon>
</Compile>
<Compile Include="Screens\Steps\InstallStepViewModel.cs" />
<Compile Include="Screens\Steps\PrerequisitesStepView.xaml.cs">
<DependentUpon>PrerequisitesStepView.xaml</DependentUpon>
</Compile>
<Compile Include="Screens\Steps\PrerequisitesStepViewModel.cs" />
<Compile Include="Screens\Steps\Prerequisites\PrerequisiteView.xaml.cs">
<DependentUpon>PrerequisiteView.xaml</DependentUpon>
</Compile>
<Compile Include="Screens\Steps\Prerequisites\PrerequisiteViewModel.cs" />
<Compile Include="Screens\Steps\WelcomeStepViewModel.cs" />
<Compile Include="Services\IIInstallationService.cs" />
<Compile Include="Services\InstallationService.cs" />
<Compile Include="Stylet\FluentValidationAdapter.cs" />
<Compile Include="Utilities\ProcessUtilities.cs" />
<Page Include="Screens\RootView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Screens\Steps\DirectoryStepView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Screens\Steps\InstallStepView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Screens\Steps\PrerequisitesStepView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Screens\Steps\Prerequisites\PrerequisiteView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Screens\Steps\WelcomeStepView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.manifest" />
<None Include="packages.config" />
<None Include="packages.lock.json" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\MaterialDesignThemes.3.2.0\build\MaterialDesignThemes.targets" Condition="Exists('..\packages\MaterialDesignThemes.3.2.0\build\MaterialDesignThemes.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MaterialDesignThemes.3.2.0\build\MaterialDesignThemes.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MaterialDesignThemes.3.2.0\build\MaterialDesignThemes.targets'))" />
</Target>
</Project>

View File

@ -1,3 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=prerequisites_005Cinterface/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cprerequisites_005Cinterface/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@ -1,35 +0,0 @@
using Artemis.UI.Installer.Screens;
using Artemis.UI.Installer.Screens.Steps;
using Artemis.UI.Installer.Services;
using Artemis.UI.Installer.Services.Prerequisites;
using Artemis.UI.Installer.Stylet;
using FluentValidation;
using Stylet;
using StyletIoC;
namespace Artemis.UI.Installer
{
public class Bootstrapper : Bootstrapper<RootViewModel>
{
#region Overrides of Bootstrapper<RootViewModel>
/// <inheritdoc />
protected override void ConfigureIoC(IStyletIoCBuilder builder)
{
// View related stuff
builder.Bind<ConfigurationStep>().ToAllImplementations();
builder.Bind(typeof(IPrerequisite)).ToAllImplementations();
// Services
builder.Bind<IInstallationService>().To<InstallationService>().InSingletonScope();
// Validation
builder.Bind(typeof(IModelValidator<>)).To(typeof(FluentValidationAdapter<>));
builder.Bind(typeof(IValidator<>)).ToAllImplementations();
base.ConfigureIoC(builder);
}
#endregion
}
}

View File

@ -1,34 +0,0 @@
using System;
using System.Globalization;
using System.Windows.Data;
namespace Artemis.UI.Installer.Converters
{
[ValueConversion(typeof(bool), typeof(bool))]
public class InverseBooleanConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType == typeof(bool))
return !(bool) value;
if (targetType == typeof(bool?))
return !(bool?) value;
throw new InvalidOperationException("The target must be a boolean");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType == typeof(bool))
return !(bool) value;
if (targetType == typeof(bool?))
return !(bool?) value;
throw new InvalidOperationException("The target must be a boolean");
}
#endregion
}
}

View File

@ -1,55 +0,0 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Artemis.UI.Installer")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Artemis.UI.Installer")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,70 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Artemis.UI.Installer.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Artemis.UI.Installer.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -1,117 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,29 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Artemis.UI.Installer.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -1,67 +0,0 @@
<mde:MaterialWindow x:Class="Artemis.UI.Installer.Screens.RootView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Artemis.UI.Installer.Screens"
xmlns:mde="https://spiegelp.github.io/MaterialDesignExtensions/winfx/xaml"
xmlns:s="https://github.com/canton7/Stylet"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
FadeContentIfInactive="False"
Title="Artemis Installer"
TitleBarIcon="{StaticResource BowIcon}"
Foreground="{DynamicResource MaterialDesignBody}"
Background="{DynamicResource MaterialDesignPaper}"
FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto"
UseLayoutRounding="True"
Height="550" Width="800"
ResizeMode="NoResize">
<materialDesign:DialogHost IsTabStop="False"
Focusable="False"
Identifier="RootDialog"
DialogTheme="Inherit">
<mde:Stepper IsLinear="True" Layout="Horizontal" ActiveStepChanged="{s:Action ActiveStepChanged}" CancelNavigation="{s:Action Cancel}" Margin="15">
<mde:Step>
<mde:Step.Header>
<mde:StepTitleHeader FirstLevelTitle="Welcome" />
</mde:Step.Header>
<mde:Step.Content>
<ContentControl s:View.Model="{Binding ActiveItem}" />
</mde:Step.Content>
</mde:Step>
<mde:Step>
<mde:Step.Header>
<mde:StepTitleHeader FirstLevelTitle="Prerequisites" />
</mde:Step.Header>
<mde:Step.Content>
<ContentControl s:View.Model="{Binding ActiveItem}" />
</mde:Step.Content>
</mde:Step>
<mde:Step>
<mde:Step.Header>
<mde:StepTitleHeader FirstLevelTitle="Directory" />
</mde:Step.Header>
<mde:Step.Content>
<ContentControl s:View.Model="{Binding ActiveItem}" />
</mde:Step.Content>
</mde:Step>
<mde:Step>
<mde:Step.Header>
<mde:StepTitleHeader FirstLevelTitle="Install" />
</mde:Step.Header>
<mde:Step.Content>
<ContentControl s:View.Model="{Binding ActiveItem}" />
</mde:Step.Content>
</mde:Step>
<mde:Step>
<mde:Step.Header>
<mde:StepTitleHeader FirstLevelTitle="Finish" />
</mde:Step.Header>
<mde:Step.Content>
<ContentControl s:View.Model="{Binding ActiveItem}" />
</mde:Step.Content>
</mde:Step>
</mde:Stepper>
</materialDesign:DialogHost>
</mde:MaterialWindow>

View File

@ -1,36 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using Artemis.UI.Installer.Screens.Steps;
using MaterialDesignExtensions.Controllers;
using MaterialDesignExtensions.Controls;
using Stylet;
namespace Artemis.UI.Installer.Screens
{
public class RootViewModel : Conductor<ConfigurationStep>.Collection.OneActive
{
private StepperController _stepperController;
public RootViewModel(IEnumerable<ConfigurationStep> configurationSteps)
{
Items.AddRange(configurationSteps.OrderBy(s => s.Order));
}
public void ActiveStepChanged(object sender, ActiveStepChangedEventArgs e)
{
Stepper stepper = (Stepper) sender;
_stepperController = stepper.Controller;
int activeStepIndex = stepper.Steps.IndexOf(e.Step);
if (Items.Count > activeStepIndex)
ActiveItem = Items[activeStepIndex];
else
_stepperController.Back();
}
public void Cancel()
{
RequestClose();
}
}
}

View File

@ -1,19 +0,0 @@
using Stylet;
namespace Artemis.UI.Installer.Screens.Steps
{
public abstract class ConfigurationStep : Screen
{
/// <inheritdoc />
protected ConfigurationStep()
{
}
/// <inheritdoc />
protected ConfigurationStep(IModelValidator validator) : base(validator)
{
}
public abstract int Order { get; }
}
}

View File

@ -1,63 +0,0 @@
<UserControl x:Class="Artemis.UI.Installer.Screens.Steps.DirectoryStepView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:steps="clr-namespace:Artemis.UI.Installer.Screens.Steps"
xmlns:s="https://github.com/canton7/Stylet"
xmlns:mde="https://spiegelp.github.io/MaterialDesignExtensions/winfx/xaml"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:converters="clr-namespace:Artemis.UI.Installer.Converters"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:DesignInstance steps:DirectoryStepViewModel}">
<UserControl.Resources>
<converters:InverseBooleanConverter x:Key="InverseBooleanConverter" />
</UserControl.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Grid.ColumnSpan="2">
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}" TextWrapping="Wrap">
Select the directory in which you wish to install Artemis.
</TextBlock>
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}" Foreground="{DynamicResource MaterialDesignBodyLight}" TextWrapping="Wrap">
Because Artemis can start together with Windows, it is recommended to install on an SSD.<LineBreak />
</TextBlock>
</StackPanel>
<TextBox Grid.Row="1"
Grid.Column="0"
Style="{StaticResource MaterialDesignOutlinedTextFieldTextBox}"
VerticalAlignment="Center"
materialDesign:HintAssist.Hint="Installation directory"
Text="{Binding InstallationDirectory}" />
<Button Grid.Row="1"
Grid.Column="1"
Style="{StaticResource MaterialDesignIconButton}"
ToolTip="Browse"
VerticalAlignment="Center"
Margin="15 0 0 0"
Background="{DynamicResource MaterialDesignTextFieldBoxBackground}"
Command="{s:Action BrowseDirectory}">
<materialDesign:PackIcon Kind="DotsHorizontal" />
</Button>
<mde:StepButtonBar Grid.Row="2"
Grid.ColumnSpan="2"
VerticalAlignment="Bottom"
Continue="CONTINUE"
Back="BACK"
IsContinueEnabled="{Binding HasErrors, Converter={StaticResource InverseBooleanConverter}}" />
</Grid>
</UserControl>

View File

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Artemis.UI.Installer.Screens.Steps
{
/// <summary>
/// Interaction logic for DirectoryStepView.xaml
/// </summary>
public partial class DirectoryStepView : UserControl
{
public DirectoryStepView()
{
InitializeComponent();
}
}
}

View File

@ -1,92 +0,0 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Artemis.UI.Installer.Services;
using FluentValidation;
using Ookii.Dialogs.Wpf;
using Stylet;
namespace Artemis.UI.Installer.Screens.Steps
{
public class DirectoryStepViewModel : ConfigurationStep
{
private readonly IInstallationService _installationService;
private string _installationDirectory;
public DirectoryStepViewModel(IInstallationService installationService, IModelValidator<DirectoryStepViewModel> validator) : base(validator)
{
_installationService = installationService;
}
public string InstallationDirectory
{
get => _installationDirectory;
set
{
if (!SetAndNotify(ref _installationDirectory, value)) return;
Validate();
}
}
public override int Order => 3;
public void BrowseDirectory()
{
VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog
{
Description = "Select the directory in which to install Artemis",
SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
UseDescriptionForTitle = true
};
if (dialog.ShowDialog() is bool accepted && accepted)
InstallationDirectory = Path.Combine(dialog.SelectedPath, "Artemis");
}
/// <inheritdoc />
protected override void OnActivate()
{
InstallationDirectory = _installationService.InstallationDirectory;
base.OnActivate();
}
/// <inheritdoc />
protected override void OnDeactivate()
{
_installationService.InstallationDirectory = InstallationDirectory;
base.OnDeactivate();
}
}
public class DirectoryStepViewModelValidator : AbstractValidator<DirectoryStepViewModel>
{
public DirectoryStepViewModelValidator()
{
RuleFor(m => m.InstallationDirectory).NotEmpty().WithMessage("Installation directory is required");
RuleFor(m => m.InstallationDirectory).Must(s =>
{
try
{
bool rooted = Path.IsPathRooted(s);
string _ = Path.GetFullPath(s);
return rooted;
}
catch (Exception)
{
return false;
}
}).WithMessage("Directory must be valid");
RuleFor(m => m.InstallationDirectory).Must(s =>
{
try
{
return Directory.Exists(Path.GetPathRoot(s));
}
catch (Exception)
{
return false;
}
}).WithMessage("Directory is on an invalid drive");
}
}
}

View File

@ -1,37 +0,0 @@
<UserControl x:Class="Artemis.UI.Installer.Screens.Steps.InstallStepView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:steps="clr-namespace:Artemis.UI.Installer.Screens.Steps"
xmlns:s="https://github.com/canton7/Stylet"
xmlns:mde="https://spiegelp.github.io/MaterialDesignExtensions/winfx/xaml"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:DesignInstance steps:InstallStepViewModel}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0 25">
<StackPanel>
<ProgressBar Value="{Binding DownloadProcess}" IsIndeterminate="{Binding IsIndeterminate}" />
<TextBlock Margin="0 10" Visibility="{Binding Installing, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}}">
Downloading <Run Text="{Binding DownloadCurrent, StringFormat=N2}" />/<Run Text="{Binding DownloadTotal, StringFormat=N2}" /> MB.
</TextBlock>
<TextBlock Margin="0 10" Visibility="{Binding Installing, Converter={x:Static s:BoolToVisibilityConverter.Instance}}">
Installing <Run FontWeight="Bold" Text="{Binding Subject.Title}" />.
</TextBlock>
</StackPanel>
</Grid>
<mde:StepButtonBar Grid.Row="1"
Grid.ColumnSpan="2"
VerticalAlignment="Bottom"
Continue="CONTINUE"
Back="BACK"
IsContinueEnabled="{Binding CanContinue}" />
</Grid>
</UserControl>

View File

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Artemis.UI.Installer.Screens.Steps
{
/// <summary>
/// Interaction logic for InstallStepView.xaml
/// </summary>
public partial class InstallStepView : UserControl
{
public InstallStepView()
{
InitializeComponent();
}
}
}

View File

@ -1,28 +0,0 @@
using Artemis.UI.Installer.Services;
namespace Artemis.UI.Installer.Screens.Steps
{
public class InstallStepViewModel : ConfigurationStep
{
private readonly IInstallationService _installationService;
private bool _canContinue;
public InstallStepViewModel(IInstallationService installationService)
{
_installationService = installationService;
}
public override int Order => 4;
public bool CanContinue
{
get => _canContinue;
set => SetAndNotify(ref _canContinue, value);
}
protected override void OnInitialActivate()
{
base.OnInitialActivate();
}
}
}

View File

@ -1,43 +0,0 @@
<UserControl x:Class="Artemis.UI.Installer.Screens.Steps.Prerequisites.PrerequisiteView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Artemis.UI.Installer.Screens.Steps.Prerequisites"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:DesignInstance local:PrerequisiteViewModel}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center">
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}"
Text="{Binding Title}"/>
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}"
Foreground="{DynamicResource MaterialDesignNavigationItemSubheader}"
Text="{Binding Description}"/>
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" VerticalAlignment="Center">
<ToggleButton Style="{StaticResource MaterialDesignActionToggleButton}"
Focusable="False"
IsHitTestVisible="False"
IsChecked="{Binding IsMet}">
<ToggleButton.Content>
<Border Background="#E74C4C" Width="32" Height="32">
<materialDesign:PackIcon Kind="Close" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Border>
</ToggleButton.Content>
<materialDesign:ToggleButtonAssist.OnContent>
<materialDesign:PackIcon Kind="Check" />
</materialDesign:ToggleButtonAssist.OnContent>
</ToggleButton>
</StackPanel>
</Grid>
</UserControl>

View File

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Artemis.UI.Installer.Screens.Steps.Prerequisites
{
/// <summary>
/// Interaction logic for PrerequisiteView.xaml
/// </summary>
public partial class PrerequisiteView : UserControl
{
public PrerequisiteView()
{
InitializeComponent();
}
}
}

View File

@ -1,44 +0,0 @@
using Artemis.UI.Installer.Services.Prerequisites;
using Stylet;
namespace Artemis.UI.Installer.Screens.Steps.Prerequisites
{
public class PrerequisiteViewModel : PropertyChangedBase
{
private string _description;
private bool _isMet;
private string _title;
public PrerequisiteViewModel(IPrerequisite prerequisite)
{
Prerequisite = prerequisite;
}
public IPrerequisite Prerequisite { get; }
public string Title
{
get => _title;
set => SetAndNotify(ref _title, value);
}
public string Description
{
get => _description;
set => SetAndNotify(ref _description, value);
}
public bool IsMet
{
get => _isMet;
set => SetAndNotify(ref _isMet, value);
}
public void Update()
{
Title = Prerequisite.Title;
Description = Prerequisite.Description;
IsMet = Prerequisite.IsMet();
}
}
}

View File

@ -1,60 +0,0 @@
<UserControl x:Class="Artemis.UI.Installer.Screens.Steps.PrerequisitesStepView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:steps="clr-namespace:Artemis.UI.Installer.Screens.Steps"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:s="https://github.com/canton7/Stylet"
xmlns:mde="https://spiegelp.github.io/MaterialDesignExtensions/winfx/xaml"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:DesignInstance steps:PrerequisitesStepViewModel}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="60" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Style="{StaticResource MaterialDesignBody1TextBlock}" TextWrapping="Wrap">
In order to run Artemis requires .NET 5 and the Visual C++ Redistributable, both by Microsoft. <LineBreak />
The installer can install these for you if you're missing them.
</TextBlock>
<ItemsControl Grid.Row="1" ItemsSource="{Binding Prerequisites}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl s:View.Model="{Binding}" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" IsTabStop="False"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid Grid.Row="2" Margin="0 25">
<Button Style="{StaticResource MaterialDesignRaisedButton}"
Width="300"
Visibility="{Binding DisplayDownloadButton, Converter={x:Static s:BoolToVisibilityConverter.Instance}}"
Command="{s:Action InstallMissing}">
Download missing prerequisites
</Button>
<StackPanel Visibility="{Binding DisplayProcess, Converter={x:Static s:BoolToVisibilityConverter.Instance}}">
<ProgressBar Value="{Binding DownloadProcess}" IsIndeterminate="{Binding Installing}" />
<TextBlock Margin="0 10" Visibility="{Binding Installing, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}}">
Downloading <Run FontWeight="Bold" Text="{Binding Subject.Title}" /> <Run Text="{Binding DownloadCurrent, StringFormat=N2}" />/<Run Text="{Binding DownloadTotal, StringFormat=N2}" /> MB.
</TextBlock>
<TextBlock Margin="0 10" Visibility="{Binding Installing, Converter={x:Static s:BoolToVisibilityConverter.Instance}}">
Installing <Run FontWeight="Bold" Text="{Binding Subject.Title}" />.
</TextBlock>
</StackPanel>
</Grid>
<mde:StepButtonBar Grid.Row="3"
Grid.ColumnSpan="2"
VerticalAlignment="Bottom"
Continue="CONTINUE"
Back="BACK"
IsContinueEnabled="{Binding CanContinue}" />
</Grid>
</UserControl>

View File

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Artemis.UI.Installer.Screens.Steps
{
/// <summary>
/// Interaction logic for PrerequisitesStepView.xaml
/// </summary>
public partial class PrerequisitesStepView : UserControl
{
public PrerequisitesStepView()
{
InitializeComponent();
}
}
}

View File

@ -1,133 +0,0 @@
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Artemis.UI.Installer.Screens.Steps.Prerequisites;
using Artemis.UI.Installer.Services;
using Stylet;
namespace Artemis.UI.Installer.Screens.Steps
{
public class PrerequisitesStepViewModel : ConfigurationStep
{
private bool _canContinue;
private bool _displayDownloadButton;
private bool _displayProcess;
private double _downloadCurrent;
private int _downloadProcess;
private double _downloadTotal;
private bool _installing;
private PrerequisiteViewModel _subject;
public PrerequisitesStepViewModel(IInstallationService installationService)
{
Prerequisites = new BindableCollection<PrerequisiteViewModel>(installationService.Prerequisites.Select(p => new PrerequisiteViewModel(p)));
}
public BindableCollection<PrerequisiteViewModel> Prerequisites { get; }
public bool CanContinue
{
get => _canContinue;
set => SetAndNotify(ref _canContinue, value);
}
public PrerequisiteViewModel Subject
{
get => _subject;
set => SetAndNotify(ref _subject, value);
}
public bool DisplayDownloadButton
{
get => _displayDownloadButton;
set => SetAndNotify(ref _displayDownloadButton, value);
}
public bool DisplayProcess
{
get => _displayProcess;
set => SetAndNotify(ref _displayProcess, value);
}
public bool Installing
{
get => _installing;
set => SetAndNotify(ref _installing, value);
}
public int DownloadProcess
{
get => _downloadProcess;
set => SetAndNotify(ref _downloadProcess, value);
}
public double DownloadCurrent
{
get => _downloadCurrent;
set => SetAndNotify(ref _downloadCurrent, value);
}
public double DownloadTotal
{
get => _downloadTotal;
set => SetAndNotify(ref _downloadTotal, value);
}
public override int Order => 2;
public void Update()
{
foreach (PrerequisiteViewModel prerequisiteViewModel in Prerequisites)
prerequisiteViewModel.Update();
CanContinue = Prerequisites.All(p => p.IsMet);
DisplayDownloadButton = !DisplayProcess && Prerequisites.Any(p => !p.IsMet);
}
public async Task InstallMissing()
{
DisplayDownloadButton = false;
DisplayProcess = true;
foreach (PrerequisiteViewModel prerequisiteViewModel in Prerequisites)
{
if (prerequisiteViewModel.IsMet) continue;
using (WebClient client = new WebClient())
{
Subject = prerequisiteViewModel;
client.DownloadProgressChanged += ClientOnDownloadProgressChanged;
string runtimeFile = Path.GetTempFileName();
runtimeFile = runtimeFile.Replace(".tmp", ".exe");
await client.DownloadFileTaskAsync(prerequisiteViewModel.Prerequisite.DownloadUrl, runtimeFile);
client.DownloadProgressChanged -= ClientOnDownloadProgressChanged;
Installing = true;
await prerequisiteViewModel.Prerequisite.Install(runtimeFile);
File.Delete(runtimeFile);
Installing = false;
}
Update();
}
DisplayProcess = false;
DisplayDownloadButton = Prerequisites.Any(p => !p.IsMet);
}
protected override void OnActivate()
{
Update();
base.OnActivate();
}
private void ClientOnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
DownloadTotal = e.TotalBytesToReceive / 1000000d;
DownloadCurrent = e.BytesReceived / 1000000d;
DownloadProcess = e.ProgressPercentage;
}
}
}

View File

@ -1,32 +0,0 @@
<UserControl x:Class="Artemis.UI.Installer.Screens.Steps.WelcomeStepView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mde="https://spiegelp.github.io/MaterialDesignExtensions/winfx/xaml"
xmlns:steps="clr-namespace:Artemis.UI.Installer.Screens.Steps"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:DesignInstance steps:WelcomeStepViewModel}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel>
<TextBlock Style="{StaticResource MaterialDesignHeadline4TextBlock}">Welcome to the Artemis installation wizard!</TextBlock>
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}" TextWrapping="Wrap">
This wizard will install or update Artemis for you, ensuring you have the latest version.<LineBreak />
</TextBlock>
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}" TextWrapping="Wrap">
In order to do this, the installer requires an active internet connection to download the latest program files. <LineBreak/>
Click continue to get started!
</TextBlock>
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}" Foreground="{DynamicResource MaterialDesignBodyLight}" TextWrapping="Wrap">
PS: The files downloaded will be about 35 MB.<LineBreak />
</TextBlock>
</StackPanel>
<mde:StepButtonBar Grid.Row="1" VerticalAlignment="Bottom" Continue="CONTINUE" Cancel="CANCEL" />
</Grid>
</UserControl>

View File

@ -1,16 +0,0 @@
using Artemis.UI.Installer.Services;
namespace Artemis.UI.Installer.Screens.Steps
{
public class WelcomeStepViewModel : ConfigurationStep
{
private readonly IInstallationService _installationService;
public WelcomeStepViewModel(IInstallationService installationService)
{
_installationService = installationService;
}
public override int Order => 1;
}
}

View File

@ -1,11 +0,0 @@
using System.Collections.Generic;
using Artemis.UI.Installer.Services.Prerequisites;
namespace Artemis.UI.Installer.Services
{
public interface IInstallationService
{
string InstallationDirectory { get; set; }
List<IPrerequisite> Prerequisites { get; }
}
}

View File

@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Artemis.UI.Installer.Services.Prerequisites;
namespace Artemis.UI.Installer.Services
{
public class InstallationService : IInstallationService
{
public InstallationService(IEnumerable<IPrerequisite> prerequisites)
{
InstallationDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Artemis");
Prerequisites = prerequisites.ToList();
}
public string InstallationDirectory { get; set; }
public List<IPrerequisite> Prerequisites { get; }
}
}

View File

@ -1,33 +0,0 @@
using System;
using System.Threading.Tasks;
using Artemis.UI.Installer.Utilities;
using Microsoft.Win32;
namespace Artemis.UI.Installer.Services.Prerequisites
{
public class DotnetPrerequisite : IPrerequisite
{
public string Title => ".NET 5 runtime x64";
public string Description => "The .NET 5 runtime is required for Artemis to run, the download is about 50 MB";
public string DownloadUrl => "https://download.visualstudio.microsoft.com/download/pr/c6a74d6b-576c-4ab0-bf55-d46d45610730/" +
"f70d2252c9f452c2eb679b8041846466/windowsdesktop-runtime-5.0.1-win-x64.exe";
public bool IsMet()
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedhost");
object versionValue = key?.GetValue("Version");
if (versionValue == null)
return false;
Version dotnetVersion = Version.Parse(versionValue.ToString());
return dotnetVersion.Major >= 5;
}
public async Task Install(string file)
{
await ProcessUtilities.RunProcessAsync(file, "-passive");
}
}
}

View File

@ -1,14 +0,0 @@
using System.Threading.Tasks;
namespace Artemis.UI.Installer.Services.Prerequisites
{
public interface IPrerequisite
{
string Title { get; }
string Description { get; }
string DownloadUrl { get; }
bool IsMet();
Task Install(string file);
}
}

View File

@ -1,28 +0,0 @@
using System.Threading.Tasks;
using Artemis.UI.Installer.Utilities;
using Microsoft.Win32;
namespace Artemis.UI.Installer.Services.Prerequisites
{
public class RedistPrerequisite : IPrerequisite
{
public string Title => "Visual C++ Redistributable for VS 2015, 2017 and 2019 x64";
public string Description => "The C++ Redistributable is required for many device SDKs, the download is about 15 MB";
public string DownloadUrl => "https://aka.ms/vs/16/release/vc_redist.x64.exe";
public bool IsMet()
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64", false);
object majorValue = key?.GetValue("Major");
if (majorValue == null)
return false;
return int.Parse(majorValue.ToString()) >= 14;
}
public async Task Install(string file)
{
await ProcessUtilities.RunProcessAsync(file, "-passive");
}
}
}

View File

@ -1,41 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using FluentValidation;
using Stylet;
namespace Artemis.UI.Installer.Stylet
{
public class FluentValidationAdapter<T> : IModelValidator<T>
{
private readonly IValidator<T> _validator;
private T _subject;
public FluentValidationAdapter(IValidator<T> validator)
{
_validator = validator;
}
public void Initialize(object subject)
{
_subject = (T) subject;
}
public async Task<IEnumerable<string>> ValidatePropertyAsync(string propertyName)
{
// If someone's calling us synchronously, and ValidationAsync does not complete synchronously,
// we'll deadlock unless we continue on another thread.
return (await _validator.ValidateAsync(_subject, options => options.IncludeProperties(propertyName)).ConfigureAwait(false))
.Errors.Select(x => x.ErrorMessage);
}
public async Task<Dictionary<string, IEnumerable<string>>> ValidateAllPropertiesAsync()
{
// If someone's calling us synchronously, and ValidationAsync does not complete synchronously,
// we'll deadlock unless we continue on another thread.
return (await _validator.ValidateAsync(_subject).ConfigureAwait(false))
.Errors.GroupBy(x => x.PropertyName)
.ToDictionary(x => x.Key, x => x.Select(failure => failure.ErrorMessage));
}
}
}

View File

@ -1,29 +0,0 @@
using System.Diagnostics;
using System.Threading.Tasks;
namespace Artemis.UI.Installer.Utilities
{
public static class ProcessUtilities
{
public static Task<int> RunProcessAsync(string fileName, string arguments)
{
TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
Process process = new Process
{
StartInfo = {FileName = fileName, Arguments = arguments},
EnableRaisingEvents = true
};
process.Exited += (sender, args) =>
{
tcs.SetResult(process.ExitCode);
process.Dispose();
};
process.Start();
return tcs.Task;
}
}
}

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Specifying requestedExecutionLevel element will disable file and registry virtualization.
Remove this element if your application requires this virtualization for backwards
compatibility.
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- A list of the Windows versions that this application has been tested on
and is designed to work with. Uncomment the appropriate elements
and Windows will automatically select the most compatible environment. -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FluentValidation" version="9.3.0" targetFramework="net472" />
<package id="MaterialDesignColors" version="1.2.7" targetFramework="net472" />
<package id="MaterialDesignExtensions" version="3.3.0-a01" targetFramework="net472" />
<package id="MaterialDesignThemes" version="3.2.0" targetFramework="net472" />
<package id="Ookii.Dialogs.Wpf" version="3.1.0" targetFramework="net472" />
<package id="Stylet" version="1.3.5" targetFramework="net472" />
<package id="Stylet.Start" version="1.3.5" targetFramework="net472" />
</packages>

View File

@ -1,49 +0,0 @@
{
"version": 1,
"dependencies": {
".NETFramework,Version=v4.7.2": {
"FluentValidation": {
"type": "Direct",
"requested": "[9.3.0, 9.3.0]",
"resolved": "9.3.0",
"contentHash": "C44l6Ih+YwpED/TsXfl6LIq6Z4wLXahstnr6T70uUg1Hs7/bLBKKAo9Nl0sLhVjDE8TA+fF+O3IM4nDrwabcSQ=="
},
"MaterialDesignColors": {
"type": "Direct",
"requested": "[1.2.7, 1.2.7]",
"resolved": "1.2.7",
"contentHash": "e+shDlaSAJcuTArqtfWjVUgAOlwQlgWq8akkzCGe1MvfV1ozmOqqXyWxg5w0vC/3/KZ84wnPUJeI1wzEpI0uJQ=="
},
"MaterialDesignExtensions": {
"type": "Direct",
"requested": "[3.3.0-a01, 3.3.0-a01]",
"resolved": "3.3.0-a01",
"contentHash": "dq8lvcj73H6TCmhjlRud8EeUSgC8S2U7T4jOoefmLieZQigbfQNy29hF1041cnu6b3l8mW00zWJituRMSt0iOQ=="
},
"MaterialDesignThemes": {
"type": "Direct",
"requested": "[3.2.0, 3.2.0]",
"resolved": "3.2.0",
"contentHash": "aOZQShQuV7sCWOwO98dYz1S4stmIWDBH+Q6KoR3wDiDyuG7twoGnBDzQBhrxuS16I3GQiG5nfvUjEJFVc/zdKg=="
},
"Ookii.Dialogs.Wpf": {
"type": "Direct",
"requested": "[3.1.0, 3.1.0]",
"resolved": "3.1.0",
"contentHash": "EpUWoSLLO1aVkUmo2dPE4xO+zQZRxbp13agbbQzGBL1ACALgCD69cTwdLdPdg2LIsPcZ4uA3iID+YaazdZxyww=="
},
"Stylet": {
"type": "Direct",
"requested": "[1.3.5, 1.3.5]",
"resolved": "1.3.5",
"contentHash": "9vjjaTgf5sZAGHnxQWIslD32MG5gXj7ANgS+w965L5Eh//UC3qwZDrEf226Pf+v1P/ldAJDpUySnOyGlb3TSSw=="
},
"Stylet.Start": {
"type": "Direct",
"requested": "[1.3.5, 1.3.5]",
"resolved": "1.3.5",
"contentHash": "UwVT5eTTNWI8a3hiva361UMD/ebmY4pd7c4qtkM9soAGcBavNCrgcxO3IC3+L+1hEcuZqyOqdBLyrT1lOB/M+w=="
}
}
}
}

View File

@ -11,8 +11,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Artemis.Core", "Artemis.Cor
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Artemis.UI.Shared", "Artemis.UI.Shared\Artemis.UI.Shared.csproj", "{ADB357E6-151D-4D0D-87CB-68FD0BC29812}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.UI.Installer", "Artemis.UI.Installer\Artemis.UI.Installer.csproj", "{2AE00626-50EC-4788-9EA7-CDADB00502A3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@ -35,9 +33,6 @@ Global
{ADB357E6-151D-4D0D-87CB-68FD0BC29812}.Debug|x64.Build.0 = Debug|x64
{ADB357E6-151D-4D0D-87CB-68FD0BC29812}.Release|x64.ActiveCfg = Release|x64
{ADB357E6-151D-4D0D-87CB-68FD0BC29812}.Release|x64.Build.0 = Release|x64
{2AE00626-50EC-4788-9EA7-CDADB00502A3}.Debug|x64.ActiveCfg = Debug|x64
{2AE00626-50EC-4788-9EA7-CDADB00502A3}.Debug|x64.Build.0 = Debug|x64
{2AE00626-50EC-4788-9EA7-CDADB00502A3}.Release|x64.ActiveCfg = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE