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"