From ca47896204482bf4a6979e3838bf7f09f61cebeb Mon Sep 17 00:00:00 2001
From: giy <giy@omp-system.ru>
Date: Fri, 02 Sep 2022 14:16:56 +0300
Subject: [PATCH] Обновление до версии 2.9.0

---
 QtVsTools.Package/Options/QtVersionsPage.cs |   92 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 66 insertions(+), 26 deletions(-)

diff --git a/QtVsTools.Package/Options/QtVersionsPage.cs b/QtVsTools.Package/Options/QtVersionsPage.cs
index f28e8ee..cffc4b7 100644
--- a/QtVsTools.Package/Options/QtVersionsPage.cs
+++ b/QtVsTools.Package/Options/QtVersionsPage.cs
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2020 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the Qt VS Tools.
@@ -28,29 +28,37 @@
 
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Windows;
 using Microsoft.VisualStudio.Shell;
 using Microsoft.VisualStudio.Shell.Interop;
-using QtVsTools.Core;
 
 namespace QtVsTools.Options
 {
+    using Common;
+    using Core;
+    using static QtVsTools.Options.QtVersionsTable;
+
     public class QtVersionsPage : UIElementDialogPage
     {
+        static LazyFactory Lazy { get; } = new LazyFactory();
+
         QtVersionManager VersionManager => QtVersionManager.The();
 
-        QtVersionsTable _VersionsTable;
-        QtVersionsTable VersionsTable => _VersionsTable
-            ?? (_VersionsTable = new QtVersionsTable());
+        QtVersionsTable VersionsTable => Lazy.Get(() =>
+            VersionsTable, () => new QtVersionsTable());
 
         protected override UIElement Child => VersionsTable;
 
         public override void LoadSettingsFromStorage()
         {
-            var versions = new List<QtVersionsTable.Row>();
+            var versions = new List<Row>();
             foreach (var versionName in VersionManager.GetVersions()) {
                 var versionPath = VersionManager.GetInstallPath(versionName);
+                if (string.IsNullOrEmpty(versionPath))
+                    continue;
+
                 BuildHost host = BuildHost.Windows;
                 string compiler = "msvc";
                 if (versionPath.StartsWith("SSH:") || versionPath.StartsWith("WSL:")) {
@@ -65,13 +73,15 @@
                         compiler = linuxPaths[2];
                 }
                 var defaultVersion = VersionManager.GetDefaultVersion();
-                versions.Add(new QtVersionsTable.Row()
+                versions.Add(new Row()
                 {
                     IsDefault = (versionName == defaultVersion),
                     VersionName = versionName,
+                    InitialVersionName = versionName,
                     Path = versionPath,
                     Host = host,
                     Compiler = compiler,
+                    State = State.Unknown
                 });
             }
             VersionsTable.UpdateVersions(versions);
@@ -79,23 +89,40 @@
 
         public override void SaveSettingsToStorage()
         {
-            foreach (var versionName in VersionManager.GetVersions()) {
+            void RemoveVersion(string versionName)
+            {
                 try {
                     VersionManager.RemoveVersion(versionName);
                 } catch (Exception exception) {
-                    Messages.Print(
-                        exception.Message + "\r\n\r\nStacktrace:\r\n" + exception.StackTrace);
+                    exception.Log();
                 }
             }
-            foreach (var version in VersionsTable.Versions) {
+
+            var versions = VersionsTable.Versions;
+            foreach (var version in versions) {
+                if (version.State.HasFlag(State.Removed))
+                    RemoveVersion(version.VersionName);
+
+                if (!version.State.HasFlag(State.Modified))
+                    continue;
+
                 try {
                     if (version.Host == BuildHost.Windows) {
-                        var versionInfo = VersionInformation.Get(version.Path);
-                        var generator = versionInfo.GetQMakeConfEntry("MAKEFILE_GENERATOR");
-                        if (generator != "MSVC.NET" && generator != "MSBUILD")
-                            throw new Exception(SR.GetString(
-                                "AddQtVersionDialog_IncorrectMakefileGenerator", generator));
-                        VersionManager.SaveVersion(version.VersionName, version.Path);
+                        if (version.State.HasFlag((State)Column.Path)) {
+                            var versionPath = version.Path;
+                            var ignoreCase = StringComparison.CurrentCultureIgnoreCase;
+                            if (Path.GetFileName(versionPath).Equals("qmake.exe", ignoreCase))
+                                versionPath = Path.GetDirectoryName(versionPath);
+                            if (Path.GetFileName(versionPath).Equals("bin", ignoreCase))
+                                versionPath = Path.GetDirectoryName(versionPath);
+                            var versionInfo = VersionInformation.Get(versionPath);
+                            var generator = versionInfo.GetQMakeConfEntry("MAKEFILE_GENERATOR");
+                            if (generator != "MSVC.NET" && generator != "MSBUILD")
+                                throw new Exception(string.Format(
+                                    "This Qt version uses an unsupported makefile generator (used: "
+                                    + "{0}, supported: MSVC.NET, MSBUILD)", generator));
+                            VersionManager.SaveVersion(version.VersionName, versionPath);
+                        }
                     } else {
                         string name = version.VersionName;
                         string access =
@@ -107,21 +134,34 @@
                         path = string.Format("{0}:{1}:{2}", access, path, compiler);
                         VersionManager.SaveVersion(name, path, checkPath: false);
                     }
+
+                    if (version.State.HasFlag((State)Column.VersionName)) {
+                        try {
+                            VersionManager.SaveVersion(version.VersionName, version.Path);
+                            if (!string.IsNullOrEmpty(version.InitialVersionName))
+                                VersionManager.RemoveVersion(version.InitialVersionName);
+                        } catch (Exception exception) {
+                            exception.Log();
+                        }
+                    }
                 } catch (Exception exception) {
-                    Messages.Print(
-                        exception.Message + "\r\n\r\nStacktrace:\r\n" + exception.StackTrace);
+                    exception.Log();
+                    version.State = State.Removed;
+                    RemoveVersion(version.VersionName);
                 }
             }
+
             try {
-                var defaultVersion = VersionsTable.Versions
-                    .Where(version => version.IsDefault)
-                    .FirstOrDefault();
-                if (defaultVersion != null)
-                    VersionManager.SaveDefaultVersion(defaultVersion.VersionName);
+                var defaultVersion =
+                    versions.FirstOrDefault(v => v.IsDefault && v.State != State.Removed)
+                        ?? versions.FirstOrDefault(v => v.State != State.Removed);
+                VersionManager.SaveDefaultVersion(defaultVersion?.VersionName ?? "");
             } catch (Exception exception) {
-                Messages.Print(
-                    exception.Message + "\r\n\r\nStacktrace:\r\n" + exception.StackTrace);
+                exception.Log();
             }
+
+            if (Notifications.NoQtVersion.IsOpen && VersionManager.GetVersions()?.Any() == true)
+                Notifications.NoQtVersion.Close();
         }
 
         protected override void OnApply(PageApplyEventArgs e)

--
Gitblit v1.9.1