diff --git a/src/plugins/haskell/haskellbuildconfiguration.cpp b/src/plugins/haskell/haskellbuildconfiguration.cpp index 18179da5eb4..1434833ff65 100644 --- a/src/plugins/haskell/haskellbuildconfiguration.cpp +++ b/src/plugins/haskell/haskellbuildconfiguration.cpp @@ -6,11 +6,14 @@ #include "haskellconstants.h" #include "haskelltr.h" +#include #include #include +#include #include #include #include + #include #include #include @@ -23,89 +26,107 @@ using namespace ProjectExplorer; -const char C_HASKELL_BUILDCONFIGURATION_ID[] = "Haskell.BuildConfiguration"; +namespace Haskell::Internal { -namespace Haskell { -namespace Internal { - -HaskellBuildConfigurationFactory::HaskellBuildConfigurationFactory() +class HaskellBuildConfiguration final : public BuildConfiguration { - registerBuildConfiguration(C_HASKELL_BUILDCONFIGURATION_ID); - setSupportedProjectType(Constants::C_HASKELL_PROJECT_ID); - setSupportedProjectMimeTypeName(Constants::C_HASKELL_PROJECT_MIMETYPE); +public: + HaskellBuildConfiguration(Target *target, Utils::Id id) + : BuildConfiguration(target, id) + { + setInitializer([this](const BuildInfo &info) { + setBuildDirectory(info.buildDirectory); + setBuildType(info.buildType); + setDisplayName(info.displayName); + }); + appendInitialBuildStep(Constants::C_STACK_BUILD_STEP_ID); + } - setBuildGenerator([](const Kit *k, const Utils::FilePath &projectPath, bool forSetup) { - BuildInfo info; - info.typeName = Tr::tr("Release"); - if (forSetup) { - info.displayName = info.typeName; - info.buildDirectory = projectPath.parentDir().pathAppended(".stack-work"); - } - info.kitId = k->id(); - info.buildType = BuildConfiguration::BuildType::Release; - return QList{info}; - }); -} + NamedWidget *createConfigWidget() final; -HaskellBuildConfiguration::HaskellBuildConfiguration(Target *target, Utils::Id id) - : BuildConfiguration(target, id) + BuildType buildType() const final + { + return m_buildType; + } + + void setBuildType(BuildType type) + { + m_buildType = type; + } + +private: + BuildType m_buildType = BuildType::Release; +}; + +class HaskellBuildConfigurationWidget final : public NamedWidget { - setInitializer([this](const BuildInfo &info) { - setBuildDirectory(info.buildDirectory); - setBuildType(info.buildType); - setDisplayName(info.displayName); - }); - appendInitialBuildStep(Constants::C_STACK_BUILD_STEP_ID); -} +public: + HaskellBuildConfigurationWidget(HaskellBuildConfiguration *bc) + : NamedWidget(Tr::tr("General")) + { + setLayout(new QVBoxLayout); + layout()->setContentsMargins(0, 0, 0, 0); + auto box = new Utils::DetailsWidget; + box->setState(Utils::DetailsWidget::NoSummary); + layout()->addWidget(box); + auto details = new QWidget; + box->setWidget(details); + details->setLayout(new QHBoxLayout); + details->layout()->setContentsMargins(0, 0, 0, 0); + details->layout()->addWidget(new QLabel(Tr::tr("Build directory:"))); + + auto buildDirectoryInput = new Utils::PathChooser; + buildDirectoryInput->setExpectedKind(Utils::PathChooser::Directory); + buildDirectoryInput->setFilePath(bc->buildDirectory()); + details->layout()->addWidget(buildDirectoryInput); + + connect(bc, + &BuildConfiguration::buildDirectoryChanged, + buildDirectoryInput, + [bc, buildDirectoryInput] { + buildDirectoryInput->setFilePath(bc->buildDirectory()); + }); + connect(buildDirectoryInput, + &Utils::PathChooser::textChanged, + bc, + [bc, buildDirectoryInput](const QString &) { + bc->setBuildDirectory(buildDirectoryInput->rawFilePath()); + }); + } +}; NamedWidget *HaskellBuildConfiguration::createConfigWidget() { return new HaskellBuildConfigurationWidget(this); } -BuildConfiguration::BuildType HaskellBuildConfiguration::buildType() const +class HaskellBuildConfigurationFactory final : public BuildConfigurationFactory { - return m_buildType; +public: + HaskellBuildConfigurationFactory() + { + registerBuildConfiguration("Haskell.BuildConfiguration"); + + setSupportedProjectType(Constants::C_HASKELL_PROJECT_ID); + setSupportedProjectMimeTypeName(Constants::C_HASKELL_PROJECT_MIMETYPE); + + setBuildGenerator([](const Kit *k, const Utils::FilePath &projectPath, bool forSetup) { + BuildInfo info; + info.typeName = Tr::tr("Release"); + if (forSetup) { + info.displayName = info.typeName; + info.buildDirectory = projectPath.parentDir().pathAppended(".stack-work"); + } + info.kitId = k->id(); + info.buildType = BuildConfiguration::BuildType::Release; + return QList{info}; + }); + } +}; + +void setupHaskellBuildConfiguration() +{ + static HaskellBuildConfigurationFactory theHaskellBuildConfigurationFactory; } -void HaskellBuildConfiguration::setBuildType(BuildConfiguration::BuildType type) -{ - m_buildType = type; -} - -HaskellBuildConfigurationWidget::HaskellBuildConfigurationWidget(HaskellBuildConfiguration *bc) - : NamedWidget(Tr::tr("General")) - , m_buildConfiguration(bc) -{ - setLayout(new QVBoxLayout); - layout()->setContentsMargins(0, 0, 0, 0); - auto box = new Utils::DetailsWidget; - box->setState(Utils::DetailsWidget::NoSummary); - layout()->addWidget(box); - auto details = new QWidget; - box->setWidget(details); - details->setLayout(new QHBoxLayout); - details->layout()->setContentsMargins(0, 0, 0, 0); - details->layout()->addWidget(new QLabel(Tr::tr("Build directory:"))); - - auto buildDirectoryInput = new Utils::PathChooser; - buildDirectoryInput->setExpectedKind(Utils::PathChooser::Directory); - buildDirectoryInput->setFilePath(m_buildConfiguration->buildDirectory()); - details->layout()->addWidget(buildDirectoryInput); - - connect(m_buildConfiguration, - &BuildConfiguration::buildDirectoryChanged, - buildDirectoryInput, - [this, buildDirectoryInput] { - buildDirectoryInput->setFilePath(m_buildConfiguration->buildDirectory()); - }); - connect(buildDirectoryInput, - &Utils::PathChooser::textChanged, - m_buildConfiguration, - [this, buildDirectoryInput](const QString &) { - m_buildConfiguration->setBuildDirectory(buildDirectoryInput->rawFilePath()); - }); -} - -} // namespace Internal -} // namespace Haskell +} // Haskell::Internal diff --git a/src/plugins/haskell/haskellbuildconfiguration.h b/src/plugins/haskell/haskellbuildconfiguration.h index e8cbc1dbc61..ee6c7065ee6 100644 --- a/src/plugins/haskell/haskellbuildconfiguration.h +++ b/src/plugins/haskell/haskellbuildconfiguration.h @@ -3,43 +3,8 @@ #pragma once -#include -#include +namespace Haskell::Internal { -namespace Haskell { -namespace Internal { +void setupHaskellBuildConfiguration(); -class HaskellBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory -{ -public: - HaskellBuildConfigurationFactory(); -}; - -class HaskellBuildConfiguration : public ProjectExplorer::BuildConfiguration -{ - Q_OBJECT - -public: - HaskellBuildConfiguration(ProjectExplorer::Target *target, Utils::Id id); - - ProjectExplorer::NamedWidget *createConfigWidget() override; - BuildType buildType() const override; - void setBuildType(BuildType type); - -private: - BuildType m_buildType = BuildType::Release; -}; - -class HaskellBuildConfigurationWidget : public ProjectExplorer::NamedWidget -{ - Q_OBJECT - -public: - HaskellBuildConfigurationWidget(HaskellBuildConfiguration *bc); - -private: - HaskellBuildConfiguration *m_buildConfiguration; -}; - -} // namespace Internal -} // namespace Haskell +} // Haskell::Internal diff --git a/src/plugins/haskell/haskellplugin.cpp b/src/plugins/haskell/haskellplugin.cpp index d32165075f8..3b6bebdd289 100644 --- a/src/plugins/haskell/haskellplugin.cpp +++ b/src/plugins/haskell/haskellplugin.cpp @@ -30,7 +30,6 @@ class HaskellPluginPrivate { public: HaskellEditorFactory editorFactory; - HaskellBuildConfigurationFactory buildConfigFactory; HaskellRunConfigurationFactory runConfigFactory; ProjectExplorer::SimpleTargetRunnerFactory runWorkerFactory{{Constants::C_HASKELL_RUNCONFIG_ID}}; }; @@ -59,6 +58,7 @@ private: d = new HaskellPluginPrivate; setupHaskellStackBuildStep(); + setupHaskellBuildConfiguration(); ProjectExplorer::ProjectManager::registerProjectType( Constants::C_HASKELL_PROJECT_MIMETYPE);