From c3cfc9dd9d94a3c3ce2d58c0ec9320c03489f496 Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 3 Sep 2016 07:06:55 +0200 Subject: Fix Video sorting Show directories in FileWidget and always put ".." first, then the directories by creating a new QSortFilterProxyModel. For this the file attribute is needed for every column, so use QList instead of individual QStandardItem*s. Use enums to access columns. --- filesorter.cpp | 29 +++++++++++++++++++++++++ filesorter.h | 9 ++++++++ filewidget.cpp | 62 +++++++++++++++++++++++++++++++++++------------------- filewidget.h | 8 ++++--- shemovcleaner.qrc | 1 + up_dick.png | Bin 0 -> 836 bytes 6 files changed, 84 insertions(+), 25 deletions(-) create mode 100644 up_dick.png diff --git a/filesorter.cpp b/filesorter.cpp index a87ac6f..b155a7c 100644 --- a/filesorter.cpp +++ b/filesorter.cpp @@ -1,4 +1,5 @@ #include "filesorter.h" +#include "filewidget.h" FileSorter::FileSorter(QObject *parent) : QSortFilterProxyModel(parent) {} @@ -10,3 +11,31 @@ bool FileSorter::lessThan(const QModelIndex &source_left, const QModelIndex &sou } return QSortFilterProxyModel::lessThan(source_left, source_right); } + +VideoSorter::VideoSorter(QObject *parent) : QSortFilterProxyModel(parent) {} + +bool VideoSorter::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { + int leftData = sourceModel()->data(source_left, Qt::UserRole + 1).toInt(); + int rightData = sourceModel()->data(source_right, Qt::UserRole + 1).toInt(); + + //always Sort DotDot first + if(leftData == FileWidget::ParentDir && rightData != FileWidget::ParentDir){ + return sortOrder() == Qt::AscendingOrder; + }else if(leftData != FileWidget::ParentDir && rightData == FileWidget::ParentDir){ + return sortOrder() != Qt::AscendingOrder; + } + + //followed by directories + if(leftData == FileWidget::Directory && rightData != FileWidget::Directory){ + return sortOrder() == Qt::AscendingOrder; + }else if(leftData != FileWidget::Directory && rightData == FileWidget::Directory){ + return sortOrder() != Qt::AscendingOrder; + } + + //now check if we're sorting IconRow + if(source_left.column() == FileWidget::IconRow){ + return leftData < rightData; + } + + return QSortFilterProxyModel::lessThan(source_left, source_right); +} diff --git a/filesorter.h b/filesorter.h index 92bc71e..11012ed 100644 --- a/filesorter.h +++ b/filesorter.h @@ -10,7 +10,16 @@ class FileSorter : public QSortFilterProxyModel { protected: virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const; +}; + +class VideoSorter : public QSortFilterProxyModel { + Q_OBJECT + public: + explicit VideoSorter(QObject *parent = 0); + protected: + virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const; }; + #endif // FILESORTER_H diff --git a/filewidget.cpp b/filewidget.cpp index 6d67007..d1d7a6a 100644 --- a/filewidget.cpp +++ b/filewidget.cpp @@ -68,7 +68,7 @@ void FileWidget::setupGui(){ mFileView->setSelectionMode(QAbstractItemView::ExtendedSelection); mModel = new QStandardItemModel; - mProxy = new FileSorter; + mProxy = new VideoSorter; mProxy->setSourceModel(mModel); mFileView->setModel(mProxy); readSettings(); @@ -96,7 +96,7 @@ void FileWidget::selectDir(){ void FileWidget::gatherData(){ QDir d(mDir->text()); - QFileInfoList fl = d.entryInfoList(QStringList() << "*", QDir::Files, QDir::Name); + QFileInfoList fl = d.entryInfoList(QStringList() << "*", QDir::Files | QDir::Dirs | QDir::NoDot, QDir::Name | QDir::DirsFirst); mModel->clear(); QStandardItem *root = mModel->invisibleRootItem(); mModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name") << tr("MIME") << tr("MD5")); @@ -108,34 +108,52 @@ void FileWidget::gatherData(){ foreach(QFileInfo fi, fl){ QMimeType mime = db.mimeTypeForFile(fi); - QStandardItem *i1; - QStandardItem *i2 = new QStandardItem(fi.fileName()); - i2->setEditable(false); - QStandardItem *i4; + QList fData; + FileAttrs attr = NotPresent; + for(int i = 0; i < RowCount; ++i){ + QStandardItem *item = new QStandardItem; + item->setEditable(false); + if(i == Md5Row){ + item->setFont(QFont("courier new")); + } + fData << item; + } + fData[NameRow]->setText(fi.fileName()); if(mime.name().startsWith("video")){ QString md5 = Helper::md5Sum(fi.absoluteFilePath()); - i4 = new QStandardItem(md5); - i4->setFont(QFont("courier new")); + fData[Md5Row]->setText(md5); int haveFile = md5Count(md5); if(haveFile){ - i1 = new QStandardItem(QIcon(":/huge_bra.png"), QString()); - i1->setData(Present); - i2->setForeground(greenBrush); + fData[IconRow]->setIcon(QIcon(":/huge_bra.png")); + fData[NameRow]->setForeground(greenBrush); + attr = Present; + }else{ + fData[IconRow]->setIcon(QIcon(":/chastity_belt.png")); + fData[NameRow]->setForeground(redBrush); + attr = NotPresent; + } + }else if(fi.isDir()){ + if(fi.fileName() == ".."){ + fData[IconRow]->setIcon(QIcon(":/up_dick.png")); + attr = ParentDir; }else{ - i1 = new QStandardItem(QIcon(":/chastity_belt.png"), QString()); - i1->setData(NotPresent); - i2->setForeground(redBrush); + fData[IconRow]->setIcon(QIcon(":/folder.png")); + attr = Directory; } + fData[Md5Row]->setText(tr("n/a")); }else{ - i1 = new QStandardItem(QIcon(":/gaping_ass.png"), QString()); - i1->setData(NoVideo); - i4 = new QStandardItem(tr("n/a")); - i4->setFont(QFont("courier new")); + fData[IconRow]->setIcon(QIcon(":/gaping_ass.png")); + fData[Md5Row]->setText(tr("n/a")); + attr = NoVideo; + } + fData[MimeRow]->setText(mime.name()); + if(mime.name() == "inode/directory"){ + fData[MimeRow]->setText("directory"); + } + for(int i = 0; i < RowCount; ++i){ + fData[i]->setData(attr); } - i1->setEditable(false); - QStandardItem *i3 = new QStandardItem(mime.name()); - i3->setEditable(false); - root->appendRow(QList() << i1 << i2 << i3 << i4); + root->appendRow(fData); } readHeaderData(); qApp->restoreOverrideCursor(); diff --git a/filewidget.h b/filewidget.h index b00d742..504a6c7 100644 --- a/filewidget.h +++ b/filewidget.h @@ -9,12 +9,14 @@ class QLineEdit; class QPushButton; class QStandardItemModel; class QTreeView; -class FileSorter; +class VideoSorter; class FileWidget : public QWidget { Q_OBJECT public: - enum FileAttrs { NotPresent = 0, Present = 1, NoVideo = 2 }; + enum FileAttrs { NotPresent = 0, Present = 1, NoVideo = 2, ParentDir = 3, Directory = 4 }; + enum { RowCount = 4 }; + enum Colums { IconRow = 0, NameRow = 1, MimeRow = 2, Md5Row = 3 }; explicit FileWidget(QWidget *parent = 0); ~FileWidget(); @@ -36,7 +38,7 @@ class FileWidget : public QWidget { QPushButton *mSearch; QStandardItemModel *mModel; QTreeView *mFileView; - FileSorter *mProxy; + VideoSorter *mProxy; QSqlDatabase mDb; QSqlQuery mQOrigin; QSqlQuery mQFiles; diff --git a/shemovcleaner.qrc b/shemovcleaner.qrc index e1145d4..7083020 100644 --- a/shemovcleaner.qrc +++ b/shemovcleaner.qrc @@ -10,5 +10,6 @@ refresh.png chastity_belt.png edit-copy.png + up_dick.png diff --git a/up_dick.png b/up_dick.png new file mode 100644 index 0000000..778df2d Binary files /dev/null and b/up_dick.png differ -- cgit v1.2.3-70-g09d2