QGIS API Documentation 3.41.0-Master (3440c17df1d)
Loading...
Searching...
No Matches
qgsfindfilesbypatternwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsfindfilesbypatternwidget.cpp
3 -----------------------------
4 begin : April 2019
5 copyright : (C) 2019 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17#include "moc_qgsfindfilesbypatternwidget.cpp"
18#include "qgsgui.h"
19#include "qgssettings.h"
20
21#include <QDir>
22#include <QDirIterator>
23#include <QDialogButtonBox>
24
25
27 : QWidget( parent )
28{
29 setupUi( this );
30
31 mFolderWidget->setStorageMode( QgsFileWidget::GetDirectory );
32 mResultsTable->setColumnCount( 2 );
33
34 mResultsTable->setHorizontalHeaderLabels( QStringList() << tr( "File" ) << tr( "Directory" ) );
35 mResultsTable->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Stretch );
36 mResultsTable->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
37
38 connect( mFindButton, &QPushButton::clicked, this, &QgsFindFilesByPatternWidget::find );
39
40 const QgsSettings settings;
41 mFolderWidget->setFilePath( settings.value( QStringLiteral( "qgis/lastFindRecursiveFolder" ) ).toString() );
42 mFindButton->setEnabled( !mFolderWidget->filePath().isEmpty() );
43 connect( mFolderWidget, &QgsFileWidget::fileChanged, this, [ = ]( const QString & filePath )
44 {
45 QgsSettings settings;
46 settings.setValue( QStringLiteral( "qgis/lastFindRecursiveFolder" ), filePath );
47 mFindButton->setEnabled( !filePath.isEmpty() );
48 } );
49
50}
51
52void QgsFindFilesByPatternWidget::find()
53{
54 mFindButton->setText( tr( "Cancel" ) );
55 disconnect( mFindButton, &QPushButton::clicked, this, &QgsFindFilesByPatternWidget::find );
56 connect( mFindButton, &QPushButton::clicked, this, &QgsFindFilesByPatternWidget::cancel );
57 mCanceled = false;
58
59 mResultsTable->setRowCount( 0 );
60 mFiles.clear();
61
62 const QString pattern = mPatternLineEdit->text();
63 const QString path = mFolderWidget->filePath();
64
65 const QDir startDir( path );
66
67 QStringList filter;
68 if ( !pattern.isEmpty() )
69 filter << pattern;
70
71 QDirIterator it( path, filter, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, mRecursiveCheckBox->isChecked() ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags );
72 while ( it.hasNext() )
73 {
74 const QString fullPath = it.next();
75 mFiles << fullPath;
76
77 const QFileInfo fi( fullPath );
78
79 const QString toolTip = QDir::toNativeSeparators( fullPath );
80 const QString fileName = fi.fileName();
81 const QString relativeDirectory = QDir::toNativeSeparators( startDir.relativeFilePath( fi.dir().absolutePath() ) );
82 const QString fullDirectory = QDir::toNativeSeparators( fi.dir().absolutePath() );
83
84 QTableWidgetItem *fileNameItem = new QTableWidgetItem( fileName );
85 fileNameItem->setToolTip( toolTip );
86 fileNameItem->setFlags( fileNameItem->flags() ^ Qt::ItemIsEditable );
87
88 QTableWidgetItem *directoryItem = new QTableWidgetItem( relativeDirectory );
89 directoryItem->setToolTip( fullDirectory );
90 directoryItem->setFlags( directoryItem->flags() ^ Qt::ItemIsEditable );
91
92 const int row = mResultsTable->rowCount();
93 mResultsTable->insertRow( row );
94 mResultsTable->setItem( row, 0, fileNameItem );
95 mResultsTable->setItem( row, 1, directoryItem );
96
97 QCoreApplication::processEvents();
98 if ( mCanceled )
99 break;
100 }
101
102 mFindButton->setText( tr( "Find Files" ) );
103 disconnect( mFindButton, &QPushButton::clicked, this, &QgsFindFilesByPatternWidget::cancel );
104 connect( mFindButton, &QPushButton::clicked, this, &QgsFindFilesByPatternWidget::find );
105
106 emit findComplete( mFiles );
107}
108
109void QgsFindFilesByPatternWidget::cancel()
110{
111 mCanceled = true;
112}
113
114
115//
116// QgsFindFilesByPatternDialog
117//
118
120 : QDialog( parent )
121{
122 setWindowTitle( tr( "Find Files by Pattern" ) );
123 setObjectName( "QgsFindFilesByPatternDialog" );
124
126
127 QVBoxLayout *vLayout = new QVBoxLayout();
128 mWidget = new QgsFindFilesByPatternWidget();
129
130 vLayout->addWidget( mWidget );
131 mButtonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
132 connect( mButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept );
133 connect( mButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject );
134 vLayout->addWidget( mButtonBox );
135 setLayout( vLayout );
136
137 mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( false );
138 connect( mWidget, &QgsFindFilesByPatternWidget::findComplete, this, [ = ]( const QStringList & files )
139 {
140 mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( !files.empty() );
141 } );
142}
143
145{
146 return mWidget->files();
147}
@ GetDirectory
Select a directory.
void fileChanged(const QString &path)
Emitted whenever the current file or directory path is changed.
QStringList files() const
Returns the list of files found by the dialog.
QgsFindFilesByPatternDialog(QWidget *parent SIP_TRANSFERTHIS=nullptr)
Constructor for QgsFindFilesByPatternDialog, with the specified parent widget.
A reusable widget for finding files (recursively) by file pattern.
QStringList files() const
Returns the list of files found by the dialog.
void findComplete(const QStringList &files)
Emitted after files are found in the dialog.
QgsFindFilesByPatternWidget(QWidget *parent SIP_TRANSFERTHIS=nullptr)
Constructor for QgsFindFilesByPatternWidget, with the specified parent widget.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
Definition qgsgui.cpp:209
This class is a composition of two QSettings instances:
Definition qgssettings.h:64
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.