#include "filesorter.h" #include "filewidget.h" FileSorter::FileSorter(QObject *parent) : QSortFilterProxyModel(parent) {} bool FileSorter::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { QVariant leftData = sourceModel()->data(source_left, Qt::UserRole + 1); QVariant rightData = sourceModel()->data(source_right, Qt::UserRole + 1); if(leftData.type() == QVariant::Int){ return leftData.toInt() < rightData.toInt(); } 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::IconColumn){ return leftData < rightData; } return QSortFilterProxyModel::lessThan(source_left, source_right); }