QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
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 "qgsgui.h"
18 #include "qgssettings.h"
19 
20 #include <QDir>
21 #include <QDirIterator>
22 #include <QDialogButtonBox>
23 
24 
26  : QWidget( parent )
27 {
28  setupUi( this );
29 
30  mFolderWidget->setStorageMode( QgsFileWidget::GetDirectory );
31  mResultsTable->setColumnCount( 2 );
32 
33  mResultsTable->setHorizontalHeaderLabels( QStringList() << tr( "File" ) << tr( "Directory" ) );
34  mResultsTable->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Stretch );
35  mResultsTable->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
36 
37  connect( mFindButton, &QPushButton::clicked, this, &QgsFindFilesByPatternWidget::find );
38 
39  QgsSettings settings;
40  mFolderWidget->setFilePath( settings.value( QStringLiteral( "qgis/lastFindRecursiveFolder" ) ).toString() );
41  mFindButton->setEnabled( !mFolderWidget->filePath().isEmpty() );
42  connect( mFolderWidget, &QgsFileWidget::fileChanged, this, [ = ]( const QString & filePath )
43  {
44  QgsSettings settings;
45  settings.setValue( QStringLiteral( "qgis/lastFindRecursiveFolder" ), filePath );
46  mFindButton->setEnabled( !filePath.isEmpty() );
47  } );
48 
49 }
50 
51 void QgsFindFilesByPatternWidget::find()
52 {
53  mFindButton->setText( tr( "Cancel" ) );
54  disconnect( mFindButton, &QPushButton::clicked, this, &QgsFindFilesByPatternWidget::find );
55  connect( mFindButton, &QPushButton::clicked, this, &QgsFindFilesByPatternWidget::cancel );
56  mCanceled = false;
57 
58  mResultsTable->setRowCount( 0 );
59  mFiles.clear();
60 
61  const QString pattern = mPatternLineEdit->text();
62  const QString path = mFolderWidget->filePath();
63 
64  QDir startDir( path );
65 
66  QStringList filter;
67  if ( !pattern.isEmpty() )
68  filter << pattern;
69 
70  QDirIterator it( path, filter, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, mRecursiveCheckBox->isChecked() ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags );
71  QStringList files;
72  while ( it.hasNext() )
73  {
74  const QString fullPath = it.next();
75  mFiles << fullPath;
76 
77  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 
109 void 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 }
This class is a composition of two QSettings instances:
Definition: qgssettings.h:58
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Select a directory.
Definition: qgsfilewidget.h:66
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.
QgsFindFilesByPatternWidget(QWidget *parent SIP_TRANSFERTHIS=nullptr)
Constructor for QgsFindFilesByPatternWidget, with the specified parent widget.
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.
void findComplete(const QStringList &files)
Emitted after files are found in the dialog.
A reusable widget for finding files (recursively) by file pattern.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
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:127