Don't session-restore invalid paths

When session restore is populating the main window, it's unconditional;
you'll get whatever was there before. This can be a problem if any of
those things are now missing. For example, maybe you were browsing files
on a removable disk, then quit Dolphin, and finally removed the disk. The
next time you launch Dolphin again, it will try to show you the
view from the now-missing removable disk.

To prevent this, we now look at all the URLs in all of the view
containers that were created after session-restore has finished doing
its thing; if any of them are invalid local URLs, we change the URL to
the home folder instead to avoid showing the user a view with an invalid
location in it.

BUG: 427619
FIXED-IN: 20.12
This commit is contained in:
Nate Graham 2020-10-13 13:37:11 -06:00 committed by Elvis Angelaccio
parent ae1d441dac
commit c733b3aa97
3 changed files with 24 additions and 0 deletions

View file

@ -216,6 +216,20 @@ QVector<DolphinViewContainer*> DolphinMainWindow::viewContainers() const
return viewContainers;
}
void DolphinMainWindow::setViewsWithInvalidPathsToHome()
{
const QVector<DolphinViewContainer*> theViewContainers = viewContainers();
for (DolphinViewContainer *viewContainer : theViewContainers) {
// Only consider local dirs, not remote locations and abstract protocols
if (viewContainer->url().isLocalFile()) {
if (!QFileInfo::exists(viewContainer->url().toLocalFile())) {
viewContainer->setUrl(QUrl::fromLocalFile(QDir::homePath()));
}
}
}
}
void DolphinMainWindow::openDirectories(const QList<QUrl>& dirs, bool splitView)
{
m_tabWidget->openDirectories(dirs, splitView);

View file

@ -102,6 +102,12 @@ public:
*/
void setViewsToHomeIfMountPathOpen(const QString& mountPath);
/**
* Sets any of the window's view containers which are currently displaying
* invalid locations to the home path
*/
void setViewsWithInvalidPathsToHome();
public slots:
/**
* Opens each directory in \p dirs in a separate tab. If \a splitView is set,

View file

@ -191,6 +191,10 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv)
if (startedWithURLs) {
mainWindow->openDirectories(urls, splitView);
}
// Now handle invalid locations in the set of active views to
// avoid issues like https://bugs.kde.org/show_bug.cgi?id=427619
mainWindow->setViewsWithInvalidPathsToHome();
} else {
qCWarning(DolphinDebug) << "Unknown class " << className << " in session saved data!";
}