ui: migrate client to gtk
This commit is contained in:
@@ -42,7 +42,7 @@ public class AppUpdater
|
|||||||
{
|
{
|
||||||
var client = new HttpClient();
|
var client = new HttpClient();
|
||||||
var tempFileName = Path.GetTempFileName();
|
var tempFileName = Path.GetTempFileName();
|
||||||
var appFileName = Pilz.Win32.NativeTools.GetExecutablePath();
|
var appFileName = Environment.ProcessPath;
|
||||||
var oldFileName = appFileName + ".old";
|
var oldFileName = appFileName + ".old";
|
||||||
|
|
||||||
// Delete old file
|
// Delete old file
|
||||||
|
|||||||
351
ModpackUpdater.Apps.Client/Form1.Designer.cs
generated
351
ModpackUpdater.Apps.Client/Form1.Designer.cs
generated
@@ -1,351 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace ModpackUpdater.Apps.Client
|
|
||||||
{
|
|
||||||
[Microsoft.VisualBasic.CompilerServices.DesignerGenerated()]
|
|
||||||
|
|
||||||
public partial class Form1 : Telerik.WinControls.UI.RadForm
|
|
||||||
{
|
|
||||||
|
|
||||||
// Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
|
|
||||||
[DebuggerNonUserCode()]
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (disposing && components is not null)
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wird vom Windows Form-Designer benötigt.
|
|
||||||
private System.ComponentModel.IContainer components = new System.ComponentModel.Container();
|
|
||||||
|
|
||||||
// Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
|
|
||||||
// Das Bearbeiten ist mit dem Windows Form-Designer möglich.
|
|
||||||
// Das Bearbeiten mit dem Code-Editor ist nicht möglich.
|
|
||||||
[DebuggerStepThrough()]
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
var resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
|
|
||||||
RadLabel1 = new Telerik.WinControls.UI.RadLabel();
|
|
||||||
RadLabel2 = new Telerik.WinControls.UI.RadLabel();
|
|
||||||
RadLabel3 = new Telerik.WinControls.UI.RadLabel();
|
|
||||||
RadLabel_Status = new Telerik.WinControls.UI.RadLabel();
|
|
||||||
RadTextBox_MinecraftProfileFolder = new Telerik.WinControls.UI.RadTextBox();
|
|
||||||
RadTextBox_ModpackConfig = new Telerik.WinControls.UI.RadTextBox();
|
|
||||||
RadButton_Install = new Telerik.WinControls.UI.RadSplitButton();
|
|
||||||
radMenuItem_Install = new Telerik.WinControls.UI.RadMenuItem();
|
|
||||||
radMenuItem_Repair = new Telerik.WinControls.UI.RadMenuItem();
|
|
||||||
RadButton_CheckForUpdates = new Telerik.WinControls.UI.RadButton();
|
|
||||||
RadButton_PasteModpackConfig = new Telerik.WinControls.UI.RadButton();
|
|
||||||
RadButton_SearchMinecraftProfileFolder = new Telerik.WinControls.UI.RadButton();
|
|
||||||
tableLayoutPanel1 = new TableLayoutPanel();
|
|
||||||
radLabel4 = new Telerik.WinControls.UI.RadLabel();
|
|
||||||
radTextBox_InstallKey = new Telerik.WinControls.UI.RadTextBox();
|
|
||||||
radButton_PasteInstallKey = new Telerik.WinControls.UI.RadButton();
|
|
||||||
radButton_RefreshConfig = new Telerik.WinControls.UI.RadButton();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadLabel1).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadLabel2).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadLabel3).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadLabel_Status).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadTextBox_MinecraftProfileFolder).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadTextBox_ModpackConfig).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadButton_Install).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).BeginInit();
|
|
||||||
tableLayoutPanel1.SuspendLayout();
|
|
||||||
((System.ComponentModel.ISupportInitialize)radLabel4).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)radTextBox_InstallKey).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)radButton_PasteInstallKey).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)this).BeginInit();
|
|
||||||
SuspendLayout();
|
|
||||||
//
|
|
||||||
// RadLabel1
|
|
||||||
//
|
|
||||||
RadLabel1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
RadLabel1.AutoSize = false;
|
|
||||||
RadLabel1.Location = new Point(3, 3);
|
|
||||||
RadLabel1.Name = "RadLabel1";
|
|
||||||
RadLabel1.Size = new Size(144, 24);
|
|
||||||
RadLabel1.TabIndex = 0;
|
|
||||||
RadLabel1.Text = "Minecraft profile folder:";
|
|
||||||
//
|
|
||||||
// RadLabel2
|
|
||||||
//
|
|
||||||
RadLabel2.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
RadLabel2.AutoSize = false;
|
|
||||||
RadLabel2.Location = new Point(3, 63);
|
|
||||||
RadLabel2.Name = "RadLabel2";
|
|
||||||
RadLabel2.Size = new Size(144, 24);
|
|
||||||
RadLabel2.TabIndex = 1;
|
|
||||||
RadLabel2.Text = "Modpack config:";
|
|
||||||
//
|
|
||||||
// RadLabel3
|
|
||||||
//
|
|
||||||
RadLabel3.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
RadLabel3.AutoSize = false;
|
|
||||||
RadLabel3.Location = new Point(3, 183);
|
|
||||||
RadLabel3.Name = "RadLabel3";
|
|
||||||
RadLabel3.Size = new Size(144, 24);
|
|
||||||
RadLabel3.TabIndex = 2;
|
|
||||||
RadLabel3.Text = "Status:";
|
|
||||||
//
|
|
||||||
// RadLabel_Status
|
|
||||||
//
|
|
||||||
RadLabel_Status.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
RadLabel_Status.AutoSize = false;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(RadLabel_Status, 6);
|
|
||||||
RadLabel_Status.Location = new Point(153, 183);
|
|
||||||
RadLabel_Status.Name = "RadLabel_Status";
|
|
||||||
RadLabel_Status.Size = new Size(266, 24);
|
|
||||||
RadLabel_Status.TabIndex = 3;
|
|
||||||
RadLabel_Status.Text = "-";
|
|
||||||
RadLabel_Status.TextImageRelation = TextImageRelation.ImageBeforeText;
|
|
||||||
//
|
|
||||||
// RadTextBox_MinecraftProfileFolder
|
|
||||||
//
|
|
||||||
RadTextBox_MinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(RadTextBox_MinecraftProfileFolder, 6);
|
|
||||||
RadTextBox_MinecraftProfileFolder.Location = new Point(153, 3);
|
|
||||||
RadTextBox_MinecraftProfileFolder.Name = "RadTextBox_MinecraftProfileFolder";
|
|
||||||
RadTextBox_MinecraftProfileFolder.NullText = "No file loaded!";
|
|
||||||
RadTextBox_MinecraftProfileFolder.ReadOnly = true;
|
|
||||||
RadTextBox_MinecraftProfileFolder.Size = new Size(266, 24);
|
|
||||||
RadTextBox_MinecraftProfileFolder.TabIndex = 4;
|
|
||||||
//
|
|
||||||
// RadTextBox_ModpackConfig
|
|
||||||
//
|
|
||||||
RadTextBox_ModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(RadTextBox_ModpackConfig, 6);
|
|
||||||
RadTextBox_ModpackConfig.Location = new Point(153, 63);
|
|
||||||
RadTextBox_ModpackConfig.Name = "RadTextBox_ModpackConfig";
|
|
||||||
RadTextBox_ModpackConfig.NullText = "No config url provided.";
|
|
||||||
RadTextBox_ModpackConfig.ReadOnly = true;
|
|
||||||
RadTextBox_ModpackConfig.Size = new Size(266, 24);
|
|
||||||
RadTextBox_ModpackConfig.TabIndex = 5;
|
|
||||||
//
|
|
||||||
// RadButton_Install
|
|
||||||
//
|
|
||||||
RadButton_Install.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(RadButton_Install, 2);
|
|
||||||
RadButton_Install.ImageAlignment = ContentAlignment.MiddleRight;
|
|
||||||
RadButton_Install.Items.AddRange(new Telerik.WinControls.RadItem[] { radMenuItem_Install, radMenuItem_Repair });
|
|
||||||
RadButton_Install.Location = new Point(325, 213);
|
|
||||||
RadButton_Install.Name = "RadButton_Install";
|
|
||||||
RadButton_Install.Size = new Size(94, 24);
|
|
||||||
RadButton_Install.TabIndex = 10;
|
|
||||||
RadButton_Install.Text = "Install";
|
|
||||||
RadButton_Install.TextAlignment = ContentAlignment.MiddleLeft;
|
|
||||||
RadButton_Install.TextImageRelation = TextImageRelation.ImageBeforeText;
|
|
||||||
RadButton_Install.Click += ButtonX_StartUpdate_Click;
|
|
||||||
//
|
|
||||||
// radMenuItem_Install
|
|
||||||
//
|
|
||||||
radMenuItem_Install.Name = "radMenuItem_Install";
|
|
||||||
radMenuItem_Install.Text = "Install";
|
|
||||||
radMenuItem_Install.Click += RadMenuItem_Install_Click;
|
|
||||||
//
|
|
||||||
// radMenuItem_Repair
|
|
||||||
//
|
|
||||||
radMenuItem_Repair.Name = "radMenuItem_Repair";
|
|
||||||
radMenuItem_Repair.Text = "Repair";
|
|
||||||
radMenuItem_Repair.Click += RadMenuItem_Repair_Click;
|
|
||||||
//
|
|
||||||
// RadButton_CheckForUpdates
|
|
||||||
//
|
|
||||||
RadButton_CheckForUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(RadButton_CheckForUpdates, 4);
|
|
||||||
RadButton_CheckForUpdates.ImageAlignment = ContentAlignment.MiddleRight;
|
|
||||||
RadButton_CheckForUpdates.Location = new Point(153, 213);
|
|
||||||
RadButton_CheckForUpdates.Name = "RadButton_CheckForUpdates";
|
|
||||||
RadButton_CheckForUpdates.Size = new Size(166, 24);
|
|
||||||
RadButton_CheckForUpdates.TabIndex = 0;
|
|
||||||
RadButton_CheckForUpdates.Text = "Check for Updates";
|
|
||||||
RadButton_CheckForUpdates.TextAlignment = ContentAlignment.MiddleLeft;
|
|
||||||
RadButton_CheckForUpdates.TextImageRelation = TextImageRelation.ImageBeforeText;
|
|
||||||
RadButton_CheckForUpdates.Click += ButtonX_CheckForUpdates_Click;
|
|
||||||
//
|
|
||||||
// RadButton_PasteModpackConfig
|
|
||||||
//
|
|
||||||
RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(RadButton_PasteModpackConfig, 2);
|
|
||||||
RadButton_PasteModpackConfig.ImageAlignment = ContentAlignment.MiddleRight;
|
|
||||||
RadButton_PasteModpackConfig.Location = new Point(325, 93);
|
|
||||||
RadButton_PasteModpackConfig.Name = "RadButton_PasteModpackConfig";
|
|
||||||
RadButton_PasteModpackConfig.Size = new Size(94, 24);
|
|
||||||
RadButton_PasteModpackConfig.TabIndex = 7;
|
|
||||||
RadButton_PasteModpackConfig.Text = "Paste";
|
|
||||||
RadButton_PasteModpackConfig.TextAlignment = ContentAlignment.MiddleLeft;
|
|
||||||
RadButton_PasteModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText;
|
|
||||||
RadButton_PasteModpackConfig.Click += RadButton_PasteModpackConfig_Click;
|
|
||||||
//
|
|
||||||
// RadButton_SearchMinecraftProfileFolder
|
|
||||||
//
|
|
||||||
RadButton_SearchMinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(RadButton_SearchMinecraftProfileFolder, 2);
|
|
||||||
RadButton_SearchMinecraftProfileFolder.ImageAlignment = ContentAlignment.MiddleRight;
|
|
||||||
RadButton_SearchMinecraftProfileFolder.Location = new Point(325, 33);
|
|
||||||
RadButton_SearchMinecraftProfileFolder.Name = "RadButton_SearchMinecraftProfileFolder";
|
|
||||||
RadButton_SearchMinecraftProfileFolder.Size = new Size(94, 24);
|
|
||||||
RadButton_SearchMinecraftProfileFolder.TabIndex = 6;
|
|
||||||
RadButton_SearchMinecraftProfileFolder.Text = "Search";
|
|
||||||
RadButton_SearchMinecraftProfileFolder.TextAlignment = ContentAlignment.MiddleLeft;
|
|
||||||
RadButton_SearchMinecraftProfileFolder.TextImageRelation = TextImageRelation.ImageBeforeText;
|
|
||||||
RadButton_SearchMinecraftProfileFolder.Click += ButtonX_SearchMinecraftProfile_Click;
|
|
||||||
//
|
|
||||||
// tableLayoutPanel1
|
|
||||||
//
|
|
||||||
tableLayoutPanel1.AutoSize = true;
|
|
||||||
tableLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
|
||||||
tableLayoutPanel1.ColumnCount = 7;
|
|
||||||
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 150F));
|
|
||||||
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
|
||||||
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F));
|
|
||||||
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F));
|
|
||||||
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F));
|
|
||||||
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F));
|
|
||||||
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F));
|
|
||||||
tableLayoutPanel1.Controls.Add(RadLabel1, 0, 0);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadLabel2, 0, 2);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadTextBox_MinecraftProfileFolder, 1, 0);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadTextBox_ModpackConfig, 1, 2);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadLabel_Status, 1, 6);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadLabel3, 0, 6);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadButton_SearchMinecraftProfileFolder, 5, 1);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadButton_Install, 5, 7);
|
|
||||||
tableLayoutPanel1.Controls.Add(radLabel4, 0, 4);
|
|
||||||
tableLayoutPanel1.Controls.Add(radTextBox_InstallKey, 1, 4);
|
|
||||||
tableLayoutPanel1.Controls.Add(radButton_PasteInstallKey, 5, 5);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadButton_PasteModpackConfig, 5, 3);
|
|
||||||
tableLayoutPanel1.Controls.Add(radButton_RefreshConfig, 4, 3);
|
|
||||||
tableLayoutPanel1.Controls.Add(RadButton_CheckForUpdates, 1, 7);
|
|
||||||
tableLayoutPanel1.Dock = DockStyle.Fill;
|
|
||||||
tableLayoutPanel1.Location = new Point(0, 0);
|
|
||||||
tableLayoutPanel1.Name = "tableLayoutPanel1";
|
|
||||||
tableLayoutPanel1.RowCount = 8;
|
|
||||||
tableLayoutPanel1.RowStyles.Add(new RowStyle());
|
|
||||||
tableLayoutPanel1.RowStyles.Add(new RowStyle());
|
|
||||||
tableLayoutPanel1.RowStyles.Add(new RowStyle());
|
|
||||||
tableLayoutPanel1.RowStyles.Add(new RowStyle());
|
|
||||||
tableLayoutPanel1.RowStyles.Add(new RowStyle());
|
|
||||||
tableLayoutPanel1.RowStyles.Add(new RowStyle());
|
|
||||||
tableLayoutPanel1.RowStyles.Add(new RowStyle());
|
|
||||||
tableLayoutPanel1.RowStyles.Add(new RowStyle());
|
|
||||||
tableLayoutPanel1.Size = new Size(422, 249);
|
|
||||||
tableLayoutPanel1.TabIndex = 7;
|
|
||||||
//
|
|
||||||
// radLabel4
|
|
||||||
//
|
|
||||||
radLabel4.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
radLabel4.AutoSize = false;
|
|
||||||
radLabel4.Location = new Point(3, 123);
|
|
||||||
radLabel4.Name = "radLabel4";
|
|
||||||
radLabel4.Size = new Size(144, 24);
|
|
||||||
radLabel4.TabIndex = 12;
|
|
||||||
radLabel4.Text = "Installation key:";
|
|
||||||
//
|
|
||||||
// radTextBox_InstallKey
|
|
||||||
//
|
|
||||||
radTextBox_InstallKey.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(radTextBox_InstallKey, 6);
|
|
||||||
radTextBox_InstallKey.Location = new Point(153, 123);
|
|
||||||
radTextBox_InstallKey.Name = "radTextBox_InstallKey";
|
|
||||||
radTextBox_InstallKey.NullText = "No key provided. Only for private servers.";
|
|
||||||
radTextBox_InstallKey.ReadOnly = true;
|
|
||||||
radTextBox_InstallKey.Size = new Size(266, 24);
|
|
||||||
radTextBox_InstallKey.TabIndex = 13;
|
|
||||||
//
|
|
||||||
// radButton_PasteInstallKey
|
|
||||||
//
|
|
||||||
radButton_PasteInstallKey.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
|
||||||
tableLayoutPanel1.SetColumnSpan(radButton_PasteInstallKey, 2);
|
|
||||||
radButton_PasteInstallKey.ImageAlignment = ContentAlignment.MiddleRight;
|
|
||||||
radButton_PasteInstallKey.Location = new Point(325, 153);
|
|
||||||
radButton_PasteInstallKey.Name = "radButton_PasteInstallKey";
|
|
||||||
radButton_PasteInstallKey.Size = new Size(94, 24);
|
|
||||||
radButton_PasteInstallKey.TabIndex = 14;
|
|
||||||
radButton_PasteInstallKey.Text = "Paste";
|
|
||||||
radButton_PasteInstallKey.TextAlignment = ContentAlignment.MiddleLeft;
|
|
||||||
radButton_PasteInstallKey.TextImageRelation = TextImageRelation.ImageBeforeText;
|
|
||||||
radButton_PasteInstallKey.Click += RadButton_PasteInstallKey_Click;
|
|
||||||
//
|
|
||||||
// radButton_RefreshConfig
|
|
||||||
//
|
|
||||||
radButton_RefreshConfig.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
|
||||||
radButton_RefreshConfig.DisplayStyle = Telerik.WinControls.DisplayStyle.Image;
|
|
||||||
radButton_RefreshConfig.ImageAlignment = ContentAlignment.MiddleCenter;
|
|
||||||
radButton_RefreshConfig.Location = new Point(295, 93);
|
|
||||||
radButton_RefreshConfig.Name = "radButton_RefreshConfig";
|
|
||||||
radButton_RefreshConfig.Size = new Size(24, 24);
|
|
||||||
radButton_RefreshConfig.TabIndex = 11;
|
|
||||||
radButton_RefreshConfig.Text = "Reload";
|
|
||||||
radButton_RefreshConfig.Click += RadButton_RefreshConfig_Click;
|
|
||||||
//
|
|
||||||
// Form1
|
|
||||||
//
|
|
||||||
AutoScaleBaseSize = new Size(7, 15);
|
|
||||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
|
||||||
AutoScaleMode = AutoScaleMode.Font;
|
|
||||||
AutoSize = true;
|
|
||||||
AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
|
||||||
ClientSize = new Size(422, 249);
|
|
||||||
Controls.Add(tableLayoutPanel1);
|
|
||||||
Icon = (Icon)resources.GetObject("$this.Icon");
|
|
||||||
MaximizeBox = false;
|
|
||||||
MinimumSize = new Size(430, 0);
|
|
||||||
Name = "Form1";
|
|
||||||
StartPosition = FormStartPosition.CenterScreen;
|
|
||||||
Text = "Minecraft Modpack Updater";
|
|
||||||
FormClosing += Form1_FormClosing;
|
|
||||||
Load += Form1_Load;
|
|
||||||
Shown += Form1_Shown;
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadLabel1).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadLabel2).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadLabel3).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadLabel_Status).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadTextBox_MinecraftProfileFolder).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadTextBox_ModpackConfig).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadButton_Install).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).EndInit();
|
|
||||||
tableLayoutPanel1.ResumeLayout(false);
|
|
||||||
tableLayoutPanel1.PerformLayout();
|
|
||||||
((System.ComponentModel.ISupportInitialize)radLabel4).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)radTextBox_InstallKey).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)radButton_PasteInstallKey).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)this).EndInit();
|
|
||||||
ResumeLayout(false);
|
|
||||||
PerformLayout();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal Telerik.WinControls.UI.RadLabel RadLabel1;
|
|
||||||
internal Telerik.WinControls.UI.RadLabel RadLabel2;
|
|
||||||
internal Telerik.WinControls.UI.RadLabel RadLabel3;
|
|
||||||
internal Telerik.WinControls.UI.RadLabel RadLabel_Status;
|
|
||||||
internal Telerik.WinControls.UI.RadTextBox RadTextBox_MinecraftProfileFolder;
|
|
||||||
internal Telerik.WinControls.UI.RadTextBox RadTextBox_ModpackConfig;
|
|
||||||
internal Telerik.WinControls.UI.RadSplitButton RadButton_Install;
|
|
||||||
internal Telerik.WinControls.UI.RadButton RadButton_CheckForUpdates;
|
|
||||||
internal Telerik.WinControls.UI.RadButton RadButton_SearchMinecraftProfileFolder;
|
|
||||||
internal Telerik.WinControls.UI.RadButton RadButton_PasteModpackConfig;
|
|
||||||
private TableLayoutPanel tableLayoutPanel1;
|
|
||||||
private Telerik.WinControls.UI.RadButton radButton_RefreshConfig;
|
|
||||||
internal Telerik.WinControls.UI.RadLabel radLabel4;
|
|
||||||
internal Telerik.WinControls.UI.RadTextBox radTextBox_InstallKey;
|
|
||||||
internal Telerik.WinControls.UI.RadButton radButton_PasteInstallKey;
|
|
||||||
private Telerik.WinControls.UI.RadMenuItem radMenuItem_Repair;
|
|
||||||
private Telerik.WinControls.UI.RadMenuItem radMenuItem_Install;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,333 +0,0 @@
|
|||||||
using ModpackUpdater.Manager;
|
|
||||||
using ModpackUpdater.My.Resources;
|
|
||||||
using Pilz.Extensions;
|
|
||||||
using Pilz.UI.Symbols;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Reflection;
|
|
||||||
using Telerik.WinControls;
|
|
||||||
using Telerik.WinControls.UI;
|
|
||||||
|
|
||||||
namespace ModpackUpdater.Apps.Client;
|
|
||||||
|
|
||||||
public partial class Form1
|
|
||||||
{
|
|
||||||
private ModpackInfo modpackInfo = new();
|
|
||||||
private ModpackConfig updateConfig = new();
|
|
||||||
private ModpackFeatures features;
|
|
||||||
private bool currentUpdating = false;
|
|
||||||
private UpdateCheckResult lastUpdateCheckResult = null;
|
|
||||||
private readonly UpdateCheckOptionsAdv updateOptions;
|
|
||||||
|
|
||||||
public Form1(UpdateCheckOptionsAdv updateOptions) : this()
|
|
||||||
{
|
|
||||||
this.updateOptions = updateOptions;
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(updateOptions.ProfileFolder))
|
|
||||||
LoadMinecraftProfile(updateOptions.ProfileFolder);
|
|
||||||
else if (!string.IsNullOrWhiteSpace(AppConfig.Instance.LastMinecraftProfilePath))
|
|
||||||
LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Form1()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
Text = $"{Text} (v{Assembly.GetExecutingAssembly().GetAppVersion()})";
|
|
||||||
RadButton_Install.DefaultItem = radMenuItem_Install;
|
|
||||||
|
|
||||||
RadButton_CheckForUpdates.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.update_done, SymbolSize.Small);
|
|
||||||
radButton_RefreshConfig.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.refresh, SymbolSize.Small);
|
|
||||||
RadButton_SearchMinecraftProfileFolder.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.opened_folder, SymbolSize.Small);
|
|
||||||
radButton_PasteInstallKey.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.paste, SymbolSize.Small);
|
|
||||||
RadButton_PasteModpackConfig.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.paste, SymbolSize.Small);
|
|
||||||
RadButton_Install.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small);
|
|
||||||
radMenuItem_Install.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small);
|
|
||||||
radMenuItem_Repair.SvgImage = AppGlobals.Symbols.GetSvgImage(AppSymbols.wrench, SymbolSize.Small);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LoadMinecraftProfile(string folderPath)
|
|
||||||
{
|
|
||||||
RadTextBox_MinecraftProfileFolder.Text = folderPath;
|
|
||||||
AppConfig.Instance.LastMinecraftProfilePath = folderPath;
|
|
||||||
CheckStatusAndUpdate(loadedProfile: true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LoadUpdateConfigFile(string filePath)
|
|
||||||
{
|
|
||||||
RadTextBox_ModpackConfig.Text = filePath;
|
|
||||||
CheckStatusAndUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LoadInstallKey(string installKey)
|
|
||||||
{
|
|
||||||
radTextBox_InstallKey.Text = installKey;
|
|
||||||
CheckStatusAndUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetStatus(string statusText, RadSvgImage image)
|
|
||||||
{
|
|
||||||
RadLabel_Status.Text = statusText;
|
|
||||||
RadLabel_Status.SvgImage = image;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ClearStatus()
|
|
||||||
{
|
|
||||||
RadLabel_Status.Text = "-";
|
|
||||||
RadLabel_Status.SvgImage = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CheckStatusAndUpdate(bool loadedProfile = false)
|
|
||||||
{
|
|
||||||
if (CheckStatus(loadedProfile))
|
|
||||||
RadButton_CheckForUpdates.PerformClick();
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool CheckStatus(bool loadedProfile)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
modpackInfo = ModpackInfo.TryLoad(RadTextBox_MinecraftProfileFolder.Text.Trim());
|
|
||||||
if (loadedProfile)
|
|
||||||
{
|
|
||||||
RadTextBox_ModpackConfig.Text = modpackInfo.ConfigUrl;
|
|
||||||
radTextBox_InstallKey.Text = modpackInfo.ExtrasKey;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
modpackInfo.ExtrasKey = radTextBox_InstallKey.Text;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
updateConfig = ModpackConfig.LoadFromUrl(RadTextBox_ModpackConfig.Text);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
if (modpackInfo != null)
|
|
||||||
features = new(updateConfig);
|
|
||||||
|
|
||||||
if (modpackInfo == null || string.IsNullOrWhiteSpace(RadTextBox_MinecraftProfileFolder.Text) /*|| modpackInfo.Valid*/)
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppGlobals.Symbols.GetSvgImage(AppSymbols.general_warning_sign, SymbolSize.Small));
|
|
||||||
RadButton_PasteModpackConfig.Enabled = false;
|
|
||||||
radButton_PasteInstallKey.Enabled = false;
|
|
||||||
RadButton_CheckForUpdates.Enabled = false;
|
|
||||||
RadButton_Install.Enabled = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (updateConfig == null || string.IsNullOrWhiteSpace(RadTextBox_ModpackConfig.Text))
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusText_ConfigIncompleteOrNotLoaded, AppGlobals.Symbols.GetSvgImage(AppSymbols.general_warning_sign, SymbolSize.Small));
|
|
||||||
RadButton_PasteModpackConfig.Enabled = true;
|
|
||||||
radButton_PasteInstallKey.Enabled = false;
|
|
||||||
RadButton_CheckForUpdates.Enabled = false;
|
|
||||||
RadButton_Install.Enabled = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (updateConfig.Maintenance && !updateOptions.IgnoreMaintenance)
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusText_Maintenance, AppGlobals.Symbols.GetSvgImage(AppSymbols.services, SymbolSize.Small));
|
|
||||||
RadButton_PasteModpackConfig.Enabled = true;
|
|
||||||
radButton_PasteInstallKey.Enabled = true;
|
|
||||||
RadButton_CheckForUpdates.Enabled = false;
|
|
||||||
RadButton_Install.Enabled = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
RadButton_PasteModpackConfig.Enabled = true;
|
|
||||||
radButton_PasteInstallKey.Enabled = true;
|
|
||||||
RadButton_CheckForUpdates.Enabled = true;
|
|
||||||
RadButton_Install.Enabled = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task ExecuteUpdate(bool doInstall, bool repair)
|
|
||||||
{
|
|
||||||
var updater = new ModpackInstaller(updateConfig, modpackInfo)
|
|
||||||
{
|
|
||||||
OverwriteRefTag = Program.Options.RefTag,
|
|
||||||
OverwriteVersion = Program.Options.Version,
|
|
||||||
};
|
|
||||||
updater.InstallProgessUpdated += Update_InstallProgessUpdated;
|
|
||||||
updater.CheckingProgressUpdated += Updated_CheckingProgresssUpdated;
|
|
||||||
|
|
||||||
void error()
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppGlobals.Symbols.GetSvgImage(AppSymbols.close, SymbolSize.Small));
|
|
||||||
currentUpdating = false;
|
|
||||||
}
|
|
||||||
void installing()
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusText_Installing, AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small));
|
|
||||||
currentUpdating = true;
|
|
||||||
}
|
|
||||||
void updatesAvailable()
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusText_UpdateAvailable, AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small));
|
|
||||||
}
|
|
||||||
void everythingOk()
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusTest_EverythingOk, AppGlobals.Symbols.GetSvgImage(AppSymbols.done, SymbolSize.Small));
|
|
||||||
currentUpdating = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check only if not pressed "install", not really needed otherwise.
|
|
||||||
if (lastUpdateCheckResult is null || !doInstall || repair)
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusText_CheckingForUpdates, AppGlobals.Symbols.GetSvgImage(AppSymbols.update_done, SymbolSize.Small));
|
|
||||||
|
|
||||||
// Check for extras once again
|
|
||||||
updateOptions.IncludeExtras = features.IsEnabled(ModpackFeatures.FeatureAllowExtas, new AllowExtrasFeatureContext(modpackInfo));
|
|
||||||
|
|
||||||
// Force re-install on repair
|
|
||||||
updateOptions.IgnoreInstalledVersion = repair;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
lastUpdateCheckResult = await updater.Check(updateOptions);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
error();
|
|
||||||
if (Debugger.IsAttached)
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error while update check
|
|
||||||
if (lastUpdateCheckResult is null || lastUpdateCheckResult.HasError)
|
|
||||||
{
|
|
||||||
error();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No updates available
|
|
||||||
if (!lastUpdateCheckResult.HasUpdates)
|
|
||||||
{
|
|
||||||
everythingOk();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Updates available (but don't install)
|
|
||||||
if (!doInstall)
|
|
||||||
{
|
|
||||||
updatesAvailable();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Install updates
|
|
||||||
installing();
|
|
||||||
currentUpdating = true;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Install
|
|
||||||
if (await updater.Install(lastUpdateCheckResult) == false)
|
|
||||||
{
|
|
||||||
error();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Success
|
|
||||||
lastUpdateCheckResult = null; // Reset last update check, a new one would be needed now.
|
|
||||||
everythingOk();
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
// Error
|
|
||||||
error();
|
|
||||||
if (Debugger.IsAttached)
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Update_InstallProgessUpdated(UpdateCheckResult result, int processedSyncs)
|
|
||||||
{
|
|
||||||
int actionCount = result.Actions.Count;
|
|
||||||
SetStatus(Math.Round(processedSyncs / (double)actionCount * 100d, 1) + "%", AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Updated_CheckingProgresssUpdated(int toCheck, int processed)
|
|
||||||
{
|
|
||||||
SetStatus(Math.Round(processed / (double)toCheck * 100d, 1) + "%", AppGlobals.Symbols.GetSvgImage(AppSymbols.update_done, SymbolSize.Small));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ButtonX_SearchMinecraftProfile_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
var ofd = new RadOpenFolderDialog();
|
|
||||||
if (ofd.ShowDialog(this) == DialogResult.OK)
|
|
||||||
LoadMinecraftProfile(ofd.FileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RadButton_PasteModpackConfig_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
LoadUpdateConfigFile(Clipboard.GetText());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RadButton_PasteInstallKey_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
LoadInstallKey(Clipboard.GetText());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RadButton_RefreshConfig_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
LoadUpdateConfigFile(RadTextBox_ModpackConfig.Text);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void ButtonX_CheckForUpdates_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
ClearStatus();
|
|
||||||
await ExecuteUpdate(false, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void ButtonX_StartUpdate_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void RadMenuItem_Install_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (!currentUpdating)
|
|
||||||
{
|
|
||||||
ClearStatus();
|
|
||||||
await ExecuteUpdate(true, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void RadMenuItem_Repair_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (!currentUpdating)
|
|
||||||
{
|
|
||||||
ClearStatus();
|
|
||||||
await ExecuteUpdate(true, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
|
|
||||||
{
|
|
||||||
AppConfig.Instance.LastMinecraftProfilePath = RadTextBox_MinecraftProfileFolder.Text;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Form1_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (Directory.Exists(AppConfig.Instance.LastMinecraftProfilePath))
|
|
||||||
LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void Form1_Shown(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
var updater = new AppUpdater();
|
|
||||||
if (!updateOptions.NoUpdate && await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes)
|
|
||||||
{
|
|
||||||
SetStatus(LangRes.StatusText_InstallingAppUpdate, AppGlobals.Symbols.GetSvgImage(AppSymbols.software_installer, SymbolSize.Small));
|
|
||||||
Enabled = false;
|
|
||||||
await updater.Install();
|
|
||||||
Application.Restart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
348
ModpackUpdater.Apps.Client/MainWindow.cs
Normal file
348
ModpackUpdater.Apps.Client/MainWindow.cs
Normal file
@@ -0,0 +1,348 @@
|
|||||||
|
using Gtk;
|
||||||
|
using ModpackUpdater.Manager;
|
||||||
|
using ModpackUpdater.My.Resources;
|
||||||
|
using Pilz.Extensions;
|
||||||
|
using Pilz.UI.Gtk.Dialogs;
|
||||||
|
using Pilz.UI.Symbols;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using UI = Gtk.Builder.ObjectAttribute;
|
||||||
|
|
||||||
|
namespace ModpackUpdater.Apps.Client;
|
||||||
|
|
||||||
|
internal class MainWindow : Window
|
||||||
|
{
|
||||||
|
[UI] private readonly Entry textBox_MinecraftFolder;
|
||||||
|
[UI] private readonly Entry textBox_ModpackUrl;
|
||||||
|
[UI] private readonly Entry textBox_InstallationKey;
|
||||||
|
[UI] private readonly Button button_SearchMinecraftFolder;
|
||||||
|
[UI] private readonly Button button_Install;
|
||||||
|
[UI] private readonly Button button_CheckForUpdates;
|
||||||
|
[UI] private readonly ImageMenuItem menuItem_Repair;
|
||||||
|
[UI] private readonly Label label_Status;
|
||||||
|
[UI] private readonly Image image_Status;
|
||||||
|
[UI] private readonly Image image_Repair;
|
||||||
|
|
||||||
|
private readonly UpdateCheckOptionsAdv updateOptions;
|
||||||
|
private ModpackInfo modpackInfo = new();
|
||||||
|
private ModpackConfig updateConfig = new();
|
||||||
|
private ModpackFeatures features;
|
||||||
|
private UpdateCheckResult lastUpdateCheckResult;
|
||||||
|
private bool currentUpdating;
|
||||||
|
private bool loadingData;
|
||||||
|
|
||||||
|
public MainWindow(UpdateCheckOptionsAdv updateOptions) : this(new Builder("MainWindow.glade"), updateOptions)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private MainWindow(Builder builder, UpdateCheckOptionsAdv updateOptions) : base(builder.GetRawOwnedObject("MainWindow"))
|
||||||
|
{
|
||||||
|
this.updateOptions = updateOptions;
|
||||||
|
|
||||||
|
builder.Autoconnect(this);
|
||||||
|
|
||||||
|
Title = $"{Title} (v{Assembly.GetExecutingAssembly().GetAppVersion()})";
|
||||||
|
|
||||||
|
button_CheckForUpdates.Image = AppGlobals.Symbols.GetImage(AppSymbols.update_done, SymbolSize.Small);
|
||||||
|
button_SearchMinecraftFolder.Image = AppGlobals.Symbols.GetImage(AppSymbols.opened_folder, SymbolSize.Small);
|
||||||
|
button_Install.Image = AppGlobals.Symbols.GetImage(AppSymbols.software_installer, SymbolSize.Small);
|
||||||
|
image_Repair.Pixbuf = AppGlobals.Symbols.GetPixbuf(AppSymbols.wrench, SymbolSize.Small);
|
||||||
|
|
||||||
|
LoadProfileToUi();
|
||||||
|
|
||||||
|
DeleteEvent += MainWindow_DeleteEvent;
|
||||||
|
Shown += MainWindow_Shown;
|
||||||
|
|
||||||
|
textBox_MinecraftFolder.Changed += TextBox_MinecraftFolder_TextInserted;
|
||||||
|
textBox_ModpackUrl.Changed += TextBox_ModpackUrl_TextInserted;
|
||||||
|
textBox_InstallationKey.Changed += TextBox_InstallationKey_TextInserted;
|
||||||
|
button_SearchMinecraftFolder.Clicked += Button_SearchMinecraftFolder_Clicked;
|
||||||
|
button_Install.Clicked += Button_Install_Clicked;
|
||||||
|
button_CheckForUpdates.Clicked += Button_CheckForUpdates_Clicked;
|
||||||
|
menuItem_Repair.Activated += MenuItem_Repair_Activated;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Gui
|
||||||
|
|
||||||
|
private void MainWindow_DeleteEvent(object o, DeleteEventArgs args)
|
||||||
|
{
|
||||||
|
AppConfig.Instance.LastMinecraftProfilePath = textBox_MinecraftFolder.Text.Trim();
|
||||||
|
Application.Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void MainWindow_Shown(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var updater = new AppUpdater();
|
||||||
|
if (!updateOptions.NoUpdate && await updater.Check() && MessageBox.Show(this, ButtonsType.YesNo, MessageType.Info, LangRes.MsgBox_UpdateAvailable) == ResponseType.Yes)
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusText_InstallingAppUpdate, AppGlobals.Symbols.GetPixbuf(AppSymbols.software_installer, SymbolSize.Small));
|
||||||
|
Sensitive = false;
|
||||||
|
await updater.Install();
|
||||||
|
Program.Restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckStatusAndUpdate(true);
|
||||||
|
LoadProfileToUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TextBox_MinecraftFolder_TextInserted(object o, EventArgs args)
|
||||||
|
{
|
||||||
|
if (!loadingData)
|
||||||
|
CheckStatusAndUpdate(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TextBox_ModpackUrl_TextInserted(object o, EventArgs args)
|
||||||
|
{
|
||||||
|
if (!loadingData)
|
||||||
|
CheckStatusAndUpdate(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TextBox_InstallationKey_TextInserted(object o, EventArgs args)
|
||||||
|
{
|
||||||
|
if (!loadingData)
|
||||||
|
CheckStatusAndUpdate(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Button_SearchMinecraftFolder_Clicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var ofd = new FileChooserDialog("Select Minecraft profile folder", this, FileChooserAction.SelectFolder, "Accept", ResponseType.Ok, "Cancel", ResponseType.Cancel);
|
||||||
|
ofd.Response += SearchMinecraftFolder_Response;
|
||||||
|
ofd.Present();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SearchMinecraftFolder_Response(object o, ResponseArgs args)
|
||||||
|
{
|
||||||
|
if (o is not FileChooserDialog ofd)
|
||||||
|
return;
|
||||||
|
if (args.ResponseId == ResponseType.Ok)
|
||||||
|
textBox_MinecraftFolder.Text = ofd.Filename;
|
||||||
|
ofd.Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Button_CheckForUpdates_Clicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ClearStatus();
|
||||||
|
await ExecuteUpdate(false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Button_Install_Clicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (!currentUpdating)
|
||||||
|
{
|
||||||
|
ClearStatus();
|
||||||
|
await ExecuteUpdate(true, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void MenuItem_Repair_Activated(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (!currentUpdating)
|
||||||
|
{
|
||||||
|
ClearStatus();
|
||||||
|
await ExecuteUpdate(true, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Features
|
||||||
|
|
||||||
|
private void SetStatus(string statusText, Gdk.Pixbuf image)
|
||||||
|
{
|
||||||
|
label_Status.Text = statusText;
|
||||||
|
image_Status.Pixbuf = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ClearStatus()
|
||||||
|
{
|
||||||
|
label_Status.Text = "-";
|
||||||
|
image_Status.Pixbuf = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadProfileToUi()
|
||||||
|
{
|
||||||
|
loadingData = true;
|
||||||
|
textBox_MinecraftFolder.Text = modpackInfo?.LocaLPath ?? updateOptions.ProfileFolder ?? AppConfig.Instance.LastMinecraftProfilePath ?? textBox_MinecraftFolder.Text;
|
||||||
|
textBox_ModpackUrl.Text = modpackInfo?.ConfigUrl ?? updateOptions.ModpackConfig ?? textBox_ModpackUrl.Text;
|
||||||
|
textBox_InstallationKey.Text = modpackInfo?.ExtrasKey ?? updateOptions.ExtrasKey ?? textBox_InstallationKey.Text;
|
||||||
|
loadingData = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void CheckStatusAndUpdate(bool loadProfileToUi)
|
||||||
|
{
|
||||||
|
if (CheckStatus(loadProfileToUi))
|
||||||
|
await ExecuteUpdate(false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CheckStatus(bool loadProfileToUi)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
modpackInfo = ModpackInfo.TryLoad(textBox_MinecraftFolder.Text.Trim());
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loadProfileToUi)
|
||||||
|
LoadProfileToUi();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
updateConfig = ModpackConfig.LoadFromUrl(textBox_ModpackUrl.Text);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modpackInfo != null)
|
||||||
|
features = new(updateConfig);
|
||||||
|
|
||||||
|
if (modpackInfo == null || string.IsNullOrWhiteSpace(textBox_MinecraftFolder.Text) /*|| modpackInfo.Valid*/)
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppGlobals.Symbols.GetPixbuf(AppSymbols.general_warning_sign, SymbolSize.Small));
|
||||||
|
button_CheckForUpdates.Sensitive = false;
|
||||||
|
button_Install.Sensitive = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (updateConfig == null || string.IsNullOrWhiteSpace(textBox_ModpackUrl.Text))
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusText_ConfigIncompleteOrNotLoaded, AppGlobals.Symbols.GetPixbuf(AppSymbols.general_warning_sign, SymbolSize.Small));
|
||||||
|
button_CheckForUpdates.Sensitive = false;
|
||||||
|
button_Install.Sensitive = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (updateConfig.Maintenance && !updateOptions.IgnoreMaintenance)
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusText_Maintenance, AppGlobals.Symbols.GetPixbuf(AppSymbols.services, SymbolSize.Small));
|
||||||
|
button_CheckForUpdates.Sensitive = false;
|
||||||
|
button_Install.Sensitive = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
button_CheckForUpdates.Sensitive = true;
|
||||||
|
button_Install.Sensitive = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ExecuteUpdate(bool doInstall, bool repair)
|
||||||
|
{
|
||||||
|
// Ensure set extras key
|
||||||
|
modpackInfo.ExtrasKey = textBox_InstallationKey.Text.Trim();
|
||||||
|
|
||||||
|
var updater = new ModpackInstaller(updateConfig, modpackInfo)
|
||||||
|
{
|
||||||
|
OverwriteRefTag = Program.Options.RefTag,
|
||||||
|
OverwriteVersion = Program.Options.Version,
|
||||||
|
};
|
||||||
|
updater.InstallProgessUpdated += Update_InstallProgessUpdated;
|
||||||
|
updater.CheckingProgressUpdated += Updated_CheckingProgresssUpdated;
|
||||||
|
|
||||||
|
void error()
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppGlobals.Symbols.GetPixbuf(AppSymbols.close, SymbolSize.Small));
|
||||||
|
currentUpdating = false;
|
||||||
|
}
|
||||||
|
void installing()
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusText_Installing, AppGlobals.Symbols.GetPixbuf(AppSymbols.software_installer, SymbolSize.Small));
|
||||||
|
currentUpdating = true;
|
||||||
|
}
|
||||||
|
void updatesAvailable()
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusText_UpdateAvailable, AppGlobals.Symbols.GetPixbuf(AppSymbols.software_installer, SymbolSize.Small));
|
||||||
|
}
|
||||||
|
void everythingOk()
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusTest_EverythingOk, AppGlobals.Symbols.GetPixbuf(AppSymbols.done, SymbolSize.Small));
|
||||||
|
currentUpdating = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check only if not pressed "install", not really needed otherwise.
|
||||||
|
if (lastUpdateCheckResult is null || !doInstall || repair)
|
||||||
|
{
|
||||||
|
SetStatus(LangRes.StatusText_CheckingForUpdates, AppGlobals.Symbols.GetPixbuf(AppSymbols.update_done, SymbolSize.Small));
|
||||||
|
|
||||||
|
// Check for extras once again
|
||||||
|
updateOptions.IncludeExtras = features.IsEnabled(ModpackFeatures.FeatureAllowExtas, new AllowExtrasFeatureContext(modpackInfo));
|
||||||
|
|
||||||
|
// Force re-install on repair
|
||||||
|
updateOptions.IgnoreInstalledVersion = repair;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
lastUpdateCheckResult = await updater.Check(updateOptions);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
error();
|
||||||
|
if (Debugger.IsAttached)
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error while update check
|
||||||
|
if (lastUpdateCheckResult is null || lastUpdateCheckResult.HasError)
|
||||||
|
{
|
||||||
|
error();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No updates available
|
||||||
|
if (!lastUpdateCheckResult.HasUpdates)
|
||||||
|
{
|
||||||
|
everythingOk();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updates available (but don't install)
|
||||||
|
if (!doInstall)
|
||||||
|
{
|
||||||
|
updatesAvailable();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install updates
|
||||||
|
installing();
|
||||||
|
currentUpdating = true;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Install
|
||||||
|
if (await updater.Install(lastUpdateCheckResult) == false)
|
||||||
|
{
|
||||||
|
error();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
lastUpdateCheckResult = null; // Reset last update check, a new one would be needed now.
|
||||||
|
everythingOk();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
// Error
|
||||||
|
error();
|
||||||
|
if (Debugger.IsAttached)
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Updated_CheckingProgresssUpdated(int toCheck, int processed)
|
||||||
|
{
|
||||||
|
SetStatus(Math.Round(processed / (double)toCheck * 100d, 1) + "%", AppGlobals.Symbols.GetPixbuf(AppSymbols.update_done, SymbolSize.Small));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update_InstallProgessUpdated(UpdateCheckResult result, int processedSyncs)
|
||||||
|
{
|
||||||
|
int actionCount = result.Actions.Count;
|
||||||
|
SetStatus(Math.Round(processedSyncs / (double)actionCount * 100d, 1) + "%", AppGlobals.Symbols.GetPixbuf(AppSymbols.software_installer, SymbolSize.Small));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
224
ModpackUpdater.Apps.Client/MainWindow.glade
Normal file
224
ModpackUpdater.Apps.Client/MainWindow.glade
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Generated with glade 3.40.0 -->
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk+" version="3.24"/>
|
||||||
|
<object class="GtkImage" id="image_Repair">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="stock">gtk-missing-image</property>
|
||||||
|
</object>
|
||||||
|
<object class="GtkMenu" id="menu_Advanced">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="menuItem_Repair">
|
||||||
|
<property name="label" translatable="yes">Repair</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="image">image_Repair</property>
|
||||||
|
<property name="use-stock">False</property>
|
||||||
|
<property name="always-show-image">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<object class="GtkWindow" id="MainWindow">
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="title" translatable="yes">Minecraft Modpack Updater</property>
|
||||||
|
<property name="window-position">center</property>
|
||||||
|
<property name="default-width">400</property>
|
||||||
|
<child>
|
||||||
|
<!-- n-columns=3 n-rows=5 -->
|
||||||
|
<object class="GtkGrid">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="margin-start">3</property>
|
||||||
|
<property name="margin-end">3</property>
|
||||||
|
<property name="margin-top">3</property>
|
||||||
|
<property name="margin-bottom">3</property>
|
||||||
|
<property name="row-spacing">3</property>
|
||||||
|
<property name="column-spacing">3</property>
|
||||||
|
<property name="row-homogeneous">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="textBox_MinecraftFolder">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="placeholder-text" translatable="yes">C:\Users\...\AppData\...</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">1</property>
|
||||||
|
<property name="top-attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">Minecraft profile</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">0</property>
|
||||||
|
<property name="top-attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="button_SearchMinecraftFolder">
|
||||||
|
<property name="label" translatable="yes">Search</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="receives-default">True</property>
|
||||||
|
<property name="always-show-image">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">2</property>
|
||||||
|
<property name="top-attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">Modpack URL</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">0</property>
|
||||||
|
<property name="top-attach">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="textBox_ModpackUrl">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="placeholder-text" translatable="yes">https://...</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">1</property>
|
||||||
|
<property name="top-attach">1</property>
|
||||||
|
<property name="width">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">Installation key</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">0</property>
|
||||||
|
<property name="top-attach">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="textBox_InstallationKey">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="placeholder-text" translatable="yes">AAAAA-BBBBB-CCCCC-DDDDD-EEEEE</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">1</property>
|
||||||
|
<property name="top-attach">2</property>
|
||||||
|
<property name="width">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">Status</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">0</property>
|
||||||
|
<property name="top-attach">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="button_Install">
|
||||||
|
<property name="label" translatable="yes">Install</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="has-focus">True</property>
|
||||||
|
<property name="receives-default">True</property>
|
||||||
|
<property name="always-show-image">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">2</property>
|
||||||
|
<property name="top-attach">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="button_CheckForUpdates">
|
||||||
|
<property name="label" translatable="yes">Check for updates</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="receives-default">True</property>
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="always-show-image">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">1</property>
|
||||||
|
<property name="top-attach">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="image_Status">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="stock">gtk-missing-image</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label_Status">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">Everything is right and up-to-date.</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">1</property>
|
||||||
|
<property name="top-attach">3</property>
|
||||||
|
<property name="width">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkMenuButton">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="receives-default">True</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="popup">menu_Advanced</property>
|
||||||
|
<property name="use-popover">False</property>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">0</property>
|
||||||
|
<property name="top-attach">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</interface>
|
||||||
@@ -2,13 +2,19 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<UseWindowsForms>true</UseWindowsForms>
|
|
||||||
<ApplicationIcon>icons8_download_from_ftp.ico</ApplicationIcon>
|
<ApplicationIcon>icons8_download_from_ftp.ico</ApplicationIcon>
|
||||||
<AssemblyName>Minecraft Modpack Updater</AssemblyName>
|
<AssemblyName>Minecraft Modpack Updater</AssemblyName>
|
||||||
<ImplicitUsings>true</ImplicitUsings>
|
<ImplicitUsings>true</ImplicitUsings>
|
||||||
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
|
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Remove="**\*.glade" />
|
||||||
|
<EmbeddedResource Include="**\*.glade">
|
||||||
|
<LogicalName>%(Filename)%(Extension)</LogicalName>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Update="FiledialogFilters.Designer.cs">
|
<Compile Update="FiledialogFilters.Designer.cs">
|
||||||
@@ -39,13 +45,10 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Mono.Options" Version="6.12.0.148" />
|
<PackageReference Include="Mono.Options" Version="6.12.0.148" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="Pilz.Configuration" Version="3.2.0" />
|
<PackageReference Include="Pilz.Configuration" Version="3.2.2" />
|
||||||
<PackageReference Include="Pilz.Cryptography" Version="2.1.1" />
|
<PackageReference Include="Pilz.Cryptography" Version="2.1.2" />
|
||||||
<PackageReference Include="Pilz.IO" Version="2.1.0" />
|
<PackageReference Include="Pilz.IO" Version="2.1.0" />
|
||||||
<PackageReference Include="Pilz.UI" Version="2.3.14" />
|
<PackageReference Include="Pilz.UI.Gtk" Version="1.0.1" />
|
||||||
<PackageReference Include="Pilz.UI.Telerik" Version="2.8.1" />
|
|
||||||
<PackageReference Include="Pilz.Win32" Version="2.1.0" />
|
|
||||||
<PackageReference Include="UI.for.WinForms.Common" Version="2024.3.806" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
using Castle.Core.Logging;
|
using Castle.Core.Logging;
|
||||||
|
using Gtk;
|
||||||
using ModpackUpdater.Manager;
|
using ModpackUpdater.Manager;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Pilz;
|
using Pilz;
|
||||||
using Pilz.Configuration;
|
using Pilz.Configuration;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
[assembly: AssemblyAppVersion("1.7.0.0")]
|
[assembly: AssemblyAppVersion("1.7.0.0")]
|
||||||
|
|
||||||
@@ -13,6 +16,7 @@ public static class Program
|
|||||||
{
|
{
|
||||||
private static readonly SettingsManager settingsManager;
|
private static readonly SettingsManager settingsManager;
|
||||||
private static readonly ILogger log = new ConsoleLogger();
|
private static readonly ILogger log = new ConsoleLogger();
|
||||||
|
private static Application uiApp;
|
||||||
|
|
||||||
public static ISettings Settings => settingsManager.Instance;
|
public static ISettings Settings => settingsManager.Instance;
|
||||||
|
|
||||||
@@ -49,11 +53,46 @@ public static class Program
|
|||||||
|
|
||||||
private static void RunApp(UpdateCheckOptionsAdv updateOptions)
|
private static void RunApp(UpdateCheckOptionsAdv updateOptions)
|
||||||
{
|
{
|
||||||
Application.EnableVisualStyles();
|
Application.Init();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
|
||||||
Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);
|
uiApp = new Application("ModpackUpdater.Apps.Client", GLib.ApplicationFlags.None);
|
||||||
AppGlobals.Initialize();
|
uiApp.Register(GLib.Cancellable.Current);
|
||||||
Application.Run(new Form1(updateOptions));
|
|
||||||
|
var win = new MainWindow(updateOptions);
|
||||||
|
uiApp.AddWindow(win);
|
||||||
|
win.Show();
|
||||||
|
|
||||||
|
Application.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Restart()
|
||||||
|
{
|
||||||
|
var process = Process.GetCurrentProcess();
|
||||||
|
var arguments = Environment.GetCommandLineArgs();
|
||||||
|
|
||||||
|
ProcessStartInfo currentStartInfo = new()
|
||||||
|
{
|
||||||
|
FileName = Environment.ProcessPath,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (arguments.Length >= 2)
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder((arguments.Length - 1) * 16);
|
||||||
|
|
||||||
|
for (int argumentIndex = 1; argumentIndex < arguments.Length; argumentIndex++)
|
||||||
|
sb.Append($"\"{arguments[argumentIndex]}\" ");
|
||||||
|
|
||||||
|
currentStartInfo.Arguments = sb.ToString(0, sb.Length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the current application
|
||||||
|
Application.Quit();
|
||||||
|
|
||||||
|
// Start a new process
|
||||||
|
Process.Start(currentStartInfo);
|
||||||
|
|
||||||
|
// Close this proccess
|
||||||
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GetSettingsPath(int? settingsVersion = 3)
|
private static string GetSettingsPath(int? settingsVersion = 3)
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
|
|||||||
<PublishDir>bin\publish\general\</PublishDir>
|
<PublishDir>bin\publish\general\</PublishDir>
|
||||||
<PublishProtocol>FileSystem</PublishProtocol>
|
<PublishProtocol>FileSystem</PublishProtocol>
|
||||||
<_TargetId>Folder</_TargetId>
|
<_TargetId>Folder</_TargetId>
|
||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||||
<SelfContained>false</SelfContained>
|
<SelfContained>false</SelfContained>
|
||||||
<PublishSingleFile>true</PublishSingleFile>
|
<PublishSingleFile>true</PublishSingleFile>
|
||||||
<PublishReadyToRun>false</PublishReadyToRun>
|
<PublishReadyToRun>false</PublishReadyToRun>
|
||||||
|
|||||||
@@ -1,22 +1,34 @@
|
|||||||
using Pilz.UI.Telerik.Dialogs;
|
using Microsoft.Win32;
|
||||||
using Pilz.UI.Telerik.Symbols;
|
using Pilz.UI.Gtk.Symbols;
|
||||||
using Pilz.UI.Telerik.Theming;
|
using System.Runtime.InteropServices;
|
||||||
using Telerik.WinControls;
|
|
||||||
using Telerik.WinControls.Themes;
|
|
||||||
|
|
||||||
namespace ModpackUpdater.Apps;
|
namespace ModpackUpdater.Apps;
|
||||||
|
|
||||||
public static class AppGlobals
|
public static class AppGlobals
|
||||||
{
|
{
|
||||||
public static IRadSymbolFactory<AppSymbols> Symbols { get; } = new AppSymbolFactory();
|
public static IGtkSymbolFactory<AppSymbols> Symbols { get; } = new AppSymbolFactory();
|
||||||
|
|
||||||
public static void Initialize()
|
public static void Initialize()
|
||||||
{
|
{
|
||||||
ThemeHelper.ApplyApplicationTheme(ApplicationTheme.Auto,
|
if (UsesWindowsDarkTheme())
|
||||||
() => new Windows11CompactTheme(),
|
Environment.SetEnvironmentVariable("GTK_THEME", "Adwaita:dark");
|
||||||
() => new Windows11CompactDarkTheme());
|
|
||||||
|
//RadFlyoutBase.ConfirmSvg = Symbols.GetSvgImage(AppSymbols.checkmark, Pilz.UI.Symbols.SymbolSize.Small);
|
||||||
RadFlyoutBase.ConfirmSvg = Symbols.GetSvgImage(AppSymbols.checkmark, Pilz.UI.Symbols.SymbolSize.Small);
|
//RadFlyoutBase.CancelSvg = Symbols.GetSvgImage(AppSymbols.cancel, Pilz.UI.Symbols.SymbolSize.Small);
|
||||||
RadFlyoutBase.CancelSvg = Symbols.GetSvgImage(AppSymbols.cancel, Pilz.UI.Symbols.SymbolSize.Small);
|
}
|
||||||
|
|
||||||
|
private static bool UsesWindowsDarkTheme()
|
||||||
|
{
|
||||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize")?.GetValue("AppsUseLightTheme") as bool? ?? default;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
using Pilz.UI.Telerik;
|
using Pilz.UI.Gtk.Symbols;
|
||||||
using Pilz.UI.Telerik.Symbols;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace ModpackUpdater.Apps;
|
namespace ModpackUpdater.Apps;
|
||||||
|
|
||||||
internal class AppSymbolFactory : RadSymbolFactory<AppSymbols>
|
internal class AppSymbolFactory : GtkSymbolFactory<AppSymbols>
|
||||||
{
|
{
|
||||||
public override Assembly GetImageResourceAssembly()
|
public override Assembly GetImageResourceAssembly()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<UseWindowsForms>true</UseWindowsForms>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
@@ -12,10 +11,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Pilz.UI" Version="2.3.14" />
|
<PackageReference Include="Pilz.UI.Gtk" Version="1.0.1" />
|
||||||
<PackageReference Include="Pilz.UI.Telerik" Version="2.8.1" />
|
|
||||||
<PackageReference Include="UI.for.WinForms.Common" Version="2024.3.806" />
|
|
||||||
<PackageReference Include="UI.for.WinForms.Themes" Version="2024.3.806" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Castle.Core" Version="5.1.1" />
|
<PackageReference Include="Castle.Core" Version="5.2.1" />
|
||||||
<PackageReference Include="CurseForge.APIClient" Version="3.0.0" />
|
<PackageReference Include="CurseForge.APIClient" Version="4.2.0" />
|
||||||
<PackageReference Include="Modrinth.Net" Version="3.4.5" />
|
<PackageReference Include="Modrinth.Net" Version="3.5.1" />
|
||||||
<PackageReference Include="Octokit" Version="13.0.1" />
|
<PackageReference Include="Octokit" Version="14.0.0" />
|
||||||
<PackageReference Include="System.IO.Compression.ZipFile" Version="4.3.0" />
|
<PackageReference Include="System.IO.Compression.ZipFile" Version="4.3.0" />
|
||||||
<PackageReference Include="Unleash.Client" Version="5.0.2" />
|
<PackageReference Include="Unleash.Client" Version="5.2.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Pilz.Cryptography" Version="2.1.1" />
|
<PackageReference Include="Pilz.Cryptography" Version="2.1.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
Reference in New Issue
Block a user