Use the new method KDirModel::expandToUrl() from David for expanding the treeview -> no more crashes anymore for long URLs :-)

svn path=/trunk/KDE/kdebase/apps/; revision=706516
This commit is contained in:
Peter Penz 2007-08-30 16:20:46 +00:00
parent db1b90e4fa
commit 52648c9634
2 changed files with 91 additions and 37 deletions

View file

@ -31,17 +31,19 @@
#include <kdirmodel.h>
#include <kfileitem.h>
#include <QtGui/QHeaderView>
#include <QtGui/QItemSelection>
#include <QtGui/QTreeView>
#include <QtGui/QBoxLayout>
#include <QItemSelection>
#include <QTreeView>
#include <QBoxLayout>
#include <QModelIndex>
#include <QTimer>
TreeViewSidebarPage::TreeViewSidebarPage(QWidget* parent) :
SidebarPage(parent),
m_dirLister(0),
m_dirModel(0),
m_proxyModel(0),
m_treeView(0)
m_treeView(0),
m_leafDir()
{
}
@ -92,6 +94,8 @@ void TreeViewSidebarPage::showEvent(QShowEvent* event)
m_dirModel = new KDirModel(this);
m_dirModel->setDirLister(m_dirLister);
m_dirModel->setDropsAllowed(KDirModel::DropOnDirectory);
connect(m_dirModel, SIGNAL(expand(const QModelIndex&)),
this, SLOT(triggerExpanding(const QModelIndex&)));
Q_ASSERT(m_proxyModel == 0);
m_proxyModel = new DolphinSortFilterProxyModel(this);
@ -185,9 +189,63 @@ void TreeViewSidebarPage::dropUrls(const KUrl::List& urls,
}
}
void TreeViewSidebarPage::triggerExpanding(const QModelIndex& index)
{
Q_UNUSED(index);
// the expanding of the folders may not be done in the context
// of this slot
QTimer::singleShot(0, this, SLOT(expandToLeafDir()));
}
void TreeViewSidebarPage::expandToLeafDir()
{
// expand all directories until the parent directory of m_leafDir
const KUrl parentUrl = m_leafDir.upUrl();
QModelIndex dirIndex = m_dirModel->indexForUrl(parentUrl);
QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex);
m_treeView->setExpanded(proxyIndex, true);
// assure that m_leafDir gets selected
dirIndex = m_dirModel->indexForUrl(m_leafDir);
proxyIndex = m_proxyModel->mapFromSource(dirIndex);
m_treeView->scrollTo(proxyIndex);
QItemSelectionModel* selModel = m_treeView->selectionModel();
selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::Select);
}
void TreeViewSidebarPage::loadSubTree()
{
disconnect(m_dirLister, SIGNAL(completed()),
this, SLOT(loadSubTree()));
QItemSelectionModel* selModel = m_treeView->selectionModel();
selModel->clearSelection();
if (m_leafDir.isParentOf(m_dirLister->url())) {
// The leaf directory is not a child of the base URL, hence
// no sub directory must be loaded or selected.
return;
}
const QModelIndex index = m_dirModel->indexForUrl(m_leafDir);
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 {
// Load all sub directories that need to get expanded for making
// the leaf directory visible. The slot triggerExpanding() will
// get invoked if the expanding has been finished.
m_dirModel->expandToUrl(m_leafDir);
}
}
void TreeViewSidebarPage::loadTree(const KUrl& url)
{
Q_ASSERT(m_dirLister != 0);
m_leafDir = url;
// adjust the root of the tree to the base place
KFilePlacesModel* placesModel = DolphinSettings::instance().placesModel();
@ -198,42 +256,13 @@ void TreeViewSidebarPage::loadTree(const KUrl& url)
baseUrl = url;
}
connect(m_dirLister, SIGNAL(completed()),
this, SLOT(loadSubTree()));
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);
}
loadSubTree();
}
}

View file

@ -81,7 +81,31 @@ private slots:
void dropUrls(const KUrl::List& urls,
const QModelIndex& index);
/**
* Invokes expandToLeafDir() asynchronously (the expanding
* may not be done in the context of this slot).
*/
void triggerExpanding(const QModelIndex& index);
/**
* Expands all directories to make m_leafDir visible and
* adjusts the selection.
*/
void expandToLeafDir();
/**
* Loads the sub tree to make m_leafDir visible. Is invoked
* indirectly by loadTree() after the directory lister has
* finished loading the root items.
*/
void loadSubTree();
private:
/**
* Initializes the base URL of the tree and expands all
* directories until \a url.
* @param url URL of the leaf directory that should get expanded.
*/
void loadTree(const KUrl& url);
private:
@ -89,6 +113,7 @@ private:
KDirModel* m_dirModel;
DolphinSortFilterProxyModel* m_proxyModel;
SidebarTreeView* m_treeView;
KUrl m_leafDir;
};
#endif // TREEVIEWSIDEBARPAGE_H