#include "dolphinmainwindow.h"
#include "dolphinsortfilterproxymodel.h"
#include "dolphinview.h"
+#include "dolphinsettings.h"
#include "sidebartreeview.h"
#include "treeviewcontextmenu.h"
#include <kdirmodel.h>
#include <kfileitem.h>
-#include <QHeaderView>
-#include <QItemSelectionModel>
-#include <QTreeView>
-#include <QVBoxLayout>
-#include "dolphinsettings.h"
+#include <QtGui/QHeaderView>
+#include <QtGui/QItemSelection>
+#include <QtGui/QTreeView>
+#include <QtGui/QBoxLayout>
TreeViewSidebarPage::TreeViewSidebarPage(QWidget* parent) :
- SidebarPage(parent),
- m_dirLister(0),
- m_dirModel(0),
- m_proxyModel(0),
- m_treeView(0)
+ SidebarPage(parent),
+ m_dirLister(0),
+ m_dirModel(0),
+ m_proxyModel(0),
+ m_treeView(0)
{
- m_dirLister = new KDirLister();
- m_dirLister->setDirOnlyMode(true);
- m_dirLister->setAutoUpdate(true);
- m_dirLister->setMainWindow(this);
- m_dirLister->setDelayedMimeTypes(true);
- m_dirLister->setAutoErrorHandlingEnabled(false, this);
-
- 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 SidebarTreeView(this);
- m_treeView->setModel(m_proxyModel);
-
- 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(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);
}
TreeViewSidebarPage::~TreeViewSidebarPage()
}
SidebarPage::setUrl(url);
-
- // adjust the root of the tree to the base bookmark
- 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 != 0) {
+ loadTree(url);
}
+}
- if (m_dirLister->url() != baseUrl) {
- m_dirLister->stop();
- m_dirLister->openUrl(baseUrl);
+void TreeViewSidebarPage::showEvent(QShowEvent* event)
+{
+ if (event->spontaneous()) {
+ SidebarPage::showEvent(event);
+ return;
}
- // select the folder which contains the given URL
- QItemSelectionModel* selModel = m_treeView->selectionModel();
- selModel->clearSelection();
-
- const QModelIndex index = m_dirModel->indexForUrl(url);
- if (index.isValid()) {
- // 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 {
- // 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.
- connect(m_dirLister, SIGNAL(completed()),
- this, SLOT(expandSelectionParent()));
-
- KUrl parentUrl = url.upUrl();
- while (!parentUrl.isParentOf(baseUrl)) {
- m_dirLister->openUrl(parentUrl, true, false);
- parentUrl = parentUrl.upUrl();
- }
+ if (m_dirLister == 0) {
+ // Postpone the creating of the dir lister to the first show event.
+ // This assures that no performance and memory overhead is given when the TreeView is not
+ // used at all (see TreeViewSidebarPage::setUrl()).
+ m_dirLister = new KDirLister();
+ m_dirLister->setDirOnlyMode(true);
+ m_dirLister->setAutoUpdate(true);
+ m_dirLister->setMainWindow(this);
+ m_dirLister->setDelayedMimeTypes(true);
+ m_dirLister->setAutoErrorHandlingEnabled(false, this);
+
+ Q_ASSERT(m_dirModel == 0);
+ m_dirModel = new KDirModel();
+ m_dirModel->setDirLister(m_dirLister);
+ m_dirModel->setDropsAllowed(KDirModel::DropOnDirectory);
+
+ Q_ASSERT(m_proxyModel == 0);
+ m_proxyModel = new DolphinSortFilterProxyModel(this);
+ m_proxyModel->setSourceModel(m_dirModel);
+
+ Q_ASSERT(m_treeView == 0);
+ m_treeView = new SidebarTreeView(this);
+ m_treeView->setModel(m_proxyModel);
+ 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(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);
}
-}
-
-void TreeViewSidebarPage::showEvent(QShowEvent* event)
-{
+ loadTree(url());
SidebarPage::showEvent(event);
}
}
}
+void TreeViewSidebarPage::loadTree(const KUrl& url)
+{
+ Q_ASSERT(m_dirLister != 0);
+
+ // adjust the root of the tree to the base bookmark
+ 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);
+ }
+
+ // select the folder which contains the given URL
+ QItemSelectionModel* selModel = m_treeView->selectionModel();
+ selModel->clearSelection();
+
+ const QModelIndex index = m_dirModel->indexForUrl(url);
+ if (index.isValid()) {
+ // 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 {
+ // 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.
+ connect(m_dirLister, SIGNAL(completed()),
+ this, SLOT(expandSelectionParent()));
+
+ // Implementation note: It is important to remove the trailing slash from
+ // the parent URL, as the directories from the dir lister (KDirLister::directories())
+ // don't have a trailing slash and hence KUrl::List::contains() would fail...
+ KUrl parentUrl = url.upUrl();
+ parentUrl.adjustPath(KUrl::RemoveTrailingSlash);
+ while (!parentUrl.isParentOf(baseUrl)) {
+ if (m_dirLister->directories().contains(parentUrl)) {
+ m_dirLister->updateDirectory(parentUrl);
+ } else {
+ m_dirLister->openUrl(parentUrl, true, false);
+ }
+ parentUrl = parentUrl.upUrl();
+ parentUrl.adjustPath(KUrl::RemoveTrailingSlash);
+ }
+ }
+}
+
#include "treeviewsidebarpage.moc"