From e047ecc96b8873d4e293793a67a33027af291efa Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 4 Sep 2016 04:29:21 +0200 Subject: Usability fixes for FileWidget * Use GroupBoxes * Don't clear filevew if browing is cancelled * processEvents() when gathering data * filter the view instead of selecting items when searching/filtering --- filewidget.cpp | 86 ++++++++++++++++++++++++++++++---------------------------- filewidget.h | 8 ++---- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/filewidget.cpp b/filewidget.cpp index 0a2bbbb..ef4e0ad 100644 --- a/filewidget.cpp +++ b/filewidget.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "filewidget.h" #include "filesorter.h" @@ -46,31 +47,36 @@ void FileWidget::setupGui(){ fsCompleter->setCompletionMode(QCompleter::PopupCompletion); mDir->setCompleter(fsCompleter); connect(mDir, SIGNAL(returnPressed()), this, SLOT(gatherData())); - mSelDir = new QPushButton(tr("Browse...")); - connect(mSelDir, SIGNAL(clicked()), this, SLOT(selectDir())); - QLabel *dirL = new QLabel(tr("&Directory")); - dirL->setBuddy(mDir); + QPushButton *selDirBtn = new QPushButton(tr("&Browse...")); + connect(selDirBtn, SIGNAL(clicked()), this, SLOT(selectDir())); + QGroupBox *dirGB = new QGroupBox(tr("Directory")); + QHBoxLayout *dirGBL = new QHBoxLayout; + dirGBL->addWidget(mDir); + dirGBL->addWidget(selDirBtn); + dirGB->setLayout(dirGBL); - mSearchFile = new QLineEdit; - connect(mSearchFile, SIGNAL(returnPressed()), this, SLOT(searchFile())); - mSearch = new QPushButton(tr("Search")); - connect(mSearch, SIGNAL(clicked()), this, SLOT(searchFile())); - QLabel *searchL = new QLabel(tr("&Search")); - searchL->setBuddy(mSearchFile); - - QGridLayout *topL = new QGridLayout; - topL->addWidget(dirL, 0, 0); - topL->addWidget(mDir, 0, 1); - topL->addWidget(mSelDir, 0, 2); - topL->addWidget(searchL, 1, 0); - topL->addWidget(mSearchFile, 1, 1); - topL->addWidget(mSearch, 1, 2); + mFilter = new QLineEdit; + connect(mFilter, SIGNAL(returnPressed()), this, SLOT(filter())); + QPushButton *searchBtn = new QPushButton(tr("Filter")); + connect(searchBtn, SIGNAL(clicked()), this, SLOT(filter())); + QPushButton *clearBtn = new QPushButton(tr("Clear")); + connect(clearBtn, SIGNAL(clicked()), this, SLOT(clearFilter())); + QGroupBox *filterGB = new QGroupBox(tr("Filter")); + QHBoxLayout *filterGBL = new QHBoxLayout; + filterGBL->addWidget(mFilter); + filterGBL->addWidget(clearBtn); + filterGBL->addWidget(searchBtn); + filterGB->setLayout(filterGBL); mFileView = new QTreeView; mFileView->setSortingEnabled(true); mFileView->setSelectionBehavior(QAbstractItemView::SelectRows); mFileView->setSelectionMode(QAbstractItemView::ExtendedSelection); connect(mFileView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(itemDoubleClicked(QModelIndex))); + QGroupBox *filesGB = new QGroupBox(tr("Files")); + QHBoxLayout *filesGBL = new QHBoxLayout; + filesGBL->addWidget(mFileView); + filesGB->setLayout(filesGBL); mModel = new QStandardItemModel; mProxy = new VideoSorter; @@ -90,8 +96,9 @@ void FileWidget::setupGui(){ mFileDisplay = new FileDisplay(this); QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addLayout(topL); - mainLayout->addWidget(mFileView); + mainLayout->addWidget(dirGB); + mainLayout->addWidget(filterGB); + mainLayout->addWidget(filesGB); setLayout(mainLayout); connect(mFileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged(QItemSelection,QItemSelection))); @@ -99,8 +106,10 @@ void FileWidget::setupGui(){ void FileWidget::selectDir(){ QString dir = QFileDialog::getExistingDirectory(this, tr("Select directory"), QDir::homePath()); - mDir->setText(QDir::toNativeSeparators(dir)); - gatherData(); + if(!dir.isEmpty()){ + mDir->setText(QDir::toNativeSeparators(dir)); + gatherData(); + } } void FileWidget::gatherData(){ @@ -114,6 +123,8 @@ void FileWidget::gatherData(){ QMimeDatabase db; qApp->setOverrideCursor(Qt::BusyCursor); + emit statusMessage(QString(tr("Gathering data..."))); + qApp->processEvents(); foreach(QFileInfo fi, fl){ QMimeType mime = db.mimeTypeForFile(fi); @@ -179,6 +190,8 @@ void FileWidget::gatherData(){ } readHeaderData(); qApp->restoreOverrideCursor(); + fileSelectionChanged(QItemSelection(), QItemSelection()); + emit statusMessage(QString(tr("Gathering data... DONE!"))); } int FileWidget::md5Count(const QString &md5) { @@ -221,26 +234,15 @@ void FileWidget::writeSettings(){ s.setValue("video/searchdir", mDir->text()); } -void FileWidget::searchFile(){ - mFileView->selectionModel()->clear(); - int count = mProxy->rowCount(); - if(mSearchFile->text().isEmpty()){ - return; - } - QRegularExpression regex(mSearchFile->text(), QRegularExpression::CaseInsensitiveOption); - int success = 0; - for(int i = 0; i < count; ++i){ - QModelIndex cur = mProxy->index(i, 1); - QString fn = cur.data().toString(); - QRegularExpressionMatch m = regex.match(fn); - if(m.hasMatch()){ - ++success; - mFileView->selectionModel()->select(cur, QItemSelectionModel::Select | QItemSelectionModel::Rows); - if(success == 1){ - mFileView->scrollTo(cur); - } - } - } +void FileWidget::filter(){ + mProxy->setFilterRegExp(mFilter->text()); + mProxy->setFilterKeyColumn(NameColumn); + mProxy->setFilterCaseSensitivity(Qt::CaseInsensitive); +} + +void FileWidget::clearFilter(){ + mFilter->clear(); + filter(); } void FileWidget::fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected){ diff --git a/filewidget.h b/filewidget.h index 7726230..99c8d3d 100644 --- a/filewidget.h +++ b/filewidget.h @@ -7,7 +7,6 @@ #include class QLineEdit; -class QPushButton; class QStandardItemModel; class QTreeView; class VideoSorter; @@ -34,7 +33,8 @@ class FileWidget : public QWidget { private slots: void gatherData(); void selectDir(); - void searchFile(); + void filter(); + void clearFilter(); void itemDoubleClicked(const QModelIndex &idx); private: @@ -45,9 +45,7 @@ class FileWidget : public QWidget { void readSettings(); void writeSettings(); QLineEdit *mDir; - QPushButton *mSelDir; - QLineEdit *mSearchFile; - QPushButton *mSearch; + QLineEdit *mFilter; QStandardItemModel *mModel; QTreeView *mFileView; VideoSorter *mProxy; -- cgit v1.2.3-70-g09d2