From b5cc2a6924cfd8f59611d3cec2edbb00a08b4ff1 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 11 Mar 2007 00:56:43 +0000 Subject: [PATCH] Create a SidebarTreeView which will include support for drag & drop in later releases and encapsulates sidebar specific behavior. TODO: using a sort proxy model results in duplicated elements when the dir lister reloads items. svn path=/trunk/KDE/kdebase/apps/; revision=641359 --- src/CMakeLists.txt | 1 + src/dolphindetailsview.cpp | 1 + src/sidebartreeview.cpp | 85 +++++++++++++++++++++++++++++++++++++ src/sidebartreeview.h | 48 +++++++++++++++++++++ src/treeviewsidebarpage.cpp | 64 ++++++++++++++++++++++------ src/treeviewsidebarpage.h | 6 ++- 6 files changed, 190 insertions(+), 15 deletions(-) create mode 100644 src/sidebartreeview.cpp create mode 100644 src/sidebartreeview.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6c53dca95..e73965491 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -41,6 +41,7 @@ set(dolphin_SRCS statusbarspaceinfo.cpp statusbarmessagelabel.cpp treeviewsidebarpage.cpp + sidebartreeview.cpp urlbutton.cpp urlnavigator.cpp urlnavigatorbutton.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index d0556f5b1..773779976 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -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 index 000000000..ccd908463 --- /dev/null +++ b/src/sidebartreeview.cpp @@ -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 +#include + +#include +#include +#include + +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 index 000000000..acec07614 --- /dev/null +++ b/src/sidebartreeview.h @@ -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 + +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 diff --git a/src/treeviewsidebarpage.cpp b/src/treeviewsidebarpage.cpp index e60384bd9..b1fcc8daa 100644 --- a/src/treeviewsidebarpage.cpp +++ b/src/treeviewsidebarpage.cpp @@ -21,21 +21,30 @@ #include "bookmarkselector.h" #include "dolphinmainwindow.h" +#include "dolphinsortfilterproxymodel.h" #include "dolphinview.h" +#include "sidebartreeview.h" -#include "kdirlister.h" -#include "kdirmodel.h" +#include +#include +#include #include #include #include #include +// 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); diff --git a/src/treeviewsidebarpage.h b/src/treeviewsidebarpage.h index 12cb75d45..981090855 100644 --- a/src/treeviewsidebarpage.h +++ b/src/treeviewsidebarpage.h @@ -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; }; -- 2.47.3