#include #include "filesorter.h" #include "torrentwidget.h" #include "filewidget.h" FileSorter::FileSorter(QObject *parent) : QSortFilterProxyModel(parent) {} bool FileSorter::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { if(source_left.column() == TorrentWidget::IconColumn){ QVariant leftData = sourceModel()->data(source_left, TorrentWidget::PresentRole); QVariant rightData = sourceModel()->data(source_right, TorrentWidget::PresentRole); return leftData.toInt() < rightData.toInt(); } if(source_left.column() == TorrentWidget::CreatedColumn){ QDateTime leftData = source_left.data(TorrentWidget::CreatedRole).toDateTime(); QDateTime rightData = source_right.data(TorrentWidget::CreatedRole).toDateTime(); return leftData < rightData; } 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; } //special case for size if(source_left.column() == FileWidget::SizeColumn){ qint64 left = source_left.data(FileWidget::SizeRole).toInt(); qint64 right = source_right.data(FileWidget::SizeRole).toInt(); return left < right; } return QSortFilterProxyModel::lessThan(source_left, source_right); } bool VideoSorter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { QModelIndex nameIdx = sourceModel()->index(source_row, 0, source_parent); int attr = nameIdx.data(FileWidget::AttrsRole).toInt(); if(attr == FileWidget::Directory || attr == FileWidget::ParentDir){ return true; } return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); }