diff --git a/shell/openprojectdialog.h b/shell/openprojectdialog.h --- a/shell/openprojectdialog.h +++ b/shell/openprojectdialog.h @@ -57,7 +57,7 @@ void validateSourcePage( bool ); void validateOpenUrl( const QUrl& ); void validateProjectName( const QString& ); - void validateProjectManager( const QString& ); + void validateProjectManager( const QString&, const QString & ); void storeFileList(KIO::Job*, const KIO::UDSEntryList&); void openPageAccepted(); @@ -68,6 +68,7 @@ QUrl m_selected; QString m_projectName; QString m_projectManager; + bool m_urlIsDirectory; /// Used to select files when we aren't in KDE QFileDialog* nativeDialog = nullptr; KPageWidgetItem* sourcePage; diff --git a/shell/openprojectdialog.cpp b/shell/openprojectdialog.cpp --- a/shell/openprojectdialog.cpp +++ b/shell/openprojectdialog.cpp @@ -70,6 +70,7 @@ OpenProjectDialog::OpenProjectDialog( bool fetch, const QUrl& startUrl, QWidget* parent ) : KAssistantDialog( parent ) + , m_urlIsDirectory(false) , sourcePage(nullptr) , openPage(nullptr) , projectInfoPage(nullptr) @@ -208,6 +209,7 @@ if( urlInfo.isDir || urlInfo.extension != ShellExtension::getInstance()->projectFileExtension() ) { + m_urlIsDirectory = urlInfo.isDir; setAppropriate( projectInfoPage, true ); m_url = url; if( !urlInfo.isDir ) { @@ -241,7 +243,7 @@ } Q_FOREACH ( const auto& plugin, plugins ) { auto meta = m_projectPlugins.value(plugin); - choices.append({file + QString(" (%1)").arg(plugin), meta.pluginId(), meta.iconName()}); + choices.append({file + QString(" (%1)").arg(plugin), meta.pluginId(), meta.iconName(), file}); } } Q_FOREACH ( const auto& plugin, m_projectFilters.keys() ) { @@ -258,6 +260,7 @@ } else { setAppropriate( projectInfoPage, false ); m_url = url; + m_urlIsDirectory = false; } validateProjectInfo(); setValid( openPage, true ); @@ -300,9 +303,15 @@ setValid( projectInfoPage, (!projectName().isEmpty() && !projectManager().isEmpty()) ); } -void OpenProjectDialog::validateProjectManager( const QString& manager ) +void OpenProjectDialog::validateProjectManager( const QString& manager, const QString & fileName ) { m_projectManager = manager; + + if ( m_urlIsDirectory ) + { + m_selected = m_url.resolved( QUrl("./" + fileName) ); + } + validateProjectInfo(); } diff --git a/shell/projectinfopage.h b/shell/projectinfopage.h --- a/shell/projectinfopage.h +++ b/shell/projectinfopage.h @@ -17,6 +17,7 @@ QString text; QString pluginId; QString iconName; + QString fileName; }; namespace Ui @@ -37,7 +38,7 @@ void populateProjectFileCombo( const QVector& choices ); signals: void projectNameChanged( const QString& ); - void projectManagerChanged( const QString& ); + void projectManagerChanged( const QString& pluginId, const QString & fileName); private slots: void changeProjectManager( int ); private: diff --git a/shell/projectinfopage.cpp b/shell/projectinfopage.cpp --- a/shell/projectinfopage.cpp +++ b/shell/projectinfopage.cpp @@ -16,6 +16,8 @@ namespace KDevelop { + +const int FileNameRole = Qt::UserRole + 1; ProjectInfoPage::ProjectInfoPage( QWidget* parent ) : QWidget( parent ) @@ -35,7 +37,8 @@ void ProjectInfoPage::changeProjectManager( int idx ) { - emit projectManagerChanged( page_ui->managerCombo->itemData( idx ).toString() ); + emit projectManagerChanged( page_ui->managerCombo->itemData( idx ).toString(), + page_ui->managerCombo->itemData( idx, FileNameRole ).toString() ); } void ProjectInfoPage::setProjectName( const QString& name ) @@ -48,7 +51,9 @@ { page_ui->managerCombo->clear(); Q_FOREACH ( const auto& item, choices ) { + const int index = page_ui->managerCombo->count(); page_ui->managerCombo->addItem(QIcon::fromTheme(item.iconName), item.text, item.pluginId); + page_ui->managerCombo->setItemData( index, item.fileName, FileNameRole ); } changeProjectManager(0); }