Mercurial > hg > octave-nkf
diff libgui/src/find-files-model.cc @ 16997:90d50e56a06a
Add sortable table headers to find_files_dialog results
* libgui/src/find-files-dialog.cc
(find_files_dialog::find_files_dialog): enable sorting of rows in _file_list.
* libgui/src/find-files-model.cc, libgui/src/find-files-model.h
(global): New local class find_file_less_than.
(find_files_model::find_files_model): Add/initialize _sortorder var.
(find_files_model::addFile): Find pos to add data to sorted entries.
(find_files_model::sort): New function.
author | John Donoghue <john.donoghue@ieee.org> |
---|---|
date | Wed, 17 Jul 2013 21:42:11 -0400 |
parents | 3e8fd0c479b4 |
children | 15e2ad6372f7 |
line wrap: on
line diff
--- a/libgui/src/find-files-model.cc +++ b/libgui/src/find-files-model.cc @@ -22,12 +22,60 @@ #include "find-files-model.h" #include <QFileIconProvider> +#include <QtAlgorithms> + +class find_file_less_than +{ +public: + find_file_less_than (int ord) + { + _sortorder = ord; + } + QVariant getValue (const QFileInfo &f) const + { + QVariant val; + int col = (_sortorder > 0) ? _sortorder : -_sortorder; + + switch (col-1) + { + case 0: + val = QVariant (f.fileName()); + break; + + case 1: + val = QVariant (f.absolutePath()); + break; + + default: + break; + } + return val; + } + bool lessThan (const QVariant &left, const QVariant &right) const + { + return left.toString ().compare (right.toString (), Qt::CaseInsensitive) < 0; + } + bool operator () (const QFileInfo &left, const QFileInfo &right) const + { + QVariant leftval = getValue(left); + QVariant rightval = getValue(right); + + if (_sortorder > 0) + return lessThan(leftval, rightval); + else + return ! lessThan(leftval, rightval); + } +private: + int _sortorder; +}; + find_files_model::find_files_model (QObject *p) : QAbstractListModel(p) { _columnNames.append (tr ("Filename")); _columnNames.append (tr ("Directory")); + _sortorder = 0; } find_files_model::~find_files_model () @@ -47,11 +95,19 @@ void find_files_model::addFile (const QFileInfo &info) { - beginInsertRows(QModelIndex(), _files.size(), _files.size() ); + beginInsertRows (QModelIndex (), _files.size (), _files.size () ); + + QList<QFileInfo>::Iterator it; + find_file_less_than less_than(_sortorder); - _files.append(info); + for (it=_files.begin ();it!=_files.end ();it++) + { + if (less_than (info, *it)) break; + } - endInsertRows(); + _files.insert (it, info); + + endInsertRows (); } int @@ -113,6 +169,27 @@ return QVariant (); } +void +find_files_model::sort (int column, Qt::SortOrder order) +{ + if(column >= 0) + { + if (order == Qt::DescendingOrder) + _sortorder = -(column+1); + else + _sortorder = column+1; + } + else + _sortorder = 0; + + if (_sortorder != 0) + { + beginResetModel (); + qSort (_files.begin (), _files.end (), find_file_less_than (_sortorder)); + endResetModel (); + } +} + QFileInfo find_files_model::fileInfo (const QModelIndex & p) const {