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;
};