From ae1d441dacef7e52984201abdc9a918ce060021c Mon Sep 17 00:00:00 2001 From: Nate Graham Date: Tue, 13 Oct 2020 11:51:59 -0600 Subject: [PATCH] Show home folder if needed after unmounting mounted disk Right now, when you unmount a device that any active view containers are displaying, nothing in the view changes. As a result, it's possible to try to navigate to files or folders in that view, which cannot be done because the disk that the files or folders are located on has been unmounted! With this commit, we detect that case and switch the view containers to show the home folder after the disk whose contents they are displaying gets unmounted. BUG: 158934 FIXED-IN: 20.12 --- src/dolphinmainwindow.cpp | 19 +++++++++++++++++++ src/dolphinmainwindow.h | 10 +++++++++- src/panels/places/placesitemmodel.cpp | 3 +++ src/panels/places/placesitemmodel.h | 1 + src/panels/places/placespanel.cpp | 2 ++ src/panels/places/placespanel.h | 1 + 6 files changed, 35 insertions(+), 1 deletion(-) 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;