From 293e65797afd44a530df3435a8cc5b1b024aa3bb Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 10 Jun 2007 11:46:41 +0000 Subject: [PATCH] Remember and restore position of viewport when reloading or going back in history (worked already before the DolphinView/DolphinViewContainer split). Minor open issue: the x-position of the Column View is reset to 0... svn path=/trunk/KDE/kdebase/apps/; revision=673498 --- src/dolphinview.cpp | 148 +++++++++++++++++------------------ src/dolphinview.h | 20 ++--- src/dolphinviewcontainer.cpp | 18 ++++- src/dolphinviewcontainer.h | 12 +++ 4 files changed, 104 insertions(+), 94 deletions(-) diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index ae56c6ea2..65ec4c9d3 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -83,8 +83,6 @@ DolphinView::DolphinView(QWidget* parent, connect(clipboard, SIGNAL(dataChanged()), this, SLOT(updateCutItems())); - connect(m_dirLister, SIGNAL(completed()), - this, SLOT(restoreContentsPos())); connect(m_dirLister, SIGNAL(completed()), this, SLOT(updateCutItems())); connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)), @@ -276,14 +274,77 @@ void DolphinView::invertSelection() selectAll(QItemSelectionModel::Toggle); } -int DolphinView::contentsX() const +bool DolphinView::hasSelection() const +{ + return itemView()->selectionModel()->hasSelection(); +} + +void DolphinView::clearSelection() +{ + itemView()->selectionModel()->clear(); +} + +KFileItemList DolphinView::selectedItems() const +{ + const QAbstractItemView* view = itemView(); + + // Our view has a selection, we will map them back to the DirModel + // and then fill the KFileItemList. + Q_ASSERT((view != 0) && (view->selectionModel() != 0)); + + const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection()); + KFileItemList itemList; + + const QModelIndexList indexList = selection.indexes(); + QModelIndexList::const_iterator end = indexList.end(); + for (QModelIndexList::const_iterator it = indexList.begin(); it != end; ++it) { + Q_ASSERT((*it).isValid()); + + KFileItem* item = m_dirModel->itemForIndex(*it); + if (item != 0) { + itemList.append(item); + } + } + + return itemList; +} + +KUrl::List DolphinView::selectedUrls() const { - return itemView()->horizontalScrollBar()->value(); + KUrl::List urls; + + const KFileItemList list = selectedItems(); + KFileItemList::const_iterator it = list.begin(); + const KFileItemList::const_iterator end = list.end(); + while (it != end) { + KFileItem* item = *it; + urls.append(item->url()); + ++it; + } + + return urls; } -int DolphinView::contentsY() const +KFileItem* DolphinView::fileItem(const QModelIndex index) const { - return itemView()->verticalScrollBar()->value(); + const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index); + return m_dirModel->itemForIndex(dirModelIndex); +} + +void DolphinView::setContentsPosition(int x, int y) +{ + QAbstractItemView* view = itemView(); + view->horizontalScrollBar()->setValue(x); + view->verticalScrollBar()->setValue(y); + + m_blockContentsMovedSignal = false; +} + +QPoint DolphinView::contentsPosition() const +{ + const int x = itemView()->horizontalScrollBar()->value(); + const int y = itemView()->verticalScrollBar()->value(); + return QPoint(x, y); } void DolphinView::zoomIn() @@ -347,63 +408,6 @@ KFileItemDelegate::AdditionalInformation DolphinView::additionalInfo() const return m_fileItemDelegate->additionalInformation(); } -bool DolphinView::hasSelection() const -{ - return itemView()->selectionModel()->hasSelection(); -} - -void DolphinView::clearSelection() -{ - itemView()->selectionModel()->clear(); -} - -KFileItemList DolphinView::selectedItems() const -{ - const QAbstractItemView* view = itemView(); - - // Our view has a selection, we will map them back to the DirModel - // and then fill the KFileItemList. - Q_ASSERT((view != 0) && (view->selectionModel() != 0)); - - const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection()); - KFileItemList itemList; - - const QModelIndexList indexList = selection.indexes(); - QModelIndexList::const_iterator end = indexList.end(); - for (QModelIndexList::const_iterator it = indexList.begin(); it != end; ++it) { - Q_ASSERT((*it).isValid()); - - KFileItem* item = m_dirModel->itemForIndex(*it); - if (item != 0) { - itemList.append(item); - } - } - - return itemList; -} - -KUrl::List DolphinView::selectedUrls() const -{ - KUrl::List urls; - - const KFileItemList list = selectedItems(); - KFileItemList::const_iterator it = list.begin(); - const KFileItemList::const_iterator end = list.end(); - while (it != end) { - KFileItem* item = *it; - urls.append(item->url()); - ++it; - } - - return urls; -} - -KFileItem* DolphinView::fileItem(const QModelIndex index) const -{ - const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index); - return m_dirModel->itemForIndex(dirModelIndex); -} - void DolphinView::reload() { setUrl(url()); @@ -519,20 +523,6 @@ void DolphinView::showPreview(const KFileItem& item, const QPixmap& pixmap) } } -void DolphinView::restoreContentsPos() -{ - m_blockContentsMovedSignal = false; - if (!url().isEmpty()) { - QAbstractItemView* view = itemView(); - // TODO #1: view->setCurrentItem(m_urlNavigator->currentFileName()); - // TODO #2: temporary deactivated due to DolphinView/DolphinViewController split - //QPoint pos = m_urlNavigator->savedPosition(); - QPoint pos(0, 0); - view->horizontalScrollBar()->setValue(pos.x()); - view->verticalScrollBar()->setValue(pos.y()); - } -} - void DolphinView::emitSelectionChangedSignal() { emit selectionChanged(DolphinView::selectedItems()); @@ -552,6 +542,7 @@ void DolphinView::startDirLister(const KUrl& url, bool reload) m_cutItemsCache.clear(); m_blockContentsMovedSignal = true; + m_dirLister->stop(); bool openDir = true; @@ -764,7 +755,8 @@ void DolphinView::updateSortOrder(Qt::SortOrder order) void DolphinView::emitContentsMoved() { if (!m_blockContentsMovedSignal) { - emit contentsMoved(contentsX(), contentsY()); + const QPoint pos(contentsPosition()); + emit contentsMoved(pos.x(), pos.y()); } } diff --git a/src/dolphinview.h b/src/dolphinview.h index bcccb7404..ebca53e99 100644 --- a/src/dolphinview.h +++ b/src/dolphinview.h @@ -236,18 +236,14 @@ public: KFileItem* fileItem(const QModelIndex index) const; /** - * Returns the x-position of the view content. - * The content of the view might be larger than the visible area + * Sets the upper left position of the view content + * to (x,y). The content of the view might be larger than the visible area * and hence a scrolling must be done. */ - int contentsX() const; + void setContentsPosition(int x, int y); - /** - * Returns the y-position of the view content. - * The content of the view might be larger than the visible area - * and hence a scrolling must be done. - */ - int contentsY() const; + /** Returns the upper left position of the view content. */ + QPoint contentsPosition() const; /** Increases the size of the current set view mode. */ void zoomIn(); @@ -415,12 +411,6 @@ private slots: */ void showPreview(const KFileItem& item, const QPixmap& pixmap); - /** - * Restores the x- and y-position of the contents if the - * current view is part of the history. - */ - void restoreContentsPos(); - void emitSelectionChangedSignal(); /** diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index c05c4251c..01cc27896 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -133,6 +133,8 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow, this, SLOT(openContextMenu(KFileItem*, const KUrl&))); connect(m_view, SIGNAL(urlsDropped(const KUrl::List&, const KUrl&)), m_mainWindow, SLOT(dropUrls(const KUrl::List&, const KUrl&))); + connect(m_view, SIGNAL(contentsMoved(int, int)), + this, SLOT(saveContentsPos(int, int))); connect(m_view, SIGNAL(requestItemInfo(const KUrl&)), this, SLOT(showItemInfo(const KUrl&))); connect(m_view, SIGNAL(errorMessage(const QString&)), @@ -329,7 +331,7 @@ void DolphinViewContainer::updateItemCount() updateStatusBar(); - QTimer::singleShot(0, this, SLOT(restoreContentsPos())); + QTimer::singleShot(100, this, SLOT(restoreContentsPos())); } void DolphinViewContainer::showItemInfo(const KUrl& url) @@ -472,4 +474,18 @@ void DolphinViewContainer::openContextMenu(KFileItem* item, contextMenu.open(); } +void DolphinViewContainer::saveContentsPos(int x, int y) +{ + m_urlNavigator->savePosition(x, y); +} + +void DolphinViewContainer::restoreContentsPos() +{ + if (!url().isEmpty()) { + const QPoint pos = m_urlNavigator->savedPosition(); + m_view->setContentsPosition(pos.x(), pos.y()); + } +} + + #include "dolphinviewcontainer.moc" diff --git a/src/dolphinviewcontainer.h b/src/dolphinviewcontainer.h index 1d1a0a389..83ef15944 100644 --- a/src/dolphinviewcontainer.h +++ b/src/dolphinviewcontainer.h @@ -184,6 +184,18 @@ private slots: */ void openContextMenu(KFileItem* item, const KUrl& url); + /** + * Saves the position of the contents to the + * current history element. + */ + void saveContentsPos(int x, int y); + + /** + * Restores the contents position of the view, if the view + * is part of the history. + */ + void restoreContentsPos(); + private: /** * Returns the default text of the status bar, if no item is -- 2.47.3