diff --git a/plugins/appwizard/projectvcspage.cpp b/plugins/appwizard/projectvcspage.cpp index 308359cc05..d0ac291206 100644 --- a/plugins/appwizard/projectvcspage.cpp +++ b/plugins/appwizard/projectvcspage.cpp @@ -1,154 +1,163 @@ /*************************************************************************** * This file is part of KDevelop * * Copyright 2007 Andreas Pakulat * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 2 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "projectvcspage.h" #include "ui_projectvcspage.h" #include #include #include #include #include #include #include using namespace KDevelop; ProjectVcsPage::ProjectVcsPage( KDevelop::IPluginController* controller, QWidget * parent ) - : AppWizardPageWidget( parent ), m_ui( new Ui::ProjectVcsPage ) + : AppWizardPageWidget(parent) + , m_currentImportWidget(nullptr) + , m_ui(new Ui::ProjectVcsPage) { m_ui->setupUi( this ); QList vcsplugins = controller->allPluginsForExtension ( QStringLiteral("org.kdevelop.IBasicVersionControl") ); int idx = 1; m_ui->vcsImportOptions->insertWidget( 0, new QWidget(this) ); m_ui->vcsTypes->insertItem( 0, i18nc("No Version Control Support chosen", "None") ); foreach( KDevelop::IPlugin* plugin, vcsplugins ) { KDevelop::IBasicVersionControl* iface = plugin->extension(); if( iface ) { KDevelop::VcsImportMetadataWidget* widget = iface->createImportMetadataWidget( m_ui->vcsImportOptions ); if( widget ) { widget->setSourceLocationEditable( false ); widget->setUseSourceDirForDestination( true ); m_ui->vcsTypes->insertItem( idx, iface->name() ); importWidgets.push_back( widget ); vcsPlugins.push_back( qMakePair( controller->pluginInfo( plugin ).pluginId(), iface->name() ) ); m_ui->vcsImportOptions->insertWidget( idx, widget ); idx++; } } } connect( m_ui->vcsTypes, static_cast(&KComboBox::activated), m_ui->vcsImportOptions, &QStackedWidget::setCurrentIndex ); connect( m_ui->vcsTypes, static_cast(&KComboBox::activated), this, &ProjectVcsPage::vcsTypeChanged ); - validateData(); + vcsTypeChanged(m_ui->vcsTypes->currentIndex()); } void ProjectVcsPage::vcsTypeChanged( int idx ) { + if (m_currentImportWidget) { + disconnect(m_currentImportWidget, &VcsImportMetadataWidget::changed, this, &ProjectVcsPage::validateData); + } + + // first type in list is "no vcs", without an import widget + const int widgetIndex = idx - 1; + m_currentImportWidget = importWidgets.value(widgetIndex); + validateData(); - int widgetidx = idx - 1; - disconnect( this, static_cast(nullptr), this, &ProjectVcsPage::validateData ); - if ( widgetidx < 0 || widgetidx >= importWidgets.size()) - return; - connect( importWidgets[widgetidx], &VcsImportMetadataWidget::changed, this, &ProjectVcsPage::validateData ); + + if (m_currentImportWidget) { + connect(m_currentImportWidget, &VcsImportMetadataWidget::changed, this, &ProjectVcsPage::validateData); + } } void ProjectVcsPage::validateData() { if( shouldContinue() ) { emit valid(); } else { emit invalid(); } } ProjectVcsPage::~ProjectVcsPage( ) { delete m_ui; } void ProjectVcsPage::setSourceLocation( const QUrl& s ) { foreach(KDevelop::VcsImportMetadataWidget* widget, importWidgets) { widget->setSourceLocation( KDevelop::VcsLocation( s ) ); } } QString ProjectVcsPage::pluginName() const { int idx = m_ui->vcsTypes->currentIndex() - 1; if ( idx < 0 || idx >= vcsPlugins.size()) return QString(); // FIXME: Two return statements return vcsPlugins[idx].first; } QString ProjectVcsPage::commitMessage() const { int idx = m_ui->vcsTypes->currentIndex() - 1; if ( idx < 0 || idx >= importWidgets.size()) return QString(); return importWidgets[idx]->message(); } QUrl ProjectVcsPage::source() const { int idx = m_ui->vcsTypes->currentIndex() - 1; if ( idx < 0 || idx >= importWidgets.size()) return QUrl(); return importWidgets[idx]->source(); } KDevelop::VcsLocation ProjectVcsPage::destination() const { int idx = m_ui->vcsTypes->currentIndex() - 1; if ( idx < 0 || idx >= importWidgets.size()) return KDevelop::VcsLocation(); return importWidgets[idx]->destination(); } bool ProjectVcsPage::shouldContinue() { int idx = m_ui->vcsTypes->currentIndex() - 1; if ( idx < 0 || idx >= importWidgets.size()) return true; KDevelop::VcsImportMetadataWidget* widget = importWidgets[idx]; return widget->hasValidData(); } diff --git a/plugins/appwizard/projectvcspage.h b/plugins/appwizard/projectvcspage.h index c95b861678..3d0eace7e2 100644 --- a/plugins/appwizard/projectvcspage.h +++ b/plugins/appwizard/projectvcspage.h @@ -1,69 +1,70 @@ /*************************************************************************** * This file is part of KDevelop * * Copyright 2007 Andreas Pakulat * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 2 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef KDEVPLATFORM_PLUGIN_PROJECTVCSPAGE_H #define KDEVPLATFORM_PLUGIN_PROJECTVCSPAGE_H #include #include "appwizardpagewidget.h" #include namespace Ui { class ProjectVcsPage; } namespace KDevelop { class IPluginController; class VcsImportMetadataWidget; } class QUrl; class ProjectVcsPage : public AppWizardPageWidget { Q_OBJECT public: explicit ProjectVcsPage( KDevelop::IPluginController*, QWidget* parent = nullptr ); ~ProjectVcsPage() override; bool shouldContinue() override; signals: void valid(); void invalid(); public slots: void setSourceLocation( const QUrl& ); void vcsTypeChanged(int); void validateData(); public: QString pluginName() const; QUrl source() const; KDevelop::VcsLocation destination() const; QString commitMessage() const; private: QList importWidgets; + KDevelop::VcsImportMetadataWidget* m_currentImportWidget; QList > vcsPlugins; Ui::ProjectVcsPage* m_ui; }; #endif //kate: space-indent on; indent-width 4; replace-tabs on; auto-insert-doxygen on; indent-mode cstyle;