File indexing completed on 2024-04-28 04:38:24

0001 /*
0002     SPDX-FileCopyrightText: 2010 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-or-later
0005 */
0006 
0007 #include "configwidget.h"
0008 
0009 #include <KLocalizedString>
0010 #include <KLineEdit>
0011 #include <QAction>
0012 
0013 #include "ui_configwidget.h"
0014 #include <interfaces/iproject.h>
0015 
0016 using namespace KDevelop;
0017 
0018 ConfigWidget::ConfigWidget( QWidget* parent )
0019     : QWidget ( parent ), ui( new Ui::ConfigWidget )
0020 {
0021     ui->setupUi( this );
0022 
0023     ui->buildDir->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly);
0024 
0025     ui->buildAction->insertItem( CustomBuildSystemTool::Build, i18nc("@item:inlistbox build action", "Build"), QVariant() );
0026     ui->buildAction->insertItem( CustomBuildSystemTool::Configure, i18nc("@item:inlistbox build action", "Configure"), QVariant() );
0027     ui->buildAction->insertItem( CustomBuildSystemTool::Install, i18nc("@item:inlistbox build action", "Install"), QVariant() );
0028     ui->buildAction->insertItem( CustomBuildSystemTool::Clean, i18nc("@item:inlistbox build action", "Clean"), QVariant() );
0029     ui->buildAction->insertItem( CustomBuildSystemTool::Prune, i18nc("@item:inlistbox build action", "Prune"), QVariant() );
0030 
0031     connect( ui->buildAction, QOverload<int>::of(&KComboBox::activated), this, &ConfigWidget::changeAction );
0032 
0033     connect( ui->enableAction, &QCheckBox::toggled, this, &ConfigWidget::toggleActionEnablement );
0034     connect( ui->actionArguments, &QLineEdit::textEdited, this, &ConfigWidget::actionArgumentsEdited );
0035     connect( ui->actionEnvironment, &EnvironmentSelectionWidget::currentProfileChanged, this, &ConfigWidget::actionEnvironmentChanged );
0036     connect( ui->buildDir, &KUrlRequester::urlSelected, this, QOverload<>::of(&ConfigWidget::changed) );
0037     connect( ui->buildDir->lineEdit(), &KLineEdit::textEdited, this, QOverload<>::of(&ConfigWidget::changed) );
0038     connect( ui->actionExecutable, &KUrlRequester::urlSelected, this, QOverload<const QUrl&>::of(&ConfigWidget::actionExecutableChanged) );
0039     connect( ui->actionExecutable->lineEdit(), &KLineEdit::textEdited, this, QOverload<const QString&>::of(&ConfigWidget::actionExecutableChanged) );
0040 }
0041 
0042 CustomBuildSystemConfig ConfigWidget::config() const
0043 {
0044     CustomBuildSystemConfig c;
0045     c.buildDir = ui->buildDir->url();
0046     c.tools = m_tools;
0047     return c;
0048 }
0049 
0050 void ConfigWidget::loadConfig(const CustomBuildSystemConfig& cfg)
0051 {
0052     bool b = blockSignals( true );
0053     clear();
0054     ui->buildDir->setUrl( cfg.buildDir );
0055     m_tools = cfg.tools;
0056     blockSignals( b );
0057     changeAction( ui->buildAction->currentIndex() );
0058     m_tools = cfg.tools;
0059 }
0060 
0061 void ConfigWidget::setTool(const CustomBuildSystemTool& tool)
0062 {
0063     bool b = ui->enableAction->blockSignals( true );
0064     ui->enableAction->setChecked( tool.enabled );
0065     ui->enableAction->blockSignals( b );
0066 
0067     ui->actionArguments->setText( tool.arguments );
0068     ui->actionArguments->setEnabled( tool.enabled );
0069     ui->actionExecutable->setUrl( tool.executable );
0070     ui->actionExecutable->setEnabled( tool.enabled );
0071     ui->actionEnvironment->setCurrentProfile( tool.envGrp );
0072     ui->actionEnvironment->setEnabled( tool.enabled );
0073     ui->execLabel->setEnabled( tool.enabled );
0074     ui->argLabel->setEnabled( tool.enabled );
0075     ui->envLabel->setEnabled( tool.enabled );
0076 }
0077 
0078 void ConfigWidget::changeAction( int idx )
0079 {
0080     if (idx < 0 || idx >= m_tools.count() ) {
0081         CustomBuildSystemTool emptyTool;
0082         emptyTool.type = CustomBuildSystemTool::Build;
0083         emptyTool.enabled = false;
0084         setTool(emptyTool);
0085     } else {
0086         // create copy to avoid crash, see https://bugs.kde.org/show_bug.cgi?id=335470
0087         const CustomBuildSystemTool selectedTool = m_tools[idx];
0088         setTool(selectedTool);
0089     }
0090 }
0091 
0092 void ConfigWidget::toggleActionEnablement( bool enable )
0093 {
0094     applyChange([=] (CustomBuildSystemTool* tool) {
0095         tool->enabled = enable;
0096     });
0097 }
0098 
0099 void ConfigWidget::actionArgumentsEdited( const QString& txt )
0100 {
0101     applyChange([=] (CustomBuildSystemTool* tool) {
0102         tool->arguments = txt;
0103     });
0104 }
0105 
0106 void ConfigWidget::actionEnvironmentChanged(const QString& profile)
0107 {
0108     applyChange([=] (CustomBuildSystemTool* tool) {
0109         tool->envGrp = profile;
0110     });
0111 }
0112 
0113 void ConfigWidget::actionExecutableChanged( const QUrl &url )
0114 {
0115     applyChange([=] (CustomBuildSystemTool* tool) {
0116         tool->executable = url;
0117     });
0118 }
0119 
0120 void ConfigWidget::actionExecutableChanged(const QString& txt )
0121 {
0122     applyChange([=] (CustomBuildSystemTool* tool) {
0123         tool->executable = QUrl::fromLocalFile(txt);
0124     });
0125 }
0126 
0127 void ConfigWidget::clear()
0128 {
0129     ui->buildAction->setCurrentIndex( int( CustomBuildSystemTool::Build ) );
0130     changeAction( ui->buildAction->currentIndex() );
0131     ui->buildDir->setText({});
0132 }
0133 
0134 template<typename F>
0135 void ConfigWidget::applyChange(F toolChanger)
0136 {
0137     const auto idx = ui->buildAction->currentIndex();
0138     if (idx < 0 || idx >= m_tools.count()) {
0139         // happens for the empty tool
0140         return;
0141     }
0142     toolChanger(&m_tools[idx]);
0143     emit changed();
0144 }
0145 
0146 #include "moc_configwidget.cpp"