Upload via GUI (69 Dateien)
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
DeskHub Desktop – Nutzungshinweise
|
||||||
|
|
||||||
|
Copyright (c) M_Viper. Alle Rechte vorbehalten.
|
||||||
|
|
||||||
|
Diese Anwendung ist ein Desktop-Client für die DeskHub-Support-Software und
|
||||||
|
richtet sich an Mitarbeiter, die ein Konto auf einer DeskHub-Installation haben.
|
||||||
|
|
||||||
|
1. Nutzung
|
||||||
|
Die Anwendung darf nur von berechtigten Mitarbeitern der jeweiligen
|
||||||
|
DeskHub-Installation verwendet werden.
|
||||||
|
|
||||||
|
2. Zugangsdaten
|
||||||
|
Die Anmeldung wird als widerrufbares Token verschlüsselt auf diesem Computer
|
||||||
|
gespeichert. Auf gemeinsam genutzten Computern bitte nach der Arbeit abmelden.
|
||||||
|
|
||||||
|
3. Keine Gewährleistung
|
||||||
|
Die Software wird ohne jegliche Gewährleistung bereitgestellt. Der Autor
|
||||||
|
haftet nicht für Schäden, die aus der Nutzung oder Unmöglichkeit der Nutzung
|
||||||
|
der Software entstehen.
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<Application x:Class="DeskHubSetup.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<!-- [0] wird je nach Hell/Dunkel ersetzt -->
|
||||||
|
<ResourceDictionary Source="Themes/Colors.Light.xaml"/>
|
||||||
|
<ResourceDictionary Source="Themes/Controls.xaml"/>
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
<!-- DeskHub-Blau (wie Logo und Webseite) -->
|
||||||
|
<SolidColorBrush x:Key="AccentBrush" Color="#2F6FDB"/>
|
||||||
|
<SolidColorBrush x:Key="AccentHoverBrush" Color="#4380E6"/>
|
||||||
|
<SolidColorBrush x:Key="OnAccentBrush" Color="White"/>
|
||||||
|
<SolidColorBrush x:Key="AccentSubtleBrush" Color="#222F6FDB"/>
|
||||||
|
<SolidColorBrush x:Key="AccentSubtleStrokeBrush" Color="#552F6FDB"/>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using Microsoft.Win32;
|
||||||
|
|
||||||
|
namespace DeskHubSetup;
|
||||||
|
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
private static Mutex? _single;
|
||||||
|
|
||||||
|
protected override void OnStartup(StartupEventArgs e)
|
||||||
|
{
|
||||||
|
base.OnStartup(e);
|
||||||
|
bool has(string arg) => e.Args.Any(a => a.Equals(arg, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
// Das Deinstallationsprogramm ist das Setup ohne angehängte App → ohne Anhang immer Deinstallation
|
||||||
|
bool uninstall = has("--uninstall") || !Payload.Exists;
|
||||||
|
bool silent = has("/S");
|
||||||
|
bool update = has("--update");
|
||||||
|
bool launch = has("/launch");
|
||||||
|
var dirArg = e.Args.FirstOrDefault(a => a.StartsWith("/D=", StringComparison.OrdinalIgnoreCase))?.Substring(3);
|
||||||
|
|
||||||
|
_single = new Mutex(true, "DeskHub-Setup", out bool first);
|
||||||
|
if (!first)
|
||||||
|
{
|
||||||
|
Shutdown(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stille Installation/Deinstallation für Skripte: DeskHub-Setup.exe /S [/D=Ordner] [/launch] bzw. --uninstall /S
|
||||||
|
if (silent)
|
||||||
|
{
|
||||||
|
var progress = new Progress<(double, string)>(_ => { });
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (uninstall) Installer.Uninstall(removeData: false, progress);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var dir = dirArg ?? Installer.InstalledDir ?? Installer.DefaultDir;
|
||||||
|
Installer.Install(dir, desktopLink: Installer.InstalledDir is null || Installer.DesktopLinkExists,
|
||||||
|
progress, waitForExit: true);
|
||||||
|
if (launch) System.Diagnostics.Process.Start(Path.Combine(dir, Installer.ExeName));
|
||||||
|
}
|
||||||
|
Shutdown(0);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// ohne Oberfläche: Fehler für Skripte nachvollziehbar ablegen
|
||||||
|
try { File.WriteAllText(Path.Combine(Path.GetTempPath(), "DeskHub-Setup.log"), $"[{DateTime.Now}] {ex}"); } catch { }
|
||||||
|
Shutdown(1);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyTheme();
|
||||||
|
var mode = uninstall ? SetupMode.Uninstall : update ? SetupMode.Update : SetupMode.Install;
|
||||||
|
new MainWindow(mode).Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnExit(ExitEventArgs e)
|
||||||
|
{
|
||||||
|
try { _single?.ReleaseMutex(); } catch { }
|
||||||
|
base.OnExit(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Hell/Dunkel wie in Windows eingestellt.</summary>
|
||||||
|
private void ApplyTheme()
|
||||||
|
{
|
||||||
|
bool light = ReadDword(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme") != 0;
|
||||||
|
Resources.MergedDictionaries[0] = new ResourceDictionary
|
||||||
|
{
|
||||||
|
Source = new Uri($"pack://application:,,,/Themes/Colors.{(light ? "Light" : "Dark")}.xaml"),
|
||||||
|
};
|
||||||
|
if (!light)
|
||||||
|
{
|
||||||
|
// im Dunkeln etwas heller, damit Text und Fortschrittsbalken gut lesbar bleiben
|
||||||
|
var a = Color.FromRgb(0x4A, 0x86, 0xEA);
|
||||||
|
Resources["AccentBrush"] = new SolidColorBrush(a);
|
||||||
|
Resources["AccentHoverBrush"] = new SolidColorBrush(Color.FromRgb(0x5E, 0x94, 0xEE));
|
||||||
|
Resources["AccentSubtleBrush"] = new SolidColorBrush(Color.FromArgb(0x30, a.R, a.G, a.B));
|
||||||
|
Resources["AccentSubtleStrokeBrush"] = new SolidColorBrush(Color.FromArgb(0x60, a.R, a.G, a.B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int ReadDword(string key, string name)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var k = Registry.CurrentUser.OpenSubKey(key);
|
||||||
|
return k?.GetValue(name) is int i ? i : -1;
|
||||||
|
}
|
||||||
|
catch { return -1; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SetupMode { Install, Update, Uninstall }
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<!-- .NET Framework 4.8 ist in jedem Windows 10/11 enthalten → der Installer läuft ohne Zusatzinstallation -->
|
||||||
|
<TargetFramework>net48</TargetFramework>
|
||||||
|
<UseWPF>true</UseWPF>
|
||||||
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
|
<GenerateDocumentationFile>false</GenerateDocumentationFile>
|
||||||
|
<AssemblyName>DeskHub-Setup</AssemblyName>
|
||||||
|
<RootNamespace>DeskHubSetup</RootNamespace>
|
||||||
|
<ApplicationIcon>..\src\assets\icon.ico</ApplicationIcon>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
<Product>DeskHub Setup</Product>
|
||||||
|
<AssemblyTitle>DeskHub Setup</AssemblyTitle>
|
||||||
|
<Description>Installiert DeskHub</Description>
|
||||||
|
<Company>M_Viper</Company>
|
||||||
|
<Authors>M_Viper</Authors>
|
||||||
|
<Copyright>Copyright (c) M_Viper. Alle Rechte vorbehalten.</Copyright>
|
||||||
|
<NeutralLanguage>de-DE</NeutralLanguage>
|
||||||
|
<!-- Version kommt beim Bauen aus package.json (scripts/build-setup.js) -->
|
||||||
|
<Version Condition="'$(Version)' == ''">0.0.0</Version>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- WinForms nur für den Ordner-Dialog; nicht global, sonst Namenskonflikte mit WPF -->
|
||||||
|
<Using Remove="System.Windows.Forms" />
|
||||||
|
<Using Remove="System.Drawing" />
|
||||||
|
<Reference Include="Microsoft.VisualBasic" />
|
||||||
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.Web" />
|
||||||
|
<Reference Include="System.Web.Extensions" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- Themes\*.xaml (gleiches Design wie der DeskCore-Installer) bindet das SDK automatisch als Page ein -->
|
||||||
|
<Resource Include="..\src\assets\icon.ico" Link="app.ico" />
|
||||||
|
<Resource Include="..\src\assets\logo.png" Link="app.png" />
|
||||||
|
<EmbeddedResource Include="..\LICENSE" LogicalName="LICENSE.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<!--
|
||||||
|
Die eigentliche App (entpackter Electron-Ordner als ZIP) wird NICHT hier eingebettet,
|
||||||
|
sondern nach dem Bauen hinten an die .exe angehängt (scripts/build-setup.js, siehe Payload.cs).
|
||||||
|
So muss der Compiler keine ~150 MB als Ressource verarbeiten, und das Deinstallationsprogramm
|
||||||
|
ist einfach der vordere Teil der Datei ohne Anhang.
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,508 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.IO.Compression;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using Microsoft.Win32;
|
||||||
|
|
||||||
|
namespace DeskHubSetup;
|
||||||
|
|
||||||
|
/// <summary>Installation/Deinstallation – nur für den aktuellen Benutzer, ohne Administratorrechte.</summary>
|
||||||
|
public static class Installer
|
||||||
|
{
|
||||||
|
public const string AppName = "DeskHub";
|
||||||
|
public const string Publisher = "M_Viper";
|
||||||
|
public const string ExeName = "DeskHub.exe";
|
||||||
|
// Gleicher Name wie beim früheren NSIS-Setup: die App erkennt daran eine Setup-Installation
|
||||||
|
// und bietet Updates als Setup an (src/updater.js → hasUninstaller).
|
||||||
|
public const string UninstallerName = "Uninstall DeskHub.exe";
|
||||||
|
// wie "appId" in package.json – gleiche Taskleisten-/Benachrichtigungs-Zuordnung wie bisher
|
||||||
|
public const string AppUserModelId = "de.deskhub.desktop";
|
||||||
|
|
||||||
|
// Schlüssel vom alten electron-builder-Setup übernommen → in "Apps" bleibt es ein einziger Eintrag
|
||||||
|
private const string KeyId = "7c1d9a52-3b6e-4f0a-9d84-5e2a1b6f3c10";
|
||||||
|
private const string UninstallKey = @"Software\Microsoft\Windows\CurrentVersion\Uninstall\" + KeyId;
|
||||||
|
private const string LegacyAppKey = @"Software\" + KeyId;
|
||||||
|
private const string RunKey = @"Software\Microsoft\Windows\CurrentVersion\Run";
|
||||||
|
private const string FileListName = "install-files.txt";
|
||||||
|
|
||||||
|
public static string Version
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var info = typeof(Installer).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
|
||||||
|
if (!string.IsNullOrEmpty(info)) return info!.Split('+')[0];
|
||||||
|
var v = typeof(Installer).Assembly.GetName().Version!;
|
||||||
|
return $"{v.Major}.{v.Minor}.{v.Build}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Pfad dieses Setups (bzw. des Deinstallationsprogramms).</summary>
|
||||||
|
public static string SelfPath => Assembly.GetExecutingAssembly().Location;
|
||||||
|
|
||||||
|
public static string DefaultDir =>
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs", AppName);
|
||||||
|
|
||||||
|
/// <summary>App-Daten: Anmeldung (Token) und Einstellungen.</summary>
|
||||||
|
public static string DataDir =>
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "deskhub");
|
||||||
|
|
||||||
|
private static string StartMenuLink =>
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), AppName + ".lnk");
|
||||||
|
|
||||||
|
private static string DesktopLink =>
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), AppName + ".lnk");
|
||||||
|
|
||||||
|
// ---------- vorhandene Installation ----------
|
||||||
|
|
||||||
|
private static string? RegValue(string name)
|
||||||
|
{
|
||||||
|
using var k = Registry.CurrentUser.OpenSubKey(UninstallKey);
|
||||||
|
return k?.GetValue(name) as string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Ordner einer vorhandenen Installation (dieses Setups oder des alten NSIS-Setups), oder null.</summary>
|
||||||
|
public static string? InstalledDir
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var dir = RegValue("InstallLocation");
|
||||||
|
if (string.IsNullOrWhiteSpace(dir))
|
||||||
|
{
|
||||||
|
// altes NSIS-Setup trägt keinen InstallLocation ein → aus dem Deinstallationsbefehl ablesen
|
||||||
|
var m = Regex.Match(RegValue("UninstallString") ?? "", "^\"([^\"]+)\"");
|
||||||
|
dir = m.Success ? Path.GetDirectoryName(m.Groups[1].Value) : null;
|
||||||
|
}
|
||||||
|
return dir is not null && File.Exists(Path.Combine(dir, ExeName)) ? dir : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Stammt die vorhandene Installation noch vom alten NSIS-Setup?</summary>
|
||||||
|
public static bool IsLegacyInstall =>
|
||||||
|
InstalledDir is not null && (RegValue("UninstallString") ?? "").IndexOf("--uninstall", StringComparison.OrdinalIgnoreCase) < 0;
|
||||||
|
|
||||||
|
public static string? InstalledVersion => RegValue("DisplayVersion");
|
||||||
|
|
||||||
|
public static bool DesktopLinkExists => File.Exists(DesktopLink);
|
||||||
|
|
||||||
|
public static bool IsRunning(string? dir) => AppProcesses(dir, InstalledDir).Any();
|
||||||
|
|
||||||
|
public static string LicenseText
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using var s = typeof(Installer).Assembly.GetManifestResourceStream("LICENSE.txt");
|
||||||
|
if (s is null) return "";
|
||||||
|
using var r = new StreamReader(s);
|
||||||
|
return r.ReadToEnd().Trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Installieren ----------
|
||||||
|
|
||||||
|
/// <param name="waitForExit">nach einem Update aus der App: ihr erst Zeit geben, sich zu beenden</param>
|
||||||
|
public static void Install(string dir, bool desktopLink, IProgress<(double, string)> progress, bool waitForExit = false)
|
||||||
|
{
|
||||||
|
if (!Environment.Is64BitOperatingSystem)
|
||||||
|
throw new InvalidOperationException("DeskHub benötigt ein 64-Bit-Windows (Windows 10 oder 11).");
|
||||||
|
|
||||||
|
var oldDir = InstalledDir;
|
||||||
|
progress.Report((0.02, "DeskHub wird beendet …"));
|
||||||
|
CloseRunningApp(waitForExit ? 20000 : 0, dir, oldDir);
|
||||||
|
|
||||||
|
using var zip = Payload.OpenArchive();
|
||||||
|
var topLevel = TopLevelNames(zip);
|
||||||
|
|
||||||
|
progress.Report((0.05, "Alte Version wird entfernt …"));
|
||||||
|
Directory.CreateDirectory(dir);
|
||||||
|
RemoveAppFiles(dir, topLevel);
|
||||||
|
if (oldDir is not null && !SamePath(oldDir, dir))
|
||||||
|
{
|
||||||
|
// Installation wurde in einen anderen Ordner verlegt → alten Ordner aufräumen
|
||||||
|
var oldExe = Path.Combine(oldDir, ExeName);
|
||||||
|
DeleteIfPointsTo(StartMenuLink, oldExe);
|
||||||
|
DeleteIfPointsTo(DesktopLink, oldExe);
|
||||||
|
RemoveAppFiles(oldDir, topLevel);
|
||||||
|
try { Directory.Delete(oldDir); } catch { } // nur wenn leer
|
||||||
|
}
|
||||||
|
|
||||||
|
Extract(zip, dir, p => progress.Report((0.08 + p * 0.8, "Dateien werden kopiert …")));
|
||||||
|
|
||||||
|
progress.Report((0.9, "Deinstallationsprogramm wird angelegt …"));
|
||||||
|
var exe = Path.Combine(dir, ExeName);
|
||||||
|
var uninstaller = Path.Combine(dir, UninstallerName);
|
||||||
|
if (!SamePath(SelfPath, uninstaller))
|
||||||
|
{
|
||||||
|
MoveAside(uninstaller);
|
||||||
|
CopyStub(uninstaller);
|
||||||
|
}
|
||||||
|
File.WriteAllLines(Path.Combine(dir, FileListName), topLevel.Concat([UninstallerName, FileListName]));
|
||||||
|
|
||||||
|
progress.Report((0.94, "Verknüpfungen werden angelegt …"));
|
||||||
|
Shortcut.Create(StartMenuLink, exe, "DeskHub Mitarbeiter-Client", AppUserModelId);
|
||||||
|
if (desktopLink) Shortcut.Create(DesktopLink, exe, "DeskHub Mitarbeiter-Client", AppUserModelId);
|
||||||
|
else DeleteIfPointsTo(DesktopLink, exe);
|
||||||
|
|
||||||
|
progress.Report((0.97, "Windows wird eingerichtet …"));
|
||||||
|
Registry.CurrentUser.DeleteSubKeyTree(UninstallKey, throwOnMissingSubKey: false); // Reste des alten Setups
|
||||||
|
Registry.CurrentUser.DeleteSubKeyTree(LegacyAppKey, throwOnMissingSubKey: false);
|
||||||
|
using (var k = Registry.CurrentUser.CreateSubKey(UninstallKey))
|
||||||
|
{
|
||||||
|
long size = DirSize(dir) / 1024;
|
||||||
|
k.SetValue("DisplayName", AppName);
|
||||||
|
k.SetValue("DisplayVersion", Version);
|
||||||
|
k.SetValue("Publisher", Publisher);
|
||||||
|
k.SetValue("DisplayIcon", $"{exe},0");
|
||||||
|
k.SetValue("InstallLocation", dir);
|
||||||
|
k.SetValue("UninstallString", $"\"{uninstaller}\" --uninstall");
|
||||||
|
k.SetValue("QuietUninstallString", $"\"{uninstaller}\" --uninstall /S");
|
||||||
|
k.SetValue("URLInfoAbout", "https://github.com/");
|
||||||
|
k.SetValue("InstallDate", DateTime.Now.ToString("yyyyMMdd"));
|
||||||
|
k.SetValue("EstimatedSize", (int)Math.Min(int.MaxValue, size), RegistryValueKind.DWord);
|
||||||
|
k.SetValue("NoModify", 1, RegistryValueKind.DWord);
|
||||||
|
k.SetValue("NoRepair", 1, RegistryValueKind.DWord);
|
||||||
|
}
|
||||||
|
|
||||||
|
progress.Report((0.98, "Installation wird abgeschlossen …"));
|
||||||
|
Vorwaermen(exe);
|
||||||
|
|
||||||
|
progress.Report((1.0, "Fertig"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Startet DeskHub einmal kurz mit "--prewarm" – die App beendet sich sofort wieder (siehe src/main.js).
|
||||||
|
/// Windows Defender prüft eine neue, unbekannte EXE beim ersten Start mehrere Sekunden lang; das passiert
|
||||||
|
/// so während des Fortschrittsbalkens und nicht erst beim ersten echten Start.
|
||||||
|
/// </summary>
|
||||||
|
private static void Vorwaermen(string exe)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var p = Process.Start(new ProcessStartInfo(exe, "--prewarm")
|
||||||
|
{
|
||||||
|
UseShellExecute = false,
|
||||||
|
CreateNoWindow = true,
|
||||||
|
WorkingDirectory = Path.GetDirectoryName(exe)!,
|
||||||
|
});
|
||||||
|
if (p != null && !p.WaitForExit(30000)) { try { p.Kill(); } catch { } }
|
||||||
|
}
|
||||||
|
catch { /* nur eine Beschleunigung */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<string> TopLevelNames(ZipArchive zip) =>
|
||||||
|
zip.Entries
|
||||||
|
.Select(e => e.FullName.Replace('\\', '/').Split('/')[0])
|
||||||
|
.Where(n => n.Length > 0)
|
||||||
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
private static void Extract(ZipArchive zip, string dir, Action<double> report)
|
||||||
|
{
|
||||||
|
var root = Path.GetFullPath(dir).TrimEnd('\\') + "\\";
|
||||||
|
long total = Math.Max(1, zip.Entries.Sum(e => e.Length)), done = 0;
|
||||||
|
var buffer = new byte[1 << 20];
|
||||||
|
int lastPercent = -1;
|
||||||
|
|
||||||
|
foreach (var entry in zip.Entries)
|
||||||
|
{
|
||||||
|
var target = Path.GetFullPath(Path.Combine(dir, entry.FullName));
|
||||||
|
if (!target.StartsWith(root, StringComparison.OrdinalIgnoreCase)) continue; // nie außerhalb des Ordners schreiben
|
||||||
|
if (entry.Name.Length == 0)
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(target);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Directory.CreateDirectory(Path.GetDirectoryName(target)!);
|
||||||
|
long before = done;
|
||||||
|
Retry(target, () =>
|
||||||
|
{
|
||||||
|
done = before;
|
||||||
|
MoveAside(target);
|
||||||
|
using var src = entry.Open();
|
||||||
|
using var dst = File.Create(target);
|
||||||
|
int n;
|
||||||
|
while ((n = src.Read(buffer, 0, buffer.Length)) > 0)
|
||||||
|
{
|
||||||
|
dst.Write(buffer, 0, n);
|
||||||
|
done += n;
|
||||||
|
int percent = (int)(done * 100 / total);
|
||||||
|
if (percent != lastPercent)
|
||||||
|
{
|
||||||
|
lastPercent = percent;
|
||||||
|
report(Math.Min(1.0, (double)done / total));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
report(1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Setup ohne angehängte App als Deinstallationsprogramm ablegen (nur ein paar hundert KB).</summary>
|
||||||
|
private static void CopyStub(string path)
|
||||||
|
{
|
||||||
|
long length = Payload.StubLength;
|
||||||
|
using var src = File.OpenRead(SelfPath);
|
||||||
|
using var dst = File.Create(path);
|
||||||
|
var buffer = new byte[81920];
|
||||||
|
long left = length;
|
||||||
|
while (left > 0)
|
||||||
|
{
|
||||||
|
int n = src.Read(buffer, 0, (int)Math.Min(buffer.Length, left));
|
||||||
|
if (n <= 0) break;
|
||||||
|
dst.Write(buffer, 0, n);
|
||||||
|
left -= n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Deinstallieren ----------
|
||||||
|
|
||||||
|
public static void Uninstall(bool removeData, IProgress<(double, string)> progress)
|
||||||
|
{
|
||||||
|
// Nur im eingetragenen Installationsordner löschen – nie dort, wo das Setup zufällig liegt (z. B. Downloads)
|
||||||
|
var dir = InstalledDir;
|
||||||
|
var exe = dir is null ? "" : Path.Combine(dir, ExeName);
|
||||||
|
|
||||||
|
progress.Report((0.1, "DeskHub wird beendet …"));
|
||||||
|
CloseRunningApp(0, dir);
|
||||||
|
|
||||||
|
progress.Report((0.3, "Verknüpfungen werden entfernt …"));
|
||||||
|
DeleteIfPointsTo(StartMenuLink, exe);
|
||||||
|
DeleteIfPointsTo(DesktopLink, exe);
|
||||||
|
|
||||||
|
progress.Report((0.45, "Windows-Einträge werden entfernt …"));
|
||||||
|
RemoveAutostart(exe);
|
||||||
|
Registry.CurrentUser.DeleteSubKeyTree(UninstallKey, throwOnMissingSubKey: false);
|
||||||
|
Registry.CurrentUser.DeleteSubKeyTree(LegacyAppKey, throwOnMissingSubKey: false);
|
||||||
|
// Name/Logo für Windows-Benachrichtigungen (legt die App selbst an)
|
||||||
|
Registry.CurrentUser.DeleteSubKeyTree(@"Software\Classes\AppUserModelId\" + AppUserModelId, throwOnMissingSubKey: false);
|
||||||
|
|
||||||
|
if (removeData && Directory.Exists(DataDir))
|
||||||
|
{
|
||||||
|
progress.Report((0.6, "Anmeldung und Einstellungen werden in den Papierkorb gelegt …"));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Microsoft.VisualBasic.FileIO.FileSystem.DeleteDirectory(DataDir,
|
||||||
|
Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs,
|
||||||
|
Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
progress.Report((0.8, "Dateien werden entfernt …"));
|
||||||
|
if (dir is null) { progress.Report((1.0, "Fertig")); return; }
|
||||||
|
RemoveAppFiles(dir, null);
|
||||||
|
|
||||||
|
// Das laufende Deinstallationsprogramm kann sich nicht selbst löschen → kurz nach dem Beenden per cmd.
|
||||||
|
// rmdir ohne /s entfernt den Ordner nur, wenn er danach leer ist.
|
||||||
|
var self = SelfPath;
|
||||||
|
if (IsUnder(self, dir))
|
||||||
|
{
|
||||||
|
Process.Start(new ProcessStartInfo("cmd.exe",
|
||||||
|
$"/c ping 127.0.0.1 -n 3 > nul & del /f /q \"{self}\" & del /f /q \"{Path.Combine(dir, "*.old")}\" & rmdir \"{dir}\"")
|
||||||
|
{
|
||||||
|
CreateNoWindow = true, UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TryDelete(Path.Combine(dir, UninstallerName));
|
||||||
|
try { Directory.Delete(dir); } catch { } // nur wenn leer
|
||||||
|
}
|
||||||
|
progress.Report((1.0, "Fertig"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Autostart-Einträge entfernen, die die App selbst gesetzt hat (Name vergibt Electron).</summary>
|
||||||
|
private static void RemoveAutostart(string exe)
|
||||||
|
{
|
||||||
|
if (exe.Length == 0) return;
|
||||||
|
using var run = Registry.CurrentUser.OpenSubKey(RunKey, writable: true);
|
||||||
|
if (run is null) return;
|
||||||
|
foreach (var name in run.GetValueNames())
|
||||||
|
{
|
||||||
|
if (run.GetValue(name) is string cmd && cmd.IndexOf(exe, StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
run.DeleteValue(name, throwOnMissingValue: false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Dateien ----------
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Entfernt die App-Dateien aus einem Installationsordner. Gelöscht wird nur, was nachweislich zu DeskHub gehört:
|
||||||
|
/// Einträge aus der Dateiliste der letzten Installation bzw. die Namen aus dem neuen Paket –
|
||||||
|
/// Ordner nur, wenn sie eindeutig von Electron stammen. Fremde Dateien im Ordner bleiben unangetastet.
|
||||||
|
/// </summary>
|
||||||
|
private static void RemoveAppFiles(string dir, IEnumerable<string>? extraNames)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(dir)) return;
|
||||||
|
CleanupOldFiles(dir);
|
||||||
|
var listFile = Path.Combine(dir, FileListName);
|
||||||
|
var fromList = File.Exists(listFile) ? File.ReadAllLines(listFile).Where(l => l.Trim().Length > 0).ToList() : [];
|
||||||
|
var names = fromList.Concat(extraNames ?? []).Concat([UninstallerName, FileListName])
|
||||||
|
.Distinct(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
foreach (var name in names)
|
||||||
|
{
|
||||||
|
if (name.IndexOfAny(['\\', '/', ':']) >= 0 || name is "." or "..") continue;
|
||||||
|
var path = Path.Combine(dir, name);
|
||||||
|
if (SamePath(path, SelfPath)) continue; // das laufende Deinstallationsprogramm räumt cmd weg
|
||||||
|
|
||||||
|
if (Directory.Exists(path))
|
||||||
|
{
|
||||||
|
bool ours = fromList.Contains(name, StringComparer.OrdinalIgnoreCase)
|
||||||
|
|| (name.Equals("resources", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(path, "app.asar")))
|
||||||
|
|| (name.Equals("locales", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(path, "en-US.pak")));
|
||||||
|
if (ours) Retry(path, () => Directory.Delete(path, recursive: true));
|
||||||
|
}
|
||||||
|
else if (File.Exists(path))
|
||||||
|
{
|
||||||
|
Retry(path, () => MoveAside(path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Längster Pfad im Paket. Windows erlaubt (ohne Sonderfreigabe) nur 259 Zeichen pro Pfad –
|
||||||
|
/// der Installationsordner darf deshalb höchstens <see cref="MaxDirLength"/> Zeichen lang sein.
|
||||||
|
/// </summary>
|
||||||
|
private static int? _longestEntry;
|
||||||
|
public static int MaxDirLength
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_longestEntry is null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var zip = Payload.OpenArchive();
|
||||||
|
_longestEntry = zip.Entries.Count == 0 ? 0 : zip.Entries.Max(e => e.FullName.Length);
|
||||||
|
}
|
||||||
|
catch { _longestEntry = 0; }
|
||||||
|
}
|
||||||
|
return 259 - 1 - _longestEntry.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Retry(string path, Action action)
|
||||||
|
{
|
||||||
|
for (int attempt = 1; ; attempt++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
action();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (PathTooLongException ex)
|
||||||
|
{
|
||||||
|
throw new IOException($"Der Installationsordner ist zu lang. Bitte einen kürzeren Ordner wählen (höchstens {MaxDirLength} Zeichen).", ex);
|
||||||
|
}
|
||||||
|
catch (Exception ex) when ((ex is IOException || ex is UnauthorizedAccessException) && attempt < 10)
|
||||||
|
{
|
||||||
|
Thread.Sleep(500);
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
|
{
|
||||||
|
throw new IOException($"„{Path.GetFileName(path)}“ wird noch verwendet. Bitte DeskHub beenden " +
|
||||||
|
"(auch das Symbol im Infobereich neben der Uhr) und erneut versuchen.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Vorhandene Datei löschen oder – falls sie noch geöffnet ist (Explorer, Virenscanner) – beiseite umbenennen.
|
||||||
|
/// Umbenennen klappt unter Windows auch bei geöffneten Dateien, überschreiben nicht.
|
||||||
|
/// </summary>
|
||||||
|
private static void MoveAside(string path)
|
||||||
|
{
|
||||||
|
if (!File.Exists(path)) return;
|
||||||
|
try { File.Delete(path); return; } catch { }
|
||||||
|
File.Move(path, $"{path}.{Guid.NewGuid():N}.old");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CleanupOldFiles(string dir)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(dir)) return;
|
||||||
|
foreach (var f in Directory.GetFiles(dir, "*.old", SearchOption.AllDirectories))
|
||||||
|
try { File.Delete(f); } catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void TryDelete(string path)
|
||||||
|
{
|
||||||
|
try { if (File.Exists(path)) File.Delete(path); } catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void DeleteIfPointsTo(string link, string target)
|
||||||
|
{
|
||||||
|
if (!File.Exists(link) || target.Length == 0) return;
|
||||||
|
if (!SamePath(Shortcut.Target(link) ?? "", target)) return;
|
||||||
|
// Explorer/Indexdienst halten Verknüpfungen manchmal kurz fest → mehrmals versuchen
|
||||||
|
for (int i = 0; i < 10 && File.Exists(link); i++)
|
||||||
|
{
|
||||||
|
try { File.Delete(link); }
|
||||||
|
catch { Thread.Sleep(300); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Prozesse ----------
|
||||||
|
|
||||||
|
private static IEnumerable<Process> AppProcesses(params string?[] dirs)
|
||||||
|
{
|
||||||
|
var roots = dirs.Where(d => !string.IsNullOrEmpty(d)).Select(d => d!).ToList();
|
||||||
|
if (roots.Count == 0) yield break;
|
||||||
|
// App (mehrere Electron-Prozesse)
|
||||||
|
foreach (var p in Process.GetProcessesByName("DeskHub"))
|
||||||
|
{
|
||||||
|
string? file = null;
|
||||||
|
try { file = p.MainModule?.FileName; } catch { }
|
||||||
|
if (file is not null && roots.Any(r => IsUnder(file, r))) yield return p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CloseRunningApp(int waitMs, params string?[] dirs)
|
||||||
|
{
|
||||||
|
var until = DateTime.Now.AddMilliseconds(waitMs);
|
||||||
|
while (waitMs > 0 && DateTime.Now < until && AppProcesses(dirs).Any())
|
||||||
|
Thread.Sleep(300);
|
||||||
|
|
||||||
|
foreach (var p in AppProcesses(dirs).ToList())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
p.Kill();
|
||||||
|
p.WaitForExit(10000);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Helfer ----------
|
||||||
|
|
||||||
|
private static bool SamePath(string a, string b)
|
||||||
|
{
|
||||||
|
try { return string.Equals(Path.GetFullPath(a).TrimEnd('\\'), Path.GetFullPath(b).TrimEnd('\\'), StringComparison.OrdinalIgnoreCase); }
|
||||||
|
catch { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsUnder(string path, string dir) =>
|
||||||
|
Path.GetFullPath(path).StartsWith(Path.GetFullPath(dir).TrimEnd('\\') + "\\", StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
private static long DirSize(string dir)
|
||||||
|
{
|
||||||
|
long sum = 0;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (var f in Directory.EnumerateFiles(dir, "*", SearchOption.AllDirectories))
|
||||||
|
try { sum += new FileInfo(f).Length; } catch { }
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long DataSize() => Directory.Exists(DataDir) ? DirSize(DataDir) : 0;
|
||||||
|
|
||||||
|
public static string FormatSize(long bytes) => bytes switch
|
||||||
|
{
|
||||||
|
< 1024 * 1024 => $"{Math.Max(1, bytes / 1024)} KB",
|
||||||
|
< 1024L * 1024 * 1024 => $"{bytes / 1024.0 / 1024:0.#} MB",
|
||||||
|
_ => $"{bytes / 1024.0 / 1024 / 1024:0.##} GB",
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
namespace DeskHubSetup;
|
||||||
|
|
||||||
|
/// <summary>Platzhalter: DeskHub hat keinen Import aus anderen Programmen. Der Import-Schritt des Assistenten entfällt damit automatisch.</summary>
|
||||||
|
public sealed class FoundLauncher(string name, string path, int count, string unit)
|
||||||
|
{
|
||||||
|
public string Name { get; } = name;
|
||||||
|
public string Path { get; } = path;
|
||||||
|
public int Count { get; } = count;
|
||||||
|
public string Unit { get; } = unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class LauncherImport
|
||||||
|
{
|
||||||
|
public static List<FoundLauncher> Detect() => [];
|
||||||
|
public static void WritePending(List<FoundLauncher> selected) { }
|
||||||
|
}
|
||||||
@@ -0,0 +1,392 @@
|
|||||||
|
<Window x:Class="DeskHubSetup.MainWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
Title="DeskHub Setup" Icon="app.ico" Width="780" Height="520" ResizeMode="CanMinimize"
|
||||||
|
Background="{DynamicResource LayerBrush}" Foreground="{DynamicResource TextBrush}"
|
||||||
|
FontFamily="{DynamicResource UiFont}" FontSize="14"
|
||||||
|
TextOptions.TextFormattingMode="Display" UseLayoutRounding="True"
|
||||||
|
WindowStartupLocation="CenterScreen">
|
||||||
|
|
||||||
|
<WindowChrome.WindowChrome>
|
||||||
|
<WindowChrome CaptionHeight="36" ResizeBorderThickness="0" GlassFrameThickness="0,0,0,1"
|
||||||
|
CornerRadius="0" UseAeroCaptionButtons="False"/>
|
||||||
|
</WindowChrome.WindowChrome>
|
||||||
|
|
||||||
|
<Window.Resources>
|
||||||
|
<!-- Markenfarben der Seitenleiste (in Hell und Dunkel gleich) -->
|
||||||
|
<SolidColorBrush x:Key="SideText" Color="#FFFFFF"/>
|
||||||
|
<SolidColorBrush x:Key="SideTextSecondary" Color="#B9C8E8"/>
|
||||||
|
<SolidColorBrush x:Key="SideTextMuted" Color="#7F95C2"/>
|
||||||
|
<LinearGradientBrush x:Key="BrandGradient" StartPoint="0,0" EndPoint="1,0">
|
||||||
|
<GradientStop Color="#2F6FDB" Offset="0"/>
|
||||||
|
<GradientStop Color="#4FB8F0" Offset="1"/>
|
||||||
|
</LinearGradientBrush>
|
||||||
|
|
||||||
|
<Style x:Key="PageTitle" TargetType="TextBlock">
|
||||||
|
<Setter Property="FontFamily" Value="{DynamicResource DisplayFont}"/>
|
||||||
|
<Setter Property="FontSize" Value="26"/>
|
||||||
|
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||||
|
<Setter Property="Margin" Value="0,0,0,8"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="Body" TargetType="TextBlock">
|
||||||
|
<Setter Property="TextWrapping" Value="Wrap"/>
|
||||||
|
<Setter Property="LineHeight" Value="21"/>
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource TextSecondaryBrush}"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="StepDot" TargetType="Border">
|
||||||
|
<Setter Property="Width" Value="26"/>
|
||||||
|
<Setter Property="Height" Value="26"/>
|
||||||
|
<Setter Property="CornerRadius" Value="13"/>
|
||||||
|
<Setter Property="BorderThickness" Value="1.5"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="StepNum" TargetType="TextBlock">
|
||||||
|
<Setter Property="FontSize" Value="12"/>
|
||||||
|
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Center"/>
|
||||||
|
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="StepLabel" TargetType="TextBlock">
|
||||||
|
<Setter Property="Margin" Value="12,0,0,0"/>
|
||||||
|
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||||
|
<Setter Property="FontSize" Value="13.5"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="StepLine" TargetType="Border">
|
||||||
|
<Setter Property="Width" Value="2"/>
|
||||||
|
<Setter Property="Height" Value="18"/>
|
||||||
|
<Setter Property="Margin" Value="12,3,0,3"/>
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||||
|
<Setter Property="CornerRadius" Value="1"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="FeatureIcon" TargetType="Border">
|
||||||
|
<Setter Property="Width" Value="38"/>
|
||||||
|
<Setter Property="Height" Value="38"/>
|
||||||
|
<Setter Property="CornerRadius" Value="10"/>
|
||||||
|
<Setter Property="Background" Value="{DynamicResource AccentSubtleBrush}"/>
|
||||||
|
<Setter Property="VerticalAlignment" Value="Top"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="FeatureGlyph" TargetType="TextBlock">
|
||||||
|
<Setter Property="FontFamily" Value="{DynamicResource IconFont}"/>
|
||||||
|
<Setter Property="FontSize" Value="17"/>
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource AccentBrush}"/>
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Center"/>
|
||||||
|
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="FeatureTitle" TargetType="TextBlock">
|
||||||
|
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||||
|
<Setter Property="FontSize" Value="13.5"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="FeatureText" TargetType="TextBlock">
|
||||||
|
<Setter Property="FontSize" Value="12"/>
|
||||||
|
<Setter Property="TextWrapping" Value="Wrap"/>
|
||||||
|
<Setter Property="Margin" Value="0,2,0,0"/>
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource TextSecondaryBrush}"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="Card" TargetType="Border">
|
||||||
|
<Setter Property="Padding" Value="16,14"/>
|
||||||
|
<Setter Property="CornerRadius" Value="8"/>
|
||||||
|
<Setter Property="Background" Value="{DynamicResource ControlFillBrush}"/>
|
||||||
|
<Setter Property="BorderBrush" Value="{DynamicResource ControlStrokeBrush}"/>
|
||||||
|
<Setter Property="BorderThickness" Value="1"/>
|
||||||
|
</Style>
|
||||||
|
</Window.Resources>
|
||||||
|
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="36"/>
|
||||||
|
<RowDefinition Height="*"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="250"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<!-- ===== Seitenleiste im DeskHub-Look ===== -->
|
||||||
|
<Border Grid.RowSpan="3" ClipToBounds="True">
|
||||||
|
<Border.Background>
|
||||||
|
<LinearGradientBrush StartPoint="0,0" EndPoint="0.6,1">
|
||||||
|
<GradientStop Color="#0C1630" Offset="0"/>
|
||||||
|
<GradientStop Color="#112452" Offset="0.55"/>
|
||||||
|
<GradientStop Color="#173A86" Offset="1"/>
|
||||||
|
</LinearGradientBrush>
|
||||||
|
</Border.Background>
|
||||||
|
<Grid>
|
||||||
|
<!-- Lichtschein hinter dem Logo und unten -->
|
||||||
|
<Ellipse Width="320" Height="320" Margin="-120,-110,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" IsHitTestVisible="False">
|
||||||
|
<Ellipse.Fill>
|
||||||
|
<RadialGradientBrush>
|
||||||
|
<GradientStop Color="#664A86EA" Offset="0"/>
|
||||||
|
<GradientStop Color="#004A86EA" Offset="1"/>
|
||||||
|
</RadialGradientBrush>
|
||||||
|
</Ellipse.Fill>
|
||||||
|
</Ellipse>
|
||||||
|
<Ellipse Width="300" Height="300" Margin="0,0,-150,-150" HorizontalAlignment="Right" VerticalAlignment="Bottom" IsHitTestVisible="False">
|
||||||
|
<Ellipse.Fill>
|
||||||
|
<RadialGradientBrush>
|
||||||
|
<GradientStop Color="#444FB8F0" Offset="0"/>
|
||||||
|
<GradientStop Color="#004FB8F0" Offset="1"/>
|
||||||
|
</RadialGradientBrush>
|
||||||
|
</Ellipse.Fill>
|
||||||
|
</Ellipse>
|
||||||
|
|
||||||
|
<StackPanel Margin="30,64,24,0">
|
||||||
|
<Image Source="app.png" Width="68" Height="68" HorizontalAlignment="Left" RenderOptions.BitmapScalingMode="HighQuality">
|
||||||
|
<Image.Effect>
|
||||||
|
<DropShadowEffect Color="#4A86EA" BlurRadius="28" ShadowDepth="0" Opacity="0.75"/>
|
||||||
|
</Image.Effect>
|
||||||
|
</Image>
|
||||||
|
<TextBlock Text="DeskHub" FontFamily="{DynamicResource DisplayFont}" FontSize="26" FontWeight="SemiBold"
|
||||||
|
Foreground="{StaticResource SideText}" Margin="0,16,0,0"/>
|
||||||
|
<TextBlock x:Name="VersionText" Foreground="{StaticResource SideTextSecondary}" FontSize="12" Margin="0,2,0,0"/>
|
||||||
|
|
||||||
|
<StackPanel x:Name="Steps" Margin="0,38,0,0">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Border x:Name="Dot0" Style="{StaticResource StepDot}"><TextBlock x:Name="Num0" Text="1" Style="{StaticResource StepNum}"/></Border>
|
||||||
|
<TextBlock x:Name="Label0" Text="Willkommen" Style="{StaticResource StepLabel}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<Border x:Name="Line0" Style="{StaticResource StepLine}"/>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Border x:Name="Dot1" Style="{StaticResource StepDot}"><TextBlock x:Name="Num1" Text="2" Style="{StaticResource StepNum}"/></Border>
|
||||||
|
<TextBlock x:Name="Label1" Text="Lizenz" Style="{StaticResource StepLabel}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<Border x:Name="Line1" Style="{StaticResource StepLine}"/>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Border x:Name="Dot2" Style="{StaticResource StepDot}"><TextBlock x:Name="Num2" Text="3" Style="{StaticResource StepNum}"/></Border>
|
||||||
|
<TextBlock x:Name="Label2" Text="Optionen" Style="{StaticResource StepLabel}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<Border x:Name="Line2" Style="{StaticResource StepLine}"/>
|
||||||
|
<!-- Import: nur sichtbar, wenn andere Launcher gefunden wurden -->
|
||||||
|
<StackPanel x:Name="ImportStepRow" Orientation="Horizontal">
|
||||||
|
<Border x:Name="Dot3" Style="{StaticResource StepDot}"><TextBlock x:Name="Num3" Text="4" Style="{StaticResource StepNum}"/></Border>
|
||||||
|
<TextBlock x:Name="Label3" Text="Import" Style="{StaticResource StepLabel}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<Border x:Name="Line3" Style="{StaticResource StepLine}"/>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Border x:Name="Dot4" Style="{StaticResource StepDot}"><TextBlock x:Name="Num4" Text="5" Style="{StaticResource StepNum}"/></Border>
|
||||||
|
<TextBlock x:Name="Label4" Text="Installation" Style="{StaticResource StepLabel}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<TextBlock Text="© M_Viper · m-viper.de" FontSize="11" Foreground="{StaticResource SideTextMuted}"
|
||||||
|
VerticalAlignment="Bottom" Margin="30,0,0,20"/>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- Titelleiste -->
|
||||||
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="14,0,0,0">
|
||||||
|
<Image Source="app.ico" Width="16" Height="16" RenderOptions.BitmapScalingMode="HighQuality"/>
|
||||||
|
<TextBlock x:Name="WindowTitle" Text="DeskHub Setup" FontSize="12" Margin="10,0,0,0" VerticalAlignment="Center"
|
||||||
|
Foreground="{StaticResource SideTextSecondary}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top">
|
||||||
|
<Button Style="{StaticResource CaptionButton}" Content="" Click="Minimize_Click"
|
||||||
|
WindowChrome.IsHitTestVisibleInChrome="True"/>
|
||||||
|
<Button x:Name="CloseButton" Style="{StaticResource CloseCaptionButton}" Content="" Click="Cancel_Click"
|
||||||
|
WindowChrome.IsHitTestVisibleInChrome="True"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- ===== Inhalt ===== -->
|
||||||
|
<Grid Grid.Row="1" Grid.Column="1" Margin="40,18,40,0">
|
||||||
|
|
||||||
|
<!-- 0: Willkommen -->
|
||||||
|
<StackPanel x:Name="PageWelcome">
|
||||||
|
<TextBlock Text="Willkommen bei DeskHub" Style="{StaticResource PageTitle}"/>
|
||||||
|
<TextBlock Style="{StaticResource Body}"
|
||||||
|
Text="Der Assistent richtet DeskHub in wenigen Schritten ein – nur für dein Benutzerkonto und ohne Administratorrechte."/>
|
||||||
|
|
||||||
|
<Grid Margin="0,24,0,0">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="20"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="18"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<DockPanel>
|
||||||
|
<Border Style="{StaticResource FeatureIcon}" DockPanel.Dock="Left"><TextBlock Text="" Style="{StaticResource FeatureGlyph}"/></Border>
|
||||||
|
<StackPanel Margin="12,0,0,0">
|
||||||
|
<TextBlock Text="Tickets bearbeiten" Style="{StaticResource FeatureTitle}"/>
|
||||||
|
<TextBlock Text="Antworten, Notizen, Status und Zuweisung" Style="{StaticResource FeatureText}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DockPanel>
|
||||||
|
<DockPanel Grid.Column="2">
|
||||||
|
<Border Style="{StaticResource FeatureIcon}" DockPanel.Dock="Left"><TextBlock Text="" Style="{StaticResource FeatureGlyph}"/></Border>
|
||||||
|
<StackPanel Margin="12,0,0,0">
|
||||||
|
<TextBlock Text="Benachrichtigungen" Style="{StaticResource FeatureTitle}"/>
|
||||||
|
<TextBlock Text="Neue Tickets und Antworten sofort sehen" Style="{StaticResource FeatureText}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DockPanel>
|
||||||
|
<DockPanel Grid.Row="2">
|
||||||
|
<Border Style="{StaticResource FeatureIcon}" DockPanel.Dock="Left"><TextBlock Text="" Style="{StaticResource FeatureGlyph}"/></Border>
|
||||||
|
<StackPanel Margin="12,0,0,0">
|
||||||
|
<TextBlock Text="Team-Chat" Style="{StaticResource FeatureTitle}"/>
|
||||||
|
<TextBlock Text="Live-Chat, Aufgaben und Verfügbarkeit" Style="{StaticResource FeatureText}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DockPanel>
|
||||||
|
<DockPanel Grid.Row="2" Grid.Column="2">
|
||||||
|
<Border Style="{StaticResource FeatureIcon}" DockPanel.Dock="Left"><TextBlock Text="" Style="{StaticResource FeatureGlyph}"/></Border>
|
||||||
|
<StackPanel Margin="12,0,0,0">
|
||||||
|
<TextBlock Text="Deine Rechte" Style="{StaticResource FeatureTitle}"/>
|
||||||
|
<TextBlock Text="Wie in der Android-App – nur was du darfst" Style="{StaticResource FeatureText}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DockPanel>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Border x:Name="UpdateHint" Margin="0,26,0,0" Padding="14,10" CornerRadius="8" Visibility="Collapsed"
|
||||||
|
Background="{DynamicResource AccentSubtleBrush}" BorderBrush="{DynamicResource AccentSubtleStrokeBrush}" BorderThickness="1">
|
||||||
|
<DockPanel>
|
||||||
|
<TextBlock DockPanel.Dock="Left" Text="" FontFamily="{DynamicResource IconFont}" FontSize="16"
|
||||||
|
Foreground="{DynamicResource AccentBrush}" Margin="0,2,12,0" VerticalAlignment="Top"/>
|
||||||
|
<TextBlock x:Name="UpdateHintText" TextWrapping="Wrap" LineHeight="20" FontSize="13"/>
|
||||||
|
</DockPanel>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="RunningHint" Margin="0,10,0,0" Padding="14,10" CornerRadius="8" Visibility="Collapsed"
|
||||||
|
Background="{DynamicResource ControlFillBrush}" BorderBrush="{DynamicResource ControlStrokeBrush}" BorderThickness="1">
|
||||||
|
<DockPanel>
|
||||||
|
<TextBlock DockPanel.Dock="Left" Text="" FontFamily="{DynamicResource IconFont}" FontSize="16"
|
||||||
|
Foreground="{DynamicResource AccentBrush}" Margin="0,2,12,0" VerticalAlignment="Top"/>
|
||||||
|
<TextBlock TextWrapping="Wrap" LineHeight="20" FontSize="13"
|
||||||
|
Text="DeskHub läuft gerade und wird für die Installation automatisch beendet."/>
|
||||||
|
</DockPanel>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- 1: Lizenz -->
|
||||||
|
<DockPanel x:Name="PageLicense" Visibility="Collapsed">
|
||||||
|
<TextBlock DockPanel.Dock="Top" Text="Lizenz" Style="{StaticResource PageTitle}"/>
|
||||||
|
<TextBlock DockPanel.Dock="Top" Style="{StaticResource Body}" Margin="0,0,0,14"
|
||||||
|
Text="Bitte lies die Nutzungshinweise."/>
|
||||||
|
<CheckBox x:Name="AcceptLicense" DockPanel.Dock="Bottom" Margin="0,14,0,0"
|
||||||
|
Checked="AcceptLicense_Click" Unchecked="AcceptLicense_Click"
|
||||||
|
Content="Ich akzeptiere die Lizenz- und Nutzungsbedingungen"/>
|
||||||
|
<Border Background="{DynamicResource ControlFillBrush}" BorderBrush="{DynamicResource ControlStrokeBrush}"
|
||||||
|
BorderThickness="1" CornerRadius="8">
|
||||||
|
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||||
|
<!-- wird aus LICENSE aufgebaut: Überschriften, Absätze, Aufzählungen (siehe ZeigeLizenz) -->
|
||||||
|
<StackPanel x:Name="LicensePanel" Margin="16,12,16,14"/>
|
||||||
|
</ScrollViewer>
|
||||||
|
</Border>
|
||||||
|
</DockPanel>
|
||||||
|
|
||||||
|
<!-- 2: Optionen -->
|
||||||
|
<StackPanel x:Name="PageOptions" Visibility="Collapsed">
|
||||||
|
<TextBlock Text="Optionen" Style="{StaticResource PageTitle}"/>
|
||||||
|
<TextBlock Style="{StaticResource Body}" Text="Wohin soll DeskHub installiert werden?"/>
|
||||||
|
|
||||||
|
<Border Style="{StaticResource Card}" Margin="0,18,0,0">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Text="Installationsordner" FontWeight="SemiBold" FontSize="13" Margin="0,0,0,10"/>
|
||||||
|
<DockPanel>
|
||||||
|
<Button DockPanel.Dock="Right" Content="Ändern …" Margin="8,0,0,0" Click="ChangeDir_Click"/>
|
||||||
|
<TextBox x:Name="DirBox"/>
|
||||||
|
</DockPanel>
|
||||||
|
<TextBlock Style="{StaticResource Body}" FontSize="12" LineHeight="18" Margin="0,10,0,0"
|
||||||
|
Text="Benötigt ca. 300 MB. Deine Anmeldung und Einstellungen liegen getrennt davon und bleiben bei Updates erhalten."/>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{StaticResource Card}" Margin="0,12,0,0">
|
||||||
|
<StackPanel>
|
||||||
|
<CheckBox x:Name="DesktopLinkBox" Content="Verknüpfung auf dem Desktop" IsChecked="True"/>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- 3: Import aus anderen Launchern (optional) -->
|
||||||
|
<StackPanel x:Name="PageImport" Visibility="Collapsed">
|
||||||
|
<TextBlock Text="Import" Style="{StaticResource PageTitle}"/>
|
||||||
|
<TextBlock Style="{StaticResource Body}"
|
||||||
|
Text="Optional: Diese Programme wurden auf deinem PC gefunden. Was du ankreuzt, bietet DeskHub beim ersten Start zum Übernehmen an – dort wählst du die einzelnen Instanzen aus."/>
|
||||||
|
<Border Style="{StaticResource Card}" Margin="0,18,0,0" Padding="16,6">
|
||||||
|
<StackPanel x:Name="ImportList"/>
|
||||||
|
</Border>
|
||||||
|
<TextBlock Style="{StaticResource Body}" FontSize="12" LineHeight="18" Margin="0,12,0,0"
|
||||||
|
Text="In den anderen Launchern wird nichts verändert – DeskHub legt Kopien an. Später geht das jederzeit über „Importieren“ in der Toolleiste."/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- 4: Fortschritt / Fertig -->
|
||||||
|
<StackPanel x:Name="PageProgress" Visibility="Collapsed">
|
||||||
|
<Border x:Name="SuccessIcon" Width="64" Height="64" CornerRadius="32" HorizontalAlignment="Left" Margin="0,4,0,20"
|
||||||
|
Background="{StaticResource BrandGradient}" RenderTransformOrigin="0.5,0.5" Visibility="Collapsed">
|
||||||
|
<Border.RenderTransform><ScaleTransform x:Name="SuccessScale" ScaleX="1" ScaleY="1"/></Border.RenderTransform>
|
||||||
|
<Border.Effect><DropShadowEffect Color="#4A86EA" BlurRadius="24" ShadowDepth="0" Opacity="0.55"/></Border.Effect>
|
||||||
|
<TextBlock Text="" FontFamily="{DynamicResource IconFont}" FontSize="26" Foreground="White"
|
||||||
|
HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||||
|
</Border>
|
||||||
|
<TextBlock x:Name="ProgressTitle" Text="DeskHub wird installiert …" Style="{StaticResource PageTitle}"/>
|
||||||
|
|
||||||
|
<StackPanel x:Name="ProgressBarPanel" Margin="0,18,0,0">
|
||||||
|
<TextBlock x:Name="PercentText" Text="0 %" FontFamily="{DynamicResource DisplayFont}" FontSize="44" FontWeight="SemiBold"
|
||||||
|
Foreground="{DynamicResource AccentBrush}"/>
|
||||||
|
<Border x:Name="ProgressTrack" SizeChanged="ProgressTrack_SizeChanged" Height="8" CornerRadius="4" Margin="0,10,0,0" Background="{DynamicResource SubtleSelectedBrush}">
|
||||||
|
<Border x:Name="ProgressFill" HorizontalAlignment="Left" Width="0" CornerRadius="4" Background="{StaticResource BrandGradient}"/>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<TextBlock x:Name="ProgressText" Style="{StaticResource Body}" Margin="0,12,0,0" Text="Einen Moment bitte."/>
|
||||||
|
|
||||||
|
<StackPanel x:Name="DonePanel" Visibility="Collapsed">
|
||||||
|
<CheckBox x:Name="LaunchBox" Content="DeskHub jetzt starten" IsChecked="True" Margin="0,24,0,0"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- Deinstallation -->
|
||||||
|
<StackPanel x:Name="PageUninstall" Visibility="Collapsed">
|
||||||
|
<TextBlock Text="DeskHub deinstallieren" Style="{StaticResource PageTitle}"/>
|
||||||
|
<TextBlock Style="{StaticResource Body}"
|
||||||
|
Text="DeskHub wird von deinem PC entfernt: Programm, Verknüpfungen, Autostart und der Eintrag in den Windows-Einstellungen."/>
|
||||||
|
<Border Style="{StaticResource Card}" Margin="0,22,0,0">
|
||||||
|
<StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock Text="" FontFamily="{DynamicResource IconFont}" FontSize="15" Foreground="{DynamicResource AccentBrush}"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
<TextBlock Text="Deine Anmeldung und Einstellungen bleiben erhalten" FontWeight="SemiBold" Margin="10,0,0,0" VerticalAlignment="Center"/>
|
||||||
|
</StackPanel>
|
||||||
|
<TextBlock x:Name="DataInfo" Style="{StaticResource Body}" FontSize="12.5" Margin="0,6,0,14"/>
|
||||||
|
<CheckBox x:Name="RemoveDataBox" Content="Auch Anmeldung und Einstellungen löschen"
|
||||||
|
Checked="RemoveDataBox_Click" Unchecked="RemoveDataBox_Click"/>
|
||||||
|
<TextBlock x:Name="RemoveDataWarning" Visibility="Collapsed" Margin="30,8,0,0" TextWrapping="Wrap" FontSize="12.5"
|
||||||
|
Foreground="{DynamicResource DangerBrush}"
|
||||||
|
Text="Achtung: Damit wird die gespeicherte Anmeldung (Server-Adresse und Token) in den Papierkorb gelegt. Deine Tickets liegen auf dem Server und sind nicht betroffen."/>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<!-- Fußleiste -->
|
||||||
|
<StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,14,40,24">
|
||||||
|
<Button x:Name="BackButton" Content="Zurück" Width="110" Margin="0,0,8,0" Click="Back_Click"/>
|
||||||
|
<Button x:Name="NextButton" Content="Weiter" Width="140" Margin="0,0,8,0" Style="{StaticResource AccentButton}" IsDefault="True" Click="Next_Click"/>
|
||||||
|
<Button x:Name="CancelButton" Content="Abbrechen" Width="110" Click="Cancel_Click"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- Eigene Rückfrage im Setup-Look statt Windows-Meldungsfenster (siehe Frage()) -->
|
||||||
|
<Grid x:Name="DialogOverlay" Grid.RowSpan="3" Grid.ColumnSpan="2" Visibility="Collapsed" Background="#99000000">
|
||||||
|
<Border x:Name="DialogCard" Width="420" HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||||
|
Background="{DynamicResource LayerBrush}" BorderBrush="{DynamicResource ControlStrokeBrush}" BorderThickness="1"
|
||||||
|
CornerRadius="10" Padding="26,22,22,18" Effect="{StaticResource DialogShadow}" RenderTransformOrigin="0.5,0.5">
|
||||||
|
<Border.RenderTransform><ScaleTransform x:Name="DialogScale" ScaleX="1" ScaleY="1"/></Border.RenderTransform>
|
||||||
|
<StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Border Width="34" Height="34" CornerRadius="17" Background="{DynamicResource AccentSubtleBrush}" VerticalAlignment="Top">
|
||||||
|
<TextBlock x:Name="DialogIcon" Text="" FontFamily="{DynamicResource IconFont}" FontSize="16"
|
||||||
|
Foreground="{DynamicResource AccentBrush}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||||
|
</Border>
|
||||||
|
<TextBlock x:Name="DialogTitle" FontFamily="{DynamicResource DisplayFont}" FontSize="18" FontWeight="SemiBold"
|
||||||
|
VerticalAlignment="Center" Margin="12,0,0,0" TextWrapping="Wrap" MaxWidth="320"/>
|
||||||
|
</StackPanel>
|
||||||
|
<TextBlock x:Name="DialogText" TextWrapping="Wrap" LineHeight="20" Margin="46,8,0,0"
|
||||||
|
Foreground="{DynamicResource TextSecondaryBrush}"/>
|
||||||
|
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,22,0,0">
|
||||||
|
<Button x:Name="DialogSecondary" MinWidth="120" Margin="0,0,8,0" Click="DialogSecondary_Click"/>
|
||||||
|
<Button x:Name="DialogPrimary" MinWidth="130" Style="{StaticResource AccentButton}" Click="DialogPrimary_Click"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
||||||
@@ -0,0 +1,619 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Animation;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
|
||||||
|
namespace DeskHubSetup;
|
||||||
|
|
||||||
|
public partial class MainWindow : Window
|
||||||
|
{
|
||||||
|
private readonly SetupMode _mode;
|
||||||
|
private int _page;
|
||||||
|
private bool _busy;
|
||||||
|
private bool _done;
|
||||||
|
private string? _installedExe;
|
||||||
|
// andere Launcher für den optionalen Import (leer → Import-Schritt entfällt)
|
||||||
|
private List<FoundLauncher> _found = [];
|
||||||
|
private bool HasImport => _found.Count > 0;
|
||||||
|
|
||||||
|
private const int PageNumImport = 3;
|
||||||
|
private const int PageNumProgress = 4;
|
||||||
|
|
||||||
|
public MainWindow(SetupMode mode)
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
_mode = mode;
|
||||||
|
VersionText.Text = $"Version {Installer.Version}";
|
||||||
|
ZeigeLizenz(Installer.LicenseText);
|
||||||
|
|
||||||
|
var installed = Installer.InstalledDir;
|
||||||
|
DirBox.Text = installed ?? Installer.DefaultDir;
|
||||||
|
DesktopLinkBox.IsChecked = installed is null || Installer.DesktopLinkExists;
|
||||||
|
|
||||||
|
if (installed is not null)
|
||||||
|
{
|
||||||
|
UpdateHint.Visibility = Visibility.Visible;
|
||||||
|
UpdateHintText.Text = Installer.InstalledVersion == Installer.Version
|
||||||
|
? $"DeskHub {Installer.Version} ist bereits installiert und wird neu installiert. Deine Anmeldung und Einstellungen bleiben erhalten."
|
||||||
|
: $"Die vorhandene Installation{(Installer.InstalledVersion is { } v ? $" (Version {v})" : "")} wird durch Version {Installer.Version} ersetzt. Deine Anmeldung und Einstellungen bleiben erhalten.";
|
||||||
|
}
|
||||||
|
if (Installer.IsRunning(installed)) RunningHint.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case SetupMode.Uninstall:
|
||||||
|
Title = WindowTitle.Text = "DeskHub deinstallieren";
|
||||||
|
Steps.Visibility = Visibility.Collapsed;
|
||||||
|
ShowOnly(PageUninstall);
|
||||||
|
NextButton.Content = "Deinstallieren";
|
||||||
|
BackButton.Visibility = Visibility.Collapsed;
|
||||||
|
LoadDataInfo();
|
||||||
|
break;
|
||||||
|
case SetupMode.Update:
|
||||||
|
// aus der App heraus: ohne Rückfragen direkt aktualisieren und danach wieder starten
|
||||||
|
Title = WindowTitle.Text = "DeskHub wird aktualisiert";
|
||||||
|
Steps.Visibility = Visibility.Collapsed;
|
||||||
|
Loaded += async (_, _) => await RunInstall(DirBox.Text, DesktopLinkBox.IsChecked == true, update: true);
|
||||||
|
ShowOnly(PageProgress);
|
||||||
|
ProgressTitle.Text = "DeskHub wird aktualisiert …";
|
||||||
|
BackButton.Visibility = Visibility.Hidden;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SetupImportPage();
|
||||||
|
ShowPage(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Lizenztext ----------
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// LICENSE ist für die Textansicht auf ~80 Zeichen umbrochen und eingerückt. Hier wird das
|
||||||
|
/// wieder zu fließendem Text zusammengesetzt, damit der Umbruch zur Fensterbreite passt:
|
||||||
|
/// Leerzeilen trennen Abschnitte, "1. …" sind Überschriften, "- …" Aufzählungspunkte
|
||||||
|
/// (Folgezeilen gehören zum Punkt), alles andere ist Absatztext.
|
||||||
|
/// </summary>
|
||||||
|
private void ZeigeLizenz(string text)
|
||||||
|
{
|
||||||
|
LicensePanel.Children.Clear();
|
||||||
|
var abschnitte = new List<List<string>>();
|
||||||
|
var aktuell = new List<string>();
|
||||||
|
foreach (var zeile in text.Replace("\r", "").Split('\n'))
|
||||||
|
{
|
||||||
|
if (zeile.Trim().Length == 0)
|
||||||
|
{
|
||||||
|
if (aktuell.Count > 0) { abschnitte.Add(aktuell); aktuell = []; }
|
||||||
|
}
|
||||||
|
else aktuell.Add(zeile);
|
||||||
|
}
|
||||||
|
if (aktuell.Count > 0) abschnitte.Add(aktuell);
|
||||||
|
|
||||||
|
for (int a = 0; a < abschnitte.Count; a++)
|
||||||
|
{
|
||||||
|
var abschnitt = abschnitte[a];
|
||||||
|
int i = 0;
|
||||||
|
if (a == 0)
|
||||||
|
{
|
||||||
|
LicensePanel.Children.Add(LizenzText(abschnitt[0].Trim(), 14, FontWeights.SemiBold, "TextBrush", 0));
|
||||||
|
i = 1;
|
||||||
|
}
|
||||||
|
else if (System.Text.RegularExpressions.Regex.IsMatch(abschnitt[0], @"^\s*\d+\.\s"))
|
||||||
|
{
|
||||||
|
LicensePanel.Children.Add(LizenzText(abschnitt[0].Trim(), 13, FontWeights.SemiBold, "TextBrush", 14));
|
||||||
|
i = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// nach einer Überschrift eng anschließen, sonst Abstand zum vorigen Abschnitt
|
||||||
|
double absatzAbstand = i == 1 && a > 0 ? 4 : 10;
|
||||||
|
var absatz = new System.Text.StringBuilder();
|
||||||
|
string? punkt = null;
|
||||||
|
void AbsatzFertig()
|
||||||
|
{
|
||||||
|
if (absatz.Length == 0) return;
|
||||||
|
LicensePanel.Children.Add(LizenzText(absatz.ToString(), 12.5, FontWeights.Normal, "TextSecondaryBrush", absatzAbstand));
|
||||||
|
absatz.Clear();
|
||||||
|
}
|
||||||
|
void PunktFertig()
|
||||||
|
{
|
||||||
|
if (punkt is null) return;
|
||||||
|
LicensePanel.Children.Add(LizenzPunkt(punkt));
|
||||||
|
punkt = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i < abschnitt.Count; i++)
|
||||||
|
{
|
||||||
|
var t = abschnitt[i].Trim();
|
||||||
|
if (t.StartsWith("- "))
|
||||||
|
{
|
||||||
|
AbsatzFertig();
|
||||||
|
PunktFertig();
|
||||||
|
punkt = t.Substring(2).Trim();
|
||||||
|
}
|
||||||
|
else if (punkt is not null) punkt += " " + t;
|
||||||
|
else absatz.Append(absatz.Length > 0 ? " " : "").Append(t);
|
||||||
|
}
|
||||||
|
AbsatzFertig();
|
||||||
|
PunktFertig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TextBlock LizenzText(string text, double groesse, FontWeight gewicht, string farbe, double abstandOben)
|
||||||
|
{
|
||||||
|
var tb = new TextBlock
|
||||||
|
{
|
||||||
|
Text = text,
|
||||||
|
TextWrapping = TextWrapping.Wrap,
|
||||||
|
FontSize = groesse,
|
||||||
|
FontWeight = gewicht,
|
||||||
|
LineHeight = groesse + 6,
|
||||||
|
Margin = new Thickness(0, abstandOben, 0, 0),
|
||||||
|
};
|
||||||
|
tb.SetResourceReference(TextBlock.ForegroundProperty, farbe);
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aufzählungspunkt mit hängendem Einzug (umbrochene Zeilen beginnen unter dem Text, nicht unter dem Punkt)
|
||||||
|
private Grid LizenzPunkt(string text)
|
||||||
|
{
|
||||||
|
var grid = new Grid { Margin = new Thickness(4, 4, 0, 0) };
|
||||||
|
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(16) });
|
||||||
|
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
|
||||||
|
var punkt = LizenzText("•", 12.5, FontWeights.Normal, "AccentBrush", 0);
|
||||||
|
var inhalt = LizenzText(text, 12.5, FontWeights.Normal, "TextSecondaryBrush", 0);
|
||||||
|
Grid.SetColumn(inhalt, 1);
|
||||||
|
grid.Children.Add(punkt);
|
||||||
|
grid.Children.Add(inhalt);
|
||||||
|
return grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Seiten ----------
|
||||||
|
|
||||||
|
private UIElement? _shownPage;
|
||||||
|
|
||||||
|
/// <summary>Seite wechseln – mit kurzem Einblenden von rechts.</summary>
|
||||||
|
private void ShowOnly(UIElement page)
|
||||||
|
{
|
||||||
|
foreach (var p in new UIElement[] { PageWelcome, PageLicense, PageOptions, PageImport, PageProgress, PageUninstall })
|
||||||
|
p.Visibility = p == page ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
if (page == _shownPage) return;
|
||||||
|
_shownPage = page;
|
||||||
|
|
||||||
|
var ease = new CubicEase { EasingMode = EasingMode.EaseOut };
|
||||||
|
var slide = new TranslateTransform(18, 0);
|
||||||
|
page.RenderTransform = slide;
|
||||||
|
slide.BeginAnimation(TranslateTransform.XProperty, new DoubleAnimation(18, 0, TimeSpan.FromMilliseconds(260)) { EasingFunction = ease });
|
||||||
|
page.BeginAnimation(OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(220)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Farben der Schritt-Anzeige in der (immer dunkelblauen) Seitenleiste
|
||||||
|
private static readonly Brush StepDoneFill = Frozen(Color.FromRgb(0x4A, 0x86, 0xEA));
|
||||||
|
private static readonly Brush StepCurrentFill = Brushes.White;
|
||||||
|
private static readonly Brush StepCurrentText = Frozen(Color.FromRgb(0x1C, 0x4E, 0xB8));
|
||||||
|
private static readonly Brush StepUpcoming = Frozen(Color.FromRgb(0x7F, 0x95, 0xC2));
|
||||||
|
private static readonly Brush StepUpcomingStroke = Frozen(Color.FromRgb(0x46, 0x5E, 0x92));
|
||||||
|
private static readonly Brush StepDoneText = Frozen(Color.FromRgb(0xB9, 0xC8, 0xE8));
|
||||||
|
private static readonly Brush StepLineIdle = Frozen(Color.FromRgb(0x2E, 0x45, 0x78));
|
||||||
|
|
||||||
|
private static Brush Frozen(Color c)
|
||||||
|
{
|
||||||
|
var b = new SolidColorBrush(c);
|
||||||
|
b.Freeze();
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateSteps(int page)
|
||||||
|
{
|
||||||
|
var dots = new[] { Dot0, Dot1, Dot2, Dot3, Dot4 };
|
||||||
|
var nums = new[] { Num0, Num1, Num2, Num3, Num4 };
|
||||||
|
var labels = new[] { Label0, Label1, Label2, Label3, Label4 };
|
||||||
|
var lines = new[] { Line0, Line1, Line2, Line3 };
|
||||||
|
var iconFont = (FontFamily)FindResource("IconFont");
|
||||||
|
var uiFont = (FontFamily)FindResource("UiFont");
|
||||||
|
|
||||||
|
// ohne gefundene Launcher fällt der Import-Schritt weg → Nummern rücken auf
|
||||||
|
ImportStepRow.Visibility = Line3.Visibility = HasImport ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
int number = 0;
|
||||||
|
for (int i = 0; i < dots.Length; i++)
|
||||||
|
{
|
||||||
|
if (i == PageNumImport && !HasImport) continue;
|
||||||
|
number++;
|
||||||
|
bool done = i < page || (_done && i == page);
|
||||||
|
bool current = i == page && !done;
|
||||||
|
dots[i].Background = done ? StepDoneFill : current ? StepCurrentFill : Brushes.Transparent;
|
||||||
|
dots[i].BorderBrush = done ? StepDoneFill : current ? StepCurrentFill : StepUpcomingStroke;
|
||||||
|
nums[i].Text = done ? "" : number.ToString();
|
||||||
|
nums[i].FontFamily = done ? iconFont : uiFont;
|
||||||
|
nums[i].FontSize = done ? 11 : 12;
|
||||||
|
nums[i].Foreground = done ? Brushes.White : current ? StepCurrentText : StepUpcoming;
|
||||||
|
labels[i].Foreground = current ? Brushes.White : done ? StepDoneText : StepUpcoming;
|
||||||
|
labels[i].FontWeight = current ? FontWeights.SemiBold : FontWeights.Normal;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < lines.Length; i++)
|
||||||
|
lines[i].Background = i < page ? StepDoneFill : StepLineIdle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ShowPage(int page)
|
||||||
|
{
|
||||||
|
_page = page;
|
||||||
|
ShowOnly(page switch { 0 => PageWelcome, 1 => PageLicense, 2 => PageOptions, PageNumImport => PageImport, _ => PageProgress });
|
||||||
|
UpdateSteps(page);
|
||||||
|
|
||||||
|
BackButton.Visibility = page is 1 or 2 or PageNumImport ? Visibility.Visible : Visibility.Hidden;
|
||||||
|
NextButton.Content = page switch
|
||||||
|
{
|
||||||
|
2 => HasImport ? "Weiter" : "Installieren",
|
||||||
|
PageNumImport => "Installieren",
|
||||||
|
PageNumProgress => "Fertigstellen",
|
||||||
|
_ => "Weiter",
|
||||||
|
};
|
||||||
|
NextButton.IsEnabled = page != 1 || AcceptLicense.IsChecked == true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AcceptLicense_Click(object sender, RoutedEventArgs e) => NextButton.IsEnabled = AcceptLicense.IsChecked == true;
|
||||||
|
|
||||||
|
private void Back_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (!_busy && _page > 0) ShowPage(_page - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Next_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (_busy) return;
|
||||||
|
|
||||||
|
if (_mode == SetupMode.Uninstall)
|
||||||
|
{
|
||||||
|
if (_done) { Close(); return; }
|
||||||
|
await RunUninstall();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_mode == SetupMode.Update)
|
||||||
|
{
|
||||||
|
Close(); // nur nach einem Fehler erreichbar
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (_page)
|
||||||
|
{
|
||||||
|
case 0: ShowPage(1); break;
|
||||||
|
case 1 when AcceptLicense.IsChecked == true: ShowPage(2); break;
|
||||||
|
case 2:
|
||||||
|
var dir = DirBox.Text.Trim();
|
||||||
|
if (!IsFullPath(dir) || dir.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
|
||||||
|
{
|
||||||
|
await Frage("Ungültiger Ordner", "Bitte einen vollständigen Ordner angeben, z. B. C:\\Spiele\\DeskHub.", "OK");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (dir.TrimEnd('\\', '/').Length > Installer.MaxDirLength)
|
||||||
|
{
|
||||||
|
await Frage("Ordnerpfad zu lang",
|
||||||
|
$"Der Pfad hat {dir.TrimEnd('\\', '/').Length} Zeichen, Windows erlaubt hier höchstens {Installer.MaxDirLength}. " +
|
||||||
|
"Bitte einen kürzeren Ordner wählen, z. B. C:\\Spiele\\DeskHub.", "OK");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (HasImport) ShowPage(PageNumImport);
|
||||||
|
else await RunInstall(dir, DesktopLinkBox.IsChecked == true, update: false);
|
||||||
|
break;
|
||||||
|
case PageNumImport:
|
||||||
|
await RunInstall(DirBox.Text.Trim(), DesktopLinkBox.IsChecked == true, update: false);
|
||||||
|
break;
|
||||||
|
case PageNumProgress:
|
||||||
|
// Start im Hintergrund: Process.Start kann blockieren, solange Windows
|
||||||
|
// die EXE prüft – das Fenster darf dabei nie einfrieren
|
||||||
|
if (LaunchBox.IsChecked == true)
|
||||||
|
{
|
||||||
|
_busy = true;
|
||||||
|
NextButton.IsEnabled = false;
|
||||||
|
NextButton.Content = "DeskHub startet …";
|
||||||
|
await Task.Run(StartApp);
|
||||||
|
_busy = false;
|
||||||
|
}
|
||||||
|
Close();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Import aus anderen Launchern ----------
|
||||||
|
|
||||||
|
private void SetupImportPage()
|
||||||
|
{
|
||||||
|
try { _found = LauncherImport.Detect(); } catch { _found = []; }
|
||||||
|
ImportList.Children.Clear();
|
||||||
|
for (int i = 0; i < _found.Count; i++)
|
||||||
|
{
|
||||||
|
var f = _found[i];
|
||||||
|
var text = new StackPanel { Margin = new Thickness(4, 0, 0, 0) };
|
||||||
|
text.Children.Add(new TextBlock { Text = f.Name, FontWeight = FontWeights.SemiBold });
|
||||||
|
var detail = new TextBlock
|
||||||
|
{
|
||||||
|
Text = $"{f.Count} {f.Unit} gefunden · {f.Path}",
|
||||||
|
FontSize = 12,
|
||||||
|
Margin = new Thickness(0, 2, 0, 0),
|
||||||
|
TextTrimming = TextTrimming.CharacterEllipsis,
|
||||||
|
ToolTip = f.Path,
|
||||||
|
};
|
||||||
|
detail.SetResourceReference(TextBlock.ForegroundProperty, "TextSecondaryBrush");
|
||||||
|
text.Children.Add(detail);
|
||||||
|
|
||||||
|
var box = new CheckBox { Content = text, Tag = f, Margin = new Thickness(0, 10, 0, 10), IsChecked = false };
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
var line = new Border { Height = 1 };
|
||||||
|
line.SetResourceReference(Border.BackgroundProperty, "ControlStrokeBrush");
|
||||||
|
ImportList.Children.Add(line);
|
||||||
|
}
|
||||||
|
ImportList.Children.Add(box);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FoundLauncher> SelectedImports() =>
|
||||||
|
ImportList.Children.OfType<CheckBox>()
|
||||||
|
.Where(c => c.IsChecked == true && c.Tag is FoundLauncher)
|
||||||
|
.Select(c => (FoundLauncher)c.Tag)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
private void ChangeDir_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
using var dlg = new System.Windows.Forms.FolderBrowserDialog
|
||||||
|
{
|
||||||
|
Description = "Installationsordner wählen",
|
||||||
|
SelectedPath = Directory.Exists(DirBox.Text) ? DirBox.Text : Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||||
|
ShowNewFolderButton = true,
|
||||||
|
};
|
||||||
|
if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
|
||||||
|
var chosen = dlg.SelectedPath;
|
||||||
|
// wie bei üblichen Installern: Unterordner "DeskHub" anhängen
|
||||||
|
DirBox.Text = Path.GetFileName(chosen.TrimEnd('\\')).Equals("DeskHub", StringComparison.OrdinalIgnoreCase)
|
||||||
|
? chosen : Path.Combine(chosen, "DeskHub");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Installation ----------
|
||||||
|
|
||||||
|
private async Task RunInstall(string dir, bool desktop, bool update)
|
||||||
|
{
|
||||||
|
_busy = true;
|
||||||
|
if (!update) ShowPage(PageNumProgress);
|
||||||
|
SetButtons(false);
|
||||||
|
var progress = new Progress<(double Value, string Text)>(p => SetProgress(p.Value, p.Text));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Run(() => Installer.Install(dir, desktop, progress, waitForExit: update));
|
||||||
|
_installedExe = Path.Combine(dir, Installer.ExeName);
|
||||||
|
_done = true;
|
||||||
|
|
||||||
|
if (update)
|
||||||
|
{
|
||||||
|
ShowSuccess("Update abgeschlossen", $"DeskHub {Installer.Version} wird gestartet …");
|
||||||
|
StartApp();
|
||||||
|
_busy = false;
|
||||||
|
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1.5) };
|
||||||
|
timer.Tick += (_, _) => { timer.Stop(); Close(); };
|
||||||
|
timer.Start();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ausgewählte Launcher für den ersten Start vormerken (Fehler hier sollen die Installation nicht kippen)
|
||||||
|
var selected = SelectedImports();
|
||||||
|
try { LauncherImport.WritePending(selected); } catch { selected = []; }
|
||||||
|
|
||||||
|
ShowSuccess("Alles bereit!", "DeskHub ist installiert. Du findest es im Startmenü" + (desktop ? " und auf dem Desktop." : "."));
|
||||||
|
if (selected.Count > 0)
|
||||||
|
ProgressText.Text += $" Beim ersten Start bietet DeskHub dir die Instanzen aus {string.Join(" und ", selected.Select(f => f.Name))} zum Übernehmen an.";
|
||||||
|
DonePanel.Visibility = Visibility.Visible;
|
||||||
|
ShowPage(PageNumProgress);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ProgressTitle.Text = update ? "Update fehlgeschlagen" : "Installation fehlgeschlagen";
|
||||||
|
ProgressBarPanel.Visibility = Visibility.Collapsed;
|
||||||
|
ProgressText.Text = ex.Message;
|
||||||
|
ProgressText.Foreground = (Brush)FindResource("DangerBrush");
|
||||||
|
NextButton.Content = "Schließen";
|
||||||
|
_installedExe = null;
|
||||||
|
}
|
||||||
|
_busy = false;
|
||||||
|
NextButton.IsEnabled = true;
|
||||||
|
CloseButton.IsEnabled = true;
|
||||||
|
BackButton.Visibility = Visibility.Hidden;
|
||||||
|
CancelButton.Visibility = Visibility.Collapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Fortschritt ausblenden und den Haken mit kurzem "Aufploppen" zeigen.</summary>
|
||||||
|
private void ShowSuccess(string title, string text)
|
||||||
|
{
|
||||||
|
ProgressBarPanel.Visibility = Visibility.Collapsed;
|
||||||
|
ProgressTitle.Text = title;
|
||||||
|
ProgressText.Text = text;
|
||||||
|
SuccessIcon.Visibility = Visibility.Visible;
|
||||||
|
var pop = new DoubleAnimation(0.4, 1, TimeSpan.FromMilliseconds(420)) { EasingFunction = new BackEase { EasingMode = EasingMode.EaseOut, Amplitude = 0.5 } };
|
||||||
|
SuccessScale.BeginAnimation(ScaleTransform.ScaleXProperty, pop);
|
||||||
|
SuccessScale.BeginAnimation(ScaleTransform.ScaleYProperty, pop);
|
||||||
|
SuccessIcon.BeginAnimation(OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(200)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartApp()
|
||||||
|
{
|
||||||
|
if (_installedExe is null || !File.Exists(_installedExe)) return;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Process.Start(new ProcessStartInfo(_installedExe)
|
||||||
|
{
|
||||||
|
UseShellExecute = true,
|
||||||
|
WorkingDirectory = Path.GetDirectoryName(_installedExe)!,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Deinstallation ----------
|
||||||
|
|
||||||
|
private async void LoadDataInfo()
|
||||||
|
{
|
||||||
|
var root = Installer.DataDir;
|
||||||
|
var customNote = "";
|
||||||
|
if (!Directory.Exists(root))
|
||||||
|
{
|
||||||
|
DataInfo.Text = "Es wurden keine App-Daten gefunden." + customNote;
|
||||||
|
RemoveDataBox.IsEnabled = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DataInfo.Text = $"Sie liegen in {root}. Größe wird berechnet …";
|
||||||
|
var size = await Task.Run(Installer.DataSize);
|
||||||
|
DataInfo.Text = $"Sie liegen in {root} ({Installer.FormatSize(size)}) und stehen wieder bereit, falls du DeskHub später neu installierst." + customNote;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveDataBox_Click(object sender, RoutedEventArgs e) =>
|
||||||
|
RemoveDataWarning.Visibility = RemoveDataBox.IsChecked == true ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
|
||||||
|
private async Task RunUninstall()
|
||||||
|
{
|
||||||
|
_busy = true;
|
||||||
|
bool removeData = RemoveDataBox.IsChecked == true;
|
||||||
|
ShowOnly(PageProgress);
|
||||||
|
ProgressTitle.Text = "DeskHub wird entfernt …";
|
||||||
|
LaunchBox.Visibility = Visibility.Collapsed;
|
||||||
|
SetButtons(false);
|
||||||
|
var progress = new Progress<(double Value, string Text)>(p => SetProgress(p.Value, p.Text));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Run(() => Installer.Uninstall(removeData, progress));
|
||||||
|
ShowSuccess("DeskHub wurde entfernt", removeData
|
||||||
|
? "DeskHub samt Anmeldung und Einstellungen wurde entfernt (die Daten liegen im Papierkorb)."
|
||||||
|
: "Deine Anmeldung und Einstellungen liegen weiterhin in " + Installer.DataDir + " – falls du DeskHub später wieder installierst.");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ProgressTitle.Text = "Deinstallation fehlgeschlagen";
|
||||||
|
ProgressBarPanel.Visibility = Visibility.Collapsed;
|
||||||
|
ProgressText.Text = ex.Message;
|
||||||
|
}
|
||||||
|
_done = true;
|
||||||
|
_busy = false;
|
||||||
|
CloseButton.IsEnabled = true;
|
||||||
|
NextButton.Content = "Schließen";
|
||||||
|
NextButton.IsEnabled = true;
|
||||||
|
CancelButton.Visibility = Visibility.Collapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Helfer ----------
|
||||||
|
|
||||||
|
private void SetButtons(bool enabled)
|
||||||
|
{
|
||||||
|
NextButton.IsEnabled = enabled;
|
||||||
|
BackButton.IsEnabled = enabled;
|
||||||
|
CancelButton.IsEnabled = enabled;
|
||||||
|
CloseButton.IsEnabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetProgress(double value, string text)
|
||||||
|
{
|
||||||
|
if (_done) return;
|
||||||
|
ProgressText.Text = text;
|
||||||
|
PercentText.Text = $"{(int)Math.Round(value * 100)} %";
|
||||||
|
_progress = value;
|
||||||
|
AnimateProgress();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double _progress;
|
||||||
|
|
||||||
|
private void AnimateProgress()
|
||||||
|
{
|
||||||
|
var target = Math.Max(0, ProgressTrack.ActualWidth * _progress);
|
||||||
|
ProgressFill.BeginAnimation(WidthProperty,
|
||||||
|
new DoubleAnimation(target, TimeSpan.FromMilliseconds(250)) { EasingFunction = new CubicEase() });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kommt der erste Wert, bevor die Seite fertig angeordnet ist (Breite 0), nachträglich richtig setzen
|
||||||
|
private void ProgressTrack_SizeChanged(object sender, SizeChangedEventArgs e) => AnimateProgress();
|
||||||
|
|
||||||
|
private static bool IsFullPath(string p) =>
|
||||||
|
p.Length >= 3 && char.IsLetter(p[0]) && p[1] == ':' && (p[2] == '\\' || p[2] == '/');
|
||||||
|
|
||||||
|
private void Minimize_Click(object sender, RoutedEventArgs e) => WindowState = WindowState.Minimized;
|
||||||
|
|
||||||
|
private async void Cancel_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (_busy || _dialog is not null) return;
|
||||||
|
if (!_done && _mode == SetupMode.Install && _page > 0)
|
||||||
|
{
|
||||||
|
bool abbrechen = await Frage("Installation abbrechen?",
|
||||||
|
"DeskHub wird nicht installiert. Du kannst das Setup später jederzeit erneut starten.",
|
||||||
|
"Ja, abbrechen", "Weiter installieren", "\uE897");
|
||||||
|
if (!abbrechen) return;
|
||||||
|
}
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- eigene Rückfragen im Setup-Look ----------
|
||||||
|
|
||||||
|
private TaskCompletionSource<bool>? _dialog;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Zeigt eine Rückfrage über dem Fenster. Mit <paramref name="zurueck"/>: zwei Knöpfe –
|
||||||
|
/// der hervorgehobene ist der sichere Weg zurück (liefert false), der andere bestätigt (true).
|
||||||
|
/// Ohne: nur ein Hinweis mit einem Knopf (liefert true).
|
||||||
|
/// </summary>
|
||||||
|
private Task<bool> Frage(string titel, string text, string bestaetigen, string? zurueck = null, string symbol = "\uE7BA")
|
||||||
|
{
|
||||||
|
_dialog?.TrySetResult(false);
|
||||||
|
_dialog = new TaskCompletionSource<bool>();
|
||||||
|
DialogTitle.Text = titel;
|
||||||
|
DialogText.Text = text;
|
||||||
|
DialogIcon.Text = symbol;
|
||||||
|
if (zurueck is null)
|
||||||
|
{
|
||||||
|
DialogSecondary.Visibility = Visibility.Collapsed;
|
||||||
|
DialogPrimary.Content = bestaetigen;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DialogSecondary.Visibility = Visibility.Visible;
|
||||||
|
DialogSecondary.Content = bestaetigen;
|
||||||
|
DialogPrimary.Content = zurueck;
|
||||||
|
}
|
||||||
|
|
||||||
|
DialogOverlay.Visibility = Visibility.Visible;
|
||||||
|
var ein = new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(160));
|
||||||
|
DialogOverlay.BeginAnimation(OpacityProperty, ein);
|
||||||
|
var groesse = new DoubleAnimation(0.94, 1, TimeSpan.FromMilliseconds(220)) { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } };
|
||||||
|
DialogScale.BeginAnimation(ScaleTransform.ScaleXProperty, groesse);
|
||||||
|
DialogScale.BeginAnimation(ScaleTransform.ScaleYProperty, groesse);
|
||||||
|
DialogPrimary.Focus();
|
||||||
|
return _dialog.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SchliesseFrage(bool ergebnis)
|
||||||
|
{
|
||||||
|
if (_dialog is null) return;
|
||||||
|
var tcs = _dialog;
|
||||||
|
_dialog = null;
|
||||||
|
DialogOverlay.Visibility = Visibility.Collapsed;
|
||||||
|
tcs.TrySetResult(ergebnis);
|
||||||
|
}
|
||||||
|
|
||||||
|
// hervorgehobener Knopf: bei Rückfragen "zurück" (false), beim reinen Hinweis "OK" (true)
|
||||||
|
private void DialogPrimary_Click(object sender, RoutedEventArgs e) =>
|
||||||
|
SchliesseFrage(DialogSecondary.Visibility != Visibility.Visible);
|
||||||
|
|
||||||
|
private void DialogSecondary_Click(object sender, RoutedEventArgs e) => SchliesseFrage(true);
|
||||||
|
|
||||||
|
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
|
||||||
|
{
|
||||||
|
// solange die Rückfrage offen ist: Enter = hervorgehobener Knopf, Esc = zurück
|
||||||
|
if (_dialog is not null)
|
||||||
|
{
|
||||||
|
if (e.Key == System.Windows.Input.Key.Escape) { SchliesseFrage(DialogSecondary.Visibility != Visibility.Visible); e.Handled = true; return; }
|
||||||
|
if (e.Key == System.Windows.Input.Key.Enter) { DialogPrimary_Click(this, new RoutedEventArgs()); e.Handled = true; return; }
|
||||||
|
}
|
||||||
|
base.OnPreviewKeyDown(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||||
|
{
|
||||||
|
if (_busy) e.Cancel = true; // während der Installation nicht schließen
|
||||||
|
_dialog?.TrySetResult(false);
|
||||||
|
base.OnClosing(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
<?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="DeskHub.Setup"/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<!-- Installation nur für den aktuellen Benutzer → keine Administratorrechte -->
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<windowsSettings>
|
||||||
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
|
||||||
|
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
|
||||||
|
</windowsSettings>
|
||||||
|
</application>
|
||||||
|
</assembly>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
|
||||||
Binary file not shown.
@@ -0,0 +1,77 @@
|
|||||||
|
#pragma checksum "..\..\..\App.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "B21F6A6F1B31E25FC3DD883F76A5815E12750551"
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Automation;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Controls.Primitives;
|
||||||
|
using System.Windows.Controls.Ribbon;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Forms.Integration;
|
||||||
|
using System.Windows.Ink;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Markup;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Animation;
|
||||||
|
using System.Windows.Media.Effects;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Media.Media3D;
|
||||||
|
using System.Windows.Media.TextFormatting;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
using System.Windows.Shell;
|
||||||
|
|
||||||
|
|
||||||
|
namespace DeskHubSetup {
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// App
|
||||||
|
/// </summary>
|
||||||
|
public partial class App : System.Windows.Application {
|
||||||
|
|
||||||
|
private bool _contentLoaded;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// InitializeComponent
|
||||||
|
/// </summary>
|
||||||
|
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.12.0")]
|
||||||
|
public void InitializeComponent() {
|
||||||
|
if (_contentLoaded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_contentLoaded = true;
|
||||||
|
System.Uri resourceLocater = new System.Uri("/DeskHub-Setup;V0.0.0.0;component/app.xaml", System.UriKind.Relative);
|
||||||
|
|
||||||
|
#line 1 "..\..\..\App.xaml"
|
||||||
|
System.Windows.Application.LoadComponent(this, resourceLocater);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Application Entry Point.
|
||||||
|
/// </summary>
|
||||||
|
[System.STAThreadAttribute()]
|
||||||
|
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.12.0")]
|
||||||
|
public static void Main() {
|
||||||
|
DeskHubSetup.App app = new DeskHubSetup.App();
|
||||||
|
app.InitializeComponent();
|
||||||
|
app.Run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
||||||
|
</startup>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
DeskHub-Setup
|
||||||
|
0.0.0.0
|
||||||
|
|
||||||
|
winexe
|
||||||
|
C#
|
||||||
|
.cs
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Debug\net48\
|
||||||
|
DeskHubSetup
|
||||||
|
none
|
||||||
|
false
|
||||||
|
TRACE;DEBUG;NETFRAMEWORK;NET48;NET30_OR_GREATER;NET35_OR_GREATER;NET40_OR_GREATER;NET45_OR_GREATER;NET451_OR_GREATER;NET452_OR_GREATER;NET46_OR_GREATER;NET461_OR_GREATER;NET462_OR_GREATER;NET47_OR_GREATER;NET471_OR_GREATER;NET472_OR_GREATER;NET48_OR_GREATER
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\App.xaml
|
||||||
|
41549299691
|
||||||
|
|
||||||
|
9-1424364920
|
||||||
|
251587687494
|
||||||
|
MainWindow.xaml;Themes\Colors.Dark.xaml;Themes\Colors.Light.xaml;Themes\Controls.xaml;
|
||||||
|
|
||||||
|
False
|
||||||
|
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("M_Viper")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyCopyrightAttribute("Copyright (c) M_Viper. Alle Rechte vorbehalten.")]
|
||||||
|
[assembly: System.Reflection.AssemblyDescriptionAttribute("Installiert DeskHub")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("0.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("DeskHub Setup")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("DeskHub Setup")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("0.0.0.0")]
|
||||||
|
[assembly: System.Resources.NeutralResourcesLanguageAttribute("de-DE")]
|
||||||
|
|
||||||
|
// Von der MSBuild WriteCodeFragment-Klasse generiert.
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
aa2bf4657be4f171c4fd9df8bf52b7b48a059b6cf680f972df7b19373b56bbbe
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
is_global = true
|
||||||
|
build_property.ApplicationManifest = app.manifest
|
||||||
|
build_property.StartupObject =
|
||||||
|
build_property.ApplicationDefaultFont =
|
||||||
|
build_property.ApplicationHighDpiMode =
|
||||||
|
build_property.ApplicationUseCompatibleTextRendering =
|
||||||
|
build_property.ApplicationVisualStyles =
|
||||||
|
build_property.RootNamespace = DeskHubSetup
|
||||||
|
build_property.ProjectDir = C:\Users\Viper\Desktop\deskhub\desktop\installer\
|
||||||
|
build_property.EnableComHosting =
|
||||||
|
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||||
|
build_property.CsWinRTUseWindowsUIXamlProjections = false
|
||||||
|
build_property.EffectiveAnalysisLevelStyle =
|
||||||
|
build_property.EnableCodeStyleSeverity =
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// <auto-generated/>
|
||||||
|
global using System;
|
||||||
|
global using System.Collections.Generic;
|
||||||
|
global using System.Linq;
|
||||||
|
global using System.Threading;
|
||||||
|
global using System.Threading.Tasks;
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,842 @@
|
|||||||
|
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "ED239D3706336E4C103F25FAD4E1E20AD19B6906"
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Automation;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Controls.Primitives;
|
||||||
|
using System.Windows.Controls.Ribbon;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Forms.Integration;
|
||||||
|
using System.Windows.Ink;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Markup;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Animation;
|
||||||
|
using System.Windows.Media.Effects;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Media.Media3D;
|
||||||
|
using System.Windows.Media.TextFormatting;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
using System.Windows.Shell;
|
||||||
|
|
||||||
|
|
||||||
|
namespace DeskHubSetup {
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// MainWindow
|
||||||
|
/// </summary>
|
||||||
|
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
||||||
|
|
||||||
|
|
||||||
|
#line 140 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock VersionText;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 142 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel Steps;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 144 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Dot0;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 144 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Num0;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 145 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Label0;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 147 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Line0;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 149 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Dot1;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 149 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Num1;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 150 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Label1;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 152 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Line1;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 154 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Dot2;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 154 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Num2;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 155 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Label2;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 157 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Line2;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 159 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel ImportStepRow;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 160 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Dot3;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 160 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Num3;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 161 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Label3;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 163 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Line3;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 165 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border Dot4;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 165 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Num4;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 166 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock Label4;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 179 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock WindowTitle;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 185 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button CloseButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 193 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel PageWelcome;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 240 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border UpdateHint;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 245 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock UpdateHintText;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 248 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border RunningHint;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 260 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.DockPanel PageLicense;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 264 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.CheckBox AcceptLicense;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 271 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel LicensePanel;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 277 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel PageOptions;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 286 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBox DirBox;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 295 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.CheckBox DesktopLinkBox;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 301 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel PageImport;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 306 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel ImportList;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 313 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel PageProgress;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 314 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border SuccessIcon;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 316 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Media.ScaleTransform SuccessScale;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 321 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock ProgressTitle;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 323 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel ProgressBarPanel;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 324 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock PercentText;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 326 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border ProgressTrack;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 327 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border ProgressFill;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 330 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock ProgressText;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 332 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel DonePanel;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 333 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.CheckBox LaunchBox;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 338 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.StackPanel PageUninstall;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 349 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock DataInfo;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 350 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.CheckBox RemoveDataBox;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 352 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock RemoveDataWarning;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 362 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button BackButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 363 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button NextButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 364 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button CancelButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 368 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Grid DialogOverlay;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 369 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Border DialogCard;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 372 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Media.ScaleTransform DialogScale;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 376 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock DialogIcon;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 379 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock DialogTitle;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 382 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock DialogText;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 385 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button DialogSecondary;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 386 "..\..\..\MainWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button DialogPrimary;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
private bool _contentLoaded;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// InitializeComponent
|
||||||
|
/// </summary>
|
||||||
|
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.12.0")]
|
||||||
|
public void InitializeComponent() {
|
||||||
|
if (_contentLoaded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_contentLoaded = true;
|
||||||
|
System.Uri resourceLocater = new System.Uri("/DeskHub-Setup;V0.0.0.0;component/mainwindow.xaml", System.UriKind.Relative);
|
||||||
|
|
||||||
|
#line 1 "..\..\..\MainWindow.xaml"
|
||||||
|
System.Windows.Application.LoadComponent(this, resourceLocater);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.12.0")]
|
||||||
|
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
|
||||||
|
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
|
||||||
|
switch (connectionId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
this.VersionText = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 2:
|
||||||
|
this.Steps = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 3:
|
||||||
|
this.Dot0 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 4:
|
||||||
|
this.Num0 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 5:
|
||||||
|
this.Label0 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 6:
|
||||||
|
this.Line0 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 7:
|
||||||
|
this.Dot1 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 8:
|
||||||
|
this.Num1 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 9:
|
||||||
|
this.Label1 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 10:
|
||||||
|
this.Line1 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 11:
|
||||||
|
this.Dot2 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 12:
|
||||||
|
this.Num2 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 13:
|
||||||
|
this.Label2 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 14:
|
||||||
|
this.Line2 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 15:
|
||||||
|
this.ImportStepRow = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 16:
|
||||||
|
this.Dot3 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 17:
|
||||||
|
this.Num3 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 18:
|
||||||
|
this.Label3 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 19:
|
||||||
|
this.Line3 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 20:
|
||||||
|
this.Dot4 = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 21:
|
||||||
|
this.Num4 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 22:
|
||||||
|
this.Label4 = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 23:
|
||||||
|
this.WindowTitle = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 24:
|
||||||
|
|
||||||
|
#line 183 "..\..\..\MainWindow.xaml"
|
||||||
|
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Minimize_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 25:
|
||||||
|
this.CloseButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 185 "..\..\..\MainWindow.xaml"
|
||||||
|
this.CloseButton.Click += new System.Windows.RoutedEventHandler(this.Cancel_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 26:
|
||||||
|
this.PageWelcome = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 27:
|
||||||
|
this.UpdateHint = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 28:
|
||||||
|
this.UpdateHintText = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 29:
|
||||||
|
this.RunningHint = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 30:
|
||||||
|
this.PageLicense = ((System.Windows.Controls.DockPanel)(target));
|
||||||
|
return;
|
||||||
|
case 31:
|
||||||
|
this.AcceptLicense = ((System.Windows.Controls.CheckBox)(target));
|
||||||
|
|
||||||
|
#line 265 "..\..\..\MainWindow.xaml"
|
||||||
|
this.AcceptLicense.Checked += new System.Windows.RoutedEventHandler(this.AcceptLicense_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
#line 265 "..\..\..\MainWindow.xaml"
|
||||||
|
this.AcceptLicense.Unchecked += new System.Windows.RoutedEventHandler(this.AcceptLicense_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 32:
|
||||||
|
this.LicensePanel = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 33:
|
||||||
|
this.PageOptions = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 34:
|
||||||
|
|
||||||
|
#line 285 "..\..\..\MainWindow.xaml"
|
||||||
|
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ChangeDir_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 35:
|
||||||
|
this.DirBox = ((System.Windows.Controls.TextBox)(target));
|
||||||
|
return;
|
||||||
|
case 36:
|
||||||
|
this.DesktopLinkBox = ((System.Windows.Controls.CheckBox)(target));
|
||||||
|
return;
|
||||||
|
case 37:
|
||||||
|
this.PageImport = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 38:
|
||||||
|
this.ImportList = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 39:
|
||||||
|
this.PageProgress = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 40:
|
||||||
|
this.SuccessIcon = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 41:
|
||||||
|
this.SuccessScale = ((System.Windows.Media.ScaleTransform)(target));
|
||||||
|
return;
|
||||||
|
case 42:
|
||||||
|
this.ProgressTitle = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 43:
|
||||||
|
this.ProgressBarPanel = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 44:
|
||||||
|
this.PercentText = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 45:
|
||||||
|
this.ProgressTrack = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
|
#line 326 "..\..\..\MainWindow.xaml"
|
||||||
|
this.ProgressTrack.SizeChanged += new System.Windows.SizeChangedEventHandler(this.ProgressTrack_SizeChanged);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 46:
|
||||||
|
this.ProgressFill = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 47:
|
||||||
|
this.ProgressText = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 48:
|
||||||
|
this.DonePanel = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 49:
|
||||||
|
this.LaunchBox = ((System.Windows.Controls.CheckBox)(target));
|
||||||
|
return;
|
||||||
|
case 50:
|
||||||
|
this.PageUninstall = ((System.Windows.Controls.StackPanel)(target));
|
||||||
|
return;
|
||||||
|
case 51:
|
||||||
|
this.DataInfo = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 52:
|
||||||
|
this.RemoveDataBox = ((System.Windows.Controls.CheckBox)(target));
|
||||||
|
|
||||||
|
#line 351 "..\..\..\MainWindow.xaml"
|
||||||
|
this.RemoveDataBox.Checked += new System.Windows.RoutedEventHandler(this.RemoveDataBox_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
#line 351 "..\..\..\MainWindow.xaml"
|
||||||
|
this.RemoveDataBox.Unchecked += new System.Windows.RoutedEventHandler(this.RemoveDataBox_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 53:
|
||||||
|
this.RemoveDataWarning = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 54:
|
||||||
|
this.BackButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 362 "..\..\..\MainWindow.xaml"
|
||||||
|
this.BackButton.Click += new System.Windows.RoutedEventHandler(this.Back_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 55:
|
||||||
|
this.NextButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 363 "..\..\..\MainWindow.xaml"
|
||||||
|
this.NextButton.Click += new System.Windows.RoutedEventHandler(this.Next_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 56:
|
||||||
|
this.CancelButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 364 "..\..\..\MainWindow.xaml"
|
||||||
|
this.CancelButton.Click += new System.Windows.RoutedEventHandler(this.Cancel_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 57:
|
||||||
|
this.DialogOverlay = ((System.Windows.Controls.Grid)(target));
|
||||||
|
return;
|
||||||
|
case 58:
|
||||||
|
this.DialogCard = ((System.Windows.Controls.Border)(target));
|
||||||
|
return;
|
||||||
|
case 59:
|
||||||
|
this.DialogScale = ((System.Windows.Media.ScaleTransform)(target));
|
||||||
|
return;
|
||||||
|
case 60:
|
||||||
|
this.DialogIcon = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 61:
|
||||||
|
this.DialogTitle = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 62:
|
||||||
|
this.DialogText = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 63:
|
||||||
|
this.DialogSecondary = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 385 "..\..\..\MainWindow.xaml"
|
||||||
|
this.DialogSecondary.Click += new System.Windows.RoutedEventHandler(this.DialogSecondary_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 64:
|
||||||
|
this.DialogPrimary = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 386 "..\..\..\MainWindow.xaml"
|
||||||
|
this.DialogPrimary.Click += new System.Windows.RoutedEventHandler(this.DialogPrimary_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._contentLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\DeskHubSetup.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\DeskHubSetup.csproj": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\DeskHubSetup.csproj",
|
||||||
|
"projectName": "DeskHub-Setup",
|
||||||
|
"projectPath": "C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\DeskHubSetup.csproj",
|
||||||
|
"packagesPath": "C:\\Users\\Viper\\.nuget\\packages\\",
|
||||||
|
"outputPath": "C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\obj\\",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"C:\\Users\\Viper\\AppData\\Roaming\\NuGet\\NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net48": {
|
||||||
|
"targetAlias": "net48",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"restoreAuditProperties": {
|
||||||
|
"enableAudit": "true",
|
||||||
|
"auditLevel": "low",
|
||||||
|
"auditMode": "direct"
|
||||||
|
},
|
||||||
|
"SdkAnalysisLevel": "10.0.100"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net48": {
|
||||||
|
"targetAlias": "net48",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies": {
|
||||||
|
"suppressParent": "All",
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[1.0.3, )",
|
||||||
|
"autoReferenced": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.113\\RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Viper\.nuget\packages\</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="C:\Users\Viper\.nuget\packages\" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<Import Project="$(NuGetPackageRoot)microsoft.netframework.referenceassemblies.net48\1.0.3\build\Microsoft.NETFramework.ReferenceAssemblies.net48.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.netframework.referenceassemblies.net48\1.0.3\build\Microsoft.NETFramework.ReferenceAssemblies.net48.targets')" />
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
|
||||||
Binary file not shown.
@@ -0,0 +1,77 @@
|
|||||||
|
#pragma checksum "..\..\..\App.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "B21F6A6F1B31E25FC3DD883F76A5815E12750551"
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Automation;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Controls.Primitives;
|
||||||
|
using System.Windows.Controls.Ribbon;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Forms.Integration;
|
||||||
|
using System.Windows.Ink;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Markup;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Animation;
|
||||||
|
using System.Windows.Media.Effects;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Media.Media3D;
|
||||||
|
using System.Windows.Media.TextFormatting;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
using System.Windows.Shell;
|
||||||
|
|
||||||
|
|
||||||
|
namespace DeskHubSetup {
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// App
|
||||||
|
/// </summary>
|
||||||
|
public partial class App : System.Windows.Application {
|
||||||
|
|
||||||
|
private bool _contentLoaded;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// InitializeComponent
|
||||||
|
/// </summary>
|
||||||
|
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.12.0")]
|
||||||
|
public void InitializeComponent() {
|
||||||
|
if (_contentLoaded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_contentLoaded = true;
|
||||||
|
System.Uri resourceLocater = new System.Uri("/DeskHub-Setup;component/app.xaml", System.UriKind.Relative);
|
||||||
|
|
||||||
|
#line 1 "..\..\..\App.xaml"
|
||||||
|
System.Windows.Application.LoadComponent(this, resourceLocater);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Application Entry Point.
|
||||||
|
/// </summary>
|
||||||
|
[System.STAThreadAttribute()]
|
||||||
|
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.12.0")]
|
||||||
|
public static void Main() {
|
||||||
|
DeskHubSetup.App app = new DeskHubSetup.App();
|
||||||
|
app.InitializeComponent();
|
||||||
|
app.Run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
||||||
|
</startup>
|
||||||
|
</configuration>
|
||||||
Binary file not shown.
@@ -0,0 +1,20 @@
|
|||||||
|
DeskHub-Setup
|
||||||
|
|
||||||
|
|
||||||
|
winexe
|
||||||
|
C#
|
||||||
|
.cs
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\
|
||||||
|
DeskHubSetup
|
||||||
|
none
|
||||||
|
false
|
||||||
|
TRACE;RELEASE;NETFRAMEWORK;NET48;NET30_OR_GREATER;NET35_OR_GREATER;NET40_OR_GREATER;NET45_OR_GREATER;NET451_OR_GREATER;NET452_OR_GREATER;NET46_OR_GREATER;NET461_OR_GREATER;NET462_OR_GREATER;NET47_OR_GREATER;NET471_OR_GREATER;NET472_OR_GREATER;NET48_OR_GREATER
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\App.xaml
|
||||||
|
41549299691
|
||||||
|
|
||||||
|
729071450
|
||||||
|
251587687494
|
||||||
|
MainWindow.xaml;Themes\Colors.Dark.xaml;Themes\Colors.Light.xaml;Themes\Controls.xaml;
|
||||||
|
|
||||||
|
False
|
||||||
|
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("M_Viper")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
|
||||||
|
[assembly: System.Reflection.AssemblyCopyrightAttribute("Copyright (c) M_Viper. Alle Rechte vorbehalten.")]
|
||||||
|
[assembly: System.Reflection.AssemblyDescriptionAttribute("Installiert DeskHub")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("2.1.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("2.1.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("DeskHub Setup")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("DeskHub Setup")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("2.1.0.0")]
|
||||||
|
[assembly: System.Resources.NeutralResourcesLanguageAttribute("de-DE")]
|
||||||
|
|
||||||
|
// Von der MSBuild WriteCodeFragment-Klasse generiert.
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a6eed02d808246821aac76dd2ca892a994cd22af6c2c616e6ec37f75371f7aac
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
is_global = true
|
||||||
|
build_property.ApplicationManifest = app.manifest
|
||||||
|
build_property.StartupObject =
|
||||||
|
build_property.ApplicationDefaultFont =
|
||||||
|
build_property.ApplicationHighDpiMode =
|
||||||
|
build_property.ApplicationUseCompatibleTextRendering =
|
||||||
|
build_property.ApplicationVisualStyles =
|
||||||
|
build_property.RootNamespace = DeskHubSetup
|
||||||
|
build_property.ProjectDir = C:\Users\Viper\Desktop\deskhub\desktop\installer\
|
||||||
|
build_property.EnableComHosting =
|
||||||
|
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||||
|
build_property.CsWinRTUseWindowsUIXamlProjections = false
|
||||||
|
build_property.EffectiveAnalysisLevelStyle =
|
||||||
|
build_property.EnableCodeStyleSeverity =
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// <auto-generated/>
|
||||||
|
global using System;
|
||||||
|
global using System.Collections.Generic;
|
||||||
|
global using System.Linq;
|
||||||
|
global using System.Threading;
|
||||||
|
global using System.Threading.Tasks;
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
b8aa6bbb06d40efeb6117bc5808a04971737f076fb3d6a504c8a4976a5372440
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\dist\.setup\stub\DeskHub-Setup.exe.config
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\dist\.setup\stub\DeskHub-Setup.exe
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\DeskHubSetup.csproj.AssemblyReference.cache
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\MainWindow.baml
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\Themes\Colors.Dark.baml
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\Themes\Colors.Light.baml
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\Themes\Controls.baml
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\App.baml
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\MainWindow.g.cs
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\App.g.cs
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\DeskHub-Setup_MarkupCompile.cache
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\DeskHub-Setup.g.resources
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\DeskHubSetup.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\DeskHubSetup.AssemblyInfoInputs.cache
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\DeskHubSetup.AssemblyInfo.cs
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\DeskHubSetup.csproj.CoreCompileInputs.cache
|
||||||
|
C:\Users\Viper\Desktop\deskhub\desktop\installer\obj\Release\net48\DeskHub-Setup.exe
|
||||||
@@ -0,0 +1,471 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"targets": {
|
||||||
|
".NETFramework,Version=v4.8": {
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies/1.0.3": {
|
||||||
|
"type": "package",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies.net48/1.0.3": {
|
||||||
|
"type": "package",
|
||||||
|
"build": {
|
||||||
|
"build/Microsoft.NETFramework.ReferenceAssemblies.net48.targets": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies/1.0.3": {
|
||||||
|
"sha512": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "microsoft.netframework.referenceassemblies/1.0.3",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"microsoft.netframework.referenceassemblies.1.0.3.nupkg.sha512",
|
||||||
|
"microsoft.netframework.referenceassemblies.nuspec"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies.net48/1.0.3": {
|
||||||
|
"sha512": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "microsoft.netframework.referenceassemblies.net48/1.0.3",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"build/.NETFramework/v4.8/Accessibility.dll",
|
||||||
|
"build/.NETFramework/v4.8/Accessibility.xml",
|
||||||
|
"build/.NETFramework/v4.8/CustomMarshalers.dll",
|
||||||
|
"build/.NETFramework/v4.8/CustomMarshalers.xml",
|
||||||
|
"build/.NETFramework/v4.8/Facades/Microsoft.Win32.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.AppContext.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Collections.Concurrent.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Collections.NonGeneric.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Collections.Specialized.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Collections.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ComponentModel.Annotations.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ComponentModel.EventBasedAsync.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ComponentModel.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ComponentModel.TypeConverter.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ComponentModel.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Console.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Data.Common.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Diagnostics.Contracts.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Diagnostics.Debug.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Diagnostics.FileVersionInfo.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Diagnostics.Process.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Diagnostics.StackTrace.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Diagnostics.TextWriterTraceListener.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Diagnostics.Tools.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Diagnostics.TraceSource.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Drawing.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Dynamic.Runtime.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Globalization.Calendars.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Globalization.Extensions.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Globalization.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.Compression.ZipFile.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.FileSystem.DriveInfo.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.FileSystem.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.FileSystem.Watcher.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.FileSystem.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.IsolatedStorage.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.MemoryMappedFiles.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.Pipes.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.UnmanagedMemoryStream.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.IO.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Linq.Expressions.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Linq.Parallel.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Linq.Queryable.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Linq.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.Http.Rtc.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.NameResolution.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.NetworkInformation.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.Ping.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.Requests.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.Security.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.Sockets.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.WebHeaderCollection.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.WebSockets.Client.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Net.WebSockets.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ObjectModel.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Reflection.Emit.ILGeneration.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Reflection.Emit.Lightweight.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Reflection.Emit.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Reflection.Extensions.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Reflection.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Reflection.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Resources.Reader.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Resources.ResourceManager.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Resources.Writer.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.CompilerServices.VisualC.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.Extensions.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.Handles.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.RuntimeInformation.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.WindowsRuntime.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.Numerics.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Formatters.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Json.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Xml.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Runtime.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Security.Claims.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Algorithms.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Csp.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Encoding.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.X509Certificates.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Security.Principal.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Security.SecureString.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ServiceModel.Duplex.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ServiceModel.Http.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ServiceModel.NetTcp.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ServiceModel.Primitives.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ServiceModel.Security.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Text.Encoding.Extensions.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Text.Encoding.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Text.RegularExpressions.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Threading.Overlapped.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Threading.Tasks.Parallel.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Threading.Tasks.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Threading.Thread.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Threading.ThreadPool.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Threading.Timer.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Threading.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.ValueTuple.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Xml.ReaderWriter.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Xml.XDocument.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Xml.XPath.XDocument.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Xml.XPath.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Xml.XmlDocument.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/System.Xml.XmlSerializer.dll",
|
||||||
|
"build/.NETFramework/v4.8/Facades/netstandard.dll",
|
||||||
|
"build/.NETFramework/v4.8/ISymWrapper.dll",
|
||||||
|
"build/.NETFramework/v4.8/ISymWrapper.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Activities.Build.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Activities.Build.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Conversion.v4.0.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Conversion.v4.0.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Engine.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Engine.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Framework.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Framework.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Tasks.v4.0.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Tasks.v4.0.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Utilities.v4.0.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.Utilities.v4.0.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.Build.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.CSharp.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.CSharp.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.JScript.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.JScript.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.Data.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.Data.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualBasic.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualBasic.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualC.STLCLR.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualC.STLCLR.xml",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualC.dll",
|
||||||
|
"build/.NETFramework/v4.8/Microsoft.VisualC.xml",
|
||||||
|
"build/.NETFramework/v4.8/PermissionSets/FullTrust.xml",
|
||||||
|
"build/.NETFramework/v4.8/PermissionSets/Internet.xml",
|
||||||
|
"build/.NETFramework/v4.8/PermissionSets/LocalIntranet.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationBuildTasks.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationBuildTasks.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationCore.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationCore.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Aero.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Aero.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Aero2.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Aero2.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.AeroLite.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.AeroLite.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Classic.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Classic.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Luna.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Luna.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Royale.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.Royale.xml",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.dll",
|
||||||
|
"build/.NETFramework/v4.8/PresentationFramework.xml",
|
||||||
|
"build/.NETFramework/v4.8/ReachFramework.dll",
|
||||||
|
"build/.NETFramework/v4.8/ReachFramework.xml",
|
||||||
|
"build/.NETFramework/v4.8/RedistList/FrameworkList.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Activities.Core.Presentation.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Activities.Core.Presentation.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Activities.DurableInstancing.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Activities.DurableInstancing.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Activities.Presentation.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Activities.Presentation.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Activities.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Activities.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.AddIn.Contract.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.AddIn.Contract.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.AddIn.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.AddIn.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ComponentModel.Composition.Registration.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ComponentModel.Composition.Registration.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ComponentModel.Composition.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ComponentModel.Composition.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ComponentModel.DataAnnotations.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ComponentModel.DataAnnotations.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Configuration.Install.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Configuration.Install.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Configuration.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Configuration.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Core.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Core.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.DataSetExtensions.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.DataSetExtensions.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Entity.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Entity.Design.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Entity.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Entity.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Linq.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Linq.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.OracleClient.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.OracleClient.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Services.Client.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Services.Client.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Services.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Services.Design.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Services.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.Services.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.SqlXml.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.SqlXml.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Data.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Deployment.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Deployment.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Design.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Device.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Device.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Diagnostics.Tracing.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Diagnostics.Tracing.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.DirectoryServices.AccountManagement.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.DirectoryServices.AccountManagement.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.DirectoryServices.Protocols.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.DirectoryServices.Protocols.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.DirectoryServices.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.DirectoryServices.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Drawing.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Drawing.Design.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Drawing.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Drawing.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Dynamic.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.EnterpriseServices.Thunk.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.EnterpriseServices.Wrapper.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.EnterpriseServices.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.EnterpriseServices.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.IO.Compression.FileSystem.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.IO.Compression.FileSystem.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.IO.Compression.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.IO.Compression.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.IO.Log.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.IO.Log.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.IdentityModel.Selectors.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.IdentityModel.Selectors.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.IdentityModel.Services.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.IdentityModel.Services.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.IdentityModel.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.IdentityModel.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Linq.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Management.Instrumentation.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Management.Instrumentation.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Management.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Management.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Messaging.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Messaging.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Net.Http.WebRequest.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Net.Http.WebRequest.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Net.Http.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Net.Http.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Net.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Net.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Numerics.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Numerics.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Printing.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Printing.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Reflection.Context.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Reflection.Context.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.Caching.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.Caching.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.DurableInstancing.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.DurableInstancing.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.Remoting.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.Remoting.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.Serialization.Formatters.Soap.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.Serialization.Formatters.Soap.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.Serialization.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Runtime.Serialization.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Security.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Security.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Activation.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Activation.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Activities.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Activities.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Channels.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Channels.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Discovery.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Discovery.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Routing.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Routing.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Web.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.Web.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceModel.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceProcess.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.ServiceProcess.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Speech.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Speech.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Threading.Tasks.Dataflow.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Transactions.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Transactions.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Abstractions.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.ApplicationServices.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.ApplicationServices.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.DataVisualization.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.DataVisualization.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.DataVisualization.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.DynamicData.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.DynamicData.Design.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.DynamicData.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.DynamicData.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Entity.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Entity.Design.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Entity.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Entity.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Extensions.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Extensions.Design.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Extensions.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Extensions.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Mobile.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Mobile.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.RegularExpressions.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.RegularExpressions.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Routing.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Services.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.Services.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Web.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Controls.Ribbon.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Controls.Ribbon.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.Design.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Forms.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Forms.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Input.Manipulations.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Input.Manipulations.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Presentation.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.Presentation.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Windows.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Workflow.Activities.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Workflow.Activities.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Workflow.ComponentModel.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Workflow.ComponentModel.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Workflow.Runtime.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Workflow.Runtime.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.WorkflowServices.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.WorkflowServices.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Xaml.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Xaml.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Xml.Linq.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Xml.Linq.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.Xml.Serialization.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Xml.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.Xml.xml",
|
||||||
|
"build/.NETFramework/v4.8/System.dll",
|
||||||
|
"build/.NETFramework/v4.8/System.xml",
|
||||||
|
"build/.NETFramework/v4.8/UIAutomationClient.dll",
|
||||||
|
"build/.NETFramework/v4.8/UIAutomationClient.xml",
|
||||||
|
"build/.NETFramework/v4.8/UIAutomationClientsideProviders.dll",
|
||||||
|
"build/.NETFramework/v4.8/UIAutomationClientsideProviders.xml",
|
||||||
|
"build/.NETFramework/v4.8/UIAutomationProvider.dll",
|
||||||
|
"build/.NETFramework/v4.8/UIAutomationProvider.xml",
|
||||||
|
"build/.NETFramework/v4.8/UIAutomationTypes.dll",
|
||||||
|
"build/.NETFramework/v4.8/UIAutomationTypes.xml",
|
||||||
|
"build/.NETFramework/v4.8/WindowsBase.dll",
|
||||||
|
"build/.NETFramework/v4.8/WindowsBase.xml",
|
||||||
|
"build/.NETFramework/v4.8/WindowsFormsIntegration.dll",
|
||||||
|
"build/.NETFramework/v4.8/WindowsFormsIntegration.xml",
|
||||||
|
"build/.NETFramework/v4.8/XamlBuildTask.dll",
|
||||||
|
"build/.NETFramework/v4.8/XamlBuildTask.xml",
|
||||||
|
"build/.NETFramework/v4.8/mscorlib.dll",
|
||||||
|
"build/.NETFramework/v4.8/mscorlib.xml",
|
||||||
|
"build/.NETFramework/v4.8/namespaces.xml",
|
||||||
|
"build/.NETFramework/v4.8/sysglobl.dll",
|
||||||
|
"build/.NETFramework/v4.8/sysglobl.xml",
|
||||||
|
"build/Microsoft.NETFramework.ReferenceAssemblies.net48.targets",
|
||||||
|
"microsoft.netframework.referenceassemblies.net48.1.0.3.nupkg.sha512",
|
||||||
|
"microsoft.netframework.referenceassemblies.net48.nuspec"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"projectFileDependencyGroups": {
|
||||||
|
".NETFramework,Version=v4.8": [
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies >= 1.0.3"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"packageFolders": {
|
||||||
|
"C:\\Users\\Viper\\.nuget\\packages\\": {}
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\DeskHubSetup.csproj",
|
||||||
|
"projectName": "DeskHub-Setup",
|
||||||
|
"projectPath": "C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\DeskHubSetup.csproj",
|
||||||
|
"packagesPath": "C:\\Users\\Viper\\.nuget\\packages\\",
|
||||||
|
"outputPath": "C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\obj\\",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"C:\\Users\\Viper\\AppData\\Roaming\\NuGet\\NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net48": {
|
||||||
|
"targetAlias": "net48",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"restoreAuditProperties": {
|
||||||
|
"enableAudit": "true",
|
||||||
|
"auditLevel": "low",
|
||||||
|
"auditMode": "direct"
|
||||||
|
},
|
||||||
|
"SdkAnalysisLevel": "10.0.100"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net48": {
|
||||||
|
"targetAlias": "net48",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies": {
|
||||||
|
"suppressParent": "All",
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[1.0.3, )",
|
||||||
|
"autoReferenced": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.113\\RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"dgSpecHash": "zwk+EMkLg7Y=",
|
||||||
|
"success": true,
|
||||||
|
"projectFilePath": "C:\\Users\\Viper\\Desktop\\deskhub\\desktop\\installer\\DeskHubSetup.csproj",
|
||||||
|
"expectedPackageFiles": [
|
||||||
|
"C:\\Users\\Viper\\.nuget\\packages\\microsoft.netframework.referenceassemblies\\1.0.3\\microsoft.netframework.referenceassemblies.1.0.3.nupkg.sha512",
|
||||||
|
"C:\\Users\\Viper\\.nuget\\packages\\microsoft.netframework.referenceassemblies.net48\\1.0.3\\microsoft.netframework.referenceassemblies.net48.1.0.3.nupkg.sha512"
|
||||||
|
],
|
||||||
|
"logs": []
|
||||||
|
}
|
||||||
Generated
+5287
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"name": "deskhub",
|
||||||
|
"productName": "DeskHub",
|
||||||
|
"version": "2.1.0",
|
||||||
|
"description": "DeskHub Desktop-Client für Mitarbeiter",
|
||||||
|
"main": "src/main.js",
|
||||||
|
"author": "M_Viper",
|
||||||
|
"license": "SEE LICENSE IN LICENSE",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "electron .",
|
||||||
|
"test": "electron test/run.js",
|
||||||
|
"build": "electron-builder --win dir && node scripts/build-setup.js"
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"appId": "de.deskhub.desktop",
|
||||||
|
"productName": "DeskHub",
|
||||||
|
"artifactName": "DeskHub.${ext}",
|
||||||
|
"files": ["src/**/*", "package.json", "LICENSE"],
|
||||||
|
"win": { "target": "dir", "icon": "src/assets/icon.ico" }
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"electron": "^33.2.0",
|
||||||
|
"electron-builder": "^25.1.8"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="de"><head><meta charset="utf-8"><title>DeskHub Mock</title>
|
||||||
|
<link rel="stylesheet" href="../src/styles.css"></head>
|
||||||
|
<body><div id="app"></div><div id="toast" class="toast hidden"></div>
|
||||||
|
<script>
|
||||||
|
// Test-Attrappe für die Electron-Brücke (window.deskhub) – nur für lokale UI-Tests ohne Server
|
||||||
|
const staff = { id: 1, name: 'Max Muster', email: 'max@example.de', role: 'agent', permissions: { view_reports: true, reply_ticket: true, close_ticket: true, post_note: true, assign_ticket: true, create_ticket: true, manage_teams: true, manage_roles: true, manage_business_hours: true } };
|
||||||
|
const prio = [{ id: 1, name: 'Hoch', color: '#ef4444' }, { id: 2, name: 'Normal', color: '#3b82f6' }];
|
||||||
|
const statuses = [{ value: 'open', label: 'Offen', color: '#3b82f6' }, { value: 'answered', label: 'Beantwortet', color: '#22c55e' }, { value: 'closed', label: 'Geschlossen', color: '#64748b' }, { value: 'resolved', label: 'Gelöst', color: '#16a34a' }];
|
||||||
|
const tk = (n, s, st, over) => ({ id: n, number: 'T-' + (1000 + n), subject: s, requesterName: 'Kunde ' + n, requesterEmail: `k${n}@mail.de`, status: st, priority: prio[n % 2], department: { id: 1, name: 'Technik' }, assignedStaff: n % 3 ? { id: 1, name: 'Max Muster' } : null, isOverdue: !!over, dueLabel: over ? 'vor 2 Std (überfällig)' : 'in 5 Std', isSpam: false, createdAt: '2026-10-12 08:00:00', updatedAt: '2026-10-12 09:1' + n + ':00' });
|
||||||
|
const tickets = [tk(1, 'Drucker druckt nicht', 'open', true), tk(2, 'Passwort zurücksetzen', 'answered'), tk(3, 'Rechnung fehlt', 'open'), tk(4, 'VPN Verbindung bricht ab', 'open', true)];
|
||||||
|
const routes = {
|
||||||
|
'me.php': () => ({ staff }), 'metadata.php': () => ({ staff, departments: [{ id: 1, name: 'Technik' }], priorities: prio, agents: [{ id: 1, name: 'Max Muster' }, { id: 2, name: 'Eva Beispiel' }], statuses, tags: [], liveChatEnabled: true }),
|
||||||
|
'activity.php': () => ({ newReplies: 0, newUnassigned: 0, serverTime: '2026-10-12 10:00:00', health: window.__health || [] }),
|
||||||
|
'dashboard.php': () => ({ myOpen: 3, overdue: 2, unassigned: 1, unanswered: 4, resolvedToday: 5, slaPercent: 92.4, recent: tickets, departments: [{ name: 'Technik', open: 8, overdue: 2 }, { name: 'Vertrieb', open: 3, overdue: 0 }] }),
|
||||||
|
'tickets.php': () => ({ items: tickets, page: 1, perPage: 30, total: 4, hasMore: false }),
|
||||||
|
'ticket.php': () => ({ ticket: { ...tickets[0], source: 'web', firstResponseDueAt: null, resolutionDueAt: '2026-10-12 12:00:00', lockedByOtherName: null, threads: [
|
||||||
|
{ id: 1, authorType: 'user', authorName: 'Kunde 1', message: 'Mein Drucker druckt nichts mehr.\nBitte helft.', isInternalNote: false, createdAt: '2026-10-12 08:00:00', attachments: [{ id: 1, name: 'foto.png', size: 20480 }], comments: [] },
|
||||||
|
{ id: 2, authorType: 'staff', authorName: 'Max Muster', message: 'Wir schauen uns das an.', isInternalNote: false, createdAt: '2026-10-12 08:30:00', attachments: [], comments: [] },
|
||||||
|
{ id: 3, authorType: 'staff', authorName: 'Max Muster', message: 'Treiber prüfen', isInternalNote: true, createdAt: '2026-10-12 08:35:00', attachments: [], comments: [] }] } }),
|
||||||
|
'queues.php': () => ({ items: [{ id: 1, name: 'Meine überfälligen', isShared: false, mine: true, ownerName: 'Max Muster', filters: { status: 'open,pending', assigned: 'me', sla: 'overdue' } }, { id: 2, name: 'Team-Überblick', isShared: true, mine: false, ownerName: 'Eva Beispiel', filters: { status: 'open,pending,answered' } }] }),
|
||||||
|
'report_builder.php': () => ({ config: { dimension: 'department', metrics: ['total', 'open', 'resolved', 'sla_resolve'], from: '2026-09-15', to: '2026-10-15', sort: 'label', desc: false, filters: {} },
|
||||||
|
columns: [{ key: 'label', label: 'Abteilung', unit: '' }, { key: 'total', label: 'Tickets gesamt', unit: '' }, { key: 'open', label: 'Offen', unit: '' }, { key: 'resolved', label: 'Gelöst/Geschlossen', unit: '' }, { key: 'sla_resolve', label: 'SLA Lösung', unit: '%' }],
|
||||||
|
rows: [{ label: 'Technik', total: 42, open: 8, resolved: 34, sla_resolve: 91.2 }, { label: 'Vertrieb', total: 17, open: 3, resolved: 14, sla_resolve: 97.5 }], totals: { total: 59, open: 11, resolved: 48, sla_resolve: 94.4 },
|
||||||
|
dimensions: [{ key: 'department', label: 'Abteilung' }, { key: 'month', label: 'Monat' }, { key: 'agent', label: 'Mitarbeiter' }],
|
||||||
|
metrics: [{ key: 'total', label: 'Tickets gesamt', unit: '' }, { key: 'open', label: 'Offen', unit: '' }, { key: 'resolved', label: 'Gelöst/Geschlossen', unit: '' }, { key: 'sla_resolve', label: 'SLA Lösung', unit: '%' }],
|
||||||
|
saved: [{ id: 1, name: 'Monatsbericht Support', isShared: true, mine: true, ownerName: 'Max Muster' }] }),
|
||||||
|
'canned_responses.php': () => ({ items: [{ id: 1, title: 'Gruß', body: 'Hallo,<br>danke für Ihre Nachricht.', departmentId: null }] }),
|
||||||
|
'customer.php': () => ({ customer: { name: 'Kunde 1', email: 'k1@mail.de' }, tickets }),
|
||||||
|
'teams.php': () => ({ staffOptions: [{ id: 1, name: 'Max Muster' }, { id: 2, name: 'Eva Beispiel' }], items: [{ id: 1, name: 'Support', leadId: 1, leadName: 'Max Muster', notes: '', isActive: true, memberCount: 2, memberIds: [1, 2] }] }),
|
||||||
|
'roles.php': () => ({ permissionKeys: ['reply_ticket', 'close_ticket', 'manage_teams'], defaultAgentPermissions: { reply_ticket: true }, items: [{ id: 1, name: 'Teamleitung', permissions: { reply_ticket: true }, staffCount: 2 }] }),
|
||||||
|
'business_hours.php': () => ({ enabled: true, hours: [1, 2, 3, 4, 5, 6, 0].map((w) => ({ weekday: w, isOpen: w > 0 && w < 6, openTime: '09:00', closeTime: '17:00' })), holidays: [{ id: 1, date: '2026-12-25', name: 'Weihnachten' }] }),
|
||||||
|
};
|
||||||
|
window.__calls = [];
|
||||||
|
window.deskhub = {
|
||||||
|
session: async () => ({ serverUrl: 'https://demo.example.de', staff }),
|
||||||
|
settings: async () => ({ theme: window.__theme || 'dark', autostart: false, closeToTray: true, notifications: true, pollSeconds: 60, version: '1.1.0', packaged: false }),
|
||||||
|
setSettings: async (p) => { if (p.theme) window.__theme = p.theme; return window.deskhub.settings(); },
|
||||||
|
login: async () => ({ staff }), logout: async () => true, notify: async () => {}, badge: async () => {},
|
||||||
|
api: async (req) => { window.__calls.push(req.path); const f = routes[req.path]; return f ? { data: f() } : { error: { message: 'Mock: ' + req.path + ' nicht vorhanden' } }; },
|
||||||
|
onSessionExpired() {}, onNavigate() {},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script src="../src/app.js"></script><script src="../src/admin-extra.js"></script>
|
||||||
|
</body></html>
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
// UI-Tests der Desktop-App: lädt test/mock.html in einem unsichtbaren Electron-Fenster
|
||||||
|
// (mit Mock-API statt Server) und steuert die echte Oberfläche per Skript.
|
||||||
|
// Start: npm test
|
||||||
|
const { app, BrowserWindow } = require('electron');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const failures = [];
|
||||||
|
let passed = 0;
|
||||||
|
const consoleErrors = [];
|
||||||
|
|
||||||
|
function check(name, ok, detail) {
|
||||||
|
if (ok) { passed++; console.log(' ok ' + name); }
|
||||||
|
else { failures.push(name); console.log(' FAIL ' + name + (detail ? ' – ' + detail : '')); }
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(async () => {
|
||||||
|
const win = new BrowserWindow({ show: false, width: 1280, height: 800, webPreferences: { contextIsolation: false, nodeIntegration: false } });
|
||||||
|
win.webContents.on('console-message', (_e, level, message) => { if (level >= 3) consoleErrors.push(message); });
|
||||||
|
win.webContents.on('render-process-gone', (_e, d) => { failures.push('Renderer abgestürzt: ' + d.reason); });
|
||||||
|
const run = (code) => win.webContents.executeJavaScript(code);
|
||||||
|
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
||||||
|
const waitFor = async (code, ms = 4000) => {
|
||||||
|
const end = Date.now() + ms;
|
||||||
|
while (Date.now() < end) { if (await run(code).catch(() => false)) return true; await wait(50); }
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
await win.loadFile(path.join(__dirname, 'mock.html'));
|
||||||
|
// Mock-Routen, die für die Admin-Seiten fehlen, liefern eine leere Liste statt eines Fehlers
|
||||||
|
await run(`(() => { const o = window.deskhub.api; window.deskhub.api = async (r) => { const res = await o(r); return res.error && /^Mock:/.test(res.error.message) ? { data: { items: [], rules: [], holidays: [], hours: [], staffOptions: [], departments: [], permissionKeys: [], fieldOptions: [], operatorOptions: [], actionOptions: [] } } : res; }; })()`);
|
||||||
|
|
||||||
|
console.log('Start & Navigation');
|
||||||
|
check('App startet und zeigt das Hauptgerüst', await waitFor(`!!document.querySelector('.side') && !!document.getElementById('main')`));
|
||||||
|
check('Seitenleiste enthält Hauptpunkte', await run(`['Übersicht','Tickets','Kunden'].every(t => document.querySelector('.side').innerText.includes(t))`));
|
||||||
|
|
||||||
|
await run(`go('dashboard')`);
|
||||||
|
check('Dashboard zeigt Kennzahlen', await waitFor(`document.getElementById('main').innerText.includes('Drucker druckt nicht')`));
|
||||||
|
|
||||||
|
await run(`go('tickets')`);
|
||||||
|
check('Ticketliste zeigt alle Tickets', await waitFor(`['Drucker druckt nicht','Passwort zurücksetzen','Rechnung fehlt','VPN Verbindung bricht ab'].every(t => document.getElementById('main').innerText.includes(t))`));
|
||||||
|
check('Gespeicherte Ansicht erscheint als Chip', await run(`document.getElementById('main').innerText.includes('Meine überfälligen')`));
|
||||||
|
|
||||||
|
await run(`go('ticket', 1)`);
|
||||||
|
check('Ticketdetail zeigt Betreff und Verlauf', await waitFor(`['Drucker druckt nicht', 'Mein Drucker druckt nichts mehr', 'Treiber prüfen'].every(x => document.getElementById('main').innerText.includes(x))`));
|
||||||
|
check('Ticketdetail zeigt Eigenschaften und Aktionen', await run(`['eigenschaften', 'schließen'].every(x => document.getElementById('main').innerText.toLowerCase().includes(x))`));
|
||||||
|
check('Interne Notiz ist gekennzeichnet', await run(`!!document.querySelector('.thread.note')`));
|
||||||
|
|
||||||
|
await run(`go('reports')`);
|
||||||
|
check('Berichte laden Tabelle mit Summen', await waitFor(`['Technik', 'Vertrieb', '59'].every(x => document.getElementById('main').innerText.includes(x))`));
|
||||||
|
|
||||||
|
console.log('Verwaltung');
|
||||||
|
await run(`state.staff.role = 'admin'`);
|
||||||
|
const sections = await run(`adminSections().map(s => s.key)`);
|
||||||
|
check('Verwaltungsbereiche vorhanden', sections.length >= 10, 'gefunden: ' + sections.length);
|
||||||
|
for (const key of sections) {
|
||||||
|
await run(`go('admin', '${key}')`);
|
||||||
|
const ok = await waitFor(`document.getElementById('main').children.length > 0 && !document.querySelector('#main .warnbox')`, 3000);
|
||||||
|
check('Verwaltung „' + key + '“ rendert ohne Fehler', ok, await run(`(document.querySelector('#main .warnbox')||{}).innerText || ''`));
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Theme');
|
||||||
|
await run(`window.deskhub.setSettings({ theme: 'light' }).then(() => { state.prefs = { ...state.prefs, theme: 'light' }; applyTheme(); })`);
|
||||||
|
check('Hell-Modus setzt data-theme', await waitFor(`document.documentElement.dataset.theme === 'light'`));
|
||||||
|
await run(`window.deskhub.setSettings({ theme: 'dark' }).then(() => { state.prefs = { ...state.prefs, theme: 'dark' }; applyTheme(); })`);
|
||||||
|
check('Dunkel-Modus setzt data-theme', await waitFor(`document.documentElement.dataset.theme === 'dark'`));
|
||||||
|
|
||||||
|
console.log('Verbindung & Überwachung');
|
||||||
|
await run(`go('dashboard')`);
|
||||||
|
await run(`window.__origApi = window.deskhub.api; window.deskhub.api = async () => ({ error: { code: 'NETWORK', status: 0, message: 'Server nicht erreichbar.' } }); pollActivity()`);
|
||||||
|
check('Fehlende Verbindung zeigt Banner', await waitFor(`document.getElementById('banners').innerText.includes('Keine Verbindung zum Server')`, 6000));
|
||||||
|
check('Banner bietet „Jetzt erneut versuchen“', await run(`document.getElementById('banners').innerText.includes('Jetzt erneut versuchen')`));
|
||||||
|
await run(`window.deskhub.api = window.__origApi; retryNow()`);
|
||||||
|
check('Banner verschwindet nach Wiederherstellung', await waitFor(`!document.getElementById('banners').innerText.includes('Keine Verbindung zum Server')`, 6000));
|
||||||
|
await run(`window.__health = [{ level: 'error', code: 'mailbox_down', message: 'Postfach „support@example.de“ ist nicht erreichbar.' }]; pollActivity()`);
|
||||||
|
check('Serverstörung (Mailabruf) wird als Banner gezeigt', await waitFor(`document.getElementById('banners').innerText.includes('support@example.de')`, 6000));
|
||||||
|
|
||||||
|
check('Keine JavaScript-Fehler in der Konsole', consoleErrors.length === 0, consoleErrors.slice(0, 3).join(' | '));
|
||||||
|
} catch (e) {
|
||||||
|
failures.push('Testlauf abgebrochen: ' + e.message);
|
||||||
|
console.log(' FAIL ' + e.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n${passed} bestanden, ${failures.length} fehlgeschlagen`);
|
||||||
|
app.exit(failures.length ? 1 : 0);
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user