From 1e94d23281386b1a2fe36a6a6c90c2d4ec90a9fe Mon Sep 17 00:00:00 2001 From: Miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sun, 8 Oct 2023 15:00:01 +0200 Subject: [PATCH] Added new PCK-Studio Updater (#20) * Added PCK-Studio-Updater project * Updated PCK-Studio-Updater to be a standanlone executable and added checkbox for using beta builds in the settings panel * Rename constant define '_NOT_DEBUG' to 'NDEBUG' and moved it to .csproj file --- PCK-Studio-Updater/API/GithubParams.cs | 22 + .../API/GithubUpdateDownloader.cs | 148 ++ PCK-Studio-Updater/API/IUpdateDownloader.cs | 19 + PCK-Studio-Updater/PCK-Studio-Updater.csproj | 105 ++ PCK-Studio-Updater/Program.cs | 58 + PCK-Studio-Updater/ProjectLogo.ico | Bin 0 -> 150065 bytes PCK-Studio-Updater/Properties/AssemblyInfo.cs | 36 + PCK-Studio-Updater/Properties/app.manifest | 70 + PCK-Studio/App.config | 6 + PCK-Studio/Classes/Misc/RichPresenceClient.cs | 2 +- PCK-Studio/Classes/Networking/Network.cs | 59 - PCK-Studio/Classes/Networking/Update.cs | 88 - PCK-Studio/Forms/AppSettingsForm.Designer.cs | 19 +- PCK-Studio/Forms/AppSettingsForm.cs | 12 + PCK-Studio/MainForm.Designer.cs | 31 +- PCK-Studio/MainForm.cs | 13 +- PCK-Studio/MainForm.resx | 1458 +++++++---------- PCK-Studio/PckStudio.csproj | 13 +- PCK-Studio/Program.cs | 50 +- PCK-Studio/Properties/AssemblyInfo.cs | 4 +- PCK-Studio/Properties/Settings.Designer.cs | 24 + PCK-Studio/Properties/Settings.settings | 6 + PCK_Studio.sln | 20 + 23 files changed, 1242 insertions(+), 1021 deletions(-) create mode 100644 PCK-Studio-Updater/API/GithubParams.cs create mode 100644 PCK-Studio-Updater/API/GithubUpdateDownloader.cs create mode 100644 PCK-Studio-Updater/API/IUpdateDownloader.cs create mode 100644 PCK-Studio-Updater/PCK-Studio-Updater.csproj create mode 100644 PCK-Studio-Updater/Program.cs create mode 100644 PCK-Studio-Updater/ProjectLogo.ico create mode 100644 PCK-Studio-Updater/Properties/AssemblyInfo.cs create mode 100644 PCK-Studio-Updater/Properties/app.manifest delete mode 100644 PCK-Studio/Classes/Networking/Network.cs delete mode 100644 PCK-Studio/Classes/Networking/Update.cs diff --git a/PCK-Studio-Updater/API/GithubParams.cs b/PCK-Studio-Updater/API/GithubParams.cs new file mode 100644 index 00000000..77aed764 --- /dev/null +++ b/PCK-Studio-Updater/API/GithubParams.cs @@ -0,0 +1,22 @@ +using System.Text.RegularExpressions; + +namespace PCKStudio_Updater +{ + public sealed class GithubParams + { + public readonly string RepositoryOwnerName; + public readonly string RepositoryName; + public readonly string TargetExecutableName; + public readonly bool UsePreRelease; + public readonly Regex VersionMatcher; + + public GithubParams(string repositoryOwnerName, string repositoryName, string targetExecutableName, bool usePreRelease, Regex versionMatcher) + { + RepositoryOwnerName = repositoryOwnerName; + RepositoryName = repositoryName; + TargetExecutableName = targetExecutableName; + UsePreRelease = usePreRelease; + VersionMatcher = versionMatcher; + } + } +} diff --git a/PCK-Studio-Updater/API/GithubUpdateDownloader.cs b/PCK-Studio-Updater/API/GithubUpdateDownloader.cs new file mode 100644 index 00000000..b89c3897 --- /dev/null +++ b/PCK-Studio-Updater/API/GithubUpdateDownloader.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO.Compression; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Octokit; + +namespace PCKStudio_Updater +{ + public sealed class GithubUpdateDownloader : IUpdateDownloader + { + private static readonly Assembly updaterAssembly = Assembly.GetAssembly(typeof(GithubUpdateDownloader)); + + private readonly GithubParams _updateParams; + private readonly GitHubClient githubClient; + private Release latestFetchedRelease; + private Version latestReleaseVersion; + private DirectoryInfo downloadDirectory; + + + public GithubUpdateDownloader(GithubParams updateParams) + { + _updateParams = updateParams; + var githubClientProductHeader = new ProductHeaderValue(updaterAssembly.GetName().Name); + githubClient = new GitHubClient(githubClientProductHeader); + } + + public bool IsUpdateAvailable(FileVersionInfo fileVersionInfo) + { + return IsUpdateAvailable(fileVersionInfo.ProductVersion); + } + + public bool IsUpdateAvailable(Assembly currentAssembly) + { + if (!File.Exists(currentAssembly.Location)) + return false; + FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(currentAssembly.Location); + return IsUpdateAvailable(fileVersionInfo.ProductVersion); + } + + public bool IsUpdateAvailable(Version productVersion) + { + Debug.WriteLine("Release Product ver.: " + latestReleaseVersion); + Debug.WriteLine("Current Product ver.: " + productVersion); + return latestReleaseVersion.CompareTo(productVersion) > 0; + } + + public bool IsUpdateAvailable(string productVersion) + { + GetLatestRelease(_updateParams.UsePreRelease); + if (Version.TryParse(productVersion, out var currentVersion)) + { + return IsUpdateAvailable(currentVersion); + } + return false; + } + + private void UnpackZip(string zipFilePath) + { + ZipFile.ExtractToDirectory(zipFilePath, Path.GetDirectoryName(zipFilePath)); + } + + private static void DownloadAsset(ReleaseAsset asset, Stream destination) + { + string downloadUrl = asset.BrowserDownloadUrl; + var client = new WebClient(); + using (var serverStream = client.OpenRead(downloadUrl)) + { + serverStream.CopyTo(destination); + } + } + + private void GetLatestRelease(bool prerelease) + { + Release release; + if (prerelease) + { + var prereleaseTask = githubClient.Repository.Release.GetAll(_updateParams.RepositoryOwnerName, _updateParams.RepositoryName); + prereleaseTask.Wait(); + var prereleases = prereleaseTask.Result.OrderByDescending(release => release.PublishedAt ?? release.CreatedAt).Where(release => release.Prerelease).ToArray(); + release = latestFetchedRelease = prereleases[0]; + } + else + { + var latestReleaseTask = githubClient.Repository.Release.GetLatest(_updateParams.RepositoryOwnerName, _updateParams.RepositoryName); + latestReleaseTask.Wait(); + release = latestFetchedRelease = latestReleaseTask.Result; + } + var match = _updateParams.VersionMatcher.Match(release.Name); + if (match.Success) + { + string versionString = match.Value; + Version.TryParse(versionString, out latestReleaseVersion); + } + } + + private void EmptyDirectory(DirectoryInfo directory) + { + string appname = Assembly.GetExecutingAssembly().GetName().Name; + foreach (FileInfo file in directory.GetFiles()) + { + if (Path.GetFileNameWithoutExtension(file.Name) != appname && file.Name != "update.zip") + file.Delete(); + } + foreach (DirectoryInfo subDirectory in directory.GetDirectories()) + subDirectory.Delete(true); + } + + public void DownloadTo(DirectoryInfo directory) + { + if (latestFetchedRelease is null) + GetLatestRelease(_updateParams.UsePreRelease); + if (latestFetchedRelease.Assets?.Count > 0) + { + var asset = latestFetchedRelease.Assets[0]; + string zipFilePath = Path.Combine(directory.FullName, "update.zip"); + using(var zipFileStream = File.OpenWrite(zipFilePath)) + { + DownloadAsset(asset, zipFileStream); + } + Debug.WriteLine("Download Complete", category: nameof(GithubUpdateDownloader)); + EmptyDirectory(directory); + UnpackZip(zipFilePath); + File.Delete(zipFilePath); + downloadDirectory = directory; + } + } + + public void Launch() + { + if (downloadDirectory is null) + { + throw new ArgumentNullException("Download directory not set."); + } + + var files = downloadDirectory.GetFiles(_updateParams.TargetExecutableName + ".exe", SearchOption.TopDirectoryOnly); + if (files is not null && files.Length > 0) + { + Process.Start(files[0].FullName); + } + } + } +} diff --git a/PCK-Studio-Updater/API/IUpdateDownloader.cs b/PCK-Studio-Updater/API/IUpdateDownloader.cs new file mode 100644 index 00000000..ef422762 --- /dev/null +++ b/PCK-Studio-Updater/API/IUpdateDownloader.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PCKStudio_Updater +{ + public interface IUpdateDownloader + { + public bool IsUpdateAvailable(Version currentVersion); + public bool IsUpdateAvailable(string currentVersionString); + + public void DownloadTo(DirectoryInfo directory); + + public void Launch(); + } +} diff --git a/PCK-Studio-Updater/PCK-Studio-Updater.csproj b/PCK-Studio-Updater/PCK-Studio-Updater.csproj new file mode 100644 index 00000000..a47ab997 --- /dev/null +++ b/PCK-Studio-Updater/PCK-Studio-Updater.csproj @@ -0,0 +1,105 @@ + + + + + Debug + AnyCPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF} + WinExe + PCKStudio_Updater + PCK-Studio-Updater + latest + enable + v4.8 + 512 + true + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + PCKStudio_Updater.Program + + + ProjectLogo.ico + + + + + + + + + + + + + + + + + + + + + + 5.7.0 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + 7.1.0 + + + + + False + Microsoft .NET Framework 4.8 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + \ No newline at end of file diff --git a/PCK-Studio-Updater/Program.cs b/PCK-Studio-Updater/Program.cs new file mode 100644 index 00000000..d150ad4c --- /dev/null +++ b/PCK-Studio-Updater/Program.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime; +using System.Text; +using System.Text.RegularExpressions; + +namespace PCKStudio_Updater +{ + internal class Program + { + static void Main(string[] args) + { + Uri projectUrl = new Uri("https://github.com/PhoenixARC/-PCK-Studio"); + if (args.Length > 0) + { + projectUrl = new Uri(args[0]); + } + + string executableName = "PCK-Studio"; + if (args.Length > 1) + { + executableName = args[1]; + } + + bool prerelease = false; + if (args.Length > 2) + { + prerelease = args[2].ToLower() == "true" || args[2].ToLower() == "1"; + } + + var versionMatcher = new Regex("(\\*|\\d+(\\.\\d+){0,3}(\\.\\*)?)"); + if (args.Length > 3) + { + versionMatcher = new Regex(args[3]); + } + + GithubParams updateParams = new GithubParams( + Path.GetDirectoryName(projectUrl.AbsolutePath).Replace("\\", ""), + Path.GetFileName(projectUrl.AbsolutePath), + executableName, + prerelease, + versionMatcher + ); + + IUpdateDownloader updater = new GithubUpdateDownloader(updateParams); + + if (!File.Exists(updateParams.TargetExecutableName + ".exe") || updater.IsUpdateAvailable(FileVersionInfo.GetVersionInfo(updateParams.TargetExecutableName + ".exe").ProductVersion)) + { + updater.DownloadTo(new DirectoryInfo(".")); + updater.Launch(); + return; + } + } + } +} diff --git a/PCK-Studio-Updater/ProjectLogo.ico b/PCK-Studio-Updater/ProjectLogo.ico new file mode 100644 index 0000000000000000000000000000000000000000..85357f6f1261aa55ad080aae1030554de307b768 GIT binary patch literal 150065 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 literal 0 HcmV?d00001 diff --git a/PCK-Studio-Updater/Properties/AssemblyInfo.cs b/PCK-Studio-Updater/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..8e714011 --- /dev/null +++ b/PCK-Studio-Updater/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PckStudio-Updater")] +[assembly: AssemblyDescription("Updater for PCK-Studio")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PckStudio-Updater")] +[assembly: AssemblyCopyright("Copyright © 2023 Miku-666")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5b223556-15b9-41da-aa0b-5e7f45e743bf")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PCK-Studio-Updater/Properties/app.manifest b/PCK-Studio-Updater/Properties/app.manifest new file mode 100644 index 00000000..c02c2d89 --- /dev/null +++ b/PCK-Studio-Updater/Properties/app.manifest @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PCK-Studio/App.config b/PCK-Studio/App.config index fff538b6..f3cb4efa 100644 --- a/PCK-Studio/App.config +++ b/PCK-Studio/App.config @@ -71,6 +71,12 @@ True + + True + + + False + False diff --git a/PCK-Studio/Classes/Misc/RichPresenceClient.cs b/PCK-Studio/Classes/Misc/RichPresenceClient.cs index e7bef380..fdbad35f 100644 --- a/PCK-Studio/Classes/Misc/RichPresenceClient.cs +++ b/PCK-Studio/Classes/Misc/RichPresenceClient.cs @@ -27,7 +27,7 @@ namespace PckStudio.Classes.Misc new Button() { Label = "Check it out!", - Url = Program.ProjectUrl, + Url = Program.ProjectUrl.AbsoluteUri, } }; diff --git a/PCK-Studio/Classes/Networking/Network.cs b/PCK-Studio/Classes/Networking/Network.cs deleted file mode 100644 index f35575ac..00000000 --- a/PCK-Studio/Classes/Networking/Network.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Diagnostics; -using System.Net; -using System.Windows.Forms; - -namespace PckStudio.Classes.Networking -{ - [Obsolete] - class Network - { - public static string Version = Application.ProductVersion; - public static bool IsBeta = true; - public static bool Portable = false; - public static bool NeedsUpdate = false; - public static Uri MainURL = new Uri(Program.BaseAPIUrl); - public static Uri BackUpURL = new Uri(Program.BackUpAPIUrl); - static readonly string UpdatePath = "/update/Version"; - static readonly string BetaUpdatePath = "/update/VersionBeta"; - - public static void CheckUpdate() - { - using WebClient wc = new WebClient(); - try - { - Update.CheckForUpdate(null); // TODO - - Uri versionUri = new Uri(MainURL, IsBeta ? BetaUpdatePath : UpdatePath); - Console.WriteLine(versionUri); - string serverVersion = wc.DownloadString(versionUri); - if (Version != serverVersion) - { - if (MessageBox.Show("An update is available! Do you want to update?" + - $"\nYour Version: {Version}" + - $"\nAvailable version: {serverVersion}", "Update Available", MessageBoxButtons.YesNo) == DialogResult.Yes) - { - Update.UpdateProgram(new UpdateOptions( - isBeta: IsBeta, - isPortable: Portable, - baseUri: new Uri(MainURL, "/Update/Download/setup/PCKStudio-Setup.msi"), - betaUri: new Uri(MainURL, "/Update/Download/setup/beta/PCKStudioBeta-Setup.msi") - ) - ); - } - else - { - NeedsUpdate = true; - } - } - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - MessageBox.Show("Can't connect to the server!", "Server unavailabe"); - } - } - - - } -} diff --git a/PCK-Studio/Classes/Networking/Update.cs b/PCK-Studio/Classes/Networking/Update.cs deleted file mode 100644 index 4813ae45..00000000 --- a/PCK-Studio/Classes/Networking/Update.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Diagnostics; -using System.Threading; -using System.IO; -using System.Net; -using System.Windows.Forms; - -namespace PckStudio.Classes.Networking -{ - [Obsolete] - public enum UpdateResult - { - // Base Failure value - Failure = -1, - // Base Success value - Success, - - UpdateAvailable, - - UpdateFailure, - } - - [Obsolete] - class UpdateOptions - { - public bool IsBeta { get; set; } - public bool IsPortable { get; set; } - public string Domain - { - get => _baseDomain?.OriginalString ?? (_betaDomain?.OriginalString ?? throw new NullReferenceException(nameof(_betaDomain))); - set - { - _ = value ?? throw new NullReferenceException(nameof(value)); - _baseDomain = new Uri(value); - } - } - - private Uri _baseDomain; - private Uri _betaDomain; - - public UpdateOptions(bool isBeta, bool isPortable, Uri baseUri, Uri betaUri) - { - IsBeta = isBeta; - IsPortable = isPortable; - _baseDomain = baseUri; - _betaDomain = betaUri; - } - } - - [Obsolete] - static class Update - { - public static UpdateResult CheckForUpdate(UpdateOptions options) - { - // TODO: implement this - return UpdateResult.Failure; - } - - public static void UpdateProgram(UpdateOptions options) - { - string updateURL = options.Domain; - if (options.IsPortable) - { - updateURL = updateURL.Replace(".msi","Portable.msi"); - } - - string downloadPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Temp\\"; - string destinationURL = options.Domain; - if (TryDownloadFile(downloadPath + Path.GetFileName(destinationURL), destinationURL)) - { - Process.Start(downloadPath + Path.GetFileName(destinationURL)); - Application.Exit(); - } - } - - static bool TryDownloadFile(string filePath, string url) - { - try - { - using (WebClient client = new WebClient()) - client.DownloadFile(url, filePath); - return true; - } - catch (Exception ex) { Console.WriteLine(ex.Message); } - return false; - } - } -} diff --git a/PCK-Studio/Forms/AppSettingsForm.Designer.cs b/PCK-Studio/Forms/AppSettingsForm.Designer.cs index d651aef3..977513d6 100644 --- a/PCK-Studio/Forms/AppSettingsForm.Designer.cs +++ b/PCK-Studio/Forms/AppSettingsForm.Designer.cs @@ -36,6 +36,7 @@ this.autoLoadPckCheckBox = new MetroFramework.Controls.MetroCheckBox(); this.showPresenceCheckBox = new MetroFramework.Controls.MetroCheckBox(); this.grf_paramKeyComboBoxCheckBox = new MetroFramework.Controls.MetroCheckBox(); + this.usePrereleaseCheckBox = new MetroFramework.Controls.MetroCheckBox(); this.SuspendLayout(); // // autoSaveCheckBox @@ -76,7 +77,6 @@ // autoUpdateCheckBox // this.autoUpdateCheckBox.AutoSize = true; - this.autoUpdateCheckBox.Enabled = false; this.autoUpdateCheckBox.Location = new System.Drawing.Point(23, 105); this.autoUpdateCheckBox.Name = "autoUpdateCheckBox"; this.autoUpdateCheckBox.Size = new System.Drawing.Size(90, 15); @@ -86,6 +86,7 @@ this.autoUpdateCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; this.SettingToolTip.SetToolTip(this.autoUpdateCheckBox, "Whether to automatically check for updates"); this.autoUpdateCheckBox.UseSelectable = true; + this.autoUpdateCheckBox.CheckedChanged += new System.EventHandler(this.autoUpdateCheckBox_CheckedChanged); // // autoLoadPckCheckBox // @@ -129,11 +130,26 @@ this.grf_paramKeyComboBoxCheckBox.UseSelectable = true; this.grf_paramKeyComboBoxCheckBox.CheckedChanged += new System.EventHandler(this.grf_paramKeyComboBoxCheckBox_CheckedChanged); // + // usePrereleaseCheckBox + // + this.usePrereleaseCheckBox.AutoSize = true; + this.usePrereleaseCheckBox.Location = new System.Drawing.Point(119, 105); + this.usePrereleaseCheckBox.Name = "usePrereleaseCheckBox"; + this.usePrereleaseCheckBox.Size = new System.Drawing.Size(98, 15); + this.usePrereleaseCheckBox.Style = MetroFramework.MetroColorStyle.White; + this.usePrereleaseCheckBox.TabIndex = 6; + this.usePrereleaseCheckBox.Text = "Use Beta Build"; + this.usePrereleaseCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.SettingToolTip.SetToolTip(this.usePrereleaseCheckBox, "Whether to automatically check for updates"); + this.usePrereleaseCheckBox.UseSelectable = true; + this.usePrereleaseCheckBox.Visible = false; + // // AppSettingsForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(527, 270); + this.Controls.Add(this.usePrereleaseCheckBox); this.Controls.Add(this.grf_paramKeyComboBoxCheckBox); this.Controls.Add(this.showPresenceCheckBox); this.Controls.Add(this.autoLoadPckCheckBox); @@ -164,5 +180,6 @@ private MetroFramework.Controls.MetroCheckBox autoLoadPckCheckBox; private MetroFramework.Controls.MetroCheckBox showPresenceCheckBox; private MetroFramework.Controls.MetroCheckBox grf_paramKeyComboBoxCheckBox; + private MetroFramework.Controls.MetroCheckBox usePrereleaseCheckBox; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/AppSettingsForm.cs b/PCK-Studio/Forms/AppSettingsForm.cs index 71725fb0..b62445a0 100644 --- a/PCK-Studio/Forms/AppSettingsForm.cs +++ b/PCK-Studio/Forms/AppSettingsForm.cs @@ -40,11 +40,21 @@ namespace PckStudio.Forms Settings.Default.ShowRichPresence = showPresenceCheckBox.Checked; } + private void autoUpdateCheckBox_CheckedChanged(object sender, EventArgs e) + { + usePrereleaseCheckBox.Visible = Settings.Default.AutoUpdate = autoUpdateCheckBox.Checked; + } + private void grf_paramKeyComboBoxCheckBox_CheckedChanged(object sender, EventArgs e) { Settings.Default.UseComboBoxForGRFParameter = grf_paramKeyComboBoxCheckBox.Checked; } + private void usePrereleaseCheckBox_CheckedChanged(object sender, EventArgs e) + { + Settings.Default.UsePrerelease = usePrereleaseCheckBox.Checked; + } + private void LoadCheckboxState(CheckBox checkBox, EventHandler eventHandler, bool state) { checkBox.CheckedChanged -= eventHandler; @@ -58,6 +68,8 @@ namespace PckStudio.Forms LoadCheckboxState(endianCheckBox, endianCheckBox_CheckedChanged, Settings.Default.UseLittleEndianAsDefault); LoadCheckboxState(autoLoadPckCheckBox, autoLoadPckCheckBox_CheckedChanged, Settings.Default.LoadSubPcks); LoadCheckboxState(showPresenceCheckBox, showPresenceCheckBox_CheckedChanged, Settings.Default.ShowRichPresence); + LoadCheckboxState(autoUpdateCheckBox, autoUpdateCheckBox_CheckedChanged, Settings.Default.AutoUpdate); + LoadCheckboxState(usePrereleaseCheckBox, usePrereleaseCheckBox_CheckedChanged, Settings.Default.UsePrerelease); LoadCheckboxState(grf_paramKeyComboBoxCheckBox, grf_paramKeyComboBoxCheckBox_CheckedChanged, Settings.Default.UseComboBoxForGRFParameter); } diff --git a/PCK-Studio/MainForm.Designer.cs b/PCK-Studio/MainForm.Designer.cs index 366dc5d5..94e00784 100644 --- a/PCK-Studio/MainForm.Designer.cs +++ b/PCK-Studio/MainForm.Designer.cs @@ -33,6 +33,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); System.Windows.Forms.ToolStripSeparator toolStripSeparator1; System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.contextMenuPCKEntries = new System.Windows.Forms.ContextMenuStrip(this.components); this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.folderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -99,6 +100,7 @@ this.joinDevelopmentDiscordToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.trelloBoardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkForUpdatesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.videosToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.howToMakeABasicSkinPackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -146,7 +148,6 @@ this.LittleEndianCheckBox = new MetroFramework.Controls.MetroCheckBox(); logoPictureBox = new System.Windows.Forms.PictureBox(); toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); ((System.ComponentModel.ISupportInitialize)(logoPictureBox)).BeginInit(); this.contextMenuPCKEntries.SuspendLayout(); this.menuStrip.SuspendLayout(); @@ -166,6 +167,16 @@ logoPictureBox.Name = "logoPictureBox"; logoPictureBox.TabStop = false; // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(toolStripSeparator1, "toolStripSeparator1"); + // + // toolStripSeparator3 + // + toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(toolStripSeparator3, "toolStripSeparator3"); + // // contextMenuPCKEntries // this.contextMenuPCKEntries.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -628,6 +639,7 @@ // helpToolStripMenuItem // this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.checkForUpdatesToolStripMenuItem, this.aboutToolStripMenuItem, toolStripSeparator1, this.videosToolStripMenuItem, @@ -638,17 +650,18 @@ this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; resources.ApplyResources(this.helpToolStripMenuItem, "helpToolStripMenuItem"); // + // checkForUpdatesToolStripMenuItem + // + this.checkForUpdatesToolStripMenuItem.Name = "checkForUpdatesToolStripMenuItem"; + resources.ApplyResources(this.checkForUpdatesToolStripMenuItem, "checkForUpdatesToolStripMenuItem"); + this.checkForUpdatesToolStripMenuItem.Click += new System.EventHandler(this.checkForUpdatesToolStripMenuItem_Click); + // // aboutToolStripMenuItem // resources.ApplyResources(this.aboutToolStripMenuItem, "aboutToolStripMenuItem"); this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); // - // toolStripSeparator1 - // - toolStripSeparator1.Name = "toolStripSeparator1"; - resources.ApplyResources(toolStripSeparator1, "toolStripSeparator1"); - // // videosToolStripMenuItem // this.videosToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -739,11 +752,6 @@ resources.ApplyResources(this.forMattNLContributorToolStripMenuItem, "forMattNLContributorToolStripMenuItem"); this.forMattNLContributorToolStripMenuItem.Click += new System.EventHandler(this.forMattNLContributorToolStripMenuItem_Click); // - // toolStripSeparator3 - // - toolStripSeparator3.Name = "toolStripSeparator3"; - resources.ApplyResources(toolStripSeparator3, "toolStripSeparator3"); - // // settingsToolStripMenuItem // this.settingsToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ranch; @@ -1233,6 +1241,7 @@ private System.Windows.Forms.ToolStripMenuItem toPhoenixARCDeveloperToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem forMattNLContributorToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem checkForUpdatesToolStripMenuItem; } } diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index c50d57c1..b669d7b4 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -32,6 +32,7 @@ using PckStudio.Extensions; using PckStudio.Popups; using PckStudio.Classes.Utils; using PckStudio.Helper; +using PCKStudio_Updater; namespace PckStudio { @@ -2267,5 +2268,15 @@ namespace PckStudio return; } } - } + + private void checkForUpdatesToolStripMenuItem_Click(object sender, EventArgs e) + { + if (Program.Updater.IsUpdateAvailable(Application.ProductVersion)) + { + Program.UpdateToLatest("Would you like to download it?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, DialogResult.Yes); + return; + } + MessageBox.Show("Already up to date.", "No update available"); + } + } } \ No newline at end of file diff --git a/PCK-Studio/MainForm.resx b/PCK-Studio/MainForm.resx index 6d014a15..9e5d15af 100644 --- a/PCK-Studio/MainForm.resx +++ b/PCK-Studio/MainForm.resx @@ -809,32 +809,18 @@ 8 + + False + + + 177, 6 + + + 177, 6 + 116, 17 - - 158, 224 - - - contextMenuPCKEntries - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAA3SURBVDhPY/j/ - /z9FGKsgGIsCKWSMTQ0QYxUE45FmALpiYvFwMgAbxqIYG8YqCMajBhCJ/zMAAPGwpV/Xje8RAAAAAElF - TkSuQmCC - - - - 157, 22 - - - Create - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -923,20 +909,19 @@ EntityMaterials.bin - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB - DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW - mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAA3SURBVDhPY/j/ + /z9FGKsgGIsCKWSMTQ0QYxUE45FmALpiYvFwMgAbxqIYG8YqCMajBhCJ/zMAAPGwpV/Xje8RAAAAAElF TkSuQmCC - + 157, 22 - - Import + + Create @@ -990,11 +975,20 @@ Add File - + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB + DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW + mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF + TkSuQmCC + + + 157, 22 - - Export + + Import 186, 22 @@ -1002,11 +996,11 @@ Export as 3DS Texture - + 157, 22 - - Set File Type + + Export 222, 22 @@ -1080,11 +1074,11 @@ Entity Materials File (.BIN) - + 157, 22 - - Misc. Functions + + Set File Type 210, 22 @@ -1104,6 +1098,12 @@ Correct Skin Decimals + + 157, 22 + + + Misc. Functions + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -1169,6 +1169,15 @@ Delete + + 158, 224 + + + contextMenuPCKEntries + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 17, 17 @@ -1181,30 +1190,383 @@ None + + 151, 22 + + + Skin Pack + + + 151, 22 + + + Texture Pack + + + 151, 22 + + + Mash-Up Pack + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADuSURBVFhH7ZbB + CsMgEERDbv5A/v83e2jNTmCKGdegJk0heHgUn7vrKBQyxRj/iivJPM9WMTWjc45wJeAwhAghVJEG1nkl + XNkziLCvtteXphFCfQ08nOi+4kvTeFL1NfBQ/BLuefjS9NkAADOwPnpNX14UADBEaV4mNnkygN34Y/1v + AgeWZXll9So2eTLAEVm9ik2a7g1Qgn9t9bvFV/4gAOZdHgB1RPeUEeAZAeBr0d4R4JIACuqI7ikjwDMD + tDACNAfo/Sou0fQ9wGKvoQfO8i61W6SkTXi+XtLLgOwcFSna3It3c+LKO3HlfcRpBa3JBjU5E8DiAAAA + AElFTkSuQmCC + + + + 186, 22 + + + New + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAABGSURBVDhPYxgc + 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADsCkgAkO1jxoAAtgkicFQ7cPCAGLB////wXgwAQYG + AOrUrx4HdAXuAAAAAElFTkSuQmCC + + + + Ctrl+O + + + 186, 22 + + + Open + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABVSURBVDhPvYwB + CgAgCAP9/6cLg0BlS4XqQGjmTn4xyLQ4CtCnnQ3b+0CIZddxARBL9r1wIbCP401JgMrwFi1RWSkJWFlJ + BaeyUhYwUkHGO0FnbiEyAQxPT7Gcb/TQAAAAAElFTkSuQmCC + + + + 186, 22 + + + Extract + + + 160, 22 + + + Full box support + + + 186, 22 + + + Pack Settings + + + False + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C + y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga + QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN + 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC + + + + Ctrl+S + + + 186, 22 + + + Save + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + IEt7+/x6k9t/lxQ++v/2zUc4vnv11f+Dq+79v3DgyX+QHBAwgDAGAGkGYrAiZAOOrX36v9zg/P95ebfA + ciA1uAwAS6IbcGLdS7g4zAAQhmpDAJjEjIS7/1+//AA34MH1d2BDLh98DZYjaECN0bX/BTpHsGKQHEED + iMVQbQgAEtw39zmK/7FhkBqcBoD8+vjh8//nz1zFikFysECFakMAmAEvnr35f//OY6wYJEdTA/6CJLH5 + GxlDDfgL1YYAWdpb52+bdf0vNr8jY5AaULKHahtwwMAAAPeIxBbbnvcfAAAAAElFTkSuQmCC + + + + Ctrl+Shift+S + + + 186, 22 + + + Save As + + + 186, 22 + + + Close + + + False + 37, 20 File + + False + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAACRSURBVFhH7Y45 + DoAwDATz/09DZWRF62utUIBHmgayk6xhaHBtvs5/HmBdor97/1roUEcaFGOkQTHGFpVg5WyaarB6PoSJ + MZsHPd7NgrZiCBqJWdBWDEEjMQvaiiFoJGZBW7EMM2Y2JjqWCVbPh+xBL1o5mwIFGWlQjJEGxRhbWCH9 + 3ft3DH3J0Yss5gHDF1jrBvn6/wGuM1ZgAAAAAElFTkSuQmCC + + + + Ctrl+Q + + + 192, 22 + + + Quick Change + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAJeSURBVDhPhVFp + TxNRFH1/RbGdlsQElaWzdaQgbadFtnkznWlLCm2Q2UCxTqdFFAzTRONSYheIoCjRpmoErBiKW/hi4q+q + bxpoSPzgyfnw7r3nvHvveyD92W/UQ5l9Vt6h5B1S2/Wntnr1977lHxDltVr/7FtaqTLJbc/YU+f8x0GQ + rgfmPgw9aoj390dX6uMSgWlVMvkGT7zqLR5PF34lzL3w9HZXunZNfuedr/nAw+9RnnZt/dHl1+SN2lWO + cS3sDsVxbOEgsPwTFo9Tz38nRdIRK15MvvRIlBtIFKboSoTGRMp5e4+VaEeEdoi0Y2r7kkBjyqcBjsEW + x3s4xomUWUiAkhoweLqiBRurEFLujVl/lvfkICESFyK0M0qc1xU5KxAlOSzQbtuQm+iWiHMVjd2Q++9A + b0X3C2SHSHYIpNPgGZMnRbIzLeBZrs8QmH1rEuw+iEVo1xLfl+O6nqzcvQd7MpDay6cQm2fwTBnO8sQL + xQcaFq+GLm/eGtm8OfY4N2NN+VBhbWawmhmzhQDYbDatSSafGECDgC/WFFLUrdTBanRNGUbLoDADiTVt + 5KwBJQvaaFG9Dspq0Ji4YghEWQtlJvCCHLJ1bZwa2rANJZ2VvO5FAUdEh1a6pfuXJ4a5EdTxWz6GaPL4 + fw0hkydysK+khdFUh5ZkG9o41bUBDA6HjGsd7Qo9ZR0tzR5ZcdRwietu1U8M6NKv+XjDioIM5ylqYfRB + izwRoZwmpCoqW9KDJjwzW7N5aMXLGoveEBRV1uQ9EarzKB/LQlyiXOj/JS+GmtiGU6BwXQ2sa8G/5oRp + fQPDL0EAAAAASUVORK5CYII= + + + + 192, 22 + + + Convert to Bedrock + 39, 20 Edit + + 195, 22 + + + Add Custom Pack Icon + + + 195, 22 + + + Pck Manager + + + 145, 22 + + + Wav -> Binka + + + 145, 22 + + + Binka -> Wav + + + 195, 22 + + + Audio Converter + 46, 20 Tools + + 223, 22 + + + PCK Center + + + + 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 + + + + 223, 22 + + + Development Discord Server + + + 223, 22 + + + Trello Board + 63, 20 More + + 180, 22 + + + Check for updates + iVBORw0KGgoAAAANSUhEUgAAAtAAAALQCAYAAAC5V0ecAAAABGdBTUEAALGPC/xhBQAAazFJREFUeF7t @@ -1674,424 +2036,6 @@ About - - False - - - 177, 6 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 - jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq - myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp - JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC - - - - 180, 22 - - - Tutorials - - - 180, 22 - - - Buy a coffee - - - False - - - 177, 6 - - - Alt+S - - - 180, 22 - - - Settings - - - 44, 20 - - - Help - - - 24, 44 - - - 1016, 24 - - - 2 - - - MainMenuStrip - - - menuStrip - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADuSURBVFhH7ZbB - CsMgEERDbv5A/v83e2jNTmCKGdegJk0heHgUn7vrKBQyxRj/iivJPM9WMTWjc45wJeAwhAghVJEG1nkl - XNkziLCvtteXphFCfQ08nOi+4kvTeFL1NfBQ/BLuefjS9NkAADOwPnpNX14UADBEaV4mNnkygN34Y/1v - AgeWZXll9So2eTLAEVm9ik2a7g1Qgn9t9bvFV/4gAOZdHgB1RPeUEeAZAeBr0d4R4JIACuqI7ikjwDMD - tDACNAfo/Sou0fQ9wGKvoQfO8i61W6SkTXi+XtLLgOwcFSna3It3c+LKO3HlfcRpBa3JBjU5E8DiAAAA - AElFTkSuQmCC - - - - 186, 22 - - - New - - - 151, 22 - - - Skin Pack - - - 151, 22 - - - Texture Pack - - - 151, 22 - - - Mash-Up Pack - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAABGSURBVDhPYxgc - 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADsCkgAkO1jxoAAtgkicFQ7cPCAGLB////wXgwAQYG - AOrUrx4HdAXuAAAAAElFTkSuQmCC - - - - Ctrl+O - - - 186, 22 - - - Open - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABVSURBVDhPvYwB - CgAgCAP9/6cLg0BlS4XqQGjmTn4xyLQ4CtCnnQ3b+0CIZddxARBL9r1wIbCP401JgMrwFi1RWSkJWFlJ - BaeyUhYwUkHGO0FnbiEyAQxPT7Gcb/TQAAAAAElFTkSuQmCC - - - - 186, 22 - - - Extract - - - 186, 22 - - - Pack Settings - - - False - - - 160, 22 - - - Full box support - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C - y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga - QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN - 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC - - - - Ctrl+S - - - 186, 22 - - - Save - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - IEt7+/x6k9t/lxQ++v/2zUc4vnv11f+Dq+79v3DgyX+QHBAwgDAGAGkGYrAiZAOOrX36v9zg/P95ebfA - ciA1uAwAS6IbcGLdS7g4zAAQhmpDAJjEjIS7/1+//AA34MH1d2BDLh98DZYjaECN0bX/BTpHsGKQHEED - iMVQbQgAEtw39zmK/7FhkBqcBoD8+vjh8//nz1zFikFysECFakMAmAEvnr35f//OY6wYJEdTA/6CJLH5 - GxlDDfgL1YYAWdpb52+bdf0vNr8jY5AaULKHahtwwMAAAPeIxBbbnvcfAAAAAElFTkSuQmCC - - - - Ctrl+Shift+S - - - 186, 22 - - - Save As - - - 186, 22 - - - Close - - - False - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAACRSURBVFhH7Y45 - DoAwDATz/09DZWRF62utUIBHmgayk6xhaHBtvs5/HmBdor97/1roUEcaFGOkQTHGFpVg5WyaarB6PoSJ - MZsHPd7NgrZiCBqJWdBWDEEjMQvaiiFoJGZBW7EMM2Y2JjqWCVbPh+xBL1o5mwIFGWlQjJEGxRhbWCH9 - 3ft3DH3J0Yss5gHDF1jrBvn6/wGuM1ZgAAAAAElFTkSuQmCC - - - - Ctrl+Q - - - 192, 22 - - - Quick Change - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAJeSURBVDhPhVFp - TxNRFH1/RbGdlsQElaWzdaQgbadFtnkznWlLCm2Q2UCxTqdFFAzTRONSYheIoCjRpmoErBiKW/hi4q+q - bxpoSPzgyfnw7r3nvHvveyD92W/UQ5l9Vt6h5B1S2/Wntnr1977lHxDltVr/7FtaqTLJbc/YU+f8x0GQ - rgfmPgw9aoj390dX6uMSgWlVMvkGT7zqLR5PF34lzL3w9HZXunZNfuedr/nAw+9RnnZt/dHl1+SN2lWO - cS3sDsVxbOEgsPwTFo9Tz38nRdIRK15MvvRIlBtIFKboSoTGRMp5e4+VaEeEdoi0Y2r7kkBjyqcBjsEW - x3s4xomUWUiAkhoweLqiBRurEFLujVl/lvfkICESFyK0M0qc1xU5KxAlOSzQbtuQm+iWiHMVjd2Q++9A - b0X3C2SHSHYIpNPgGZMnRbIzLeBZrs8QmH1rEuw+iEVo1xLfl+O6nqzcvQd7MpDay6cQm2fwTBnO8sQL - xQcaFq+GLm/eGtm8OfY4N2NN+VBhbWawmhmzhQDYbDatSSafGECDgC/WFFLUrdTBanRNGUbLoDADiTVt - 5KwBJQvaaFG9Dspq0Ji4YghEWQtlJvCCHLJ1bZwa2rANJZ2VvO5FAUdEh1a6pfuXJ4a5EdTxWz6GaPL4 - fw0hkydysK+khdFUh5ZkG9o41bUBDA6HjGsd7Qo9ZR0tzR5ZcdRwietu1U8M6NKv+XjDioIM5ylqYfRB - izwRoZwmpCoqW9KDJjwzW7N5aMXLGoveEBRV1uQ9EarzKB/LQlyiXOj/JS+GmtiGU6BwXQ2sa8G/5oRp - fQPDL0EAAAAASUVORK5CYII= - - - - 192, 22 - - - Convert to Bedrock - - - 195, 22 - - - Add Custom Pack Icon - - - 195, 22 - - - Pck Manager - - - 195, 22 - - - Audio Converter - - - 145, 22 - - - Wav -> Binka - - - 145, 22 - - - Binka -> Wav - - - 223, 22 - - - PCK Center - - - - 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 - - - - 223, 22 - - - Development Discord Server - - - 223, 22 - - - Trello Board - 312, 22 @@ -2134,6 +2078,20 @@ How PCKs work + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 + jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq + myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp + JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC + + + + 180, 22 + + + Tutorials + 253, 22 @@ -2152,32 +2110,54 @@ For MattNL (Other Developer) + + 180, 22 + + + Buy a coffee + + + Alt+S + + + 180, 22 + + + Settings + + + 44, 20 + + + Help + + + 24, 44 + + + 1016, 24 + + + 2 + + + MainMenuStrip + + + menuStrip + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + 298, 17 - - 182, 92 - - - contextMenuMetaTree - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - - - - 181, 22 - - - Add Entry - 160, 22 @@ -2196,6 +2176,20 @@ Add ANIM Entry + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 181, 22 + + + Add Entry + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -2231,128 +2225,14 @@ Edit All Entries - - openTab + + 182, 92 - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + contextMenuMetaTree - - tabControl - - - 0 - - - editorTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 1 - - - Fill - - - 20, 30 - - - 0, 0, 0, 0 - - - 1024, 600 - - - 0 - - - tabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 4 - - - pckOpen - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - openTab - - - 2 - - - label5 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - openTab - - - 3 - - - labelVersion - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - openTab - - - 4 - - - ChangelogRichTextBox - - - System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - openTab - - - 5 - - - 4, 38 - - - 18, 30, 20, 5 - - - 1016, 558 - - - 1 - - - openTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 0 + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 None @@ -3464,119 +3344,32 @@ 5 - - True - - - None - - - pckFileLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 2 - - - labelImageSize - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 3 - - - fileEntryCountLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 4 - - - PropertiesTabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 5 - - - label11 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 6 - - - treeViewMain - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - editorTab - - - 7 - - - previewPictureBox - - - PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null - - - editorTab - - - 9 - - + 4, 38 - - 5, 50, 5, 7 + + 18, 30, 20, 5 - + 1016, 558 - - 0 + + 1 - - editorTab + + openTab - + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - + tabControl - - 1 + + 0 + + + None 3, 17 @@ -3656,138 +3449,6 @@ Top, Bottom, Right - - MetaTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - PropertiesTabControl - - - 0 - - - 338, 277 - - - 671, 282 - - - 11 - - - PropertiesTabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 5 - - - metroLabel2 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 2 - - - treeMeta - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MetaTab - - - 3 - - - entryTypeTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 4 - - - entryDataTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 5 - - - buttonEdit - - - MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 6 - - - metroLabel1 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 7 - - - 4, 38 - - - 3, 3, 3, 3 - - - 663, 240 - - - 0 - - - Properties - - - MetaTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - PropertiesTabControl - - - 0 - Top, Right @@ -3989,6 +3650,54 @@ 7 + + 4, 38 + + + 3, 3, 3, 3 + + + 663, 240 + + + 0 + + + Properties + + + MetaTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + PropertiesTabControl + + + 0 + + + 338, 277 + + + 671, 282 + + + 11 + + + PropertiesTabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 5 + True @@ -4091,6 +3800,57 @@ 9 + + 4, 38 + + + 5, 50, 5, 7 + + + 1016, 558 + + + 0 + + + editorTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + tabControl + + + 1 + + + Fill + + + 20, 30 + + + 0, 0, 0, 0 + + + 1024, 600 + + + 0 + + + tabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 4 + Top, Right @@ -6651,6 +6411,18 @@ CenterParent + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator3 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + createToolStripMenuItem @@ -7035,18 +6807,18 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + checkForUpdatesToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + aboutToolStripMenuItem System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator1 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - videosToolStripMenuItem @@ -7119,12 +6891,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator3 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - settingsToolStripMenuItem diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 3e040c1d..c7685cff 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -4,6 +4,7 @@ preview true + NDEBUG publish\ true Disk @@ -40,7 +41,7 @@ full false bin\Debug\ - DEBUG;TRACE + $(DefineConstants);DEBUG;TRACE prompt 4 true @@ -50,7 +51,7 @@ none true bin\Release\ - TRACE + $(DefineConstants);TRACE prompt 4 true @@ -60,7 +61,7 @@ pdbonly false bin\Beta\ - BETA;TRACE + $(DefineConstants);BETA;TRACE prompt 4 true @@ -225,9 +226,7 @@ - - UserControl @@ -728,6 +727,10 @@ + + {5B223556-15B9-41DA-AA0B-5E7F45E743BF} + PCK-Studio-Updater + {693AEBC1-293D-4DF0-BCAE-26A1099FE7BB} OMI Filetype Library diff --git a/PCK-Studio/Program.cs b/PCK-Studio/Program.cs index 644b6c70..38fe6f56 100644 --- a/PCK-Studio/Program.cs +++ b/PCK-Studio/Program.cs @@ -1,21 +1,36 @@ using System; using System.Diagnostics; using System.IO; +using System.Text.RegularExpressions; using System.Windows.Forms; using PckStudio.Classes.Misc; using PckStudio.Internal; +using PckStudio.Properties; +using PCKStudio_Updater; + namespace PckStudio { static class Program { - public static readonly string ProjectUrl = "https://github.com/PhoenixARC/-PCK-Studio"; - public static readonly string BaseAPIUrl = "http://api.pckstudio.xyz/api/pck"; - public static readonly string BackUpAPIUrl = "https://raw.githubusercontent.com/PhoenixARC/pckstudio.tk/main/studio/PCK/api/"; - public static readonly string AppData = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Application.ProductName); - public static readonly string AppDataCache = Path.Combine(AppData, "cache"); + internal static readonly Uri ProjectUrl = new Uri("https://github.com/PhoenixARC/-PCK-Studio"); + internal static readonly string BaseAPIUrl = "http://api.pckstudio.xyz/api/pck"; + internal static readonly string BackUpAPIUrl = "https://raw.githubusercontent.com/PhoenixARC/pckstudio.tk/main/studio/PCK/api/"; - public static MainForm MainInstance { get; private set; } + internal static readonly string AppData = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Application.ProductName); + internal static readonly string AppDataCache = Path.Combine(AppData, "cache"); + + private static readonly GithubParams UpdateParams = new GithubParams( + Path.GetDirectoryName(ProjectUrl.AbsolutePath).Replace("\\", ""), + Path.GetFileName(ProjectUrl.AbsolutePath), + Application.ProductName, + Settings.Default.UsePrerelease, + new Regex("(\\*|\\d+(\\.\\d+){0,3}(\\.\\*)?)") + ); + internal static readonly IUpdateDownloader Updater = new GithubUpdateDownloader(UpdateParams); + + + internal static MainForm MainInstance { get; private set; } /// /// The main entry point for the application. @@ -23,6 +38,11 @@ namespace PckStudio [STAThread] static void Main(string[] args) { + if (Settings.Default.AutoUpdate) + { + UpdateToLatest("Click Ok to continue.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, DialogResult.OK); + } + ApplicationScope.Initialize(); Trace.TraceInformation("Startup"); RPC.Initialize(); @@ -32,5 +52,21 @@ namespace PckStudio Application.ApplicationExit += (sender, e) => { RPC.Deinitialize(); }; Application.Run(MainInstance); } + + [Conditional("NDEBUG")] + internal static void UpdateToLatest(string message, MessageBoxButtons buttons, MessageBoxIcon icon, DialogResult dialogResult) + { + bool updateAvailable = Updater.IsUpdateAvailable(Application.ProductVersion); + if (updateAvailable && MessageBox.Show( + "New update available.\n" + + message, + "Update Available", + buttons, icon, MessageBoxDefaultButton.Button1) == dialogResult) + { + Updater.DownloadTo(new DirectoryInfo(Application.StartupPath)); + Updater.Launch(); + Application.Exit(); + } + } } -} +} \ No newline at end of file diff --git a/PCK-Studio/Properties/AssemblyInfo.cs b/PCK-Studio/Properties/AssemblyInfo.cs index 27386512..9e7ee662 100644 --- a/PCK-Studio/Properties/AssemblyInfo.cs +++ b/PCK-Studio/Properties/AssemblyInfo.cs @@ -32,6 +32,6 @@ using System.Security.Permissions; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("7.0")] -[assembly: AssemblyFileVersion("7.0")] +[assembly: AssemblyVersion("7.0.0.0")] +[assembly: AssemblyFileVersion("7.0.0.0")] [assembly: NeutralResourcesLanguage("")] diff --git a/PCK-Studio/Properties/Settings.Designer.cs b/PCK-Studio/Properties/Settings.Designer.cs index e6d87129..95fa109d 100644 --- a/PCK-Studio/Properties/Settings.Designer.cs +++ b/PCK-Studio/Properties/Settings.Designer.cs @@ -80,6 +80,30 @@ namespace PckStudio.Properties { } } + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool UsePrerelease { + get { + return ((bool)(this["UsePrerelease"])); + } + set { + this["UsePrerelease"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool AutoUpdate { + get { + return ((bool)(this["AutoUpdate"])); + } + set { + this["AutoUpdate"] = value; + } + } + [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] diff --git a/PCK-Studio/Properties/Settings.settings b/PCK-Studio/Properties/Settings.settings index 8724beec..2e32328f 100644 --- a/PCK-Studio/Properties/Settings.settings +++ b/PCK-Studio/Properties/Settings.settings @@ -17,6 +17,12 @@ True + + True + + + False + False diff --git a/PCK_Studio.sln b/PCK_Studio.sln index 8062268c..772bd2c5 100644 --- a/PCK_Studio.sln +++ b/PCK_Studio.sln @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OMI Filetype Library", "Ven EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpMss32", "Vendor\SharpMss32\SharpMss32\SharpMss32.csproj", "{E8D0B671-3AB1-48B6-A767-58DF67BD5D11}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PCK-Studio-Updater", "PCK-Studio-Updater\PCK-Studio-Updater.csproj", "{5B223556-15B9-41DA-AA0B-5E7F45E743BF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Beta|Any CPU = Beta|Any CPU @@ -78,6 +80,24 @@ Global {E8D0B671-3AB1-48B6-A767-58DF67BD5D11}.Release|x64.Build.0 = Release|Any CPU {E8D0B671-3AB1-48B6-A767-58DF67BD5D11}.Release|x86.ActiveCfg = Release|Any CPU {E8D0B671-3AB1-48B6-A767-58DF67BD5D11}.Release|x86.Build.0 = Release|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Beta|Any CPU.ActiveCfg = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Beta|Any CPU.Build.0 = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Beta|x64.ActiveCfg = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Beta|x64.Build.0 = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Beta|x86.ActiveCfg = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Beta|x86.Build.0 = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Debug|x64.ActiveCfg = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Debug|x64.Build.0 = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Debug|x86.ActiveCfg = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Debug|x86.Build.0 = Debug|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Release|Any CPU.Build.0 = Release|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Release|x64.ActiveCfg = Release|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Release|x64.Build.0 = Release|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Release|x86.ActiveCfg = Release|Any CPU + {5B223556-15B9-41DA-AA0B-5E7F45E743BF}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE