From 41d43fc4c9dd222d86359ce6eec859c30cda3d4c Mon Sep 17 00:00:00 2001 From: Hefaistos68 Date: Thu, 31 Aug 2023 16:15:11 +0100 Subject: [PATCH 1/3] Update README.md --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dd7f146..b7c9c13 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,6 @@ Doing so manually is most often a tedious and time consuming process. Also, as of late, the "Start Window" of Visual Studio is not the most helpful, besides its inherent limitations of managing its recently used list. ## Working Features - - Importing from folders - Importing from any Visual Studio version and profile - Support for VS 2017, 2019 and 2022 @@ -51,6 +50,16 @@ Also, as of late, the "Start Window" of Visual Studio is not the most helpful, b - Support for dark mode - Support for non-Windows environments +## How to use +First either import your whole recent list from VS by using the toolbar button with the VS symbol, or import from folder directly with the folder-up-arrow toolbar button. You can also drag solutions or projects from the explorer directly into it. + +After you have at least one SoP in the list, you can start it by pressing enter on the selected item or double clicking it. When you double click on a folder/group then the whole folder will be launched, each item in its own VS instance as defined in the items settings. + +As expected, you can use drag and drop to order items, alt+enter to open the items settings, del to delete an item, etc. Remember that the settings of a folder/group item are applied before all items. This means that when you set a folder to execute as admin, all the contained SoPs will run as admin too. +You can set for each SoP which (installed) version of Visual Studio you want to open it with. Recomended version is shown for each as it is defined in the solution file. +There are also context menus that you can invoke with right clicking on an item. + + ![SoP Settings](https://github.com/Hefaistos68/VSLauncherX/blob/master/docs/Settings-sample.jpg) From d9f40e819cf4feaf0d5661ca5ab29f3595f9e1ac Mon Sep 17 00:00:00 2001 From: Andreas Saurwein Date: Thu, 31 Aug 2023 18:22:16 +0100 Subject: [PATCH 2/3] excluding credentials --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d10bf98..b57eb89 100644 --- a/.gitignore +++ b/.gitignore @@ -366,3 +366,4 @@ FodyWeavers.xsd .vshistory/ /BackgroundLaunch/Properties/launchSettings.json /BackgroundLaunch/Properties/launchSettings.json +/VSLauncherX/client_secret.json From 65fbfc14f4b86c8272f1060267c0515763a3903f Mon Sep 17 00:00:00 2001 From: Andreas Saurwein Date: Thu, 31 Aug 2023 19:01:37 +0100 Subject: [PATCH 3/3] Added multiple launch warning --- VSLauncherX/App.config | 3 + VSLauncherX/Forms/dlgNewInstance.Designer.cs | 2 +- VSLauncherX/Forms/dlgWarnMultiple.Designer.cs | 138 +++++++++ VSLauncherX/Forms/dlgWarnMultiple.cs | 40 +++ VSLauncherX/Forms/dlgWarnMultiple.resx | 263 ++++++++++++++++++ VSLauncherX/Helpers/GoogleDriveStorage.cs | 104 +++++++ VSLauncherX/MainDialog.cs | 27 ++ VSLauncherX/Properties/Settings.Designer.cs | 14 +- VSLauncherX/Properties/Settings.settings | 3 + VSLauncherX/VSLauncherX.csproj | 8 + docs/app-logo.jpg | Bin 0 -> 26386 bytes 11 files changed, 600 insertions(+), 2 deletions(-) create mode 100644 VSLauncherX/Forms/dlgWarnMultiple.Designer.cs create mode 100644 VSLauncherX/Forms/dlgWarnMultiple.cs create mode 100644 VSLauncherX/Forms/dlgWarnMultiple.resx create mode 100644 VSLauncherX/Helpers/GoogleDriveStorage.cs create mode 100644 docs/app-logo.jpg diff --git a/VSLauncherX/App.config b/VSLauncherX/App.config index bb186e5..e9841a6 100644 --- a/VSLauncherX/App.config +++ b/VSLauncherX/App.config @@ -31,6 +31,9 @@ False + + False + \ No newline at end of file diff --git a/VSLauncherX/Forms/dlgNewInstance.Designer.cs b/VSLauncherX/Forms/dlgNewInstance.Designer.cs index f272c93..cf10e83 100644 --- a/VSLauncherX/Forms/dlgNewInstance.Designer.cs +++ b/VSLauncherX/Forms/dlgNewInstance.Designer.cs @@ -68,7 +68,7 @@ private void InitializeComponent() btnOk.TextImageRelation = TextImageRelation.ImageBeforeText; btnOk.UseVisualStyleBackColor = true; // - // txtItemName + // lblItemNumber // txtInstanceName.Location = new Point(12, 27); txtInstanceName.Name = "txtInstanceName"; diff --git a/VSLauncherX/Forms/dlgWarnMultiple.Designer.cs b/VSLauncherX/Forms/dlgWarnMultiple.Designer.cs new file mode 100644 index 0000000..a226893 --- /dev/null +++ b/VSLauncherX/Forms/dlgWarnMultiple.Designer.cs @@ -0,0 +1,138 @@ +namespace VSLauncher +{ + partial class dlgWarnMultiple + { + /// + /// 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() + { + Label label1; + Label label2; + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(dlgWarnMultiple)); + btnCancel = new Button(); + btnOk = new Button(); + lblItemNumber = new Label(); + chkDontShow = new CheckBox(); + label1 = new Label(); + label2 = new Label(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 9); + label1.Name = "label1"; + label1.Size = new Size(133, 15); + label1.TabIndex = 0; + label1.Text = "You are about to launch"; + // + // label2 + // + label2.Location = new Point(12, 50); + label2.Name = "label2"; + label2.Size = new Size(355, 60); + label2.TabIndex = 2; + label2.Text = "Instances of Visual Studio (or other tools). This may consume a lot of time and resources.\r\n\r\nAre you sure to continue?"; + // + // btnCancel + // + btnCancel.DialogResult = DialogResult.Cancel; + btnCancel.Image = Resources.Cancel_24x24; + btnCancel.Location = new Point(161, 151); + btnCancel.Name = "btnCancel"; + btnCancel.Size = new Size(100, 40); + btnCancel.TabIndex = 4; + btnCancel.Text = " Cancel"; + btnCancel.TextImageRelation = TextImageRelation.ImageBeforeText; + btnCancel.UseVisualStyleBackColor = true; + // + // btnOk + // + btnOk.DialogResult = DialogResult.OK; + btnOk.Image = Resources.Check_24x24; + btnOk.Location = new Point(267, 151); + btnOk.Name = "btnOk"; + btnOk.Size = new Size(100, 40); + btnOk.TabIndex = 5; + btnOk.Text = " Ok"; + btnOk.TextImageRelation = TextImageRelation.ImageBeforeText; + btnOk.UseVisualStyleBackColor = true; + btnOk.Click += btnOk_Click; + // + // lblItemNumber + // + lblItemNumber.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point); + lblItemNumber.Location = new Point(12, 27); + lblItemNumber.Name = "lblItemNumber"; + lblItemNumber.Size = new Size(322, 23); + lblItemNumber.TabIndex = 1; + lblItemNumber.Text = "0"; + lblItemNumber.TextAlign = ContentAlignment.MiddleCenter; + // + // chkDontShow + // + chkDontShow.AutoSize = true; + chkDontShow.Location = new Point(12, 163); + chkDontShow.Name = "chkDontShow"; + chkDontShow.Size = new Size(118, 19); + chkDontShow.TabIndex = 3; + chkDontShow.Text = "Don´t show again"; + chkDontShow.UseVisualStyleBackColor = true; + // + // dlgWarnMultiple + // + this.AcceptButton = btnOk; + this.AutoScaleDimensions = new SizeF(7F, 15F); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = btnCancel; + this.ClientSize = new Size(379, 203); + this.ControlBox = false; + this.Controls.Add(chkDontShow); + this.Controls.Add(btnCancel); + this.Controls.Add(btnOk); + this.Controls.Add(lblItemNumber); + this.Controls.Add(label2); + this.Controls.Add(label1); + this.FormBorderStyle = FormBorderStyle.FixedDialog; + this.Icon = (Icon)resources.GetObject("$this.Icon"); + this.MaximizeBox = false; + this.MdiChildrenMinimizedAnchorBottom = false; + this.MinimizeBox = false; + this.Name = "dlgWarnMultiple"; + this.SizeGripStyle = SizeGripStyle.Hide; + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Warning"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button btnCancel; + private Button btnOk; + private Label lblItemNumber; + private CheckBox chkDontShow; + } +} \ No newline at end of file diff --git a/VSLauncherX/Forms/dlgWarnMultiple.cs b/VSLauncherX/Forms/dlgWarnMultiple.cs new file mode 100644 index 0000000..e7a845c --- /dev/null +++ b/VSLauncherX/Forms/dlgWarnMultiple.cs @@ -0,0 +1,40 @@ +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 VSLauncher.DataModel; + +namespace VSLauncher +{ + /// + /// Warning dialog when multiple items are launched + /// + public partial class dlgWarnMultiple : Form + { + /// + /// Initializes a new instance of the class. + /// + public dlgWarnMultiple(int n) + { + InitializeComponent(); + this.lblItemNumber.Text = n.ToString(); + } + + /// + /// Gets the instance name. + /// + public string ItemName { get; private set; } = string.Empty; + + private void btnOk_Click(object sender, EventArgs e) + { + Properties.Settings.Default.DontShowMultiplesWarning = this.chkDontShow.Checked; + Properties.Settings.Default.Save(); + } + } +} diff --git a/VSLauncherX/Forms/dlgWarnMultiple.resx b/VSLauncherX/Forms/dlgWarnMultiple.resx new file mode 100644 index 0000000..1baddb7 --- /dev/null +++ b/VSLauncherX/Forms/dlgWarnMultiple.resx @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + False + + + False + + + + + AAABAAMAICAAAAEAIACoEAAANgAAABgYAAABACAAiAkAAN4QAAAQEAAAAQAgAGgEAABmGgAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADqD1Q05gNGTOYHS+zh/ + zv83fcz/NnvI/zZ5xf81d8H/M3S+/zJyuf8ycbf/MW60/zBssP8vaq7/Lmmr/y5pq/8vaq7/MGyw/zFu + s/8ycLb/MnK5/zN0vv81d8H/NXnE/zZ7yP83fcz/OH/O/zmA0fY5gNGOOoPVCAAAAAAAAAAAOoPVhy2N + 6P8Bi/7/AIv//wCL//8Ai///AIv//wCL//8AjP//AI3//wCO//8Ajv//AI7//wCO//8Ajv//AI7//wCO + //8Ajv//AI7//wCO//8Ajf//AIz//wCL//8Ai///AIv//wCL//8Ai///AYv+/y2N6P86g9WNAAAAAAAA + AAA6g9XwYbf9/wCP//8Aj///AI///wCP//8Akf//AJP//wCU//8Alf//AJb//wCW//8Al///AJj//wCY + //8AmP//AJj//wCX//8Alv//AJb//wCV//8AlP//AJP//wCR//8Aj///AI///wCP//8Aj///Yrj+/zqD + 1fYAAAAAAAAAADqD1cyFw/f/GZ3//wCS//8Akv//AJT//wCW//8AmP//AJr//wCb//8AnP//AJ7//wCf + //8Aov//AKT//wCk//8Aov//AJ///wCe//8AnP//AJv//wCa//8AmP//AJb//wCU//8Akv//AJL//xmd + //+Hxff/OoPV0QAAAAAAAAAAOoPVY1yg5P9lwP//AJb//wCX//8Amv//AJz//wCe//8AoP//AKL//wCj + //8Apf//AKn//02///9Nv///Tb///02///8Aqf//AKX//wCj//8Aov//AKD//wCe//8AnP//AJr//wCX + //8Alv//ZcD//1yg5P86g9VoAAAAAAAAAAA6g9UCO4TV/4jI+P8cpP//AJz//wCf//8Aof//AKT//wCm + //8Ap///AKj//wCr//8Ar///TcT//w1Dsv8NQ7L/TcT//wCv//8Aq///AKj//wCn//8Apv//AKT//wCh + //8An///AJz//xuk//+Jyfj/O4TV/zqD1QIAAAAAAAAAAAAAAAA6g9VsWp/j/2jE//8Anv//AKL//wCl + //8Ap///AKn//wCr//8ArP//AK///wCz//9Nxv//DUOy/w1Dsv9Nxv//ALP//wCv//8ArP//AKv//wCp + //8Ap///AKX//wCi//8Anv//aMT//1qf4/86g9VsAAAAAAAAAAAAAAAAAAAAADqD1QE6g9X/h8n3/x2t + //8Apv//AKn//wCr//8ArP//AK///wCx//8As///ALf//wC7//8Avf//AL3//wC7//8At///ALP//wCx + //8Ar///AK7//wCr//8Aqf//AKb//x2t//+Hyvj/O4TV/zqD1QIAAAAAAAAAAAAAAAAAAAAAAAAAADqD + 1WhYn+L/a8v//wCp//8ArP//AK///wCx//8As///ALX//wC4//8Au///Tc3//03N//9Nzf//Tc3//wC7 + //8AuP//ALX//wCz//8Asf//AK///wCs//8Aqf//a8v//1if4v86g9VoAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAOoPVATqD1f+Gy/f/ILb//wCv//8Asv//ALT//wC2//8AuP//ALv//wC///9N0P//DUOy/w1D + sv9N0P//AL///wC7//8AuP//ALb//wC0//8Asv//AK///yC2//+Gy/f/OoPV/zqD1QEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAOoPVZFee4v9t0f//ALH//wC0//8At///ALn//wC7//8Avv//AML//03S + //8NQ7L/DUOy/03S//8Awv//AL7//wC7//8Auf//ALf//wC0//8Asf//bdH//1ee4v86g9VmAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOoPVyYXN9v8iv///ALf//wC6//8AvP//AL7//wDC + //8Axv//TdT//w1Dsv8NQ7L/TdT//wDG//8Awv//AL7//wC8//8Auv//ALf//yK///+Fzfb/OoPV/zqD + 1QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6g9VgVZ7h/3DX//8Auv//ALz//wC/ + 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 + 2/8ffdv/IH7c/yF/3f8igN//IoDh/ySB4v8kg+T/JYTm/yaF6P8phuftNIfdiDqD1RM6g9U1TJzp6iuX + /f8Ajv//AI7//wCP//8Akf//AJP//wCU//8AlP//AJX//wCW//8Alv//AJX//wCU//8AlP//AJP//wCR + //8Aj///AI7//wCO//8rl/3/TJzp7TqD1Tc6g9UsZ6fn2FCs/P8Ak///AJT//wCX//8Amv//AJz//wCe + //8AoP//GKb//yWr//8lq///GKb//wCg//8Anv//AJz//wCa//8Al///AJT//wCT//9RrPz/aKjn2zqD + 1S46g9UNS5DbmW+59P8OnP//AJv//wCe//8Aof//AKT//wCl//8Aqf//Nrf//z6g5v8+oOb/Nrf//wCp + //8Apf//AKT//wCh//8Anv//AJv//w2c//9wuvT/S5DbmjqD1Q0AAAAAOoPVSWKl5eNQtf//AJ///wCj + //8Ap///AKn//wCr//8Ar///Nrz//yh2yf8odsn/Nrz//wCv//8Aq///AKn//wCn//8Ao///AJ///1C1 + //9jpeXjOoPVSQAAAAAAAAAAAAAAADqD1aNxvfX/Kq7//wCp//8ArP//AK///wCx//8Atf//GLz//yXB + //8lwf//GLz//wC1//8Asf//AK///wCt//8Aqf//Kq7//3G+9v87hNWjOoPVAQAAAAAAAAAAAAAAADqD + 1SdZo+T/Wb79/wau//8Asf//ALP//wC2//8Auv//Nsb//z6r5v8+q+b/Nsb//wC6//8Atv//ALP//wCx + //8Grv//Wb79/1mj5P86g9UnAAAAAAAAAAAAAAAAAAAAAAAAAABOlNyoY7z0/zC3//8AtP//ALf//wC6 + //8Avv//Nsr//yh8yf8ofMn/Nsr//wC+//8Auv//ALf//wC0//8wt///Y7z0/06U3KkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA6g9UsZ6zm11TF/P8AuP//ALz//wC+//8AxP//Ns7//yh+yf8ofsn/Ns7//wDE + //8Avv//ALz//wC4//9Uxfz/ZKnl6zqD1TYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6g9UMSJDbiXHG + 9PgUv///AL///wDB//8Axv//NtD//yh/yf8of8n/NtD//wDG//8Awf//AL///xS///9yxvT4SJDbiTqD + 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 + AADwDwAA+B8AAPgfAAD8PwAA/D8AAP5/AAA= + + + \ No newline at end of file diff --git a/VSLauncherX/Helpers/GoogleDriveStorage.cs b/VSLauncherX/Helpers/GoogleDriveStorage.cs new file mode 100644 index 0000000..5d58cf0 --- /dev/null +++ b/VSLauncherX/Helpers/GoogleDriveStorage.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; + +using Google.Apis.Auth.OAuth2; +using Google.Apis.Drive.v3; +using Google.Apis.Services; +using System.Diagnostics; + +namespace VSLauncher.Helpers +{ + /// + /// The google drive storage class, to up- and download the settings file, very experimental + /// + public class GoogleDriveStorage + { + private DriveService? driveService; + private Google.Apis.Drive.v3.Data.File fileMetadata = new Google.Apis.Drive.v3.Data.File() + { + Name = "VSLauncherX.settings.json", + Description = "VSLauncherX Solution and Project list", + MimeType = "text/json" + }; + + /// + /// Initializes a new instance of the class. + /// + public GoogleDriveStorage() { } + + + /// + /// Authenticates the storage + /// + public void Authenticate() + { + var credential = GoogleCredential.FromFile("client_secret.json"); + + // Create a Drive service object. + this.driveService = new DriveService(new BaseClientService.Initializer() + { + HttpClientInitializer = credential, + ApplicationName = "VSLauncherX", + }); + } + + /// + /// Uploads the. + /// + /// The contents. + public void Upload(string contents) + { + if(this.driveService == null) + { + Authenticate(); + } + + FilesResource.CreateMediaUpload request; + + // create a stream to read from the string contents + using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(contents))) + { + request = this.driveService.Files.Create(fileMetadata, stream, "text/json"); + request.Fields = "id"; + request.Upload(); + } + + var file = request.ResponseBody; + Debug.WriteLine("File ID: " + file.Id); + } + + /// + /// Downloads the file + /// + /// A string. + public string Download() + { + string contents; + + if (this.driveService == null) + { + Authenticate(); + } + + var query = "name is 'VSLauncherX.settings.json'"; + var info = this.driveService.Files.List(); + info.Q = query; + + var result = info.Execute(); + var file = result.Files.First(); + + var request = this.driveService.Files.Get(file.Id); + using (var stream = new System.IO.MemoryStream()) + { + request.Download(stream); + + contents = Encoding.UTF8.GetString(stream.ToArray()); + } + return contents; + } +} +} diff --git a/VSLauncherX/MainDialog.cs b/VSLauncherX/MainDialog.cs index d128bb8..05e4fc9 100644 --- a/VSLauncherX/MainDialog.cs +++ b/VSLauncherX/MainDialog.cs @@ -850,6 +850,20 @@ private void runToolStripMenuItem_Click(object sender, EventArgs e) if (item is VsFolder f) { + if (!Properties.Settings.Default.DontShowMultiplesWarning) + { + var n = f.ContainedSolutionsCount()+f.ContainedProjectsCount(); + if(n > 3) + { + var dlg = new dlgWarnMultiple(n); + + if(dlg.ShowDialog() == DialogResult.Cancel) + { + return; + } + } + } + vs = string.IsNullOrEmpty(f.VsVersion) ? this.visualStudioInstances.GetByIdentifier(f.VsVersion) : vs; il = new ItemLauncher(f, vs); } @@ -1002,6 +1016,19 @@ private void LoadSolutionData() /// private void SaveSolutionData() { +// if (true) +// { +// JsonSerializerSettings settings = new JsonSerializerSettings() +// { +// Formatting = Formatting.Indented, +// TypeNameHandling = TypeNameHandling.All +// }; +// +// string json = JsonConvert.SerializeObject(this.solutionGroups, settings); +// // testing out storing the file in the google drive +// new GoogleDriveStorage().Upload(json); +// } + // save this.solutionGroups data to a JSON file in the users data folder string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "VSLauncher", "VSLauncher.json"); diff --git a/VSLauncherX/Properties/Settings.Designer.cs b/VSLauncherX/Properties/Settings.Designer.cs index cd12a2a..d5a9841 100644 --- a/VSLauncherX/Properties/Settings.Designer.cs +++ b/VSLauncherX/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace VSLauncher.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -118,5 +118,17 @@ public bool SynchronizeVS { this["SynchronizeVS"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool DontShowMultiplesWarning { + get { + return ((bool)(this["DontShowMultiplesWarning"])); + } + set { + this["DontShowMultiplesWarning"] = value; + } + } } } diff --git a/VSLauncherX/Properties/Settings.settings b/VSLauncherX/Properties/Settings.settings index 059dac7..e16dbe7 100644 --- a/VSLauncherX/Properties/Settings.settings +++ b/VSLauncherX/Properties/Settings.settings @@ -26,5 +26,8 @@ False + + False + \ No newline at end of file diff --git a/VSLauncherX/VSLauncherX.csproj b/VSLauncherX/VSLauncherX.csproj index 3b66c45..7c23fde 100644 --- a/VSLauncherX/VSLauncherX.csproj +++ b/VSLauncherX/VSLauncherX.csproj @@ -15,6 +15,7 @@ + @@ -31,6 +32,9 @@ + + PreserveNewest + @@ -48,6 +52,7 @@ + @@ -67,6 +72,9 @@ Form + + Form + Form diff --git a/docs/app-logo.jpg b/docs/app-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..995f22e65bf92677e6f0aea7fa5390f92130d4d2 GIT binary patch literal 26386 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