From 31bc791cb48e110db8f7b994931c1879974168a1 Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 31 Oct 2010 08:26:07 +0100 Subject: Added ".." entry to FileView Show ".." entry in FileView and make it go to the parent directory. Had to work around QT Bug 14760: NoDot doesn't work so the "." entry has to be filtered in filterAcceptsRow() --- filesystemdirproxy.cpp | 4 ++++ filesystemfileproxy.cpp | 20 ++++++++++++++++++++ filesystemfileproxy.h | 1 + filesystemwidget.cpp | 6 +++++- fileview.cpp | 3 +++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/filesystemdirproxy.cpp b/filesystemdirproxy.cpp index ae5d188..b43fe62 100644 --- a/filesystemdirproxy.cpp +++ b/filesystemdirproxy.cpp @@ -18,6 +18,10 @@ bool FilesystemDirProxy::filterAcceptsRow(int sourcerow, const QModelIndex &sour if(!idx.isValid()){ return false; } + QString fName = idx.data().toString(); + if((fName == "." ) || (fName == "..")){ + return false; + } return m->isDir(idx); } diff --git a/filesystemfileproxy.cpp b/filesystemfileproxy.cpp index 06ad939..7c49258 100644 --- a/filesystemfileproxy.cpp +++ b/filesystemfileproxy.cpp @@ -42,8 +42,28 @@ QVariant FilesystemFileProxy::data(const QModelIndex &index, int role) const{ return QSortFilterProxyModel::data(index, role); } +bool FilesystemFileProxy::filterAcceptsRow(int sourcerow, const QModelIndex &sourceparent) const{ + QFileSystemModel *m = static_cast(sourceModel()); + QModelIndex idx = m->index(sourcerow, 0, sourceparent); + if(!idx.isValid()){ + return false; + } + QString fName = idx.data().toString(); + if(fName == "." ){ + return false; + } + return QSortFilterProxyModel::filterAcceptsRow(sourcerow, sourceparent); +} + bool FilesystemFileProxy::lessThan(const QModelIndex &left, const QModelIndex &right) const { if(left.model()->headerData(left.column(), Qt::Horizontal).toString() == tr("Name")){ + if(left.data().toString() == ".."){ + if(sortOrder() == Qt::AscendingOrder){ + return true; + }else{ + return false; + } + } QFileSystemModel *source = static_cast(sourceModel()); if(source->isDir(left) && source->isDir(right)){ return left.data().toString().toLower() < right.data().toString().toLower(); diff --git a/filesystemfileproxy.h b/filesystemfileproxy.h index a7b5e18..739305d 100644 --- a/filesystemfileproxy.h +++ b/filesystemfileproxy.h @@ -19,6 +19,7 @@ class FilesystemFileProxy : public QSortFilterProxyModel { FilesystemFileProxy(QObject *parent = 0); ~FilesystemFileProxy() {}; virtual QVariant data(const QModelIndex &index, int role) const; + virtual bool filterAcceptsRow(int sourcerow, const QModelIndex &source_parent) const; protected: virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index 67facb9..52aede8 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -35,7 +35,7 @@ FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent) { mModel = new QFileSystemModel; mModel->setRootPath("/"); - mModel->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); + mModel->setFilter(QDir::AllEntries | QDir::NoDot); mModel->setReadOnly(false); SheMovIconProvider *p = new SheMovIconProvider; mModel->setIconProvider(p); @@ -134,6 +134,10 @@ void FilesystemWidget::directoryEdited(){ void FilesystemWidget::fileViewActivated(const QModelIndex &idx){ QModelIndex real = mFileProxy->mapToSource(idx); if(mModel->isDir(real)){ + if(idx.data().toString() == ".."){ + parentDir(); + return; + } fileView()->selectionModel()->select(idx, QItemSelectionModel::Deselect); mDirView->setCurrentIndex(mDirProxy->mapFromSource(real)); return; diff --git a/fileview.cpp b/fileview.cpp index f4f5294..03fc76f 100644 --- a/fileview.cpp +++ b/fileview.cpp @@ -163,6 +163,9 @@ bool FileView::event(QEvent *e){ if(!curIdx.isValid() || (curIdx.column() != 0)){ return exitHover(); } + if(curIdx.data().toString() == ".."){ + return exitHover(); + } QFileInfo fi(curIdx.data(QFileSystemModel::FilePathRole).toString()); if(!fi.exists()){ return true; -- cgit v1.2.3-70-g09d2