diff --git a/src/plugins/coco/cocobuildstep.cpp b/src/plugins/coco/cocobuildstep.cpp index dea41c52dee..941cbe7237f 100644 --- a/src/plugins/coco/cocobuildstep.cpp +++ b/src/plugins/coco/cocobuildstep.cpp @@ -97,8 +97,7 @@ QWidget *CocoBuildStep::createConfigWidget() void CocoBuildStep::updateDisplay() { - CocoInstallation coco; - if (!coco.isValid()) { + if (!cocoSettings().isValid()) { setSummaryText("" + Tr::tr("Coco Code Coverage: No working Coco installation") + ""); emit setButtonState(false); return; diff --git a/src/plugins/coco/cocoplugin.cpp b/src/plugins/coco/cocoplugin.cpp index 4162fc5a8af..e499efba2db 100644 --- a/src/plugins/coco/cocoplugin.cpp +++ b/src/plugins/coco/cocoplugin.cpp @@ -61,8 +61,7 @@ public: m_client->shutdown(); m_client = nullptr; - CocoInstallation coco; - if (coco.isValid()) { + if (cocoSettings().isValid()) { QDialog dialog(ICore::dialogParent()); dialog.setModal(true); auto layout = new QFormLayout(); @@ -83,7 +82,7 @@ public: QObject::connect(&buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); if (dialog.exec() == QDialog::Accepted) { - const FilePath cocoPath = coco.coverageBrowserPath(); + const FilePath cocoPath = cocoSettings().coverageBrowserPath(); const FilePath csmesPath = csmesChoser.filePath(); if (cocoPath.isExecutableFile() && csmesPath.exists()) { m_client = new CocoLanguageClient(cocoPath, csmesPath); @@ -117,7 +116,7 @@ void CocoPlugin::initialize() QCoreApplication::translate("Coco", "Coco"), ":/cocoplugin/images/SquishCoco_48x48.png"); - GlobalSettings::read(); + cocoSettings().read(); GlobalSettingsPage::instance().widget(); setupCocoProjectPanel(); diff --git a/src/plugins/coco/cocoprojectwidget.cpp b/src/plugins/coco/cocoprojectwidget.cpp index 88b0d78e321..9d101875c7c 100644 --- a/src/plugins/coco/cocoprojectwidget.cpp +++ b/src/plugins/coco/cocoprojectwidget.cpp @@ -105,11 +105,11 @@ void CocoProjectWidget::reloadSettings() setState(configDone); displayChanges(); - const bool valid = m_coco.isValid(); + const bool valid = cocoSettings().isValid(); m_configerrorLabel.setVisible(!valid); if (!valid) { m_configerrorLabel.setText( - Tr::tr("Coco is not installed correctly: \"%1\"").arg(m_coco.errorMessage())); + Tr::tr("Coco is not installed correctly: \"%1\"").arg(cocoSettings().errorMessage())); } } @@ -232,7 +232,7 @@ void Internal::CocoProjectWidget::onCoverageGroupBoxClicked() return; } - if (!m_coco.isValid()) { + if (!cocoSettings().isValid()) { m_coverageGroupBoxEnabled.setValue(false, Utils::BaseAspect::BeQuiet); QMessageBox box; @@ -245,7 +245,7 @@ void Internal::CocoProjectWidget::onCoverageGroupBoxClicked() if (box.clickedButton() == editButton) Core::ICore::showOptionsDialog(Constants::COCO_SETTINGS_PAGE_ID); - m_coverageGroupBoxEnabled.setValue(m_coco.isValid(), Utils::BaseAspect::BeQuiet); + m_coverageGroupBoxEnabled.setValue(cocoSettings().isValid(), Utils::BaseAspect::BeQuiet); } else m_buildSettings->setCoverage(checked); diff --git a/src/plugins/coco/cocoprojectwidget.h b/src/plugins/coco/cocoprojectwidget.h index ccc04fddc5d..30efb7e09eb 100644 --- a/src/plugins/coco/cocoprojectwidget.h +++ b/src/plugins/coco/cocoprojectwidget.h @@ -4,7 +4,6 @@ #pragma once #include "buildsettings.h" -#include "globalsettings.h" #include #include @@ -75,7 +74,6 @@ private: QString m_selectionDirectory; ConfigurationState m_configState = configDone; QString m_buildConfigurationName; - CocoInstallation m_coco; }; } // namespace Coco::Internal diff --git a/src/plugins/coco/cocoqmakesettings.cpp b/src/plugins/coco/cocoqmakesettings.cpp index 61115a8c01d..35012262802 100644 --- a/src/plugins/coco/cocoqmakesettings.cpp +++ b/src/plugins/coco/cocoqmakesettings.cpp @@ -50,7 +50,6 @@ private: bool cocoPathValid() const; QMakeFeatureFile m_featureFile; - CocoInstallation m_coco; }; void CocoQMakeSettings::read() @@ -179,7 +178,7 @@ void CocoQMakeSettings::write(const QString &options, const QString &tweaks) QString CocoQMakeSettings::pathAssignment() const { - return pathAssignmentPrefix + m_coco.directory().toUserOutput(); + return pathAssignmentPrefix + cocoSettings().directory().toUserOutput(); } bool CocoQMakeSettings::cocoPathValid() const diff --git a/src/plugins/coco/globalsettings.cpp b/src/plugins/coco/globalsettings.cpp index 7a83e3309c0..7a85e35ab4f 100644 --- a/src/plugins/coco/globalsettings.cpp +++ b/src/plugins/coco/globalsettings.cpp @@ -20,23 +20,34 @@ #include #include +using namespace Utils; + namespace Coco::Internal { -namespace GlobalSettings { static const char DIRECTORY[] = "CocoDirectory"; -void read() +CocoSettings &cocoSettings() +{ + static CocoSettings theCocoSettings; + return theCocoSettings; +} + +CocoSettings::CocoSettings() +{ + m_errorMessage = Tr::tr("Error: Coco installation directory not set. (This can't happen.)"); +} + +void CocoSettings::read() { - CocoInstallation coco; bool directoryInSettings = false; - Utils::QtcSettings *s = Core::ICore::settings(); + QtcSettings *s = Core::ICore::settings(); s->beginGroup(Constants::COCO_SETTINGS_GROUP); const QStringList keys = s->allKeys(); for (const QString &keyString : keys) { - Utils::Key key(keyString.toLatin1()); + Key key(keyString.toLatin1()); if (key == DIRECTORY) { - coco.setDirectory(Utils::FilePath::fromUserInput(s->value(key).toString())); + setDirectory(FilePath::fromUserInput(s->value(key).toString())); directoryInSettings = true; } else s->remove(key); @@ -44,74 +55,56 @@ void read() s->endGroup(); if (!directoryInSettings) - coco.findDefaultDirectory(); + findDefaultDirectory(); - GlobalSettings::save(); + save(); } -void save() +void CocoSettings::save() { - Utils::QtcSettings *s = Core::ICore::settings(); + QtcSettings *s = Core::ICore::settings(); s->beginGroup(Constants::COCO_SETTINGS_GROUP); - s->setValue(DIRECTORY, CocoInstallation().directory().toUserOutput()); + s->setValue(DIRECTORY, directory().toUserOutput()); s->endGroup(); } -} // namespace GlobalSettings - -struct CocoInstallationPrivate +FilePath CocoSettings::directory() const { - Utils::FilePath cocoPath; - bool isValid = false; - QString errorMessage = Tr::tr("Error: Coco installation directory not set. (This can't happen.)"); -}; - -CocoInstallationPrivate *CocoInstallation::d = nullptr; - -CocoInstallation::CocoInstallation() -{ - if (!d) - d = new CocoInstallationPrivate; + return m_cocoPath; } -Utils::FilePath CocoInstallation::directory() const -{ - return d->cocoPath; -} - -Utils::FilePath CocoInstallation::coverageBrowserPath() const +FilePath CocoSettings::coverageBrowserPath() const { QString browserPath; - if (Utils::HostOsInfo::isAnyUnixHost() || Utils::HostOsInfo::isMacHost()) + if (HostOsInfo::isAnyUnixHost() || HostOsInfo::isMacHost()) browserPath = "bin/coveragebrowser"; else browserPath = "coveragebrowser.exe"; - return d->cocoPath.resolvePath(browserPath); + return m_cocoPath.resolvePath(browserPath); } -void CocoInstallation::setDirectory(const Utils::FilePath &dir) +void CocoSettings::setDirectory(const FilePath &dir) { if (isCocoDirectory(dir)) { - d->cocoPath = dir; - d->isValid = true; - d->errorMessage = ""; + m_cocoPath = dir; + m_isValid = true; + m_errorMessage.clear(); verifyCocoDirectory(); - } - else { - d->cocoPath = Utils::FilePath(); - d->isValid = false; - d->errorMessage + } else { + m_cocoPath = Utils::FilePath(); + m_isValid = false; + m_errorMessage = Tr::tr("Error: Coco installation directory not found at \"%1\".").arg(dir.nativePath()); } } -Utils::FilePath CocoInstallation::coverageScannerPath(const Utils::FilePath &cocoDir) const +FilePath CocoSettings::coverageScannerPath(const FilePath &cocoDir) const { QString scannerPath; - if (Utils::HostOsInfo::isAnyUnixHost() || Utils::HostOsInfo::isMacHost()) + if (HostOsInfo::isAnyUnixHost() || HostOsInfo::isMacHost()) scannerPath = "bin/coveragescanner"; else scannerPath = "coveragescanner.exe"; @@ -119,21 +112,21 @@ Utils::FilePath CocoInstallation::coverageScannerPath(const Utils::FilePath &coc return cocoDir.resolvePath(scannerPath); } -bool CocoInstallation::isCocoDirectory(const Utils::FilePath &cocoDir) const +bool CocoSettings::isCocoDirectory(const Utils::FilePath &cocoDir) const { return coverageScannerPath(cocoDir).exists(); } -void CocoInstallation::logError(const QString &msg) +void CocoSettings::logError(const QString &msg) { logFlashing(msg); - d->isValid = false; - d->errorMessage = msg; + m_isValid = false; + m_errorMessage = msg; } -bool CocoInstallation::verifyCocoDirectory() +bool CocoSettings::verifyCocoDirectory() { - QString coveragescanner = coverageScannerPath(d->cocoPath).nativePath(); + QString coveragescanner = coverageScannerPath(m_cocoPath).nativePath(); QProcess proc; proc.setProgram(coveragescanner); @@ -170,19 +163,19 @@ bool CocoInstallation::verifyCocoDirectory() } } -bool CocoInstallation::isValid() const +bool CocoSettings::isValid() const { - return d->isValid; + return m_isValid; } -QString CocoInstallation::errorMessage() const +QString CocoSettings::errorMessage() const { - return d->errorMessage; + return m_errorMessage; } -void CocoInstallation::tryPath(const QString &path) +void CocoSettings::tryPath(const QString &path) { - if (d->isValid) + if (m_isValid) return; const auto fpath = Utils::FilePath::fromString(path); @@ -190,17 +183,18 @@ void CocoInstallation::tryPath(const QString &path) if (isCocoDirectory(fpath)) { logSilently(Tr::tr("Found Coco directory \"%1\".").arg(nativePath)); setDirectory(fpath); - GlobalSettings::save(); - } else + save(); + } else { logSilently(Tr::tr("Checked Coco directory \"%1\".").arg(nativePath)); + } } -QString CocoInstallation::envVar(const QString &var) const +QString CocoSettings::envVar(const QString &var) const { return QProcessEnvironment::systemEnvironment().value(var); } -void CocoInstallation::findDefaultDirectory() +void CocoSettings::findDefaultDirectory() { if (Utils::HostOsInfo::isMacHost()) tryPath("/Applications/SquishCoco"); @@ -216,10 +210,11 @@ void CocoInstallation::findDefaultDirectory() tryPath(envVar("ProgramFiles(x86)") + "\\squishcoco"); } } + GlobalSettingsWidget::GlobalSettingsWidget(QFrame *parent) : QFrame(parent) { - m_cocoPathAspect.setDefaultPathValue(m_coco.directory()); + m_cocoPathAspect.setDefaultPathValue(cocoSettings().directory()); m_cocoPathAspect.setExpectedKind(Utils::PathChooser::ExistingDirectory); m_cocoPathAspect.setPromptDialogTitle(Tr::tr("Coco Installation Directory")); @@ -245,13 +240,13 @@ void GlobalSettingsWidget::onCocoPathChanged() bool GlobalSettingsWidget::verifyCocoDirectory(const Utils::FilePath &cocoDir) { - m_coco.setDirectory(cocoDir); - m_messageLabel.setText(m_coco.errorMessage()); - if (m_coco.isValid()) + cocoSettings().setDirectory(cocoDir); + m_messageLabel.setText(cocoSettings().errorMessage()); + if (cocoSettings().isValid()) m_messageLabel.setIconType(Utils::InfoLabel::None); else m_messageLabel.setIconType(Utils::InfoLabel::Error); - return m_coco.isValid(); + return cocoSettings().isValid(); } void GlobalSettingsWidget::apply() @@ -259,21 +254,21 @@ void GlobalSettingsWidget::apply() if (!verifyCocoDirectory(widgetCocoDir())) return; - m_coco.setDirectory(widgetCocoDir()); - GlobalSettings::save(); + cocoSettings().setDirectory(widgetCocoDir()); + cocoSettings().save(); emit updateCocoDir(); } void GlobalSettingsWidget::cancel() { - m_coco.setDirectory(m_previousCocoDir); + cocoSettings().setDirectory(m_previousCocoDir); } void GlobalSettingsWidget::setVisible(bool visible) { QFrame::setVisible(visible); - m_previousCocoDir = m_coco.directory(); + m_previousCocoDir = cocoSettings().directory(); } Utils::FilePath GlobalSettingsWidget::widgetCocoDir() const diff --git a/src/plugins/coco/globalsettings.h b/src/plugins/coco/globalsettings.h index ce682e857e6..568d1400792 100644 --- a/src/plugins/coco/globalsettings.h +++ b/src/plugins/coco/globalsettings.h @@ -8,20 +8,15 @@ #include namespace Coco::Internal { -namespace GlobalSettings { -void read(); -void save(); - -} // GlobalSettings - -struct CocoInstallationPrivate; - -// Borg pattern: There are many instances of this class, but all are the same. -class CocoInstallation +class CocoSettings { + friend CocoSettings &cocoSettings(); + CocoSettings(); + public: - CocoInstallation(); + void read(); + void save(); Utils::FilePath directory() const; Utils::FilePath coverageBrowserPath() const; @@ -39,9 +34,13 @@ private: void tryPath(const QString &path); QString envVar(const QString &var) const; - static CocoInstallationPrivate *d; + Utils::FilePath m_cocoPath; + bool m_isValid = false; + QString m_errorMessage; }; +CocoSettings &cocoSettings(); + class GlobalSettingsWidget : public QFrame { Q_OBJECT @@ -67,7 +66,6 @@ private: Utils::FilePathAspect m_cocoPathAspect; Utils::TextDisplay m_messageLabel; - CocoInstallation m_coco; Utils::FilePath m_previousCocoDir; };