X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f782a725d48fdc45c3e21ee7d26cd69ce01f231f..61a4e8691d600a1d105142ce44570c4107600a04:/src/treeviewsidebarpage.cpp diff --git a/src/treeviewsidebarpage.cpp b/src/treeviewsidebarpage.cpp index e60384bd9..ef75baf95 100644 --- a/src/treeviewsidebarpage.cpp +++ b/src/treeviewsidebarpage.cpp @@ -19,28 +19,30 @@ #include "treeviewsidebarpage.h" -#include "bookmarkselector.h" #include "dolphinmainwindow.h" +#include "dolphinsortfilterproxymodel.h" #include "dolphinview.h" +#include "sidebartreeview.h" +#include "treeviewcontextmenu.h" -#include "kdirlister.h" -#include "kdirmodel.h" +#include +#include +#include +#include #include #include #include #include - -TreeViewSidebarPage::TreeViewSidebarPage(DolphinMainWindow* mainWindow, - QWidget* parent) : - SidebarPage(mainWindow, parent), - m_dirLister(0), - m_dirModel(0), - m_treeView(0), - m_selectedUrl() +#include "dolphinsettings.h" + +TreeViewSidebarPage::TreeViewSidebarPage(QWidget* parent) : + SidebarPage(parent), + m_dirLister(0), + m_dirModel(0), + m_proxyModel(0), + m_treeView(0) { - Q_ASSERT(mainWindow != 0); - m_dirLister = new KDirLister(); m_dirLister->setDirOnlyMode(true); m_dirLister->setAutoUpdate(true); @@ -50,26 +52,24 @@ TreeViewSidebarPage::TreeViewSidebarPage(DolphinMainWindow* mainWindow, m_dirModel = new KDirModel(); m_dirModel->setDirLister(m_dirLister); + m_dirModel->setDropsAllowed(KDirModel::DropOnDirectory); + + m_proxyModel = new DolphinSortFilterProxyModel(this); + m_proxyModel->setSourceModel(m_dirModel); - m_treeView = new QTreeView(this); - m_treeView->setModel(m_dirModel); - m_treeView->setSelectionMode(QAbstractItemView::SingleSelection); - m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers); + m_treeView = new SidebarTreeView(this); + m_treeView->setModel(m_proxyModel); - // 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(); + m_proxyModel->setSorting(DolphinView::SortByName); + m_proxyModel->setSortOrder(Qt::AscendingOrder); connect(m_treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(updateActiveView(const QModelIndex&))); - connect(m_treeView, SIGNAL(doubleClicked(const QModelIndex&)), - this, SLOT(slotDoubleClicked(const QModelIndex&))); + connect(m_treeView, SIGNAL(urlsDropped(const KUrl::List&, const QModelIndex&)), + this, SLOT(dropUrls(const KUrl::List&, const QModelIndex&))); QVBoxLayout* layout = new QVBoxLayout(this); + layout->setMargin(0); layout->addWidget(m_treeView); } @@ -79,27 +79,23 @@ TreeViewSidebarPage::~TreeViewSidebarPage() m_dirLister = 0; } -void TreeViewSidebarPage::activeViewChanged() -{ - connectToActiveView(); -} - -void TreeViewSidebarPage::showEvent(QShowEvent* event) +void TreeViewSidebarPage::setUrl(const KUrl& url) { - SidebarPage::showEvent(event); - connectToActiveView(); -} - -void TreeViewSidebarPage::updateSelection(const KUrl& url) -{ - if (!url.isValid() || (url == m_selectedUrl)) { + if (!url.isValid() || (url == m_url)) { return; } - m_selectedUrl = url; + m_url = url; // adjust the root of the tree to the base bookmark - const KUrl baseUrl = BookmarkSelector::baseBookmark(url).url(); + KFilePlacesModel* placesModel = DolphinSettings::instance().placesModel(); + KUrl baseUrl = placesModel->url(placesModel->closestItem(url)); + if (!baseUrl.isValid()) { + // it's possible that no closest item is available and hence an + // empty URL is returned + baseUrl = url; + } + if (m_dirLister->url() != baseUrl) { m_dirLister->stop(); m_dirLister->openUrl(baseUrl); @@ -109,14 +105,13 @@ void TreeViewSidebarPage::updateSelection(const KUrl& url) QItemSelectionModel* selModel = m_treeView->selectionModel(); selModel->clearSelection(); - const KFileItem item(S_IFDIR, KFileItem::Unknown, url); - const QModelIndex index = m_dirModel->indexForItem(item); + const QModelIndex index = m_dirModel->indexForUrl(url); if (index.isValid()) { // the item with the given URL is already part of the model - m_treeView->scrollTo(index); - selModel->setCurrentIndex(index, QItemSelectionModel::Select); - } - else { + const QModelIndex proxyIndex = m_proxyModel->mapFromSource(index); + m_treeView->scrollTo(proxyIndex); + selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::Select); + } else { // The item with the given URL is not loaded by the model yet. Iterate // backward to the base URL and trigger the loading of the items for // each hierarchy level. @@ -129,6 +124,30 @@ void TreeViewSidebarPage::updateSelection(const KUrl& url) parentUrl = parentUrl.upUrl(); } } + +} + +void TreeViewSidebarPage::showEvent(QShowEvent* event) +{ + SidebarPage::showEvent(event); +} + +void TreeViewSidebarPage::contextMenuEvent(QContextMenuEvent* event) +{ + SidebarPage::contextMenuEvent(event); + + const QModelIndex index = m_treeView->indexAt(event->pos()); + if (!index.isValid()) { + // only open a context menu above a directory item + return; + } + + const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index); + KFileItem* item = m_dirModel->itemForIndex(dirModelIndex); + + emit changeSelection(KFileItemList()); + TreeViewContextMenu contextMenu(this, item); + contextMenu.open(); } void TreeViewSidebarPage::expandSelectionParent() @@ -137,46 +156,49 @@ void TreeViewSidebarPage::expandSelectionParent() this, SLOT(expandSelectionParent())); // expand the parent folder of the selected item - const KFileItem parentItem(S_IFDIR, KFileItem::Unknown, m_selectedUrl.upUrl()); - QModelIndex index = m_dirModel->indexForItem(parentItem); + KUrl parentUrl = m_url.upUrl(); + if (!m_dirLister->url().isParentOf(parentUrl)) { + return; + } + + QModelIndex index = m_dirModel->indexForUrl(parentUrl); if (index.isValid()) { - m_treeView->setExpanded(index, true); + QModelIndex proxyIndex = m_proxyModel->mapFromSource(index); + m_treeView->setExpanded(proxyIndex, true); // select the item and assure that the item is visible - const KFileItem selectedItem(S_IFDIR, KFileItem::Unknown, m_selectedUrl); - index = m_dirModel->indexForItem(selectedItem); + index = m_dirModel->indexForUrl(m_url); if (index.isValid()) { - m_treeView->scrollTo(index); + proxyIndex = m_proxyModel->mapFromSource(index); + m_treeView->scrollTo(proxyIndex); QItemSelectionModel* selModel = m_treeView->selectionModel(); - selModel->setCurrentIndex(index, QItemSelectionModel::Select); + selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::Select); } } } void TreeViewSidebarPage::updateActiveView(const QModelIndex& index) { - const KFileItem* item = m_dirModel->itemForIndex(index); + const QModelIndex dirIndex = m_proxyModel->mapToSource(index); + const KFileItem* item = m_dirModel->itemForIndex(dirIndex); if (item != 0) { const KUrl& url = item->url(); - mainWindow()->activeView()->setUrl(url); + emit changeUrl(url); } } -void TreeViewSidebarPage::connectToActiveView() +void TreeViewSidebarPage::dropUrls(const KUrl::List& urls, + const QModelIndex& index) { - const QWidget* parent = parentWidget(); - if ((parent == 0) || parent->isHidden()) { - return; + if (index.isValid()) { + const QModelIndex dirIndex = m_proxyModel->mapToSource(index); + KFileItem* item = m_dirModel->itemForIndex(dirIndex); + Q_ASSERT(item != 0); + if (item->isDir()) { + emit urlsDropped(urls, item->url()); + } } - - const DolphinView* view = mainWindow()->activeView(); - const KUrl& url = view->url(); - - connect(view, SIGNAL(urlChanged(const KUrl&)), - this, SLOT(updateSelection(const KUrl&))); - - updateSelection(url); } #include "treeviewsidebarpage.moc"