diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp index b6f7fb57209..c7060762913 100644 --- a/src/plugins/cpptools/cppfilesettingspage.cpp +++ b/src/plugins/cpptools/cppfilesettingspage.cpp @@ -50,14 +50,17 @@ #include #include -static const char headerPrefixesKeyC[] = "HeaderPrefixes"; -static const char sourcePrefixesKeyC[] = "SourcePrefixes"; -static const char headerSuffixKeyC[] = "HeaderSuffix"; -static const char sourceSuffixKeyC[] = "SourceSuffix"; -static const char headerSearchPathsKeyC[] = "HeaderSearchPaths"; -static const char sourceSearchPathsKeyC[] = "SourceSearchPaths"; -static const char headerPragmaOnceC[] = "HeaderPragmaOnce"; -static const char licenseTemplatePathKeyC[] = "LicenseTemplate"; +namespace CppTools { +namespace Internal { + +const char headerPrefixesKeyC[] = "HeaderPrefixes"; +const char sourcePrefixesKeyC[] = "SourcePrefixes"; +const char headerSuffixKeyC[] = "HeaderSuffix"; +const char sourceSuffixKeyC[] = "SourceSuffix"; +const char headerSearchPathsKeyC[] = "HeaderSearchPaths"; +const char sourceSearchPathsKeyC[] = "SourceSearchPaths"; +const char headerPragmaOnceC[] = "HeaderPragmaOnce"; +const char licenseTemplatePathKeyC[] = "LicenseTemplate"; const char *licenseTemplateTemplate = QT_TRANSLATE_NOOP("CppTools::Internal::CppFileSettingsWidget", "/**************************************************************************\n" @@ -67,9 +70,6 @@ const char *licenseTemplateTemplate = QT_TRANSLATE_NOOP("CppTools::Internal::Cpp "** To protect a percent sign, use '%%'.\n" "**************************************************************************/\n"); -namespace CppTools { -namespace Internal { - void CppFileSettings::toSettings(QSettings *s) const { s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); @@ -252,40 +252,57 @@ QString CppFileSettings::licenseTemplate() // ------------------ CppFileSettingsWidget -CppFileSettingsWidget::CppFileSettingsWidget() : - m_ui(new Internal::Ui::CppFileSettingsPage) +class CppFileSettingsWidget final : public Core::IOptionsPageWidget { - m_ui->setupUi(this); + Q_DECLARE_TR_FUNCTIONS(CppTools::Internal::CppFileSettingsWidget) + +public: + explicit CppFileSettingsWidget(CppFileSettings *settings); + + void apply() final; + + void setSettings(const CppFileSettings &s); + +private: + void slotEdit(); + QString licenseTemplatePath() const; + void setLicenseTemplatePath(const QString &); + + Ui::CppFileSettingsPage m_ui; + CppFileSettings *m_settings = nullptr; +}; + +CppFileSettingsWidget::CppFileSettingsWidget(CppFileSettings *settings) + : m_settings(settings) +{ + m_ui.setupUi(this); // populate suffix combos const Utils::MimeType sourceMt = Utils::mimeTypeForName(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE)); if (sourceMt.isValid()) { foreach (const QString &suffix, sourceMt.suffixes()) - m_ui->sourceSuffixComboBox->addItem(suffix); + m_ui.sourceSuffixComboBox->addItem(suffix); } const Utils::MimeType headerMt = Utils::mimeTypeForName(QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE)); if (headerMt.isValid()) { foreach (const QString &suffix, headerMt.suffixes()) - m_ui->headerSuffixComboBox->addItem(suffix); + m_ui.headerSuffixComboBox->addItem(suffix); } - m_ui->licenseTemplatePathChooser->setExpectedKind(Utils::PathChooser::File); - m_ui->licenseTemplatePathChooser->setHistoryCompleter(QLatin1String("Cpp.LicenseTemplate.History")); - m_ui->licenseTemplatePathChooser->addButton(tr("Edit..."), this, [this] { slotEdit(); }); -} + m_ui.licenseTemplatePathChooser->setExpectedKind(Utils::PathChooser::File); + m_ui.licenseTemplatePathChooser->setHistoryCompleter(QLatin1String("Cpp.LicenseTemplate.History")); + m_ui.licenseTemplatePathChooser->addButton(tr("Edit..."), this, [this] { slotEdit(); }); -CppFileSettingsWidget::~CppFileSettingsWidget() -{ - delete m_ui; + setSettings(*m_settings); } QString CppFileSettingsWidget::licenseTemplatePath() const { - return m_ui->licenseTemplatePathChooser->path(); + return m_ui.licenseTemplatePathChooser->path(); } void CppFileSettingsWidget::setLicenseTemplatePath(const QString &lp) { - m_ui->licenseTemplatePathChooser->setPath(lp); + m_ui.licenseTemplatePathChooser->setPath(lp); } static QStringList trimmedPaths(const QString &paths) @@ -296,19 +313,25 @@ static QStringList trimmedPaths(const QString &paths) return res; } -CppFileSettings CppFileSettingsWidget::settings() const +void CppFileSettingsWidget::apply() { CppFileSettings rc; - rc.lowerCaseFiles = m_ui->lowerCaseFileNamesCheckBox->isChecked(); - rc.headerPragmaOnce = m_ui->headerPragmaOnceCheckBox->isChecked(); - rc.headerPrefixes = trimmedPaths(m_ui->headerPrefixesEdit->text()); - rc.sourcePrefixes = trimmedPaths(m_ui->sourcePrefixesEdit->text()); - rc.headerSuffix = m_ui->headerSuffixComboBox->currentText(); - rc.sourceSuffix = m_ui->sourceSuffixComboBox->currentText(); - rc.headerSearchPaths = trimmedPaths(m_ui->headerSearchPathsEdit->text()); - rc.sourceSearchPaths = trimmedPaths(m_ui->sourceSearchPathsEdit->text()); - rc.licenseTemplatePath = licenseTemplatePath(); - return rc; + rc.lowerCaseFiles = m_ui.lowerCaseFileNamesCheckBox->isChecked(); + rc.headerPragmaOnce = m_ui.headerPragmaOnceCheckBox->isChecked(); + rc.headerPrefixes = trimmedPaths(m_ui.headerPrefixesEdit->text()); + rc.sourcePrefixes = trimmedPaths(m_ui.sourcePrefixesEdit->text()); + rc.headerSuffix = m_ui.headerSuffixComboBox->currentText(); + rc.sourceSuffix = m_ui.sourceSuffixComboBox->currentText(); + rc.headerSearchPaths = trimmedPaths(m_ui.headerSearchPathsEdit->text()); + rc.sourceSearchPaths = trimmedPaths(m_ui.sourceSearchPathsEdit->text()); + + if (rc == *m_settings) + return; + + *m_settings = rc; + m_settings->toSettings(Core::ICore::settings()); + m_settings->applySuffixesToMimeDB(); + CppToolsPlugin::clearHeaderSourceCache(); } static inline void setComboText(QComboBox *cb, const QString &text, int defaultIndex = 0) @@ -320,14 +343,14 @@ static inline void setComboText(QComboBox *cb, const QString &text, int defaultI void CppFileSettingsWidget::setSettings(const CppFileSettings &s) { const QChar comma = QLatin1Char(','); - m_ui->lowerCaseFileNamesCheckBox->setChecked(s.lowerCaseFiles); - m_ui->headerPragmaOnceCheckBox->setChecked(s.headerPragmaOnce); - m_ui->headerPrefixesEdit->setText(s.headerPrefixes.join(comma)); - m_ui->sourcePrefixesEdit->setText(s.sourcePrefixes.join(comma)); - setComboText(m_ui->headerSuffixComboBox, s.headerSuffix); - setComboText(m_ui->sourceSuffixComboBox, s.sourceSuffix); - m_ui->headerSearchPathsEdit->setText(s.headerSearchPaths.join(comma)); - m_ui->sourceSearchPathsEdit->setText(s.sourceSearchPaths.join(comma)); + m_ui.lowerCaseFileNamesCheckBox->setChecked(s.lowerCaseFiles); + m_ui.headerPragmaOnceCheckBox->setChecked(s.headerPragmaOnce); + m_ui.headerPrefixesEdit->setText(s.headerPrefixes.join(comma)); + m_ui.sourcePrefixesEdit->setText(s.sourcePrefixes.join(comma)); + setComboText(m_ui.headerSuffixComboBox, s.headerSuffix); + setComboText(m_ui.sourceSuffixComboBox, s.sourceSuffix); + m_ui.headerSearchPathsEdit->setText(s.headerSearchPaths.join(comma)); + m_ui.sourceSearchPathsEdit->setText(s.sourceSearchPaths.join(comma)); setLicenseTemplatePath(s.licenseTemplatePath); } @@ -350,39 +373,13 @@ void CppFileSettingsWidget::slotEdit() } // --------------- CppFileSettingsPage -CppFileSettingsPage::CppFileSettingsPage(QSharedPointer &settings) : - m_settings(settings) + +CppFileSettingsPage::CppFileSettingsPage(CppFileSettings *settings) { setId(Constants::CPP_FILE_SETTINGS_ID); setDisplayName(QCoreApplication::translate("CppTools", Constants::CPP_FILE_SETTINGS_NAME)); setCategory(Constants::CPP_SETTINGS_CATEGORY); -} - -QWidget *CppFileSettingsPage::widget() -{ - if (!m_widget) { - m_widget = new CppFileSettingsWidget; - m_widget->setSettings(*m_settings); - } - return m_widget; -} - -void CppFileSettingsPage::apply() -{ - if (m_widget) { - const CppFileSettings newSettings = m_widget->settings(); - if (newSettings != *m_settings) { - *m_settings = newSettings; - m_settings->toSettings(Core::ICore::settings()); - m_settings->applySuffixesToMimeDB(); - CppToolsPlugin::clearHeaderSourceCache(); - } - } -} - -void CppFileSettingsPage::finish() -{ - delete m_widget; + setWidgetCreator([settings] { return new CppFileSettingsWidget(settings); }); } } // namespace Internal diff --git a/src/plugins/cpptools/cppfilesettingspage.h b/src/plugins/cpptools/cppfilesettingspage.h index 4a88e5af5e4..4fb2db74b9a 100644 --- a/src/plugins/cpptools/cppfilesettingspage.h +++ b/src/plugins/cpptools/cppfilesettingspage.h @@ -27,10 +27,6 @@ #include -#include -#include -#include - QT_BEGIN_NAMESPACE class QSettings; QT_END_NAMESPACE @@ -38,8 +34,6 @@ QT_END_NAMESPACE namespace CppTools { namespace Internal { -namespace Ui { class CppFileSettingsPage; } - struct CppFileSettings { QStringList headerPrefixes; @@ -65,37 +59,10 @@ struct CppFileSettings bool operator!=(const CppFileSettings &s) const { return !equals(s); } }; -class CppFileSettingsWidget : public QWidget -{ - Q_OBJECT - -public: - CppFileSettingsWidget(); - ~CppFileSettingsWidget() override; - - CppFileSettings settings() const; - void setSettings(const CppFileSettings &s); - -private: - void slotEdit(); - QString licenseTemplatePath() const; - void setLicenseTemplatePath(const QString &); - - Ui::CppFileSettingsPage *m_ui; -}; - class CppFileSettingsPage : public Core::IOptionsPage { public: - explicit CppFileSettingsPage(QSharedPointer &settings); - - QWidget *widget() override; - void apply() override; - void finish() override; - -private: - const QSharedPointer m_settings; - QPointer m_widget; + explicit CppFileSettingsPage(CppFileSettings *settings); }; } // namespace Internal diff --git a/src/plugins/cpptools/cppheadersource_test.cpp b/src/plugins/cpptools/cppheadersource_test.cpp index 46994ed1f77..37244f4fba2 100644 --- a/src/plugins/cpptools/cppheadersource_test.cpp +++ b/src/plugins/cpptools/cppheadersource_test.cpp @@ -89,23 +89,25 @@ void CppToolsPlugin::test_headersource_data() void CppToolsPlugin::initTestCase() { QDir(baseTestDir()).mkpath(_(".")); - m_fileSettings->headerSearchPaths.append(QLatin1String("include")); - m_fileSettings->headerSearchPaths.append(QLatin1String("../include")); - m_fileSettings->sourceSearchPaths.append(QLatin1String("src")); - m_fileSettings->sourceSearchPaths.append(QLatin1String("../src")); - m_fileSettings->headerPrefixes.append(QLatin1String("testh_")); - m_fileSettings->sourcePrefixes.append(QLatin1String("testc_")); + CppFileSettings *fs = fileSettings(); + fs->headerSearchPaths.append(QLatin1String("include")); + fs->headerSearchPaths.append(QLatin1String("../include")); + fs->sourceSearchPaths.append(QLatin1String("src")); + fs->sourceSearchPaths.append(QLatin1String("../src")); + fs->headerPrefixes.append(QLatin1String("testh_")); + fs->sourcePrefixes.append(QLatin1String("testc_")); } void CppToolsPlugin::cleanupTestCase() { Utils::FileUtils::removeRecursively(Utils::FilePath::fromString(baseTestDir())); - m_fileSettings->headerSearchPaths.removeLast(); - m_fileSettings->headerSearchPaths.removeLast(); - m_fileSettings->sourceSearchPaths.removeLast(); - m_fileSettings->sourceSearchPaths.removeLast(); - m_fileSettings->headerPrefixes.removeLast(); - m_fileSettings->sourcePrefixes.removeLast(); + CppFileSettings *fs = fileSettings(); + fs->headerSearchPaths.removeLast(); + fs->headerSearchPaths.removeLast(); + fs->sourceSearchPaths.removeLast(); + fs->sourceSearchPaths.removeLast(); + fs->headerPrefixes.removeLast(); + fs->sourcePrefixes.removeLast(); } } // namespace Internal diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp index 98a476569ae..401086ec54e 100644 --- a/src/plugins/cpptools/cpptoolsplugin.cpp +++ b/src/plugins/cpptools/cpptoolsplugin.cpp @@ -86,14 +86,12 @@ public: CppModelManager::createCppModelManager(m_instance); m_settings = new CppToolsSettings(m_instance); // force registration of cpp tools settings m_codeModelSettings.fromSettings(ICore::settings()); - m_cppFileSettingsPage = new CppFileSettingsPage(m_instance->m_fileSettings); m_cppCodeStyleSettingsPage = new CppCodeStyleSettingsPage; } ~CppToolsPluginPrivate() { StringTable::destroy(); - delete m_cppFileSettingsPage; if (m_cppCodeStyleSettingsPage) delete m_cppCodeStyleSettingsPage; ExtensionSystem::PluginManager::removeObject(&m_cppProjectUpdaterFactory); @@ -101,14 +99,14 @@ public: CppCodeModelSettings m_codeModelSettings; CppToolsSettings *m_settings = nullptr; - CppFileSettingsPage *m_cppFileSettingsPage = nullptr; + CppFileSettings m_fileSettings; + CppFileSettingsPage m_cppFileSettingsPage{&m_fileSettings}; CppCodeModelSettingsPage m_cppCodeModelSettingsPage{&m_codeModelSettings}; QPointer m_cppCodeStyleSettingsPage = nullptr; CppProjectUpdaterFactory m_cppProjectUpdaterFactory; }; CppToolsPlugin::CppToolsPlugin() - : m_fileSettings(new CppFileSettings) { m_instance = this; CppToolsBridge::setCppToolsBridgeImplementation(std::make_unique()); @@ -133,37 +131,37 @@ void CppToolsPlugin::clearHeaderSourceCache() Utils::FilePath CppToolsPlugin::licenseTemplatePath() { - return Utils::FilePath::fromString(m_instance->m_fileSettings->licenseTemplatePath); + return Utils::FilePath::fromString(m_instance->d->m_fileSettings.licenseTemplatePath); } QString CppToolsPlugin::licenseTemplate() { - return m_instance->m_fileSettings->licenseTemplate(); + return m_instance->d->m_fileSettings.licenseTemplate(); } bool CppToolsPlugin::usePragmaOnce() { - return m_instance->m_fileSettings->headerPragmaOnce; + return m_instance->d->m_fileSettings.headerPragmaOnce; } const QStringList &CppToolsPlugin::headerSearchPaths() { - return m_instance->m_fileSettings->headerSearchPaths; + return m_instance->d->m_fileSettings.headerSearchPaths; } const QStringList &CppToolsPlugin::sourceSearchPaths() { - return m_instance->m_fileSettings->sourceSearchPaths; + return m_instance->d->m_fileSettings.sourceSearchPaths; } const QStringList &CppToolsPlugin::headerPrefixes() { - return m_instance->m_fileSettings->headerPrefixes; + return m_instance->d->m_fileSettings.headerPrefixes; } const QStringList &CppToolsPlugin::sourcePrefixes() { - return m_instance->m_fileSettings->sourcePrefixes; + return m_instance->d->m_fileSettings.sourcePrefixes; } bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) @@ -223,8 +221,8 @@ void CppToolsPlugin::extensionsInitialized() { // The Cpp editor plugin, which is loaded later on, registers the Cpp mime types, // so, apply settings here - m_instance->m_fileSettings->fromSettings(ICore::settings()); - if (!m_instance->m_fileSettings->applySuffixesToMimeDB()) + d->m_fileSettings.fromSettings(ICore::settings()); + if (!d->m_fileSettings.applySuffixesToMimeDB()) qWarning("Unable to apply cpp suffixes to mime database (cpp mime types not found).\n"); } @@ -233,6 +231,11 @@ CppCodeModelSettings *CppToolsPlugin::codeModelSettings() return &d->m_codeModelSettings; } +CppFileSettings *CppToolsPlugin::fileSettings() +{ + return &d->m_fileSettings; +} + void CppToolsPlugin::switchHeaderSource() { CppTools::switchHeaderSource(); diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 6e82228fa7e..24f981d15f3 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -29,24 +29,15 @@ #include -#include - -QT_BEGIN_NAMESPACE -class QFileInfo; -class QDir; -QT_END_NAMESPACE - namespace Utils { class FilePath; } namespace CppTools { -class CppToolsSettings; class CppCodeModelSettings; namespace Internal { struct CppFileSettings; -class CppToolsPluginPrivate; class CppToolsPlugin final : public ExtensionSystem::IPlugin { @@ -180,9 +171,8 @@ private slots: #endif private: - friend class CppToolsPluginPrivate; - CppToolsPluginPrivate *d = nullptr; - QSharedPointer m_fileSettings; + CppFileSettings *fileSettings(); + class CppToolsPluginPrivate *d = nullptr; }; } // namespace Internal