Request restart after changing file system case sensitivity

And don't apply the changed setting until restart by just writing the
new value to the settings directly, which is then read at the next
startup.
Avoids issues where file paths are cached or used as key in a hash.

Fixes: QTCREATORBUG-25005
Change-Id: I30e4d75455124af67ba9ee1d9e8ed31924016d0d
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
Eike Ziller
2021-12-10 09:05:17 +01:00
parent 85b1d166eb
commit f03f712791
3 changed files with 61 additions and 37 deletions

View File

@@ -1234,11 +1234,6 @@ void EditorManagerPrivate::saveSettings()
qsettings->setValueWithDefault(maxRecentFilesKey, qsettings->setValueWithDefault(maxRecentFilesKey,
d->m_settings.maxRecentFiles, d->m_settings.maxRecentFiles,
def.maxRecentFiles); def.maxRecentFiles);
qsettings->setValueWithDefault(fileSystemCaseSensitivityKey,
int(HostOsInfo::fileNameCaseSensitivity()),
int(OsSpecificAspects::fileNameCaseSensitivity(
HostOsInfo::hostOs())));
qsettings->setValueWithDefault(preferredEditorFactoriesKey, qsettings->setValueWithDefault(preferredEditorFactoriesKey,
toMap(userPreferredEditorFactories())); toMap(userPreferredEditorFactories()));
} }
@@ -1256,26 +1251,14 @@ void EditorManagerPrivate::readSettings()
if (maxRecentFiles > 0) if (maxRecentFiles > 0)
d->m_settings.maxRecentFiles = maxRecentFiles; d->m_settings.maxRecentFiles = maxRecentFiles;
if (qs->contains(fileSystemCaseSensitivityKey)) { const Qt::CaseSensitivity defaultSensitivity = OsSpecificAspects::fileNameCaseSensitivity(
Qt::CaseSensitivity defaultSensitivity HostOsInfo::hostOs());
= OsSpecificAspects::fileNameCaseSensitivity(HostOsInfo::hostOs()); const Qt::CaseSensitivity sensitivity = readFileSystemSensitivity(qs);
bool ok = false;
Qt::CaseSensitivity sensitivity = defaultSensitivity;
int sensitivitySetting = qs->value(fileSystemCaseSensitivityKey).toInt(&ok);
if (ok) {
switch (Qt::CaseSensitivity(sensitivitySetting)) {
case Qt::CaseSensitive:
sensitivity = Qt::CaseSensitive;
break;
case Qt::CaseInsensitive:
sensitivity = Qt::CaseInsensitive;
}
}
if (sensitivity == defaultSensitivity) if (sensitivity == defaultSensitivity)
HostOsInfo::unsetOverrideFileNameCaseSensitivity(); HostOsInfo::unsetOverrideFileNameCaseSensitivity();
else else
HostOsInfo::setOverrideFileNameCaseSensitivity(sensitivity); HostOsInfo::setOverrideFileNameCaseSensitivity(sensitivity);
}
const QHash<Utils::MimeType, IEditorFactory *> preferredEditorFactories = fromMap( const QHash<Utils::MimeType, IEditorFactory *> preferredEditorFactories = fromMap(
qs->value(preferredEditorFactoriesKey).toMap()); qs->value(preferredEditorFactoriesKey).toMap());
setUserPreferredEditorFactories(preferredEditorFactories); setUserPreferredEditorFactories(preferredEditorFactories);
@@ -1302,6 +1285,34 @@ void EditorManagerPrivate::readSettings()
updateAutoSave(); updateAutoSave();
} }
Qt::CaseSensitivity EditorManagerPrivate::readFileSystemSensitivity(QSettings *settings)
{
const Qt::CaseSensitivity defaultSensitivity = OsSpecificAspects::fileNameCaseSensitivity(
HostOsInfo::hostOs());
if (!settings->contains(fileSystemCaseSensitivityKey))
return defaultSensitivity;
bool ok = false;
const int sensitivitySetting = settings->value(fileSystemCaseSensitivityKey).toInt(&ok);
if (ok) {
switch (Qt::CaseSensitivity(sensitivitySetting)) {
case Qt::CaseSensitive:
return Qt::CaseSensitive;
case Qt::CaseInsensitive:
return Qt::CaseInsensitive;
}
}
return defaultSensitivity;
}
void EditorManagerPrivate::writeFileSystemSensitivity(Utils::QtcSettings *settings,
Qt::CaseSensitivity sensitivity)
{
settings->setValueWithDefault(fileSystemCaseSensitivityKey,
int(sensitivity),
int(OsSpecificAspects::fileNameCaseSensitivity(
HostOsInfo::hostOs())));
}
void EditorManagerPrivate::setAutoSaveEnabled(bool enabled) void EditorManagerPrivate::setAutoSaveEnabled(bool enabled)
{ {
d->m_settings.autoSaveEnabled = enabled; d->m_settings.autoSaveEnabled = enabled;

View File

@@ -43,9 +43,14 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QAction; class QAction;
class QSettings;
class QTimer; class QTimer;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Utils {
class QtcSettings;
}
namespace Core { namespace Core {
class EditorManager; class EditorManager;
@@ -112,6 +117,9 @@ public:
static void saveSettings(); static void saveSettings();
static void readSettings(); static void readSettings();
static Qt::CaseSensitivity readFileSystemSensitivity(QSettings *settings);
static void writeFileSystemSensitivity(Utils::QtcSettings *settings,
Qt::CaseSensitivity sensitivity);
static void setAutoSaveEnabled(bool enabled); static void setAutoSaveEnabled(bool enabled);
static bool autoSaveEnabled(); static bool autoSaveEnabled();
static void setAutoSaveInterval(int interval); static void setAutoSaveInterval(int interval);

View File

@@ -210,7 +210,9 @@ public:
m_ui.fileSystemCaseSensitivityChooser->addItem(tr("Case Insensitive"), m_ui.fileSystemCaseSensitivityChooser->addItem(tr("Case Insensitive"),
Qt::CaseInsensitive); Qt::CaseInsensitive);
} }
if (HostOsInfo::fileNameCaseSensitivity() == Qt::CaseSensitive) const Qt::CaseSensitivity sensitivity = EditorManagerPrivate::readFileSystemSensitivity(
ICore::settings());
if (sensitivity == Qt::CaseSensitive)
m_ui.fileSystemCaseSensitivityChooser->setCurrentIndex(0); m_ui.fileSystemCaseSensitivityChooser->setCurrentIndex(0);
else else
m_ui.fileSystemCaseSensitivityChooser->setCurrentIndex(1); m_ui.fileSystemCaseSensitivityChooser->setCurrentIndex(1);
@@ -258,15 +260,15 @@ private:
void SystemSettingsWidget::apply() void SystemSettingsWidget::apply()
{ {
QtcSettings *settings = ICore::settings();
EditorManager::setReloadSetting(IDocument::ReloadSetting(m_ui.reloadBehavior->currentIndex())); EditorManager::setReloadSetting(IDocument::ReloadSetting(m_ui.reloadBehavior->currentIndex()));
if (HostOsInfo::isAnyUnixHost()) { if (HostOsInfo::isAnyUnixHost()) {
ConsoleProcess::setTerminalEmulator(ICore::settings(), ConsoleProcess::setTerminalEmulator(settings,
{m_ui.terminalComboBox->lineEdit()->text(), {m_ui.terminalComboBox->lineEdit()->text(),
m_ui.terminalOpenArgs->text(), m_ui.terminalOpenArgs->text(),
m_ui.terminalExecuteArgs->text()}); m_ui.terminalExecuteArgs->text()});
if (!HostOsInfo::isMacHost()) { if (!HostOsInfo::isMacHost()) {
UnixUtils::setFileBrowser(ICore::settings(), UnixUtils::setFileBrowser(settings, m_ui.externalFileBrowserEdit->text());
m_ui.externalFileBrowserEdit->text());
} }
} }
PatchTool::setPatchCommand(m_ui.patchChooser->filePath()); PatchTool::setPatchCommand(m_ui.patchChooser->filePath());
@@ -289,14 +291,17 @@ void SystemSettingsWidget::apply()
m_ui.askBeforeExitCheckBox->isChecked()); m_ui.askBeforeExitCheckBox->isChecked());
if (HostOsInfo::isMacHost()) { if (HostOsInfo::isMacHost()) {
Qt::CaseSensitivity defaultSensitivity const Qt::CaseSensitivity sensitivity = EditorManagerPrivate::readFileSystemSensitivity(
= OsSpecificAspects::fileNameCaseSensitivity(HostOsInfo::hostOs()); settings);
Qt::CaseSensitivity selectedSensitivity = Qt::CaseSensitivity( const Qt::CaseSensitivity selectedSensitivity = Qt::CaseSensitivity(
m_ui.fileSystemCaseSensitivityChooser->currentData().toInt()); m_ui.fileSystemCaseSensitivityChooser->currentData().toInt());
if (defaultSensitivity == selectedSensitivity) if (selectedSensitivity != sensitivity) {
HostOsInfo::unsetOverrideFileNameCaseSensitivity(); EditorManagerPrivate::writeFileSystemSensitivity(settings, selectedSensitivity);
else RestartDialog dialog(
HostOsInfo::setOverrideFileNameCaseSensitivity(selectedSensitivity); ICore::dialogParent(),
tr("The file system case sensitivity change will take effect after restart."));
dialog.exec();
}
} }
CorePlugin::setEnvironmentChanges(m_environmentChanges); CorePlugin::setEnvironmentChanges(m_environmentChanges);