File indexing completed on 2024-04-28 04:37:20

0001 /*
0002     SPDX-FileCopyrightText: 2008 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "openprojectpage.h"
0008 
0009 #include <QVBoxLayout>
0010 
0011 #include <KDirOperator>
0012 #include <KFileItem>
0013 #include <KFileWidget>
0014 #include <KLocalizedString>
0015 #include <KUrlComboBox>
0016 
0017 #include "shellextension.h"
0018 #include "core.h"
0019 
0020 namespace KDevelop
0021 {
0022 
0023 OpenProjectPage::OpenProjectPage( const QUrl& startUrl, const QStringList& filters,
0024     QWidget* parent )
0025         : QWidget( parent )
0026 {
0027     auto* layout = new QVBoxLayout( this );
0028     layout->setContentsMargins(0, 0, 0, 0);
0029 
0030     fileWidget = new KFileWidget( startUrl, this);
0031 
0032     fileWidget->setFilter(filters.join(QLatin1Char('\n')));
0033 
0034     fileWidget->setMode( KFile::Modes( KFile::File | KFile::Directory | KFile::ExistingOnly ) );
0035 
0036     layout->addWidget( fileWidget );
0037 
0038     KDirOperator* ops = fileWidget->dirOperator();
0039     // Emitted for changes in the places view, the url navigator and when using the back/forward/up buttons
0040     connect(ops, &KDirOperator::urlEntered, this, &OpenProjectPage::opsEntered);
0041 
0042     // Emitted when selecting an entry from the "Name" box or editing in there
0043     connect( fileWidget->locationEdit(), &KUrlComboBox::editTextChanged,
0044              this, &OpenProjectPage::comboTextChanged);
0045 
0046     // Emitted when clicking on a file in the fileview area
0047     connect( fileWidget, &KFileWidget::fileHighlighted, this, &OpenProjectPage::highlightFile );
0048 
0049     connect(fileWidget->dirOperator()->dirLister(), &KDirLister::listingDirCompleted, this, &OpenProjectPage::dirChanged);
0050 
0051     connect( fileWidget, &KFileWidget::accepted, this, &OpenProjectPage::accepted);
0052 }
0053 
0054 QUrl OpenProjectPage::absoluteUrl(const QString& file) const
0055 {
0056     QUrl u(file);
0057     if( u.isRelative() )
0058     {
0059         u = fileWidget->baseUrl().resolved( u );
0060     }
0061     return u;
0062 }
0063 
0064 void OpenProjectPage::setUrl(const QUrl& url)
0065 {
0066     fileWidget->setUrl(url, false);
0067 }
0068 
0069 void OpenProjectPage::dirChanged(const QUrl& /*url*/)
0070 {
0071     if(fileWidget->selectedFiles().isEmpty()) {
0072         const KFileItemList items = fileWidget->dirOperator()->dirLister()->items();
0073         for (const KFileItem& item : items) {
0074             if(item.url().path().endsWith(ShellExtension::getInstance()->projectFileExtension()) && item.isFile()) {
0075                 fileWidget->setSelectedUrl(item.url());
0076             }
0077         }
0078     }
0079 }
0080 
0081 void OpenProjectPage::showEvent(QShowEvent* ev)
0082 {
0083     fileWidget->locationEdit()->setFocus();
0084     QWidget::showEvent(ev);
0085 }
0086 
0087 void OpenProjectPage::highlightFile(const QUrl& file)
0088 {
0089     emit urlSelected(file);
0090 }
0091 
0092 void OpenProjectPage::opsEntered(const QUrl& url)
0093 {
0094     emit urlSelected(url);
0095 }
0096 
0097 void OpenProjectPage::comboTextChanged( const QString& file )
0098 {
0099     emit urlSelected(absoluteUrl(file));
0100 }
0101 
0102 }
0103 
0104 #include "moc_openprojectpage.cpp"