diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 8d4f50270b..2c91cd07a7 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -1271,6 +1271,10 @@ void DolphinMainWindow::updateWindowTitle() void DolphinMainWindow::slotStorageTearDownFromPlacesRequested(const QString& mountPath) { + connect(m_placesPanel, &PlacesPanel::storageTearDownSuccessful, this, [this, mountPath]() { + setViewsToHomeIfMountPathOpen(mountPath); + }); + if (m_terminalPanel && m_terminalPanel->currentWorkingDirectory().startsWith(mountPath)) { m_tearDownFromPlacesRequested = true; m_terminalPanel->goHome(); @@ -1282,12 +1286,27 @@ void DolphinMainWindow::slotStorageTearDownFromPlacesRequested(const QString& mo void DolphinMainWindow::slotStorageTearDownExternallyRequested(const QString& mountPath) { + connect(m_placesPanel, &PlacesPanel::storageTearDownSuccessful, this, [this, mountPath]() { + setViewsToHomeIfMountPathOpen(mountPath); + }); + if (m_terminalPanel && m_terminalPanel->currentWorkingDirectory().startsWith(mountPath)) { m_tearDownFromPlacesRequested = false; m_terminalPanel->goHome(); } } +void DolphinMainWindow::setViewsToHomeIfMountPathOpen(const QString& mountPath) +{ + const QVector theViewContainers = viewContainers(); + for (DolphinViewContainer *viewContainer : theViewContainers) { + if (viewContainer && viewContainer->url().toLocalFile().startsWith(mountPath)) { + viewContainer->setUrl(QUrl::fromLocalFile(QDir::homePath())); + } + } + disconnect(m_placesPanel, &PlacesPanel::storageTearDownSuccessful, nullptr, nullptr); +} + void DolphinMainWindow::setupActions() { // setup 'File' menu diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index c03eb1be07..80d0f891a5 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -92,7 +92,15 @@ public: */ KNewFileMenu* newFileMenu() const; - void setTabsToHomeIfMountPathOpen(const QString& mountPath); + /** + * Switch the window's view containers' locations to display the home path + * for any which are currently displaying a location corresponding to or + * within mountPath. + * + * This typically done after unmounting a disk at mountPath to ensure that + * the window is not displaying an invalid location. + */ + void setViewsToHomeIfMountPathOpen(const QString& mountPath); public slots: /** diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index de858389be..c9f1c83655 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -473,6 +473,9 @@ void PlacesItemModel::slotStorageTearDownDone(Solid::ErrorType error, const QVar } else { emit errorMessage(errorData.toString()); } + } else { + // No error; it must have been unmounted successfully + emit storageTearDownSuccessful(); } disconnect(m_deviceToTearDown, &Solid::StorageAccess::teardownDone, this, &PlacesItemModel::slotStorageTearDownDone); diff --git a/src/panels/places/placesitemmodel.h b/src/panels/places/placesitemmodel.h index 91f017cecc..2b1f3bc14f 100644 --- a/src/panels/places/placesitemmodel.h +++ b/src/panels/places/placesitemmodel.h @@ -130,6 +130,7 @@ signals: void storageSetupDone(int index, bool success); void storageTearDownRequested(const QString& mountPath); void storageTearDownExternallyRequested(const QString& mountPath); + void storageTearDownSuccessful(); protected: void onItemInserted(int index) override; diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp index 413d346b6e..2e1d09e6b6 100644 --- a/src/panels/places/placespanel.cpp +++ b/src/panels/places/placespanel.cpp @@ -104,6 +104,8 @@ void PlacesPanel::showEvent(QShowEvent* event) this, &PlacesPanel::storageTearDownRequested); connect(m_model, &PlacesItemModel::storageTearDownExternallyRequested, this, &PlacesPanel::storageTearDownExternallyRequested); + connect(m_model, &PlacesItemModel::storageTearDownSuccessful, + this, &PlacesPanel::storageTearDownSuccessful); m_view = new PlacesView(); m_view->setWidgetCreator(new KItemListWidgetCreator()); diff --git a/src/panels/places/placespanel.h b/src/panels/places/placespanel.h index 8ea4d0831f..38bfa4c532 100644 --- a/src/panels/places/placespanel.h +++ b/src/panels/places/placespanel.h @@ -37,6 +37,7 @@ signals: void storageTearDownRequested(const QString& mountPath); void storageTearDownExternallyRequested(const QString& mountPath); void showHiddenEntriesChanged(bool shown); + void storageTearDownSuccessful(); protected: bool urlChanged() override;