From 07d319b7f4d8017787e194d54f413ff6d27c1879 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Tue, 25 Jun 2024 19:20:46 +0200 Subject: [PATCH 1/6] AppSettingsForm - Add automatically loading of settings --- PCK-Studio/Forms/AppSettingsForm.Designer.cs | 132 ++----------------- PCK-Studio/Forms/AppSettingsForm.cs | 96 +++++++------- 2 files changed, 57 insertions(+), 171 deletions(-) diff --git a/PCK-Studio/Forms/AppSettingsForm.Designer.cs b/PCK-Studio/Forms/AppSettingsForm.Designer.cs index 977513d6..00ed901a 100644 --- a/PCK-Studio/Forms/AppSettingsForm.Designer.cs +++ b/PCK-Studio/Forms/AppSettingsForm.Designer.cs @@ -29,133 +29,33 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AppSettingsForm)); - this.autoSaveCheckBox = new MetroFramework.Controls.MetroCheckBox(); this.SettingToolTip = new MetroFramework.Components.MetroToolTip(); - this.endianCheckBox = new MetroFramework.Controls.MetroCheckBox(); - this.autoUpdateCheckBox = new MetroFramework.Controls.MetroCheckBox(); - 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.flowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); this.SuspendLayout(); // - // autoSaveCheckBox - // - this.autoSaveCheckBox.AutoSize = true; - this.autoSaveCheckBox.Location = new System.Drawing.Point(23, 63); - this.autoSaveCheckBox.Name = "autoSaveCheckBox"; - this.autoSaveCheckBox.Size = new System.Drawing.Size(76, 15); - this.autoSaveCheckBox.Style = MetroFramework.MetroColorStyle.White; - this.autoSaveCheckBox.TabIndex = 0; - this.autoSaveCheckBox.Text = "Auto Save"; - this.autoSaveCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.SettingToolTip.SetToolTip(this.autoSaveCheckBox, "Whether to automatically save changes inside of file editor such as the loc edito" + - "r"); - this.autoSaveCheckBox.UseSelectable = true; - this.autoSaveCheckBox.CheckedChanged += new System.EventHandler(this.autoSaveCheckBox_CheckedChanged); - // // SettingToolTip // this.SettingToolTip.Style = MetroFramework.MetroColorStyle.White; this.SettingToolTip.StyleManager = null; this.SettingToolTip.Theme = MetroFramework.MetroThemeStyle.Dark; // - // endianCheckBox + // flowLayoutPanel // - this.endianCheckBox.AutoSize = true; - this.endianCheckBox.Location = new System.Drawing.Point(23, 84); - this.endianCheckBox.Name = "endianCheckBox"; - this.endianCheckBox.Size = new System.Drawing.Size(75, 15); - this.endianCheckBox.Style = MetroFramework.MetroColorStyle.White; - this.endianCheckBox.TabIndex = 1; - this.endianCheckBox.Text = "Open Vita"; - this.endianCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.SettingToolTip.SetToolTip(this.endianCheckBox, "Whether to automatically set the \'Open as Switch/Vita pck\' checkbox"); - this.endianCheckBox.UseSelectable = true; - this.endianCheckBox.CheckedChanged += new System.EventHandler(this.endianCheckBox_CheckedChanged); - // - // autoUpdateCheckBox - // - this.autoUpdateCheckBox.AutoSize = true; - this.autoUpdateCheckBox.Location = new System.Drawing.Point(23, 105); - this.autoUpdateCheckBox.Name = "autoUpdateCheckBox"; - this.autoUpdateCheckBox.Size = new System.Drawing.Size(90, 15); - this.autoUpdateCheckBox.Style = MetroFramework.MetroColorStyle.White; - this.autoUpdateCheckBox.TabIndex = 2; - this.autoUpdateCheckBox.Text = "Auto Update"; - 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 - // - this.autoLoadPckCheckBox.AutoSize = true; - this.autoLoadPckCheckBox.Location = new System.Drawing.Point(23, 126); - this.autoLoadPckCheckBox.Name = "autoLoadPckCheckBox"; - this.autoLoadPckCheckBox.Size = new System.Drawing.Size(331, 15); - this.autoLoadPckCheckBox.Style = MetroFramework.MetroColorStyle.White; - this.autoLoadPckCheckBox.TabIndex = 3; - this.autoLoadPckCheckBox.Text = "Auto load additional pck files (also known as SubPCK files)"; - this.autoLoadPckCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.SettingToolTip.SetToolTip(this.autoLoadPckCheckBox, "Whether to automatically load files inside that end in .pck"); - this.autoLoadPckCheckBox.UseSelectable = true; - this.autoLoadPckCheckBox.CheckedChanged += new System.EventHandler(this.autoLoadPckCheckBox_CheckedChanged); - // - // showPresenceCheckBox - // - this.showPresenceCheckBox.AutoSize = true; - this.showPresenceCheckBox.Location = new System.Drawing.Point(23, 147); - this.showPresenceCheckBox.Name = "showPresenceCheckBox"; - this.showPresenceCheckBox.Size = new System.Drawing.Size(171, 15); - this.showPresenceCheckBox.Style = MetroFramework.MetroColorStyle.White; - this.showPresenceCheckBox.TabIndex = 4; - this.showPresenceCheckBox.Text = "Show Discord Rich Presence"; - this.showPresenceCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.SettingToolTip.SetToolTip(this.showPresenceCheckBox, "Whether to show a rich presence on discord"); - this.showPresenceCheckBox.UseSelectable = true; - this.showPresenceCheckBox.CheckedChanged += new System.EventHandler(this.showPresenceCheckBox_CheckedChanged); - // - // grf_paramKeyComboBoxCheckBox - // - this.grf_paramKeyComboBoxCheckBox.AutoSize = true; - this.grf_paramKeyComboBoxCheckBox.Location = new System.Drawing.Point(23, 169); - this.grf_paramKeyComboBoxCheckBox.Name = "grf_paramKeyComboBoxCheckBox"; - this.grf_paramKeyComboBoxCheckBox.Size = new System.Drawing.Size(100, 15); - this.grf_paramKeyComboBoxCheckBox.Style = MetroFramework.MetroColorStyle.White; - this.grf_paramKeyComboBoxCheckBox.TabIndex = 5; - this.grf_paramKeyComboBoxCheckBox.Text = "Select GRF Key"; - this.grf_paramKeyComboBoxCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.SettingToolTip.SetToolTip(this.grf_paramKeyComboBoxCheckBox, "Use a combobox instead of typing the parameter key name"); - 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; + this.flowLayoutPanel.AutoScroll = true; + this.flowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flowLayoutPanel.Location = new System.Drawing.Point(20, 60); + this.flowLayoutPanel.Name = "flowLayoutPanel"; + this.flowLayoutPanel.Padding = new System.Windows.Forms.Padding(3); + this.flowLayoutPanel.Size = new System.Drawing.Size(487, 190); + this.flowLayoutPanel.TabIndex = 0; // // 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); - this.Controls.Add(this.autoUpdateCheckBox); - this.Controls.Add(this.endianCheckBox); - this.Controls.Add(this.autoSaveCheckBox); + this.Controls.Add(this.flowLayoutPanel); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; @@ -167,19 +67,11 @@ this.Theme = MetroFramework.MetroThemeStyle.Dark; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AppBehaviorSettingsForm_FormClosing); this.ResumeLayout(false); - this.PerformLayout(); } #endregion - - private MetroFramework.Controls.MetroCheckBox autoSaveCheckBox; private MetroFramework.Components.MetroToolTip SettingToolTip; - private MetroFramework.Controls.MetroCheckBox endianCheckBox; - private MetroFramework.Controls.MetroCheckBox autoUpdateCheckBox; - private MetroFramework.Controls.MetroCheckBox autoLoadPckCheckBox; - private MetroFramework.Controls.MetroCheckBox showPresenceCheckBox; - private MetroFramework.Controls.MetroCheckBox grf_paramKeyComboBoxCheckBox; - private MetroFramework.Controls.MetroCheckBox usePrereleaseCheckBox; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/AppSettingsForm.cs b/PCK-Studio/Forms/AppSettingsForm.cs index b62445a0..8d1927bb 100644 --- a/PCK-Studio/Forms/AppSettingsForm.cs +++ b/PCK-Studio/Forms/AppSettingsForm.cs @@ -1,12 +1,9 @@ using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Configuration; +using System.Diagnostics; using System.Windows.Forms; +using MetroFramework.Controls; using MetroFramework.Forms; using PckStudio.Properties; @@ -14,68 +11,65 @@ namespace PckStudio.Forms { public partial class AppSettingsForm : MetroForm { + private ApplicationSettingsBase _applicationSettings; + public AppSettingsForm() + : this(Settings.Default) + { + } + + public AppSettingsForm(ApplicationSettingsBase applicationSettings) { InitializeComponent(); + _applicationSettings = applicationSettings; LoadSettings(); } - private void autoSaveCheckBox_CheckedChanged(object sender, EventArgs e) + private static Dictionary CheckBoxText = new Dictionary() { - Settings.Default.AutoSaveChanges = autoSaveCheckBox.Checked; - } + ["ShowRichPresence"] = "Show Rich Presence", + ["AutoSaveChanges"] = "Auto Save", + ["UseLittleEndianAsDefault"] = "Open as Little Endian", + ["AutoUpdate"] = "Auto Update", + ["LoadSubPcks"] = "Load Sub Pcks", + ["UsePrerelease"] = "Use Prerelease", + ["UseComboBoxForGRFParameter"] = "Easy Grf Param", + }; - private void endianCheckBox_CheckedChanged(object sender, EventArgs e) + private void CheckBox_CheckedChanged(object sender, EventArgs e) { - Settings.Default.UseLittleEndianAsDefault = endianCheckBox.Checked; - } - - private void autoLoadPckCheckBox_CheckedChanged(object sender, EventArgs e) - { - Settings.Default.LoadSubPcks = autoLoadPckCheckBox.Checked; - } - - private void showPresenceCheckBox_CheckedChanged(object sender, EventArgs e) - { - 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; - checkBox.Checked = state; - checkBox.CheckedChanged += eventHandler; + if (sender is CheckBox checkBox && checkBox.Tag is string settingsKey && _applicationSettings[settingsKey] is bool) + { + _applicationSettings[settingsKey] = checkBox.Checked; + } } private void LoadSettings() { - LoadCheckboxState(autoSaveCheckBox, autoSaveCheckBox_CheckedChanged, Settings.Default.AutoSaveChanges); - 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); + foreach (SettingsPropertyValue item in _applicationSettings.PropertyValues) + { + Debug.WriteLine($"{item.Property.Name}: {item.Property.PropertyType}"); + if (!item.Property.Attributes.ContainsKey(typeof(UserScopedSettingAttribute)) || item.Property.PropertyType != typeof(bool)) + continue; + var checkBox = new MetroCheckBox + { + Name = item.Name, + Tag = item.Name, + Text = CheckBoxText.ContainsKey(item.Name) ? CheckBoxText[item.Name] : item.Name, + Checked = (bool)item.PropertyValue, + + AutoSize = true, + Theme = MetroFramework.MetroThemeStyle.Dark, + Style = MetroFramework.MetroColorStyle.White, + }; + checkBox.CheckedChanged += CheckBox_CheckedChanged; + flowLayoutPanel.Controls.Add(checkBox); + } } private void AppBehaviorSettingsForm_FormClosing(object sender, FormClosingEventArgs e) { - Settings.Default.Save(); + _applicationSettings.Save(); } } } From ff9388977646f35e00357658b9c8498d0b4655e8 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Tue, 25 Jun 2024 20:23:32 +0200 Subject: [PATCH 2/6] Change In-App-Update system --- .github/workflows/release.yml | 2 +- .../API/GithubUpdateDownloader.cs | 8 +- PCK-Studio/MainForm.cs | 7 +- PCK-Studio/PckStudio.csproj | 7 +- PCK-Studio/Program.cs | 82 +++++++++++++------ PCK_Studio.sln | 20 ----- Version.json | 6 ++ 7 files changed, 70 insertions(+), 62 deletions(-) create mode 100644 Version.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ecfe0c7e..0b96632a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -45,7 +45,7 @@ jobs: run: "msbuild PCK_Studio.sln -p:Configuration=Release" - name: Package binary - run: Compress-Archive -Path ${{ github.workspace }}\PCK-Studio\bin\Release\ -Destination ${{ env.RELEASE_NAME }}.zip + run: Compress-Archive -Path "${{ github.workspace }}\PCK-Studio\bin\Release\*" -Destination ${{ env.RELEASE_NAME }}.zip - name: Release uses: softprops/action-gh-release@v2 diff --git a/PCK-Studio-Updater/API/GithubUpdateDownloader.cs b/PCK-Studio-Updater/API/GithubUpdateDownloader.cs index b89c3897..663da45e 100644 --- a/PCK-Studio-Updater/API/GithubUpdateDownloader.cs +++ b/PCK-Studio-Updater/API/GithubUpdateDownloader.cs @@ -47,7 +47,7 @@ namespace PCKStudio_Updater { Debug.WriteLine("Release Product ver.: " + latestReleaseVersion); Debug.WriteLine("Current Product ver.: " + productVersion); - return latestReleaseVersion.CompareTo(productVersion) > 0; + return latestReleaseVersion.CompareTo(productVersion) >= 0; } public bool IsUpdateAvailable(string productVersion) @@ -101,10 +101,9 @@ namespace PCKStudio_Updater 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") + if (Path.GetFileNameWithoutExtension(file.Name) != _updateParams.TargetExecutableName && file.Name != "update.zip") file.Delete(); } foreach (DirectoryInfo subDirectory in directory.GetDirectories()) @@ -118,7 +117,7 @@ namespace PCKStudio_Updater if (latestFetchedRelease.Assets?.Count > 0) { var asset = latestFetchedRelease.Assets[0]; - string zipFilePath = Path.Combine(directory.FullName, "update.zip"); + string zipFilePath = Path.Combine(directory.FullName, asset.Name); using(var zipFileStream = File.OpenWrite(zipFilePath)) { DownloadAsset(asset, zipFileStream); @@ -126,7 +125,6 @@ namespace PCKStudio_Updater Debug.WriteLine("Download Complete", category: nameof(GithubUpdateDownloader)); EmptyDirectory(directory); UnpackZip(zipFilePath); - File.Delete(zipFilePath); downloadDirectory = directory; } } diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index b376b921..75a68d6c 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -2480,12 +2480,7 @@ namespace PckStudio 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(this, "Already up to date.", "No update available"); + Program.UpdateToLatest(); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 3e9d2105..c82f17d4 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -679,6 +679,9 @@ 1.0.5 + + 1.9.1 + 5.8.0-alpha0098 compile; runtime; build; native; contentfiles; analyzers; buildtransitive @@ -716,10 +719,6 @@ - - {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 393faaf9..e26bddc9 100644 --- a/PCK-Studio/Program.cs +++ b/PCK-Studio/Program.cs @@ -6,8 +6,9 @@ using System.Windows.Forms; using PckStudio.Internal.Misc; using PckStudio.Internal; using PckStudio.Properties; -using PCKStudio_Updater; using PckStudio.Internal.App; +using AutoUpdaterDotNET; +using Newtonsoft.Json; namespace PckStudio @@ -15,22 +16,13 @@ namespace PckStudio static class Program { internal static readonly Uri ProjectUrl = new Uri("https://github.com/PhoenixARC/-PCK-Studio"); + internal static readonly Uri RawProjectUrl = new Uri("https://raw.githubusercontent.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/"; 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; } /// @@ -39,9 +31,23 @@ namespace PckStudio [STAThread] static void Main(string[] args) { + AutoUpdater.SetOwner(MainInstance); + //AutoUpdater.ClearAppDirectory = true; +#if DEBUG + AutoUpdater.ReportErrors = true; +#endif + AutoUpdater.DownloadPath = Application.StartupPath; + AutoUpdater.ExecutablePath = "./PCK-Studio.exe"; + AutoUpdater.TopMost = true; + + string jsonPath = Path.Combine(Environment.CurrentDirectory, "updates.json"); + AutoUpdater.PersistenceProvider = new JsonFilePersistenceProvider(jsonPath); + AutoUpdater.ParseUpdateInfoEvent += AutoUpdaterOnParseUpdateInfoEvent; + AutoUpdater.Icon = Resources.ProjectLogo.ToBitmap(); + if (Settings.Default.AutoUpdate) { - UpdateToLatest("Click Ok to continue.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, DialogResult.OK); + UpdateToLatest(); } ApplicationScope.Initialize(); @@ -51,24 +57,48 @@ namespace PckStudio if (args.Length > 0 && File.Exists(args[0]) && args[0].EndsWith(".pck")) MainInstance.InitPckFromFile(args[0]); Application.ApplicationExit += (sender, e) => { RPC.Deinitialize(); }; + MainInstance.FocusMe(); Application.Run(MainInstance); } - [Conditional("NDEBUG")] - internal static void UpdateToLatest(string message, MessageBoxButtons buttons, MessageBoxIcon icon, DialogResult dialogResult) + + internal static void UpdateToLatest() { - bool updateAvailable = Updater.IsUpdateAvailable(Application.ProductVersion); - if (updateAvailable && MessageBox.Show( - MainInstance ?? null, - "New update available.\n" + - message, - "Update Available", - buttons, icon, MessageBoxDefaultButton.Button1) == dialogResult) - { - Updater.DownloadTo(new DirectoryInfo(Application.StartupPath)); - Updater.Launch(); - Application.Exit(); - } +#if NDEBUG + string url = $"{RawProjectUrl}/main/Version.json"; + AutoUpdater.Start(url); +#endif } + + class UpdateInfo + { + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("url")] + public string Url { get; set; } + + [JsonProperty("changelog")] + public string Changelog { get; set; } + + [JsonProperty("mandatory")] + public bool Mandatory { get; set; } + } + + private static void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args) + { + UpdateInfo json = JsonConvert.DeserializeObject(args.RemoteData); + args.UpdateInfo = new UpdateInfoEventArgs + { + CurrentVersion = json.Version, + DownloadURL = json.Url, + ChangelogURL = json.Changelog, + Mandatory = new Mandatory() + { + Value = json.Mandatory, + } + }; + } + } } \ No newline at end of file diff --git a/PCK_Studio.sln b/PCK_Studio.sln index 772bd2c5..8062268c 100644 --- a/PCK_Studio.sln +++ b/PCK_Studio.sln @@ -11,8 +11,6 @@ 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 @@ -80,24 +78,6 @@ 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 diff --git a/Version.json b/Version.json new file mode 100644 index 00000000..a2f213fc --- /dev/null +++ b/Version.json @@ -0,0 +1,6 @@ +{ + "version": "7.0.0.0", + "url": "https://github.com/PhoenixARC/-PCK-Studio/releases/download/v7.0.0.0/PCK-Studio.zip", + "changelog": "https://raw.githubusercontent.com/PhoenixARC/-PCK-Studio/main/CHANGELOG.md", + "mandatory": false +} \ No newline at end of file From d5c7fe9af5fce613642385c0854977ffb887141b Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Thu, 27 Jun 2024 19:30:45 +0200 Subject: [PATCH 3/6] TreeViewExtensions - Fix ArgumentOutOfRangeException when adding or replacing files(#38) --- PCK-Studio/Extensions/TreeViewExtensions.cs | 6 ++++++ PCK-Studio/Properties/AssemblyInfo.cs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/PCK-Studio/Extensions/TreeViewExtensions.cs b/PCK-Studio/Extensions/TreeViewExtensions.cs index 61583041..7ba0e35b 100644 --- a/PCK-Studio/Extensions/TreeViewExtensions.cs +++ b/PCK-Studio/Extensions/TreeViewExtensions.cs @@ -14,6 +14,12 @@ namespace PckStudio.Extensions { if (string.IsNullOrWhiteSpace(path)) return Array.Empty(); + + if (!path.Contains(treeView.PathSeparator)) + { + return treeView.Nodes.Find(path, false); + } + string segment = path.Substring(0, path.IndexOf(treeView.PathSeparator)); if (treeView.Nodes.ContainsKey(segment)) { diff --git a/PCK-Studio/Properties/AssemblyInfo.cs b/PCK-Studio/Properties/AssemblyInfo.cs index acd3487d..967d6ade 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.0.0")] +[assembly: AssemblyVersion("7.0.0.1")] [assembly: AssemblyFileVersion("7.0.0.0")] [assembly: NeutralResourcesLanguage("")] From 6007897bd1ae650580ab21f10424ef53142fb26d Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Thu, 27 Jun 2024 19:36:37 +0200 Subject: [PATCH 4/6] Update version information --- Version.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Version.json b/Version.json index a2f213fc..e4be63b7 100644 --- a/Version.json +++ b/Version.json @@ -1,6 +1,6 @@ { - "version": "7.0.0.0", - "url": "https://github.com/PhoenixARC/-PCK-Studio/releases/download/v7.0.0.0/PCK-Studio.zip", + "version": "7.0.0.1", + "url": "https://github.com/PhoenixARC/-PCK-Studio/releases/download/v7.0.0.1/PCK-Studio.zip", "changelog": "https://raw.githubusercontent.com/PhoenixARC/-PCK-Studio/main/CHANGELOG.md", "mandatory": false } \ No newline at end of file From 974b4cab96f407a007183644a3bb30853cde3608 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Thu, 27 Jun 2024 19:47:03 +0200 Subject: [PATCH 5/6] Fix displayed Version --- .gitignore | 3 +++ PCK-Studio/Forms/ContributorsForm.cs | 2 +- PCK-Studio/Internal/App/ApplicationScope.cs | 2 ++ PCK-Studio/MainForm.cs | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 15baf62c..8e15384e 100644 --- a/.gitignore +++ b/.gitignore @@ -250,3 +250,6 @@ paket-files/ # JetBrains Rider .idea/ *.sln.iml + +# Deploy util +makeUpdate.py diff --git a/PCK-Studio/Forms/ContributorsForm.cs b/PCK-Studio/Forms/ContributorsForm.cs index 51906542..cd2a528e 100644 --- a/PCK-Studio/Forms/ContributorsForm.cs +++ b/PCK-Studio/Forms/ContributorsForm.cs @@ -27,7 +27,7 @@ namespace PckStudio.Forms #else buildConfig = "unknown"; #endif - buildLabel.Text = $"Verion: {Application.ProductVersion}\nBuild Config: {buildConfig}\nBranch: {CommitInfo.BranchName}@{CommitInfo.CommitHash}"; + buildLabel.Text = $"Verion: {ApplicationScope.CurrentVersion}\nBuild Config: {buildConfig}\nBranch: {CommitInfo.BranchName}@{CommitInfo.CommitHash}"; } protected override void OnLoad(EventArgs e) diff --git a/PCK-Studio/Internal/App/ApplicationScope.cs b/PCK-Studio/Internal/App/ApplicationScope.cs index d489938b..a9578fce 100644 --- a/PCK-Studio/Internal/App/ApplicationScope.cs +++ b/PCK-Studio/Internal/App/ApplicationScope.cs @@ -21,6 +21,8 @@ namespace PckStudio.Internal.App private static Image[] _entityImages; public static Image[] EntityImages => _entityImages; + public static Version CurrentVersion { get; } = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + internal static void Initialize() { Profiler.Start(); diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 75a68d6c..c420de93 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -91,7 +91,7 @@ namespace PckStudio Text = Application.ProductName; - labelVersion.Text = $"{Application.ProductName}: {Application.ProductVersion}"; + labelVersion.Text = $"{Application.ProductName}: {ApplicationScope.CurrentVersion}"; ChangelogRichTextBox.Text = Resources.CHANGELOG; pckFileTypeHandler = new Dictionary>(15) From 3840b2940e92257bf5c143f3b11db0fa6a3bb7b9 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Thu, 27 Jun 2024 19:53:33 +0200 Subject: [PATCH 6/6] Remove PCK-Studio-Updater Project --- PCK-Studio-Updater/API/GithubParams.cs | 22 --- .../API/GithubUpdateDownloader.cs | 146 ------------------ 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 150065 -> 0 bytes PCK-Studio-Updater/Properties/AssemblyInfo.cs | 36 ----- PCK-Studio-Updater/Properties/app.manifest | 70 --------- 8 files changed, 456 deletions(-) delete mode 100644 PCK-Studio-Updater/API/GithubParams.cs delete mode 100644 PCK-Studio-Updater/API/GithubUpdateDownloader.cs delete mode 100644 PCK-Studio-Updater/API/IUpdateDownloader.cs delete mode 100644 PCK-Studio-Updater/PCK-Studio-Updater.csproj delete mode 100644 PCK-Studio-Updater/Program.cs delete mode 100644 PCK-Studio-Updater/ProjectLogo.ico delete mode 100644 PCK-Studio-Updater/Properties/AssemblyInfo.cs delete mode 100644 PCK-Studio-Updater/Properties/app.manifest diff --git a/PCK-Studio-Updater/API/GithubParams.cs b/PCK-Studio-Updater/API/GithubParams.cs deleted file mode 100644 index 77aed764..00000000 --- a/PCK-Studio-Updater/API/GithubParams.cs +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index 663da45e..00000000 --- a/PCK-Studio-Updater/API/GithubUpdateDownloader.cs +++ /dev/null @@ -1,146 +0,0 @@ -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) - { - foreach (FileInfo file in directory.GetFiles()) - { - if (Path.GetFileNameWithoutExtension(file.Name) != _updateParams.TargetExecutableName && 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, asset.Name); - using(var zipFileStream = File.OpenWrite(zipFilePath)) - { - DownloadAsset(asset, zipFileStream); - } - Debug.WriteLine("Download Complete", category: nameof(GithubUpdateDownloader)); - EmptyDirectory(directory); - UnpackZip(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 deleted file mode 100644 index ef422762..00000000 --- a/PCK-Studio-Updater/API/IUpdateDownloader.cs +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index a47ab997..00000000 --- a/PCK-Studio-Updater/PCK-Studio-Updater.csproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - - 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 deleted file mode 100644 index d150ad4c..00000000 --- a/PCK-Studio-Updater/Program.cs +++ /dev/null @@ -1,58 +0,0 @@ -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 deleted file mode 100644 index 85357f6f1261aa55ad080aae1030554de307b768..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150065 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 diff --git a/PCK-Studio-Updater/Properties/AssemblyInfo.cs b/PCK-Studio-Updater/Properties/AssemblyInfo.cs deleted file mode 100644 index 8e714011..00000000 --- a/PCK-Studio-Updater/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index c02c2d89..00000000 --- a/PCK-Studio-Updater/Properties/app.manifest +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file