Наша сборка Qt VS Tools
giy
2022-09-02 ca47896204482bf4a6979e3838bf7f09f61cebeb
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)