X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/49f881f5ec01014e7b6b0c7fa14abd7e99f605fc..30161a7b3fe76578f43a61381c98a5ae475ed52a:/src/treeviewsidebarpage.cpp diff --git a/src/treeviewsidebarpage.cpp b/src/treeviewsidebarpage.cpp index 63689b6eb..095117119 100644 --- a/src/treeviewsidebarpage.cpp +++ b/src/treeviewsidebarpage.cpp @@ -19,12 +19,13 @@ #include "treeviewsidebarpage.h" -#include "bookmarkselector.h" #include "dolphinmainwindow.h" #include "dolphinsortfilterproxymodel.h" #include "dolphinview.h" #include "sidebartreeview.h" +#include "treeviewcontextmenu.h" +#include #include #include #include @@ -33,23 +34,15 @@ #include #include #include +#include "dolphinsettings.h" -// 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), +TreeViewSidebarPage::TreeViewSidebarPage(QWidget* parent) : + SidebarPage(parent), m_dirLister(0), m_dirModel(0), m_proxyModel(0), - m_treeView(0), - m_selectedUrl() + m_treeView(0) { - Q_ASSERT(mainWindow != 0); - m_dirLister = new KDirLister(); m_dirLister->setDirOnlyMode(true); m_dirLister->setAutoUpdate(true); @@ -61,20 +54,14 @@ TreeViewSidebarPage::TreeViewSidebarPage(DolphinMainWindow* mainWindow, m_dirModel->setDirLister(m_dirLister); m_dirModel->setDropsAllowed(KDirModel::DropOnDirectory); - -#if defined(USE_PROXY_MODEL) m_proxyModel = new DolphinSortFilterProxyModel(this); m_proxyModel->setSourceModel(m_dirModel); - m_treeView = new SidebarTreeView(mainWindow, this); + m_treeView = new SidebarTreeView(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 + m_proxyModel->setSortOrder(Qt::AscendingOrder); connect(m_treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(updateActiveView(const QModelIndex&))); @@ -82,6 +69,7 @@ TreeViewSidebarPage::TreeViewSidebarPage(DolphinMainWindow* mainWindow, this, SLOT(dropUrls(const KUrl::List&, const QModelIndex&))); QVBoxLayout* layout = new QVBoxLayout(this); + layout->setMargin(0); layout->addWidget(m_treeView); } @@ -91,27 +79,17 @@ TreeViewSidebarPage::~TreeViewSidebarPage() m_dirLister = 0; } -void TreeViewSidebarPage::activeViewChanged() -{ - connectToActiveView(); -} - -void TreeViewSidebarPage::showEvent(QShowEvent* event) -{ - SidebarPage::showEvent(event); - connectToActiveView(); -} - -void TreeViewSidebarPage::updateSelection(const KUrl& url) +void TreeViewSidebarPage::setUrl(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(); + const KUrl baseUrl = placesModel->url(placesModel->closestItem(url)); if (m_dirLister->url() != baseUrl) { m_dirLister->stop(); m_dirLister->openUrl(baseUrl); @@ -121,19 +99,12 @@ 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()) { -#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 @@ -148,6 +119,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() @@ -156,48 +151,35 @@ 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()) { -#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); + index = m_dirModel->indexForUrl(m_url); 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 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); + emit changeUrl(url); } } @@ -205,33 +187,13 @@ void TreeViewSidebarPage::dropUrls(const KUrl::List& urls, const QModelIndex& index) { if (index.isValid()) { -#if defined(USE_PROXY_MODEL) - const QModelIndex& dirIndex = m_proxyModel->mapToSource(index); + const QModelIndex dirIndex = m_proxyModel->mapToSource(index); KFileItem* item = m_dirModel->itemForIndex(dirIndex); -#else - KFileItem* item = m_dirModel->itemForIndex(index); -#endif Q_ASSERT(item != 0); if (item->isDir()) { - mainWindow()->dropUrls(urls, item->url()); + emit urlsDropped(urls, item->url()); } } } -void TreeViewSidebarPage::connectToActiveView() -{ - const QWidget* parent = parentWidget(); - if ((parent == 0) || parent->isHidden()) { - return; - } - - 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"