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 00000000..85357f6f Binary files /dev/null and b/PCK-Studio-Updater/ProjectLogo.ico differ 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