diff --git a/CarManagerV3/App.config b/CarManagerV3/App.config index 25f046c..4a09ba7 100644 --- a/CarManagerV3/App.config +++ b/CarManagerV3/App.config @@ -13,6 +13,9 @@ + + False + \ No newline at end of file diff --git a/CarManagerV3/CarManagerV3.csproj b/CarManagerV3/CarManagerV3.csproj index 56d59a4..bb0eb27 100644 --- a/CarManagerV3/CarManagerV3.csproj +++ b/CarManagerV3/CarManagerV3.csproj @@ -15,19 +15,18 @@ false true 0 - 1.0.0.%2a + 1.3.0 false false true - false + true true CarMgm_Icon.ico Car Manager 3 - 1.3 - 1.3.0 - 1.3.0 Car Manager 3 + 1.3.0 + @@ -39,6 +38,7 @@ Settings.settings + diff --git a/CarManagerV3/Forms/CarDetailsForm.Designer.cs b/CarManagerV3/Forms/CarDetailsForm.Designer.cs index 424e58a..3b3bdf1 100644 --- a/CarManagerV3/Forms/CarDetailsForm.Designer.cs +++ b/CarManagerV3/Forms/CarDetailsForm.Designer.cs @@ -64,7 +64,7 @@ tableLayoutPanel1.AutoSize = true; tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; tableLayoutPanel1.ColumnCount = 2; - tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 70F)); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80F)); tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); tableLayoutPanel1.Controls.Add(pbxCarImage, 0, 0); tableLayoutPanel1.Controls.Add(label1, 0, 1); @@ -82,18 +82,18 @@ tableLayoutPanel1.Controls.Add(tableLayoutPanel2, 1, 3); tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); - tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 3, 26, 3); + tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 4, 30, 4); tableLayoutPanel1.Name = "tableLayoutPanel1"; tableLayoutPanel1.RowCount = 8; - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 188F)); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); - tableLayoutPanel1.Size = new System.Drawing.Size(469, 422); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 251F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 51F)); + tableLayoutPanel1.Size = new System.Drawing.Size(536, 563); tableLayoutPanel1.TabIndex = 0; // // pbxCarImage @@ -101,9 +101,10 @@ tableLayoutPanel1.SetColumnSpan(pbxCarImage, 2); pbxCarImage.Dock = System.Windows.Forms.DockStyle.Fill; pbxCarImage.Image = (System.Drawing.Image)resources.GetObject("pbxCarImage.Image"); - pbxCarImage.Location = new System.Drawing.Point(3, 3); + pbxCarImage.Location = new System.Drawing.Point(3, 4); + pbxCarImage.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); pbxCarImage.Name = "pbxCarImage"; - pbxCarImage.Size = new System.Drawing.Size(463, 182); + pbxCarImage.Size = new System.Drawing.Size(530, 243); pbxCarImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; pbxCarImage.TabIndex = 0; pbxCarImage.TabStop = false; @@ -112,9 +113,9 @@ // label1.AutoSize = true; label1.Dock = System.Windows.Forms.DockStyle.Fill; - label1.Location = new System.Drawing.Point(3, 188); + label1.Location = new System.Drawing.Point(3, 251); label1.Name = "label1"; - label1.Size = new System.Drawing.Size(64, 28); + label1.Size = new System.Drawing.Size(74, 37); label1.TabIndex = 1; label1.Text = "Make:"; label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -122,9 +123,10 @@ // tbxMake // tbxMake.Dock = System.Windows.Forms.DockStyle.Fill; - tbxMake.Location = new System.Drawing.Point(73, 191); + tbxMake.Location = new System.Drawing.Point(83, 255); + tbxMake.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); tbxMake.Name = "tbxMake"; - tbxMake.Size = new System.Drawing.Size(393, 23); + tbxMake.Size = new System.Drawing.Size(450, 27); tbxMake.TabIndex = 1; tbxMake.TextChanged += tbxMake_TextChanged; tbxMake.Leave += tbxMake_Leave; @@ -133,9 +135,9 @@ // label2.AutoSize = true; label2.Dock = System.Windows.Forms.DockStyle.Fill; - label2.Location = new System.Drawing.Point(3, 216); + label2.Location = new System.Drawing.Point(3, 288); label2.Name = "label2"; - label2.Size = new System.Drawing.Size(64, 28); + label2.Size = new System.Drawing.Size(74, 37); label2.TabIndex = 3; label2.Text = "Model:"; label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -143,9 +145,10 @@ // tbxModel // tbxModel.Dock = System.Windows.Forms.DockStyle.Fill; - tbxModel.Location = new System.Drawing.Point(73, 219); + tbxModel.Location = new System.Drawing.Point(83, 292); + tbxModel.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); tbxModel.Name = "tbxModel"; - tbxModel.Size = new System.Drawing.Size(393, 23); + tbxModel.Size = new System.Drawing.Size(450, 27); tbxModel.TabIndex = 2; tbxModel.TextChanged += tbxModel_TextChanged; tbxModel.Leave += tbxModel_Leave; @@ -154,9 +157,9 @@ // label3.AutoSize = true; label3.Dock = System.Windows.Forms.DockStyle.Fill; - label3.Location = new System.Drawing.Point(3, 244); + label3.Location = new System.Drawing.Point(3, 325); label3.Name = "label3"; - label3.Size = new System.Drawing.Size(64, 28); + label3.Size = new System.Drawing.Size(74, 37); label3.TabIndex = 5; label3.Text = "Year:"; label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -165,9 +168,9 @@ // label4.AutoSize = true; label4.Dock = System.Windows.Forms.DockStyle.Fill; - label4.Location = new System.Drawing.Point(3, 272); + label4.Location = new System.Drawing.Point(3, 362); label4.Name = "label4"; - label4.Size = new System.Drawing.Size(64, 28); + label4.Size = new System.Drawing.Size(74, 37); label4.TabIndex = 6; label4.Text = "Color:"; label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -176,9 +179,9 @@ // label5.AutoSize = true; label5.Dock = System.Windows.Forms.DockStyle.Fill; - label5.Location = new System.Drawing.Point(3, 300); + label5.Location = new System.Drawing.Point(3, 399); label5.Name = "label5"; - label5.Size = new System.Drawing.Size(64, 28); + label5.Size = new System.Drawing.Size(74, 37); label5.TabIndex = 7; label5.Text = "Mileage:"; label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -187,9 +190,9 @@ // label6.AutoSize = true; label6.Dock = System.Windows.Forms.DockStyle.Fill; - label6.Location = new System.Drawing.Point(3, 328); + label6.Location = new System.Drawing.Point(3, 436); label6.Name = "label6"; - label6.Size = new System.Drawing.Size(64, 28); + label6.Size = new System.Drawing.Size(74, 37); label6.TabIndex = 8; label6.Text = "Price:"; label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -202,17 +205,19 @@ flowLayoutPanel1.Controls.Add(lblID); flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; - flowLayoutPanel1.Location = new System.Drawing.Point(3, 359); + flowLayoutPanel1.Location = new System.Drawing.Point(3, 477); + flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); flowLayoutPanel1.Name = "flowLayoutPanel1"; - flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(4); - flowLayoutPanel1.Size = new System.Drawing.Size(463, 60); + flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(5); + flowLayoutPanel1.Size = new System.Drawing.Size(530, 82); flowLayoutPanel1.TabIndex = 9; // // btnSave // - btnSave.Location = new System.Drawing.Point(386, 7); + btnSave.Location = new System.Drawing.Point(442, 9); + btnSave.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); btnSave.Name = "btnSave"; - btnSave.Size = new System.Drawing.Size(66, 22); + btnSave.Size = new System.Drawing.Size(75, 29); btnSave.TabIndex = 7; btnSave.Text = "Save"; btnSave.UseVisualStyleBackColor = true; @@ -220,9 +225,10 @@ // // btnDelete // - btnDelete.Location = new System.Drawing.Point(314, 7); + btnDelete.Location = new System.Drawing.Point(361, 9); + btnDelete.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); btnDelete.Name = "btnDelete"; - btnDelete.Size = new System.Drawing.Size(66, 22); + btnDelete.Size = new System.Drawing.Size(75, 29); btnDelete.TabIndex = 8; btnDelete.Text = "Delete"; btnDelete.UseVisualStyleBackColor = true; @@ -231,28 +237,30 @@ // lblID // lblID.AutoSize = true; - lblID.Location = new System.Drawing.Point(290, 4); + lblID.Location = new System.Drawing.Point(331, 5); lblID.Name = "lblID"; - lblID.Size = new System.Drawing.Size(18, 15); + lblID.Size = new System.Drawing.Size(24, 20); lblID.TabIndex = 2; lblID.Text = "ID"; // // tbxColor // tbxColor.Dock = System.Windows.Forms.DockStyle.Fill; - tbxColor.Location = new System.Drawing.Point(73, 275); + tbxColor.Location = new System.Drawing.Point(83, 366); + tbxColor.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); tbxColor.Name = "tbxColor"; - tbxColor.Size = new System.Drawing.Size(393, 23); + tbxColor.Size = new System.Drawing.Size(450, 27); tbxColor.TabIndex = 4; tbxColor.TextChanged += tbxColor_TextChanged; tbxColor.Leave += tbxColor_Leave; // // nudMileage // - nudMileage.Location = new System.Drawing.Point(73, 303); + nudMileage.Location = new System.Drawing.Point(83, 403); + nudMileage.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); nudMileage.Maximum = new decimal(new int[] { 999999, 0, 0, 0 }); nudMileage.Name = "nudMileage"; - nudMileage.Size = new System.Drawing.Size(105, 23); + nudMileage.Size = new System.Drawing.Size(120, 27); nudMileage.TabIndex = 5; nudMileage.ThousandsSeparator = true; nudMileage.ValueChanged += nudMileage_ValueChanged; @@ -260,10 +268,11 @@ // nudPrice // nudPrice.DecimalPlaces = 2; - nudPrice.Location = new System.Drawing.Point(73, 331); + nudPrice.Location = new System.Drawing.Point(83, 440); + nudPrice.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); nudPrice.Maximum = new decimal(new int[] { 999999, 0, 0, 0 }); nudPrice.Name = "nudPrice"; - nudPrice.Size = new System.Drawing.Size(105, 23); + nudPrice.Size = new System.Drawing.Size(120, 27); nudPrice.TabIndex = 6; nudPrice.ThousandsSeparator = true; nudPrice.ValueChanged += nudPrice_ValueChanged; @@ -278,19 +287,21 @@ tableLayoutPanel2.Controls.Add(lblAge, 1, 0); tableLayoutPanel2.Controls.Add(tbxAge, 2, 0); tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; - tableLayoutPanel2.Location = new System.Drawing.Point(73, 247); + tableLayoutPanel2.Location = new System.Drawing.Point(83, 329); + tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); tableLayoutPanel2.Name = "tableLayoutPanel2"; tableLayoutPanel2.RowCount = 1; tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - tableLayoutPanel2.Size = new System.Drawing.Size(393, 22); + tableLayoutPanel2.Size = new System.Drawing.Size(450, 29); tableLayoutPanel2.TabIndex = 10; // // nudYear // - nudYear.Location = new System.Drawing.Point(3, 3); + nudYear.Location = new System.Drawing.Point(3, 4); + nudYear.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); nudYear.Maximum = new decimal(new int[] { 3000, 0, 0, 0 }); nudYear.Name = "nudYear"; - nudYear.Size = new System.Drawing.Size(105, 23); + nudYear.Size = new System.Drawing.Size(120, 27); nudYear.TabIndex = 3; nudYear.ValueChanged += nudYear_ValueChanged; // @@ -298,10 +309,10 @@ // lblAge.AutoSize = true; lblAge.Dock = System.Windows.Forms.DockStyle.Fill; - lblAge.Location = new System.Drawing.Point(134, 0); + lblAge.Location = new System.Drawing.Point(153, 0); lblAge.Name = "lblAge"; lblAge.RightToLeft = System.Windows.Forms.RightToLeft.No; - lblAge.Size = new System.Drawing.Size(125, 22); + lblAge.Size = new System.Drawing.Size(144, 29); lblAge.TabIndex = 4; lblAge.Text = "Age"; lblAge.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -310,19 +321,21 @@ // tbxAge.Dock = System.Windows.Forms.DockStyle.Fill; tbxAge.Enabled = false; - tbxAge.Location = new System.Drawing.Point(265, 3); + tbxAge.Location = new System.Drawing.Point(303, 4); + tbxAge.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); tbxAge.Name = "tbxAge"; tbxAge.ReadOnly = true; - tbxAge.Size = new System.Drawing.Size(125, 23); + tbxAge.Size = new System.Drawing.Size(144, 27); tbxAge.TabIndex = 5; // // CarDetailsForm // - AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - ClientSize = new System.Drawing.Size(469, 422); + ClientSize = new System.Drawing.Size(536, 563); Controls.Add(tableLayoutPanel1); FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); MaximizeBox = false; Name = "CarDetailsForm"; Text = "Details"; diff --git a/CarManagerV3/Forms/MainForm.cs b/CarManagerV3/Forms/MainForm.cs index 466be3c..8479a2f 100644 --- a/CarManagerV3/Forms/MainForm.cs +++ b/CarManagerV3/Forms/MainForm.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using CarManagerV3.Forms; +using CarManagerV3.Manager; namespace CarManagerV3 { @@ -61,6 +62,13 @@ namespace CarManagerV3 refreshRecents(); + if (Updater.IsUpdateAvailable(Properties.Settings.Default.AllowPrerelease)) + { + UpdatePromptForm updatePrompt = new UpdatePromptForm(Updater.GetCurrentVersion(), Updater.GetLatestVersion()); + updatePrompt.ShowDialog(); + } + + } public void openWelcomeScreen() diff --git a/CarManagerV3/Forms/SettingsForm.Designer.cs b/CarManagerV3/Forms/SettingsForm.Designer.cs index dcae6ca..2e76ba3 100644 --- a/CarManagerV3/Forms/SettingsForm.Designer.cs +++ b/CarManagerV3/Forms/SettingsForm.Designer.cs @@ -40,6 +40,7 @@ tbxDataLocation = new System.Windows.Forms.TextBox(); tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); btnReset = new System.Windows.Forms.Button(); + cbxPreRelease = new System.Windows.Forms.CheckBox(); flowLayoutPanel1.SuspendLayout(); flowLayoutPanel2.SuspendLayout(); tableLayoutPanel1.SuspendLayout(); @@ -119,13 +120,15 @@ tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); tableLayoutPanel1.Controls.Add(lblDataLocation, 0, 0); tableLayoutPanel1.Controls.Add(tbxDataLocation, 1, 0); + tableLayoutPanel1.Controls.Add(cbxPreRelease, 1, 1); tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; tableLayoutPanel1.Location = new System.Drawing.Point(0, 86); tableLayoutPanel1.Name = "tableLayoutPanel1"; tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(10, 0, 10, 0); - tableLayoutPanel1.RowCount = 2; + tableLayoutPanel1.RowCount = 3; + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); tableLayoutPanel1.Size = new System.Drawing.Size(499, 531); tableLayoutPanel1.TabIndex = 3; // @@ -175,6 +178,18 @@ btnReset.UseVisualStyleBackColor = true; btnReset.Click += btnReset_Click; // + // cbxPreRelease + // + cbxPreRelease.AutoSize = true; + tableLayoutPanel1.SetColumnSpan(cbxPreRelease, 2); + cbxPreRelease.Location = new System.Drawing.Point(13, 36); + cbxPreRelease.Name = "cbxPreRelease"; + cbxPreRelease.RightToLeft = System.Windows.Forms.RightToLeft.Yes; + cbxPreRelease.Size = new System.Drawing.Size(164, 24); + cbxPreRelease.TabIndex = 3; + cbxPreRelease.Text = "Pre-Release channel"; + cbxPreRelease.UseVisualStyleBackColor = true; + // // SettingsForm // AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); @@ -214,5 +229,6 @@ private System.Windows.Forms.TextBox tbxDataLocation; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; private System.Windows.Forms.Button btnReset; + private System.Windows.Forms.CheckBox cbxPreRelease; } } \ No newline at end of file diff --git a/CarManagerV3/Forms/SettingsForm.cs b/CarManagerV3/Forms/SettingsForm.cs index 6ada62f..dc5bdcc 100644 --- a/CarManagerV3/Forms/SettingsForm.cs +++ b/CarManagerV3/Forms/SettingsForm.cs @@ -13,7 +13,7 @@ namespace CarManagerV3.Forms public partial class SettingsForm : Form { // Settings map (Maps settings to controls and default values + optional change event handler function that takes previous and new value) - private Dictionary onChange)> settingsMap = new Dictionary onChange)>(); + private readonly Dictionary settingsMap = new(); public SettingsForm() { @@ -24,11 +24,23 @@ namespace CarManagerV3.Forms private void initializeSettingsMap() { // Initialize the settings map with setting keys, associated controls, default values, and optional change event handlers - settingsMap["DataLocation"] = (tbxDataLocation, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\CarManagerV3", (string before, string after) => - { - // TODO - } - ); + settingsMap["DataLocation"] = + new SettingBinding( + control: tbxDataLocation, + defaultValue: Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\CarManagerV3", + read: () => Properties.Settings.Default.DataLocation, // strongly typed + write: v => Properties.Settings.Default.DataLocation = v, // strongly typed + onChange: (before, after) => + { + // TODO: handle path change if needed + }); + + settingsMap["AllowPrerelease"] = + new SettingBinding( + control: cbxPreRelease, + defaultValue: false, + read: () => Properties.Settings.Default.AllowPrerelease, + write: v => Properties.Settings.Default.AllowPrerelease = v); } @@ -39,51 +51,32 @@ namespace CarManagerV3.Forms private void loadSettings() { - // with settings map - foreach (var setting in settingsMap) - { - string key = setting.Key; - Control control = setting.Value.control; - string value = Properties.Settings.Default[key]?.ToString() ?? string.Empty; - control.Text = value; - } + foreach (var kvp in settingsMap) + kvp.Value.Load(); } private void saveSettings() { - // Save settings using the settings map - foreach (var setting in settingsMap) - { - string key = setting.Key; - Control control = setting.Value.control; - string value = control.Text; - string oldValue = Properties.Settings.Default[key]?.ToString() ?? string.Empty; - // Save the value to application settings - Properties.Settings.Default[key] = value; - // Invoke the change event handler if it exists and the value has changed - if (setting.Value.onChange != null && oldValue != value) - { - setting.Value.onChange(oldValue, value); - } - } + foreach (var kvp in settingsMap) + kvp.Value.Save(); + Properties.Settings.Default.Save(); } private void resetSettings() { - DialogResult confirmReset = MessageBox.Show("Are you sure you want to reset all settings to their default values? This action cannot be undone.", "Confirm Reset", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if(confirmReset != DialogResult.Yes) - { + DialogResult confirmReset = MessageBox.Show( + "Are you sure you want to reset all settings to their default values? This action cannot be undone.", + "Confirm Reset", + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + + if (confirmReset != DialogResult.Yes) return; - } - // Reset settings to default values using the settings map - foreach (var setting in settingsMap) - { - string key = setting.Key; - string defaultValue = setting.Value.defaultValue; - // Reset the value to default in application settings - Properties.Settings.Default[key] = defaultValue; - } + + foreach (var kvp in settingsMap) + kvp.Value.Reset(); + Properties.Settings.Default.Save(); loadSettings(); } @@ -104,4 +97,77 @@ namespace CarManagerV3.Forms resetSettings(); } } + + internal interface ISettingBinding + { + void Load(); + void Save(); + void Reset(); + } + + internal sealed class SettingBinding : ISettingBinding + { + private readonly Control control; + private readonly T defaultValue; + private readonly Func read; + private readonly Action write; + private readonly Action? onChange; + + public SettingBinding(Control control, T defaultValue, Func read, Action write, Action? onChange = null) + { + this.control = control; + this.defaultValue = defaultValue; + this.read = read; + this.write = write; + this.onChange = onChange; + } + + public void Load() + { + T value = read(); + ApplyToControl(value); + } + + public void Save() + { + T before = read(); + T after = ReadFromControl(); + + write(after); + + if (onChange != null && !EqualityComparer.Default.Equals(before, after)) + onChange(before, after); + } + + public void Reset() => write(defaultValue); + + private void ApplyToControl(T value) + { + switch (control) + { + case TextBox tb: + tb.Text = value?.ToString() ?? string.Empty; + break; + + case CheckBox cb: + cb.Checked = value is bool b ? b : Convert.ToBoolean(value); + break; + + default: + throw new NotSupportedException($"Control type '{control.GetType().Name}' not supported for {typeof(T).Name}."); + } + } + + private T ReadFromControl() + { + object result = control switch + { + TextBox tb when typeof(T) == typeof(string) => tb.Text, + CheckBox cb when typeof(T) == typeof(bool) => cb.Checked, + _ => throw new NotSupportedException($"Cannot read {typeof(T).Name} from control type '{control.GetType().Name}'.") + }; + + return (T)result; + } + } } diff --git a/CarManagerV3/Forms/UpdatePromptForm.Designer.cs b/CarManagerV3/Forms/UpdatePromptForm.Designer.cs new file mode 100644 index 0000000..3c44380 --- /dev/null +++ b/CarManagerV3/Forms/UpdatePromptForm.Designer.cs @@ -0,0 +1,190 @@ +namespace CarManagerV3.Forms +{ + partial class UpdatePromptForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + lblUpdateTitleStatic = new System.Windows.Forms.Label(); + label2 = new System.Windows.Forms.Label(); + lblInstalledVersion = new System.Windows.Forms.Label(); + lblLatestVersion = new System.Windows.Forms.Label(); + tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel(); + btnInstallUpdate = new System.Windows.Forms.Button(); + btnDismissUpdate = new System.Windows.Forms.Button(); + btnReadChangelog = new System.Windows.Forms.Button(); + flowLayoutPanel1.SuspendLayout(); + tableLayoutPanel1.SuspendLayout(); + flowLayoutPanel2.SuspendLayout(); + SuspendLayout(); + // + // flowLayoutPanel1 + // + flowLayoutPanel1.Controls.Add(lblUpdateTitleStatic); + flowLayoutPanel1.Controls.Add(label2); + flowLayoutPanel1.Controls.Add(lblInstalledVersion); + flowLayoutPanel1.Controls.Add(lblLatestVersion); + flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top; + flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + flowLayoutPanel1.Location = new System.Drawing.Point(10, 20); + flowLayoutPanel1.Name = "flowLayoutPanel1"; + flowLayoutPanel1.Size = new System.Drawing.Size(846, 125); + flowLayoutPanel1.TabIndex = 0; + // + // lblUpdateTitleStatic + // + lblUpdateTitleStatic.AutoSize = true; + lblUpdateTitleStatic.Font = new System.Drawing.Font("Segoe UI", 14F); + lblUpdateTitleStatic.Location = new System.Drawing.Point(3, 0); + lblUpdateTitleStatic.Name = "lblUpdateTitleStatic"; + lblUpdateTitleStatic.Size = new System.Drawing.Size(298, 32); + lblUpdateTitleStatic.TabIndex = 4; + lblUpdateTitleStatic.Text = "A new Version is Available!"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(3, 32); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(600, 20); + label2.TabIndex = 5; + label2.Text = "A new version of Car Manager 3 has been released. Update now to get the latest features."; + // + // lblInstalledVersion + // + lblInstalledVersion.AutoSize = true; + lblInstalledVersion.Location = new System.Drawing.Point(3, 57); + lblInstalledVersion.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0); + lblInstalledVersion.Name = "lblInstalledVersion"; + lblInstalledVersion.Size = new System.Drawing.Size(123, 20); + lblInstalledVersion.TabIndex = 6; + lblInstalledVersion.Text = "Your version: ?.?.?"; + // + // lblLatestVersion + // + lblLatestVersion.AutoSize = true; + lblLatestVersion.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + lblLatestVersion.Location = new System.Drawing.Point(3, 77); + lblLatestVersion.Name = "lblLatestVersion"; + lblLatestVersion.Size = new System.Drawing.Size(144, 20); + lblLatestVersion.TabIndex = 7; + lblLatestVersion.Text = "Latest version: ?.?.?"; + // + // tableLayoutPanel1 + // + tableLayoutPanel1.ColumnCount = 2; + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + tableLayoutPanel1.Controls.Add(flowLayoutPanel2, 1, 0); + tableLayoutPanel1.Controls.Add(btnReadChangelog, 0, 0); + tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom; + tableLayoutPanel1.Location = new System.Drawing.Point(10, 393); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 1; + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + tableLayoutPanel1.Size = new System.Drawing.Size(846, 47); + tableLayoutPanel1.TabIndex = 1; + // + // flowLayoutPanel2 + // + flowLayoutPanel2.Controls.Add(btnInstallUpdate); + flowLayoutPanel2.Controls.Add(btnDismissUpdate); + flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + flowLayoutPanel2.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; + flowLayoutPanel2.Location = new System.Drawing.Point(423, 0); + flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(0); + flowLayoutPanel2.Name = "flowLayoutPanel2"; + flowLayoutPanel2.Size = new System.Drawing.Size(423, 47); + flowLayoutPanel2.TabIndex = 0; + // + // btnInstallUpdate + // + btnInstallUpdate.AutoSize = true; + btnInstallUpdate.Location = new System.Drawing.Point(320, 3); + btnInstallUpdate.Name = "btnInstallUpdate"; + btnInstallUpdate.Size = new System.Drawing.Size(100, 30); + btnInstallUpdate.TabIndex = 0; + btnInstallUpdate.Text = "Update now"; + btnInstallUpdate.UseVisualStyleBackColor = true; + btnInstallUpdate.Click += btnInstallUpdate_Click; + // + // btnDismissUpdate + // + btnDismissUpdate.Location = new System.Drawing.Point(220, 3); + btnDismissUpdate.Name = "btnDismissUpdate"; + btnDismissUpdate.Size = new System.Drawing.Size(94, 29); + btnDismissUpdate.TabIndex = 1; + btnDismissUpdate.Text = "Dismiss"; + btnDismissUpdate.UseVisualStyleBackColor = true; + btnDismissUpdate.Click += btnDismissUpdate_Click; + // + // btnReadChangelog + // + btnReadChangelog.Location = new System.Drawing.Point(3, 3); + btnReadChangelog.Name = "btnReadChangelog"; + btnReadChangelog.Size = new System.Drawing.Size(94, 29); + btnReadChangelog.TabIndex = 1; + btnReadChangelog.Text = "Changelog"; + btnReadChangelog.UseVisualStyleBackColor = true; + // + // UpdatePromptForm + // + AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(866, 450); + Controls.Add(tableLayoutPanel1); + Controls.Add(flowLayoutPanel1); + FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + MaximizeBox = false; + MinimizeBox = false; + Name = "UpdatePromptForm"; + Padding = new System.Windows.Forms.Padding(10, 20, 10, 10); + Text = "Update Car Manager 3"; + TopMost = true; + flowLayoutPanel1.ResumeLayout(false); + flowLayoutPanel1.PerformLayout(); + tableLayoutPanel1.ResumeLayout(false); + flowLayoutPanel2.ResumeLayout(false); + flowLayoutPanel2.PerformLayout(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Label lblUpdateTitleStatic; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lblInstalledVersion; + private System.Windows.Forms.Label lblLatestVersion; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2; + private System.Windows.Forms.Button btnInstallUpdate; + private System.Windows.Forms.Button btnDismissUpdate; + private System.Windows.Forms.Button btnReadChangelog; + } +} \ No newline at end of file diff --git a/CarManagerV3/Forms/UpdatePromptForm.cs b/CarManagerV3/Forms/UpdatePromptForm.cs new file mode 100644 index 0000000..2d59a03 --- /dev/null +++ b/CarManagerV3/Forms/UpdatePromptForm.cs @@ -0,0 +1,33 @@ +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.Windows.Forms; +using CarManagerV3.Manager; + +namespace CarManagerV3.Forms +{ + public partial class UpdatePromptForm : Form + { + public UpdatePromptForm(string currentVersion, string latestVersion) + { + InitializeComponent(); + lblInstalledVersion.Text = lblInstalledVersion.Text.Replace("?.?.?", currentVersion); + lblLatestVersion.Text = lblLatestVersion.Text.Replace("?.?.?", latestVersion); + } + + private void btnDismissUpdate_Click(object sender, EventArgs e) + { + this.Close(); + } + + private async void btnInstallUpdate_Click(object sender, EventArgs e) + { + Updater.DownloadNewestInstaller(); + } + } +} diff --git a/CarManagerV3/Forms/UpdatePromptForm.resx b/CarManagerV3/Forms/UpdatePromptForm.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/CarManagerV3/Forms/UpdatePromptForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarManagerV3/Forms/Util/PleaseWait.Designer.cs b/CarManagerV3/Forms/Util/PleaseWait.Designer.cs index 21a4f7e..ed9b848 100644 --- a/CarManagerV3/Forms/Util/PleaseWait.Designer.cs +++ b/CarManagerV3/Forms/Util/PleaseWait.Designer.cs @@ -28,58 +28,60 @@ /// private void InitializeComponent() { - this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.SuspendLayout(); + progressBar1 = new System.Windows.Forms.ProgressBar(); + label1 = new System.Windows.Forms.Label(); + lblContent = new System.Windows.Forms.Label(); + SuspendLayout(); // // progressBar1 // - this.progressBar1.Location = new System.Drawing.Point(12, 62); - this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(422, 23); - this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee; - this.progressBar1.TabIndex = 0; - this.progressBar1.Click += new System.EventHandler(this.progressBar1_Click); + progressBar1.Location = new System.Drawing.Point(12, 78); + progressBar1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + progressBar1.Name = "progressBar1"; + progressBar1.Size = new System.Drawing.Size(422, 29); + progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee; + progressBar1.TabIndex = 0; + progressBar1.Click += progressBar1_Click; // // label1 // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.Location = new System.Drawing.Point(12, 13); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(121, 20); - this.label1.TabIndex = 1; - this.label1.Text = "Please wait..."; + label1.AutoSize = true; + label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 0); + label1.Location = new System.Drawing.Point(12, 16); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(121, 20); + label1.TabIndex = 1; + label1.Text = "Please wait..."; // - // label2 + // lblContent // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(13, 33); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(133, 16); - this.label2.TabIndex = 2; - this.label2.Text = "Saving your changes"; + lblContent.AutoSize = true; + lblContent.Location = new System.Drawing.Point(13, 41); + lblContent.Name = "lblContent"; + lblContent.Size = new System.Drawing.Size(144, 20); + lblContent.TabIndex = 2; + lblContent.Text = "Saving your changes"; // // PleaseWait // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoSize = true; - this.ClientSize = new System.Drawing.Size(446, 97); - this.ControlBox = false; - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.progressBar1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PleaseWait"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.Text = "Please Wait"; - this.ResumeLayout(false); - this.PerformLayout(); + AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + AutoSize = true; + ClientSize = new System.Drawing.Size(446, 121); + ControlBox = false; + Controls.Add(lblContent); + Controls.Add(label1); + Controls.Add(progressBar1); + FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + MaximizeBox = false; + MinimizeBox = false; + Name = "PleaseWait"; + ShowIcon = false; + ShowInTaskbar = false; + Text = "Please Wait"; + ResumeLayout(false); + PerformLayout(); } @@ -87,6 +89,6 @@ private System.Windows.Forms.ProgressBar progressBar1; private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lblContent; } } \ No newline at end of file diff --git a/CarManagerV3/Forms/Util/PleaseWait.cs b/CarManagerV3/Forms/Util/PleaseWait.cs index 87993bc..5adc7aa 100644 --- a/CarManagerV3/Forms/Util/PleaseWait.cs +++ b/CarManagerV3/Forms/Util/PleaseWait.cs @@ -5,13 +5,14 @@ namespace CarManagerV3 { public partial class PleaseWait : Form { - public PleaseWait() + public PleaseWait(string content = "Saving your changes...") { InitializeComponent(); // loading animation progressBar1.Style = ProgressBarStyle.Marquee; progressBar1.MarqueeAnimationSpeed = 30; - + lblContent.Text = content; + } private void progressBar1_Click(object sender, EventArgs e) diff --git a/CarManagerV3/Forms/Util/PleaseWait.resx b/CarManagerV3/Forms/Util/PleaseWait.resx index 1af7de1..8b2ff64 100644 --- a/CarManagerV3/Forms/Util/PleaseWait.resx +++ b/CarManagerV3/Forms/Util/PleaseWait.resx @@ -1,17 +1,17 @@  - diff --git a/CarManagerV3/Manager/Updater.cs b/CarManagerV3/Manager/Updater.cs new file mode 100644 index 0000000..42b0e08 --- /dev/null +++ b/CarManagerV3/Manager/Updater.cs @@ -0,0 +1,185 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CarManagerV3.Manager +{ + internal class Updater + { + + private static readonly string GitApiUrl = "https://git.jaro.digital/api/v1"; + private static readonly string GitRepoOwner = "frozd"; + private static readonly string GitRepoName = "carmanager-3"; + private static readonly string GitApiRepoUrl = $"{GitApiUrl}/repos/{GitRepoOwner}/{GitRepoName}"; + private static readonly string LatestReleaseEndpoint = $"{GitApiRepoUrl}/releases/latest"; + private static readonly string PreReleaseEndpoint = $"{GitApiRepoUrl}/releases?limit=1&pre-release=true"; + private static string latestVersionCache = null; + private static DateTime lastChecked = DateTime.MinValue; + private static readonly int CacheDurationMinutes = 60; + private static bool cacheIncludesPrerelease = false; + private static readonly string debugVersion = "1.2.0"; + + public static string GetCurrentVersion() + { + //DEBUG:: + if(debugVersion != null) + { + return debugVersion; + } + + var asm = Assembly.GetEntryAssembly()!; + Version v = asm.GetName().Version ?? new Version(0, 0, 0, 0); + return v.ToString(); + } + + private static bool IsCacheValid(bool includePreRelease = false) + { + return includePreRelease == cacheIncludesPrerelease && latestVersionCache != null && (DateTime.Now - lastChecked).TotalMinutes < CacheDurationMinutes; + } + + private static void InvalidateCache() + { + latestVersionCache = null; + lastChecked = DateTime.MinValue; + } + + private static void SetCache(string version, bool includePreRelease = false) + { + latestVersionCache = version; + cacheIncludesPrerelease = includePreRelease; + lastChecked = DateTime.Now; + } + + + public static string GetLatestVersion(bool includePreRelease = false) + { + if (IsCacheValid(includePreRelease)) + { + System.Diagnostics.Debug.WriteLine("Using cached latest version: " + latestVersionCache); + return latestVersionCache; + } + string latestVersion = null; + // Get the latest stable version first + using (var client = new System.Net.Http.HttpClient()) + { + var response = client.GetAsync(LatestReleaseEndpoint).Result; + if (response.IsSuccessStatusCode) + { + var content = response.Content.ReadAsStringAsync().Result; + dynamic release = Newtonsoft.Json.JsonConvert.DeserializeObject(content); + latestVersion = release.tag_name; + } + } + // If pre-release is requested, check for the latest pre-release version + if (includePreRelease) + { + using (var client = new System.Net.Http.HttpClient()) + { + var response = client.GetAsync(PreReleaseEndpoint).Result; + if (response.IsSuccessStatusCode) + { + var content = response.Content.ReadAsStringAsync().Result; + dynamic releases = Newtonsoft.Json.JsonConvert.DeserializeObject(content); + if (releases.Count > 0) + { + var preReleaseVersion = releases[0].tag_name; + // Compare versions and return the newer one + if (IsNewerVersion(preReleaseVersion, latestVersion)) + { + latestVersion = preReleaseVersion; + } + } + } + } + } + SetCache(latestVersion, includePreRelease); + return latestVersion; + + } + + public static bool IsNewerVersion(string versionA, string versionB) + { + if (versionA == null) return false; + if (versionB == null) return true; + Version vA = new Version(versionA.TrimStart('v')); + Version vB = new Version(versionB.TrimStart('v')); + return vA > vB; + } + + + public static async void DownloadNewestInstaller(bool includePreRelease = false) + { + string latestVersion = GetLatestVersion(includePreRelease); + if (latestVersion == null) + { + throw new Exception("Could not fetch latest version from Git API."); + } + + string releaseUrl = $"{GitApiRepoUrl}/releases/tags/{latestVersion}"; + using (var client = new System.Net.Http.HttpClient()) + { + var response = client.GetAsync(releaseUrl).Result; + if (response.IsSuccessStatusCode) + { + var content = response.Content.ReadAsStringAsync().Result; + dynamic release = Newtonsoft.Json.JsonConvert.DeserializeObject(content); + string downloadUrl = null; + foreach (var asset in release.assets) + { + // file that ends with .msi + if (asset.name.ToString().EndsWith(".msi")) + { + downloadUrl = asset.browser_download_url; + break; + } + } + if (downloadUrl != null) + { + PleaseWait loadForm = new PleaseWait("Downloading the newest version..."); + loadForm.Show(); + Application.DoEvents(); + await Task.Run(() => + { + // Download the installer to the users set Data dir, run it, and then exit the application. + string tempFilePath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), $"CarManagerInstaller_{latestVersion}.msi"); + using (var downloadClient = new System.Net.WebClient()) + { + downloadClient.DownloadFile(downloadUrl, tempFilePath); + } + // Use ProcessStartInfo with UseShellExecute to launch the MSI file + var processStartInfo = new System.Diagnostics.ProcessStartInfo + { + FileName = tempFilePath, + UseShellExecute = true + }; + System.Diagnostics.Process.Start(processStartInfo); + }); + + Application.Exit(); + } + else + { + throw new Exception("Could not find installer asset in the latest release."); + } + } + else + { + throw new Exception("Could not fetch release information from Git API."); + + } + + } + } + + public static bool IsUpdateAvailable(bool includePreRelease = false) + { + string currentVersion = GetCurrentVersion(); + string latestVersion = GetLatestVersion(includePreRelease); + return IsNewerVersion(latestVersion, currentVersion); + } + } +} diff --git a/CarManagerV3/Properties/Settings.Designer.cs b/CarManagerV3/Properties/Settings.Designer.cs index 1b3e9fc..9975d8f 100644 --- a/CarManagerV3/Properties/Settings.Designer.cs +++ b/CarManagerV3/Properties/Settings.Designer.cs @@ -34,5 +34,17 @@ namespace CarManagerV3.Properties { this["DataLocation"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool AllowPrerelease { + get { + return ((bool)(this["AllowPrerelease"])); + } + set { + this["AllowPrerelease"] = value; + } + } } } diff --git a/CarManagerV3/Properties/Settings.settings b/CarManagerV3/Properties/Settings.settings index ee34d15..cc257af 100644 --- a/CarManagerV3/Properties/Settings.settings +++ b/CarManagerV3/Properties/Settings.settings @@ -5,5 +5,8 @@ + + False + \ No newline at end of file