[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kfile
From:       David Faure <faure () kde ! org>
Date:       2007-12-04 18:25:42
Message-ID: 1196792742.237844.10556.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 744855 by dfaure:

Fix sorting in KFileTreeView - patch by ereslibre and bks.


 M  +41 -32    kfiletreeview.cpp  


--- trunk/KDE/kdelibs/kfile/kfiletreeview.cpp #744854:744855
@@ -25,6 +25,7 @@
 
 #include <kdirlister.h>
 #include <kdirmodel.h>
+#include <kdirsortfilterproxymodel.h>
 #include <kfileitemdelegate.h>
 #include <kurl.h>
 
@@ -32,63 +33,69 @@
 {
     public:
         Private(KFileTreeView *parent)
-            : mParent(parent)
+            : q(parent)
         {
         }
 
-        KUrl urlForIndex(const QModelIndex &index) const;
+        KUrl urlForProxyIndex(const QModelIndex &index) const;
 
         void _k_activated(const QModelIndex&);
         void _k_currentChanged(const QModelIndex&, const QModelIndex&);
         void _k_expanded(const QModelIndex&);
 
-        KFileTreeView *mParent;
-        KDirModel *mModel;
+        KFileTreeView *q;
+        KDirModel *mSourceModel;
+        KDirSortFilterProxyModel *mProxyModel;
 };
 
-KUrl KFileTreeView::Private::urlForIndex(const QModelIndex &index) const
+KUrl KFileTreeView::Private::urlForProxyIndex(const QModelIndex &index) const
 {
-    const KFileItem item = mModel->itemForIndex(index);
+    const KFileItem item = mSourceModel->itemForIndex(mProxyModel->mapToSource(index));
 
     return !item.isNull() ? item.url() : KUrl();
 }
 
 void KFileTreeView::Private::_k_activated(const QModelIndex &index)
 {
-    const KUrl url = urlForIndex(index);
+    const KUrl url = urlForProxyIndex(index);
     if (url.isValid())
-        emit mParent->activated(url);
+        emit q->activated(url);
 }
 
 void KFileTreeView::Private::_k_currentChanged(const QModelIndex &currentIndex, const QModelIndex&)
 {
-    const KUrl url = urlForIndex(currentIndex);
+    const KUrl url = urlForProxyIndex(currentIndex);
     if (url.isValid())
-        emit mParent->currentChanged(url);
+        emit q->currentChanged(url);
 }
 
-void KFileTreeView::Private::_k_expanded(const QModelIndex &index)
+void KFileTreeView::Private::_k_expanded(const QModelIndex &baseIndex)
 {
-    mParent->selectionModel()->clearSelection();
-    mParent->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent);
-    mParent->scrollTo(index);
+    QModelIndex index = mProxyModel->mapFromSource(baseIndex);
+
+    q->selectionModel()->clearSelection();
+    q->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent);
+    q->scrollTo(index);
 }
 
 KFileTreeView::KFileTreeView(QWidget *parent)
     : QTreeView(parent), d(new Private(this))
 {
-    d->mModel = new KDirModel(this);
+    d->mSourceModel = new KDirModel(this);
+    d->mProxyModel = new KDirSortFilterProxyModel(this);
+    d->mProxyModel->setSourceModel(d->mSourceModel);
 
-    setModel(d->mModel);
+    setModel(d->mProxyModel);
     setItemDelegate(new KFileItemDelegate(this));
 
-    d->mModel->dirLister()->openUrl(KUrl(QDir::root().absolutePath()), KDirLister::Keep);
+    d->mSourceModel->dirLister()->openUrl(KUrl(QDir::root().absolutePath()), KDirLister::Keep);
 
     connect(this, SIGNAL(activated(const QModelIndex&)),
             this, SLOT(_k_activated(const QModelIndex&)));
     connect(selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
             this, SLOT(_k_currentChanged(const QModelIndex&, const QModelIndex&)));
-    connect(d->mModel, SIGNAL(expand(const QModelIndex&)),
+
+    connect(d->mSourceModel, SIGNAL(expand(const QModelIndex&)),
             this, SLOT(_k_expanded(const QModelIndex&)));
 }
 
@@ -99,7 +106,7 @@
 
 KUrl KFileTreeView::currentUrl() const
 {
-    return d->urlForIndex(currentIndex());
+    return d->urlForProxyIndex(currentIndex());
 }
 
 KUrl KFileTreeView::selectedUrl() const
@@ -110,7 +117,7 @@
     const QItemSelection selection = selectionModel()->selection();
     const QModelIndex firstIndex = selection.indexes().first();
 
-    return d->urlForIndex(firstIndex);
+    return d->urlForProxyIndex(firstIndex);
 }
 
 KUrl::List KFileTreeView::selectedUrls() const
@@ -122,7 +129,7 @@
 
     const QModelIndexList indexes = selectionModel()->selection().indexes();
     foreach (const QModelIndex index, indexes) {
-        const KUrl url = d->urlForIndex(index);
+        const KUrl url = d->urlForProxyIndex(index);
         if (url.isValid())
             urls.append(url);
     }
@@ -132,37 +139,39 @@
 
 KUrl KFileTreeView::rootUrl() const
 {
-    return d->mModel->dirLister()->url();
+    return d->mSourceModel->dirLister()->url();
 }
 
 void KFileTreeView::setDirOnlyMode(bool enabled)
 {
-    d->mModel->dirLister()->setDirOnlyMode(enabled);
-    d->mModel->dirLister()->openUrl(d->mModel->dirLister()->url());
+    d->mSourceModel->dirLister()->setDirOnlyMode(enabled);
+    d->mSourceModel->dirLister()->openUrl(d->mSourceModel->dirLister()->url());
 }
 
 void KFileTreeView::setShowHiddenFiles(bool enabled)
 {
-    d->mModel->dirLister()->setShowingDotFiles(enabled);
-    d->mModel->dirLister()->openUrl(d->mModel->dirLister()->url());
+    d->mSourceModel->dirLister()->setShowingDotFiles(enabled);
+    d->mSourceModel->dirLister()->openUrl(d->mSourceModel->dirLister()->url());
 }
 
 void KFileTreeView::setCurrentUrl(const KUrl &url)
 {
-    QModelIndex index = d->mModel->indexForUrl(url);
+    QModelIndex baseIndex = d->mSourceModel->indexForUrl(url);
 
-    if (!index.isValid()) {
-        d->mModel->expandToUrl(url);
+    if (!baseIndex.isValid()) {
+        d->mSourceModel->expandToUrl(url);
         return;
     }
+
+    QModelIndex proxyIndex = d->mProxyModel->mapFromSource(baseIndex);
     selectionModel()->clearSelection();
-    selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent);
-    scrollTo(index);
+    selectionModel()->setCurrentIndex(proxyIndex, QItemSelectionModel::SelectCurrent);
+    scrollTo(proxyIndex);
 }
 
 void KFileTreeView::setRootUrl(const KUrl &url)
 {
-    d->mModel->dirLister()->openUrl(url);
+    d->mSourceModel->dirLister()->openUrl(url);
 }
 
 #include "kfiletreeview.moc"
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic