]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix crash when clicking an action in context menu for a removed device
authorFrank Reininghaus <frank78ac@googlemail.com>
Mon, 18 Feb 2013 22:58:26 +0000 (23:58 +0100)
committerFrank Reininghaus <frank78ac@googlemail.com>
Mon, 18 Feb 2013 22:58:31 +0000 (23:58 +0100)
Devices can be added and removed while the context menu is open.
Sfter an action has clicked that needs to access a device, we therefore
have to check if its position in the model has changed, and more
importantly, if it is still there at all in order to prevent a crash.

BUG: 315298
FIXED-IN: 4.10.1
REVIEW: 108989

src/panels/places/placespanel.cpp

index 919f2ed45e29fead3a117403a080c2b2a750d6e1..56042d8564f842f4854e54be5aa7f3d09bd9fcf0 100644 (file)
@@ -262,23 +262,34 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
             emptyTrash();
         } else if (action == addAction) {
             addEntry();
-        } else if (action == editAction) {
-            editEntry(index);
-        } else if (action == removeAction) {
-            m_model->removeItem(index);
-        } else if (action == hideAction) {
-            item->setHidden(hideAction->isChecked());
-        } else if (action == openInNewTabAction) {
-            const KUrl url = m_model->item(index)->dataValue("url").value<KUrl>();
-            emit placeMiddleClicked(url);
         } else if (action == showAllAction) {
             m_model->setHiddenItemsShown(showAllAction->isChecked());
-        } else if (action == teardownAction) {
-            m_model->requestTeardown(index);
-        } else if (action == ejectAction) {
-            m_model->requestEject(index);
         } else if (iconSizeActionMap.contains(action)) {
             m_view->setIconSize(iconSizeActionMap.value(action));
+        } else {
+            // The index might have changed if devices were added/removed while
+            // the context menu was open.
+            index = m_model->index(item);
+            if (index < 0) {
+                // The item is not in the model any more, probably because it was an
+                // external device that has been removed while the context menu was open.
+                return;
+            }
+
+            if (action == editAction) {
+                editEntry(index);
+            } else if (action == removeAction) {
+                m_model->removeItem(index);
+            } else if (action == hideAction) {
+                item->setHidden(hideAction->isChecked());
+            } else if (action == openInNewTabAction) {
+                const KUrl url = m_model->item(index)->dataValue("url").value<KUrl>();
+                emit placeMiddleClicked(url);
+            } else if (action == teardownAction) {
+                m_model->requestTeardown(index);
+            } else if (action == ejectAction) {
+                m_model->requestEject(index);
+            }
         }
     }