optimization: don't load the directory tree if the widget is invisible

svn path=/trunk/KDE/kdebase/apps/; revision=661865
This commit is contained in:
Peter Penz 2007-05-06 20:47:15 +00:00
parent 4405774647
commit aad46935fa
2 changed files with 51 additions and 39 deletions

View file

@ -86,50 +86,18 @@ void TreeViewSidebarPage::setUrl(const KUrl& url)
} }
SidebarPage::setUrl(url); SidebarPage::setUrl(url);
// TODO: it makes only sense to load the tree if the TreeViewSidebarPage
// adjust the root of the tree to the base bookmark // is visible, but currently an assertion is triggered in KDirModel when hiding
KFilePlacesModel* placesModel = DolphinSettings::instance().placesModel(); // the tree view, changing to a complete different hierarchy and showing it again.
KUrl baseUrl = placesModel->url(placesModel->closestItem(url)); //if (isVisible()) {
if (!baseUrl.isValid()) { loadTree(url);
// 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()));
KUrl parentUrl = url.upUrl();
while (!parentUrl.isParentOf(baseUrl)) {
m_dirLister->openUrl(parentUrl, true, false);
parentUrl = parentUrl.upUrl();
}
}
} }
void TreeViewSidebarPage::showEvent(QShowEvent* event) void TreeViewSidebarPage::showEvent(QShowEvent* event)
{ {
SidebarPage::showEvent(event); SidebarPage::showEvent(event);
loadTree(url());
} }
void TreeViewSidebarPage::contextMenuEvent(QContextMenuEvent* event) void TreeViewSidebarPage::contextMenuEvent(QContextMenuEvent* event)
@ -201,4 +169,45 @@ void TreeViewSidebarPage::dropUrls(const KUrl::List& urls,
} }
} }
void TreeViewSidebarPage::loadTree(const KUrl& 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->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()));
KUrl parentUrl = url.upUrl();
while (!parentUrl.isParentOf(baseUrl)) {
m_dirLister->openUrl(parentUrl, true, false);
parentUrl = parentUrl.upUrl();
}
}
}
#include "treeviewsidebarpage.moc" #include "treeviewsidebarpage.moc"

View file

@ -78,6 +78,9 @@ private slots:
void dropUrls(const KUrl::List& urls, void dropUrls(const KUrl::List& urls,
const QModelIndex& index); const QModelIndex& index);
private:
void loadTree(const KUrl& url);
private: private:
KDirLister* m_dirLister; KDirLister* m_dirLister;
KDirModel* m_dirModel; KDirModel* m_dirModel;