]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Create a SidebarTreeView which will include support for drag & drop in later releases...
authorPeter Penz <peter.penz19@gmail.com>
Sun, 11 Mar 2007 00:56:43 +0000 (00:56 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sun, 11 Mar 2007 00:56:43 +0000 (00:56 +0000)
svn path=/trunk/KDE/kdebase/apps/; revision=641359

src/CMakeLists.txt
src/dolphindetailsview.cpp
src/sidebartreeview.cpp [new file with mode: 0644]
src/sidebartreeview.h [new file with mode: 0644]
src/treeviewsidebarpage.cpp
src/treeviewsidebarpage.h

index 6c53dca95c6efa11400d1c58fbd7fa3466d5fdee..e739654910a1242b238e4433fa6f1cf421987a45 100644 (file)
@@ -41,6 +41,7 @@ set(dolphin_SRCS
    statusbarspaceinfo.cpp
    statusbarmessagelabel.cpp
    treeviewsidebarpage.cpp
+   sidebartreeview.cpp
    urlbutton.cpp
    urlnavigator.cpp
    urlnavigatorbutton.cpp
index d0556f5b1bacace530bb489327bcfb90466c8526..7737799768dea4ad7d7b927d032029a2a9f14d14 100644 (file)
@@ -117,6 +117,7 @@ bool DolphinDetailsView::event(QEvent* event)
 
     return QTreeView::event(event);
 }
+
 QStyleOptionViewItem DolphinDetailsView::viewOptions() const
 {
     return m_viewOptions;
diff --git a/src/sidebartreeview.cpp b/src/sidebartreeview.cpp
new file mode 100644 (file)
index 0000000..ccd9084
--- /dev/null
@@ -0,0 +1,85 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
+ ***************************************************************************/
+
+#include "sidebartreeview.h"
+
+#include <kdirmodel.h>
+#include <kfileitemdelegate.h>
+
+#include <QDragEnterEvent>
+#include <QDropEvent>
+#include <QHeaderView>
+
+SidebarTreeView::SidebarTreeView(DolphinMainWindow* mainWindow,
+                                 QWidget* parent) :
+    QTreeView(parent),
+    m_mainWindow(mainWindow)
+{
+    setAcceptDrops(true);
+    setUniformRowHeights(true);
+    setSelectionMode(QAbstractItemView::SingleSelection);
+    setEditTriggers(QAbstractItemView::NoEditTriggers);
+    setSortingEnabled(true);
+
+    viewport()->setAttribute(Qt::WA_Hover);
+
+    KFileItemDelegate* delegate = new KFileItemDelegate(this);
+    setItemDelegate(delegate);
+}
+
+SidebarTreeView::~SidebarTreeView()
+{
+}
+
+bool SidebarTreeView::event(QEvent* event)
+{
+    if (event->type() == QEvent::Polish) {
+        // hide all columns except of the 'Name' column
+        hideColumn(KDirModel::Size);
+        hideColumn(KDirModel::ModifiedTime);
+        hideColumn(KDirModel::Permissions);
+        hideColumn(KDirModel::Owner);
+        hideColumn(KDirModel::Group);
+        header()->hide();
+    }
+
+    return QTreeView::event(event);
+}
+
+void SidebarTreeView::dragEnterEvent(QDragEnterEvent* event)
+{
+    if (event->mimeData()->hasUrls()) {
+        event->acceptProposedAction();
+    }
+}
+
+void SidebarTreeView::dropEvent(QDropEvent* event)
+{
+    const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
+    if (urls.isEmpty() || (event->source() == this)) {
+        QTreeView::dropEvent(event);
+    }
+    else {
+        event->acceptProposedAction();
+        //m_controller->indicateDroppedUrls(urls, event->pos());
+    }
+}
+
+#include "sidebartreeview.moc"
diff --git a/src/sidebartreeview.h b/src/sidebartreeview.h
new file mode 100644 (file)
index 0000000..acec076
--- /dev/null
@@ -0,0 +1,48 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
+ ***************************************************************************/
+
+#ifndef SIDEBARTREEVIEW_H
+#define SIDEBARTREEVIEW_H
+
+#include <QTreeView>
+
+class DolphinMainWindow;
+
+/**
+ * @brief
+ */
+class SidebarTreeView : public QTreeView
+{
+    Q_OBJECT
+
+public:
+    explicit SidebarTreeView(DolphinMainWindow* mainWindow, QWidget* parent = 0);
+    virtual ~SidebarTreeView();
+
+protected:
+    virtual bool event(QEvent* event);
+    virtual void dragEnterEvent(QDragEnterEvent* event);
+    virtual void dropEvent(QDropEvent* event);
+
+private:
+    DolphinMainWindow* m_mainWindow;
+};
+
+#endif
index e60384bd904cc40c6831c7483cc18448e4ff3066..b1fcc8daa87655d9a055d68dde1f9d09a8bd6fa8 100644 (file)
 
 #include "bookmarkselector.h"
 #include "dolphinmainwindow.h"
+#include "dolphinsortfilterproxymodel.h"
 #include "dolphinview.h"
+#include "sidebartreeview.h"
 
-#include "kdirlister.h"
-#include "kdirmodel.h"
+#include <kdirlister.h>
+#include <kdirmodel.h>
+#include <kfileitem.h>
 
 #include <QHeaderView>
 #include <QItemSelectionModel>
 #include <QTreeView>
 #include <QVBoxLayout>
 
+// TODO: currently when using a proxy model the strange effect occurs
+// that items get duplicated. Activate the following define to have the proxy
+// model:
+//#define USE_PROXY_MODEL
+
 TreeViewSidebarPage::TreeViewSidebarPage(DolphinMainWindow* mainWindow,
                                          QWidget* parent) :
     SidebarPage(mainWindow, parent),
     m_dirLister(0),
     m_dirModel(0),
+    m_proxyModel(0),
     m_treeView(0),
     m_selectedUrl()
 {
@@ -50,19 +59,22 @@ TreeViewSidebarPage::TreeViewSidebarPage(DolphinMainWindow* mainWindow,
 
     m_dirModel = new KDirModel();
     m_dirModel->setDirLister(m_dirLister);
+    m_dirModel->setDropsAllowed(KDirModel::DropOnDirectory);
 
-    m_treeView = new QTreeView(this);
-    m_treeView->setModel(m_dirModel);
-    m_treeView->setSelectionMode(QAbstractItemView::SingleSelection);
-    m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
 
-    // hide all columns except of the 'Name' column
-    m_treeView->hideColumn(KDirModel::Size);
-    m_treeView->hideColumn(KDirModel::ModifiedTime);
-    m_treeView->hideColumn(KDirModel::Permissions);
-    m_treeView->hideColumn(KDirModel::Owner);
-    m_treeView->hideColumn(KDirModel::Group);
-    m_treeView->header()->hide();
+#if defined(USE_PROXY_MODEL)
+    m_proxyModel = new DolphinSortFilterProxyModel(this);
+    m_proxyModel->setSourceModel(m_dirModel);
+
+    m_treeView = new SidebarTreeView(mainWindow, this);
+    m_treeView->setModel(m_proxyModel);
+
+    m_proxyModel->setSorting(DolphinView::SortByName);
+    m_proxyModel->setSortOrder(Qt::Ascending);
+#else
+    m_treeView = new SidebarTreeView(mainWindow, this);
+    m_treeView->setModel(m_dirModel);
+#endif
 
     connect(m_treeView, SIGNAL(clicked(const QModelIndex&)),
             this, SLOT(updateActiveView(const QModelIndex&)));
@@ -110,11 +122,18 @@ void TreeViewSidebarPage::updateSelection(const KUrl& url)
     selModel->clearSelection();
 
     const KFileItem item(S_IFDIR, KFileItem::Unknown, url);
+
     const QModelIndex index = m_dirModel->indexForItem(item);
     if (index.isValid()) {
+#if defined(USE_PROXY_MODEL)
         // the item with the given URL is already part of the model
+        const QModelIndex proxyIndex = m_proxyModel->mapFromSource(index);
+        m_treeView->scrollTo(proxyIndex);
+        selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::Select);
+#else
         m_treeView->scrollTo(index);
         selModel->setCurrentIndex(index, QItemSelectionModel::Select);
+#endif
     }
     else {
         // The item with the given URL is not loaded by the model yet. Iterate
@@ -140,23 +159,42 @@ void TreeViewSidebarPage::expandSelectionParent()
     const KFileItem parentItem(S_IFDIR, KFileItem::Unknown, m_selectedUrl.upUrl());
     QModelIndex index = m_dirModel->indexForItem(parentItem);
     if (index.isValid()) {
+#if defined(USE_PROXY_MODEL)
+        QModelIndex proxyIndex = m_proxyModel->mapFromSource(index);
+        m_treeView->setExpanded(proxyIndex, true);
+#else
         m_treeView->setExpanded(index, true);
+#endif
 
         // select the item and assure that the item is visible
         const KFileItem selectedItem(S_IFDIR, KFileItem::Unknown, m_selectedUrl);
         index = m_dirModel->indexForItem(selectedItem);
         if (index.isValid()) {
+#if defined(USE_PROXY_MODEL)
+            proxyIndex = m_proxyModel->mapFromSource(index);
+            m_treeView->scrollTo(proxyIndex);
+
+            QItemSelectionModel* selModel = m_treeView->selectionModel();
+            selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::Select);
+#else
             m_treeView->scrollTo(index);
 
             QItemSelectionModel* selModel = m_treeView->selectionModel();
             selModel->setCurrentIndex(index, QItemSelectionModel::Select);
+#endif
+
         }
     }
 }
 
 void TreeViewSidebarPage::updateActiveView(const QModelIndex& index)
 {
+#if defined(USE_PROXY_MODEL)
+    const QModelIndex& dirIndex = m_proxyModel->mapToSource(index);
+    const KFileItem* item = m_dirModel->itemForIndex(dirIndex);
+#else
     const KFileItem* item = m_dirModel->itemForIndex(index);
+#endif
     if (item != 0) {
         const KUrl& url = item->url();
         mainWindow()->activeView()->setUrl(url);
index 12cb75d45838d8f55e028326a6a8f7cc2ffabcf6..9810908558e55140f29a2ed2d7e251dff78a6fda 100644 (file)
@@ -27,8 +27,9 @@ class KDirLister;
 class KDirModel;
 class KUrl;
 
+class DolphinSortFilterProxyModel;
+class SidebarTreeView;
 class QModelIndex;
-class QTreeView;
 
 /**
  * @brief Shows a tree view of the directories starting from
@@ -82,7 +83,8 @@ private:
 private:
     KDirLister* m_dirLister;
     KDirModel* m_dirModel;
-    QTreeView* m_treeView;
+    DolphinSortFilterProxyModel* m_proxyModel;
+    SidebarTreeView* m_treeView;
     KUrl m_selectedUrl;
 };