/**************************************************************************** ** ** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt VS Tools. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ using System; using System.ComponentModel; using System.Globalization; using System.Text.RegularExpressions; namespace QtVsTools.Legacy { using Core; using Legacy = Core.Legacy; public class ProjectQtSettings : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { var eventHandler = PropertyChanged; if (eventHandler != null) eventHandler.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public ProjectQtSettings(EnvDTE.Project proj) { versionManager = QtVersionManager.The(); project = proj; newMocDir = oldMocDir = Legacy.QtVSIPSettings.GetMocDirectory(project); newMocOptions = oldMocOptions = Legacy.QtVSIPSettings.GetMocOptions(project); newRccDir = oldRccDir = Legacy.QtVSIPSettings.GetRccDirectory(project); newUicDir = oldUicDir = Legacy.QtVSIPSettings.GetUicDirectory(project); newLUpdateOnBuild = oldLUpdateOnBuild = Legacy.QtVSIPSettings.GetLUpdateOnBuild(project); newLUpdateOptions = oldLUpdateOptions = Legacy.QtVSIPSettings.GetLUpdateOptions(project); newLReleaseOptions = oldLReleaseOptions = Legacy.QtVSIPSettings.GetLReleaseOptions(project); newQtVersion = oldQtVersion = versionManager.GetProjectQtVersion(project); QmlDebug = oldQmlDebug = Legacy.QtVSIPSettings.GetQmlDebug(project); } private readonly QtVersionManager versionManager; private EnvDTE.Project project; private readonly string oldMocDir; private readonly string oldMocOptions; private readonly string oldRccDir; private readonly string oldUicDir; private readonly string oldQtVersion; private readonly bool oldLUpdateOnBuild; private readonly string oldLUpdateOptions; private readonly string oldLReleaseOptions; private readonly bool oldQmlDebug; private string newMocDir; private string newMocOptions; private string newRccDir; private string newUicDir; private string newQtVersion; private bool newLUpdateOnBuild; private string newLUpdateOptions; private string newLReleaseOptions; public void SaveSettings() { var updateMoc = false; var qtPro = QtProject.Create(project); if (oldMocDir != newMocDir) { Legacy.QtVSIPSettings.SaveMocDirectory(project, newMocDir); updateMoc = true; } if (oldMocOptions != newMocOptions) { Legacy.QtVSIPSettings.SaveMocOptions(project, newMocOptions); updateMoc = true; } if (updateMoc) qtPro.UpdateMocSteps(oldMocDir); if (oldUicDir != newUicDir) { Legacy.QtVSIPSettings.SaveUicDirectory(project, newUicDir); qtPro.UpdateUicSteps(oldUicDir, true); } if (oldRccDir != newRccDir) { Legacy.QtVSIPSettings.SaveRccDirectory(project, newRccDir); qtPro.RefreshRccSteps(oldRccDir); } if (oldLUpdateOnBuild != newLUpdateOnBuild) Legacy.QtVSIPSettings.SaveLUpdateOnBuild(project, newLUpdateOnBuild); if (oldLUpdateOptions != newLUpdateOptions) Legacy.QtVSIPSettings.SaveLUpdateOptions(project, newLUpdateOptions); if (oldLReleaseOptions != newLReleaseOptions) Legacy.QtVSIPSettings.SaveLReleaseOptions(project, newLReleaseOptions); if (oldQmlDebug != QmlDebug) Legacy.QtVSIPSettings.SaveQmlDebug(project, QmlDebug); if (oldQtVersion != newQtVersion) { if (Legacy.QtProject.PromptChangeQtVersion(project, oldQtVersion, newQtVersion)) { var newProjectCreated = false; var versionChanged = qtPro.ChangeQtVersion( oldQtVersion, newQtVersion, ref newProjectCreated); if (versionChanged && newProjectCreated) project = qtPro.Project; } } } public string MocDirectory { get { return newMocDir; } set { var tmp = HelperFunctions.NormalizeRelativeFilePath(value); if (tmp.Equals(oldMocDir, StringComparison.OrdinalIgnoreCase)) return; string badMacros = IncompatibleMacros(tmp); if (!string.IsNullOrEmpty(badMacros)) Messages.DisplayErrorMessage(SR.GetString("IncompatibleMacros", badMacros)); else newMocDir = tmp; } } public string MocOptions { get { return newMocOptions; } set { newMocOptions = value; } } public string UicDirectory { get { return newUicDir; } set { var tmp = HelperFunctions.NormalizeRelativeFilePath(value); if (tmp.Equals(oldUicDir, StringComparison.OrdinalIgnoreCase)) return; string badMacros = IncompatibleMacros(tmp); if (!string.IsNullOrEmpty(badMacros)) Messages.DisplayErrorMessage(SR.GetString("IncompatibleMacros", badMacros)); else newUicDir = tmp; } } public string RccDirectory { get { return newRccDir; } set { var tmp = HelperFunctions.NormalizeRelativeFilePath(value); if (tmp.Equals(oldRccDir, StringComparison.OrdinalIgnoreCase)) return; string badMacros = IncompatibleMacros(tmp); if (!string.IsNullOrEmpty(badMacros)) Messages.DisplayErrorMessage(SR.GetString("IncompatibleMacros", badMacros)); else newRccDir = tmp; } } public bool lupdateOnBuild { get { return newLUpdateOnBuild; } set { newLUpdateOnBuild = value; } } public string LUpdateOptions { get { return newLUpdateOptions; } set { newLUpdateOptions = value; } } public string LReleaseOptions { get { return newLReleaseOptions; } set { newLReleaseOptions = value; } } [DisplayName("QML Debug")] [TypeConverter(typeof(QmlDebugConverter))] private bool QmlDebug { get; } private static string IncompatibleMacros(string stringToExpand) { string incompatibleMacros = ""; foreach (Match metaNameMatch in Regex.Matches(stringToExpand, @"\%\(([^\)]+)\)")) { string metaName = metaNameMatch.Groups[1].Value; if (!incompatibleMacros.Contains(string.Format("%({0})", metaName))) { switch (metaName) { case "RecursiveDir": case "ModifiedTime": case "CreatedTime": case "AccessedTime": if (!string.IsNullOrEmpty(incompatibleMacros)) incompatibleMacros += ", "; incompatibleMacros += string.Format("%({0})", metaName); break; } } } return incompatibleMacros; } internal class QmlDebugConverter : BooleanConverter { public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { return (bool)value ? "Enabled" : "Disabled"; } public override object ConvertFrom( ITypeDescriptorContext context, CultureInfo culture, object value) { return (string)value == "Enabled"; } } [TypeConverter(typeof(VersionConverter))] public string Version { get { return newQtVersion; } set { if (newQtVersion != value) { newQtVersion = value; OnPropertyChanged("Version"); } } } internal class VersionConverter : StringConverter { private readonly QtVersionManager versionManager; public VersionConverter() { versionManager = QtVersionManager.The(); } public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { var versions = versionManager.GetVersions(); Array.Resize(ref versions, versions.Length + 1); versions[versions.Length - 1] = "$(DefaultQtVersion)"; return new StandardValuesCollection(versions); } public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; } } } }