diff -Nru gwenview-4.11.1/app/contextmanager.cpp gwenview-4.11.2/app/contextmanager.cpp --- gwenview-4.11.1/app/contextmanager.cpp 2013-08-28 17:06:41.180773470 +0000 +++ gwenview-4.11.2/app/contextmanager.cpp 2013-09-26 19:22:36.498229265 +0000 @@ -80,7 +80,7 @@ } }; -ContextManager::ContextManager(SortedDirModel* dirModel, QItemSelectionModel* selectionModel, QObject* parent) +ContextManager::ContextManager(SortedDirModel* dirModel, QObject* parent) : QObject(parent) , d(new ContextManagerPrivate) { @@ -94,7 +94,26 @@ connect(d->mDirModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(slotDirModelDataChanged(QModelIndex,QModelIndex))); - d->mSelectionModel = selectionModel; + /* HACK! In extended-selection mode, when the current index is removed, + * QItemSelectionModel selects the previous index if there is one, if not it + * selects the next index. This is not what we want: when the user removes + * an image, he expects to go to the next one, not the previous one. + * + * To overcome this, we must connect to the mDirModel.rowsAboutToBeRemoved() + * signal *before* QItemSelectionModel connects to it, so that our slot is + * called before QItemSelectionModel slot. This allows us to pick a new + * current index ourself, leaving QItemSelectionModel slot with nothing to + * do. + * + * This is the reason ContextManager creates a QItemSelectionModel itself: + * doing so ensures QItemSelectionModel cannot be connected to the + * mDirModel.rowsAboutToBeRemoved() signal before us. + */ + connect(d->mDirModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), + SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int))); + + d->mSelectionModel = new QItemSelectionModel(d->mDirModel); + connect(d->mSelectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(slotSelectionChanged())); connect(d->mSelectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)), @@ -109,6 +128,11 @@ delete d; } +QItemSelectionModel* ContextManager::selectionModel() const +{ + return d->mSelectionModel; +} + void ContextManager::addItem(AbstractContextManagerItem* item) { d->mList << item; @@ -215,4 +239,24 @@ d->mQueuedSignals.clear(); } +void Gwenview::ContextManager::slotRowsAboutToBeRemoved(const QModelIndex& /*parent*/, int start, int end) +{ + QModelIndex oldCurrent = d->mSelectionModel->currentIndex(); + if (oldCurrent.row() < start || oldCurrent.row() > end) { + // currentIndex has not been removed + return; + } + QModelIndex newCurrent; + if (end + 1 < d->mDirModel->rowCount()) { + newCurrent = d->mDirModel->index(end + 1, 0); + } else if (start > 0) { + newCurrent = d->mDirModel->index(start - 1, 0); + } else { + // No index we can select, nothing to do + return; + } + d->mSelectionModel->select(oldCurrent, QItemSelectionModel::Deselect); + d->mSelectionModel->setCurrentIndex(newCurrent, QItemSelectionModel::Select); +} + } // namespace diff -Nru gwenview-4.11.1/app/contextmanager.h gwenview-4.11.2/app/contextmanager.h --- gwenview-4.11.1/app/contextmanager.h 2013-06-28 17:36:02.632601977 +0000 +++ gwenview-4.11.2/app/contextmanager.h 2013-09-26 19:22:36.498229265 +0000 @@ -47,7 +47,7 @@ { Q_OBJECT public: - ContextManager(SortedDirModel*, QItemSelectionModel*, QObject* parent); + ContextManager(SortedDirModel*, QObject* parent); ~ContextManager(); @@ -65,6 +65,8 @@ SortedDirModel* dirModel() const; + QItemSelectionModel* selectionModel() const; + Q_SIGNALS: void selectionChanged(); void selectionDataChanged(); @@ -75,6 +77,7 @@ void slotSelectionChanged(); void slotCurrentChanged(const QModelIndex&); void emitQueuedSignals(); + void slotRowsAboutToBeRemoved(const QModelIndex& /*parent*/, int start, int end); private: ContextManagerPrivate* const d; diff -Nru gwenview-4.11.1/app/mainwindow.cpp gwenview-4.11.2/app/mainwindow.cpp --- gwenview-4.11.1/app/mainwindow.cpp 2013-08-28 17:06:41.183773450 +0000 +++ gwenview-4.11.2/app/mainwindow.cpp 2013-09-26 19:22:36.498229265 +0000 @@ -268,9 +268,11 @@ void setupThumbnailView(QWidget* parent) { + Q_ASSERT(mContextManager); mBrowseMainPage = new BrowseMainPage(parent, q->actionCollection(), mGvCore); mThumbnailView = mBrowseMainPage->thumbnailView(); + mThumbnailView->setSelectionModel(mContextManager->selectionModel()); mUrlNavigator = mBrowseMainPage->urlNavigator(); mDocumentInfoProvider = new DocumentInfoProvider(mDirModel); @@ -279,7 +281,7 @@ mThumbnailViewHelper = new ThumbnailViewHelper(mDirModel, q->actionCollection()); mThumbnailView->setThumbnailViewHelper(mThumbnailViewHelper); - mThumbnailBarSelectionModel = new KLinkItemSelectionModel(mThumbnailBarModel, mThumbnailView->selectionModel(), q); + mThumbnailBarSelectionModel = new KLinkItemSelectionModel(mThumbnailBarModel, mContextManager->selectionModel(), q); // Connect thumbnail view connect(mThumbnailView, SIGNAL(indexActivated(QModelIndex)), @@ -485,12 +487,11 @@ edit->addAction(action->objectName(), action); } - void setupContextManager() + void setupContextManagerItems() { + Q_ASSERT(mContextManager); KActionCollection* actionCollection = q->actionCollection(); - mContextManager = new ContextManager(mDirModel, mThumbnailView->selectionModel(), q); - // Create context manager items FolderViewContextManagerItem* folderViewItem = new FolderViewContextManagerItem(mContextManager); mContextManager->addItem(folderViewItem); @@ -886,6 +887,7 @@ d->q = this; d->mCurrentMainPageId = StartMainPageId; d->mDirModel = new SortedDirModel(this); + d->mContextManager = new ContextManager(d->mDirModel, this); d->setupThumbnailBarModel(); d->mGvCore = new GvCore(this, d->mDirModel); d->mPreloader = new Preloader(this); @@ -896,7 +898,7 @@ d->setupWidgets(); d->setupActions(); d->setupUndoActions(); - d->setupContextManager(); + d->setupContextManagerItems(); d->setupFullScreenContent(); d->updateActions(); updatePreviousNextActions(); diff -Nru gwenview-4.11.1/debian/changelog gwenview-4.11.2/debian/changelog --- gwenview-4.11.1/debian/changelog 2013-09-06 21:04:46.000000000 +0000 +++ gwenview-4.11.2/debian/changelog 2013-09-30 12:56:33.000000000 +0000 @@ -1,3 +1,9 @@ +gwenview (4:4.11.2-0ubuntu1) saucy; urgency=low + + * New upstream bugfix release + + -- Jonathan Riddell Mon, 30 Sep 2013 13:56:32 +0100 + gwenview (4:4.11.1-0ubuntu1) saucy; urgency=low * New upstream bugfix release. diff -Nru gwenview-4.11.1/debian/control gwenview-4.11.2/debian/control --- gwenview-4.11.1/debian/control 2013-09-06 21:04:46.000000000 +0000 +++ gwenview-4.11.2/debian/control 2013-09-30 12:56:33.000000000 +0000 @@ -6,10 +6,10 @@ Uploaders: Eshat Cakar , Sune Vuorela Build-Depends: kde-sc-dev-latest (>= 4:4.10.2), cmake, debhelper (>= 7.3.16), pkg-kde-tools (>= 0.12), - libexiv2-dev, libjpeg-dev, libkipi-dev (>= 4:4.11.1), libkonq5-dev (>= 4:4.11.1), + libexiv2-dev, libjpeg-dev, libkipi-dev (>= 4:4.11.2), libkonq5-dev (>= 4:4.11.2), shared-desktop-ontologies (>= 0.8), libqt4-opengl-dev, - libkactivities-dev (>= 4:4.11.1), libpng-dev, liblcms2-dev, - nepomuk-core-dev (>= 4:4.11.1) + libkactivities-dev (>= 4:4.11.2), libpng-dev, liblcms2-dev, + nepomuk-core-dev (>= 4:4.11.2) Standards-Version: 3.9.3 Homepage: http://www.kde.org/ Vcs-Browser: http://bazaar.launchpad.net/~kubuntu-packagers/kubuntu-packaging/gwenview diff -Nru gwenview-4.11.1/lib/thumbnailview/thumbnailview.cpp gwenview-4.11.2/lib/thumbnailview/thumbnailview.cpp --- gwenview-4.11.1/lib/thumbnailview/thumbnailview.cpp 2013-08-28 17:06:41.223773185 +0000 +++ gwenview-4.11.2/lib/thumbnailview/thumbnailview.cpp 2013-09-26 19:22:36.499229258 +0000 @@ -493,18 +493,6 @@ d->mThumbnailProvider->removeItems(itemList); } - // Update current index if it is among the deleted rows - const int row = currentIndex().row(); - if (start <= row && row <= end) { - QModelIndex index; - if (end < model()->rowCount() - 1) { - index = model()->index(end + 1, 0); - } else if (start > 0) { - index = model()->index(start - 1, 0); - } - setCurrentIndex(index); - } - // Removing rows might make new images visible, make sure their thumbnail // is generated d->mScheduledThumbnailGenerationTimer.start(); diff -Nru gwenview-4.11.1/lib/version.h gwenview-4.11.2/lib/version.h --- gwenview-4.11.1/lib/version.h 2013-08-28 17:06:41.223773185 +0000 +++ gwenview-4.11.2/lib/version.h 2013-09-26 19:22:36.499229258 +0000 @@ -33,6 +33,6 @@ https://bugs.kde.org/editversions.cgi?product=gwenview */ -#define GWENVIEW_VERSION "4.11.0" +#define GWENVIEW_VERSION "4.11.2" #endif /* VERSION_H */