┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2010-08-19 15:01:52 +0000
committerPeter Penz <[email protected]>2010-08-19 15:01:52 +0000
commit0490d12e0945060c7f3ea0b2415b9626682f3b6a (patch)
treedc166ce3867f64a1637377e634d4ca59bd7efd84
parent2e32f55d99c0fbb30f56b0a20f86f4abe9b65ccf (diff)
Fix crash in column view because of a dangling pointer to a selection model. Thanks a lot to Frank Reininghaus for finding a way how to reproduce the issue and analyzing the root cause. Keeping the selection model as part of the DolphinView is not required anymore at all, as the restoring of selected items is done by m_selectedItems in the meantime.
CCBUG: 247618 svn path=/trunk/KDE/kdebase/apps/; revision=1165532
-rw-r--r--src/views/dolphinview.cpp63
-rw-r--r--src/views/dolphinview.h1
2 files changed, 31 insertions, 33 deletions
diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp
index 919805790..1da3dc42b 100644
--- a/src/views/dolphinview.cpp
+++ b/src/views/dolphinview.cpp
@@ -93,7 +93,6 @@ DolphinView::DolphinView(QWidget* parent,
m_dolphinViewController(0),
m_viewModeController(0),
m_viewAccessor(proxyModel),
- m_selectionModel(0),
m_selectionChangedTimer(0),
m_rootUrl(),
m_activeItemUrl(),
@@ -540,30 +539,33 @@ QList<QAction*> DolphinView::versionControlActions(const KFileItemList& items) c
void DolphinView::setUrl(const KUrl& url)
{
- if (m_viewModeController->url() != url) {
- m_newFileNames.clear();
+ if (m_viewModeController->url() == url) {
+ return;
+ }
- m_viewModeController->setUrl(url); // emits urlChanged, which we forward
- m_viewAccessor.prepareUrlChange(url);
- applyViewProperties();
- loadDirectory(url);
+ // The selection model might change in the case of the column view. Disconnect
+ // from the current selection model and reconnect later after the URL switch.
+ QAbstractItemView* view = m_viewAccessor.itemView();
+ disconnect(view->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+ this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
- // When changing the URL there is no need to keep the version
- // data of the previous URL.
- m_viewAccessor.dirModel()->clearVersionData();
+ m_newFileNames.clear();
- emit startedPathLoading(url);
- }
+ m_viewModeController->setUrl(url); // emits urlChanged, which we forward
+ m_viewAccessor.prepareUrlChange(url);
+ applyViewProperties();
+ loadDirectory(url);
- // the selection model might have changed in the case of a column view
- QItemSelectionModel* selectionModel = m_viewAccessor.itemView()->selectionModel();
- if (m_selectionModel != selectionModel) {
- disconnect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
- this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
- m_selectionModel = selectionModel;
- connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
- this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
- }
+ // When changing the URL there is no need to keep the version
+ // data of the previous URL.
+ m_viewAccessor.dirModel()->clearVersionData();
+
+ emit startedPathLoading(url);
+
+ // Reconnect to the (probably) new selection model
+ view = m_viewAccessor.itemView();
+ connect(view->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+ this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
}
void DolphinView::selectAll()
@@ -1271,28 +1273,25 @@ void DolphinView::applyViewProperties()
void DolphinView::createView()
{
+ QAbstractItemView* view = m_viewAccessor.itemView();
+ if ((view != 0) && (view->selectionModel() != 0)) {
+ disconnect(view->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+ this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
+ }
+
deleteView();
Q_ASSERT(m_viewAccessor.itemView() == 0);
m_viewAccessor.createView(this, m_dolphinViewController, m_viewModeController, m_mode);
- QAbstractItemView* view = m_viewAccessor.itemView();
+ view = m_viewAccessor.itemView();
Q_ASSERT(view != 0);
view->installEventFilter(this);
view->viewport()->installEventFilter(this);
m_dolphinViewController->setItemView(view);
- // When changing the view mode, the selection is lost due to reinstantiating
- // a new item view with a custom selection model. Pass the ownership of the
- // selection model to DolphinView, so that it can be shared by all item views.
- if (m_selectionModel != 0) {
- view->setSelectionModel(m_selectionModel);
- } else {
- m_selectionModel = view->selectionModel();
- }
- m_selectionModel->setParent(this);
- connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+ connect(view->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
setFocusProxy(m_viewAccessor.layoutTarget());
diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h
index dbef511bf..4877b0cd2 100644
--- a/src/views/dolphinview.h
+++ b/src/views/dolphinview.h
@@ -795,7 +795,6 @@ private:
ViewModeController* m_viewModeController;
ViewAccessor m_viewAccessor;
- QItemSelectionModel* m_selectionModel; // allow to switch views without losing the selection
QTimer* m_selectionChangedTimer;
KUrl m_rootUrl;