From 3a82e229824ef7dda2be2da7118d054332c44a43 Mon Sep 17 00:00:00 2001 From: con <qtc-committer@nokia.com> Date: Tue, 19 Oct 2010 11:07:20 +0200 Subject: [PATCH] Opening recent files wasn't opening with right encoding (Windows) Confusion between native and internal path representation (i.e. backslashes). File names should always be "portable" internally. Reviewed-by: Robert Loehning --- src/plugins/coreplugin/filemanager.cpp | 56 +++++++++++++++----------- src/plugins/coreplugin/filemanager.h | 4 +- src/plugins/coreplugin/mainwindow.cpp | 5 ++- 3 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp index 127c969c7df..d5cdcc21e60 100644 --- a/src/plugins/coreplugin/filemanager.cpp +++ b/src/plugins/coreplugin/filemanager.cpp @@ -159,25 +159,7 @@ FileManager::FileManager(QMainWindow *mw) connect(core, SIGNAL(contextChanged(Core::IContext*,Core::Context)), this, SLOT(syncWithEditor(Core::IContext*))); - const QSettings *s = core->settings(); - d->m_recentFiles = s->value(QLatin1String(settingsGroupC) + QLatin1Char('/') + QLatin1String(filesKeyC), QStringList()).toStringList(); - for (QStringList::iterator it = d->m_recentFiles.begin(); it != d->m_recentFiles.end(); ) { - if (QFileInfo(*it).isFile()) { - ++it; - } else { - it = d->m_recentFiles.erase(it); - } - } - const QString directoryGroup = QLatin1String(directoryGroupC) + QLatin1Char('/'); - const QString settingsProjectDir = s->value(directoryGroup + QLatin1String(projectDirectoryKeyC), - QString()).toString(); - if (!settingsProjectDir.isEmpty() && QFileInfo(settingsProjectDir).isDir()) { - d->m_projectsDirectory = settingsProjectDir; - } else { - d->m_projectsDirectory = Utils::PathChooser::homePath(); - } - d->m_useProjectsDirectory = s->value(directoryGroup + QLatin1String(useProjectDirectoryKeyC), - d->m_useProjectsDirectory).toBool(); + readSettings(); } FileManager::~FileManager() @@ -994,11 +976,16 @@ void FileManager::addToRecentFiles(const QString &fileName) { if (fileName.isEmpty()) return; - QString prettyFileName(QDir::toNativeSeparators(fileName)); - d->m_recentFiles.removeAll(prettyFileName); + QString unifiedForm(fixFileName(fileName)); + QMutableStringListIterator it(d->m_recentFiles); + while (it.hasNext()) { + QString recentUnifiedForm(fixFileName(it.next())); + if (unifiedForm == recentUnifiedForm) + it.remove(); + } if (d->m_recentFiles.count() > d->m_maxRecentFiles) d->m_recentFiles.removeLast(); - d->m_recentFiles.prepend(prettyFileName); + d->m_recentFiles.prepend(fileName); } /*! @@ -1011,7 +998,7 @@ QStringList FileManager::recentFiles() const return d->m_recentFiles; } -void FileManager::saveRecentFiles() +void FileManager::saveSettings() { QSettings *s = Core::ICore::instance()->settings(); s->beginGroup(QLatin1String(settingsGroupC)); @@ -1023,6 +1010,29 @@ void FileManager::saveRecentFiles() s->endGroup(); } +void FileManager::readSettings() +{ + const QSettings *s = Core::ICore::instance()->settings(); + d->m_recentFiles.clear(); + QStringList recentFiles = s->value(QLatin1String(settingsGroupC) + QLatin1Char('/') + QLatin1String(filesKeyC), QStringList()).toStringList(); + // clean non-existing files + foreach (const QString &file, recentFiles) { + if (QFileInfo(file).isFile()) + d->m_recentFiles.append(QDir::fromNativeSeparators(file)); // from native to guard against old settings + } + + const QString directoryGroup = QLatin1String(directoryGroupC) + QLatin1Char('/'); + const QString settingsProjectDir = s->value(directoryGroup + QLatin1String(projectDirectoryKeyC), + QString()).toString(); + if (!settingsProjectDir.isEmpty() && QFileInfo(settingsProjectDir).isDir()) { + d->m_projectsDirectory = settingsProjectDir; + } else { + d->m_projectsDirectory = Utils::PathChooser::homePath(); + } + d->m_useProjectsDirectory = s->value(directoryGroup + QLatin1String(useProjectDirectoryKeyC), + d->m_useProjectsDirectory).toBool(); +} + /*! The current file is e.g. the file currently opened when an editor is active, diff --git a/src/plugins/coreplugin/filemanager.h b/src/plugins/coreplugin/filemanager.h index 461577197a7..4df823ad5ba 100644 --- a/src/plugins/coreplugin/filemanager.h +++ b/src/plugins/coreplugin/filemanager.h @@ -74,8 +74,7 @@ public: // recent files void addToRecentFiles(const QString &fileName); QStringList recentFiles() const; - void saveRecentFiles(); - + void saveSettings(); // current file void setCurrentFile(const QString &filePath); @@ -133,6 +132,7 @@ private slots: void syncWithEditor(Core::IContext *context); private: + void readSettings(); void dump(); void addFileInfo(IFile *file); void removeFileInfo(IFile *file); diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 3737fb05fc8..b84eeefba1c 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -82,6 +82,7 @@ #include <QtCore/QTimer> #include <QtCore/QtPlugin> #include <QtCore/QUrl> +#include <QtCore/QDir> #include <QtGui/QApplication> #include <QtGui/QCloseEvent> @@ -1208,7 +1209,7 @@ void MainWindow::writeSettings() m_settings->endGroup(); - m_fileManager->saveRecentFiles(); + m_fileManager->saveSettings(); m_actionManager->saveSettings(m_settings); m_editorManager->saveSettings(); m_navigationWidget->saveSettings(m_settings); @@ -1271,7 +1272,7 @@ void MainWindow::aboutToShowRecentFiles() foreach (const QString &fileName, m_fileManager->recentFiles()) { hasRecentFiles = true; QAction *action = aci->menu()->addAction( - Utils::withTildeHomePath(fileName)); + QDir::toNativeSeparators(Utils::withTildeHomePath(fileName))); action->setData(fileName); connect(action, SIGNAL(triggered()), this, SLOT(openRecentFile())); } -- GitLab