From 9358e2753cf4a90f863f5c5ae1f28cc6a7457bc5 Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Thu, 11 Nov 2021 10:34:21 +0100
Subject: [PATCH] do not split global app settings in two classes

---
 App/main.cpp                                  |  8 +-
 GUI/Application/ApplicationSettings.cpp       | 77 +++++++++++++++
 GUI/Application/ApplicationSettings.h         | 28 +++++-
 GUI/Application/GlobalSettings.cpp            | 97 -------------------
 GUI/Application/GlobalSettings.h              | 52 ----------
 GUI/Model/Instrument/InstrumentsTreeModel.cpp |  6 +-
 GUI/View/Import/RealDataSelectorWidget.cpp    | 12 +--
 GUI/View/Import/RealDataTreeModel.cpp         |  6 +-
 .../Instrument/InstrumentLibraryEditor.cpp    | 12 +--
 GUI/View/Intensity/SavePlotAssistant.cpp      |  6 +-
 GUI/View/Main/ActionManager.cpp               | 16 +--
 GUI/View/Main/MainWindow.cpp                  |  6 +-
 GUI/View/Main/NewProjectDialog.cpp            |  4 +-
 GUI/View/Main/ProjectManager.cpp              | 17 ++--
 GUI/View/Main/PyImportAssistant.cpp           |  8 +-
 .../MaterialEditor/MaterialEditorDialog.cpp   |  8 +-
 .../Projection/SaveProjectionsAssistant.cpp   |  6 +-
 GUI/View/Realspace/RealSpaceCanvas.cpp        |  6 +-
 .../LayerOrientedSampleEditor.cpp             |  4 +-
 GUI/View/SampleDesigner/SampleListView.cpp    |  8 +-
 GUI/View/Script/PythonScriptWidget.cpp        | 10 +-
 GUI/View/Tool/GroupBoxCollapser.cpp           |  4 +-
 GUI/View/Toplevel/ProjectSettingsView.cpp     |  9 +-
 23 files changed, 181 insertions(+), 229 deletions(-)
 delete mode 100644 GUI/Application/GlobalSettings.cpp
 delete mode 100644 GUI/Application/GlobalSettings.h

diff --git a/App/main.cpp b/App/main.cpp
index 4adbe269665..59431d8c856 100644
--- a/App/main.cpp
+++ b/App/main.cpp
@@ -14,7 +14,7 @@
 
 #include "App/AppOptions.h"
 #include "App/MessageHandler.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/State/SessionData.h"
 #include "GUI/Util/OSInfo.h"
 #include "GUI/Util/Path.h"
@@ -49,7 +49,7 @@ int main(int argc, char* argv[])
     if (!GUI::Util::OS::HostOsInfo::isMacHost())
         QApplication::setWindowIcon(QIcon(":/images/BornAgain.ico"));
 
-    GlobalSettings globalSettings;
+    ApplicationSettings applicationSettings;
     SessionData GSession;
     int ret;
 
@@ -60,8 +60,8 @@ int main(int argc, char* argv[])
 
         register1DDataLoaders();
 
-        auto style = globalSettings.settings().styleToUse();
-        globalSettings.loadStyle(style);
+        auto style = applicationSettings.styleToUse();
+        applicationSettings.loadStyle(style);
 
         QString dir = SessionData::appDataFolder();
         if (!QDir().exists(dir))
diff --git a/GUI/Application/ApplicationSettings.cpp b/GUI/Application/ApplicationSettings.cpp
index 098638b63d0..c16b1023313 100644
--- a/GUI/Application/ApplicationSettings.cpp
+++ b/GUI/Application/ApplicationSettings.cpp
@@ -14,7 +14,10 @@
 
 #include "GUI/Application/ApplicationSettings.h"
 #include "Base/Util/Assert.h"
+#include <QApplication>
+#include <QFile>
 #include <QSettings>
+#include <QStandardPaths>
 #include <QWidget>
 
 namespace {
@@ -28,6 +31,13 @@ const QString S_SINGLE_SAMPLE_MODE = "SingleSampleMode";
 const QString S_DEFAULT_UNIT_IS_ANGSTROM = "DefaultUnitIsAngstrom";
 } // namespace
 
+ApplicationSettings* appSettings; //!< global pointer to _the_ instance
+
+ApplicationSettings::ApplicationSettings() : m_currentStyle(ApplicationSettings::Style::native)
+{
+    appSettings = this;
+}
+
 bool ApplicationSettings::useNativeFileDialog() const
 {
 #ifdef _WIN32
@@ -116,3 +126,70 @@ void ApplicationSettings::loadWindowSizeAndPos(QWidget* w)
     if (settings.contains(S_POS + "/" + w->objectName()))
         w->move(settings.value(S_POS + "/" + w->objectName()).toPoint());
 }
+
+void ApplicationSettings::loadStyle(ApplicationSettings::Style style)
+{
+    QString stylesheet;
+
+    switch (style) {
+    case ApplicationSettings::Style::light: {
+        QFile base(":/styles/Base.stylesheet");
+        base.open(QFile::ReadOnly);
+        QFile light(":/styles/Light.stylesheet");
+        light.open(QFile::ReadOnly);
+        stylesheet = base.readAll() + light.readAll();
+        break;
+    }
+    case ApplicationSettings::Style::dark: {
+        QFile base(":/styles/Base.stylesheet");
+        base.open(QFile::ReadOnly);
+        QFile dark(":/styles/Dark.stylesheet");
+        dark.open(QFile::ReadOnly);
+        stylesheet = base.readAll() + dark.readAll();
+        break;
+    }
+    default: {
+        QFile native(":/styles/Native.stylesheet");
+        native.open(QFile::ReadOnly);
+        stylesheet = native.readAll();
+        break;
+    }
+    }
+
+    qApp->setStyleSheet(stylesheet);
+    m_currentStyle = style;
+
+    // -- init palette for later usage; could be improved by parsing the stylesheet
+    switch (m_currentStyle) {
+    case ApplicationSettings::Style::light: {
+        m_styleSheetPalette.headlineText = QColor(48, 113, 145);
+        m_styleSheetPalette.headlineBackground = QColor(222, 232, 237);
+        break;
+    }
+    case ApplicationSettings::Style::dark: {
+        m_styleSheetPalette.headlineText = QColor(213, 220, 223);
+        m_styleSheetPalette.headlineBackground = QColor(29, 39, 44);
+        break;
+    }
+    default: {
+        m_styleSheetPalette.headlineText = Qt::black;
+        m_styleSheetPalette.headlineBackground = QColor(250, 250, 250);
+        break;
+    }
+    }
+}
+
+ApplicationSettings::Style ApplicationSettings::currentStyle()
+{
+    return m_currentStyle;
+}
+
+const ApplicationSettings::Palette& ApplicationSettings::styleSheetPalette() const
+{
+    return m_styleSheetPalette;
+}
+
+QString ApplicationSettings::appDataFolder() const
+{
+    return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
+}
diff --git a/GUI/Application/ApplicationSettings.h b/GUI/Application/ApplicationSettings.h
index d224b1f199c..1c0671e7217 100644
--- a/GUI/Application/ApplicationSettings.h
+++ b/GUI/Application/ApplicationSettings.h
@@ -15,17 +15,21 @@
 #ifndef BORNAGAIN_GUI_APPLICATION_APPLICATIONSETTINGS_H
 #define BORNAGAIN_GUI_APPLICATION_APPLICATIONSETTINGS_H
 
+#include <QColor>
+
 class QWidget;
 class QVariant;
 
 //! Application wide settings.
+//!
 //! Contains settings which the user can change. Also
 //! contains settings which may be user editable in the future.
-
 class ApplicationSettings {
 public:
     enum class Style { native, light, dark };
 
+    ApplicationSettings();
+
     bool useNativeFileDialog() const;
     bool createNewProjectOnStartup() const;
     void setCreateNewProjectOnStartup(bool b);
@@ -46,6 +50,28 @@ public:
 
     void saveWindowSizeAndPos(const QWidget* w);
     void loadWindowSizeAndPos(QWidget* w);
+
+    void loadStyle(ApplicationSettings::Style style);
+    ApplicationSettings::Style currentStyle();
+
+    struct Palette {
+        QColor headlineText;
+        QColor headlineBackground;
+    };
+
+    const Palette& styleSheetPalette() const;
+
+    //! The folder where persistent application data shall be stored.
+    //!
+    //! E.g. in Windows this is the AppData/Roaming location.
+    //! Used e.g. for storing the instrument library.
+    QString appDataFolder() const;
+
+private:
+    ApplicationSettings::Style m_currentStyle;
+    Palette m_styleSheetPalette;
 };
 
+extern ApplicationSettings* appSettings; //!< global pointer to the single instance
+
 #endif // BORNAGAIN_GUI_APPLICATION_APPLICATIONSETTINGS_H
diff --git a/GUI/Application/GlobalSettings.cpp b/GUI/Application/GlobalSettings.cpp
deleted file mode 100644
index 3bed0f180c7..00000000000
--- a/GUI/Application/GlobalSettings.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/Application/GlobalSettings.cpp
-//! @brief     Implements class GlobalSettings
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2021
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "GUI/Application/GlobalSettings.h"
-#include <QApplication>
-#include <QFile>
-#include <QStandardPaths>
-
-GlobalSettings* globalSettings; //!< global pointer to _the_ instance
-
-GlobalSettings::GlobalSettings() : m_currentStyle(ApplicationSettings::Style::native)
-{
-    globalSettings = this;
-}
-
-ApplicationSettings& GlobalSettings::settings()
-{
-    return m_settings;
-}
-
-void GlobalSettings::loadStyle(ApplicationSettings::Style style)
-{
-    QString stylesheet;
-
-    switch (style) {
-    case ApplicationSettings::Style::light: {
-        QFile base(":/styles/Base.stylesheet");
-        base.open(QFile::ReadOnly);
-        QFile light(":/styles/Light.stylesheet");
-        light.open(QFile::ReadOnly);
-        stylesheet = base.readAll() + light.readAll();
-        break;
-    }
-    case ApplicationSettings::Style::dark: {
-        QFile base(":/styles/Base.stylesheet");
-        base.open(QFile::ReadOnly);
-        QFile dark(":/styles/Dark.stylesheet");
-        dark.open(QFile::ReadOnly);
-        stylesheet = base.readAll() + dark.readAll();
-        break;
-    }
-    default: {
-        QFile native(":/styles/Native.stylesheet");
-        native.open(QFile::ReadOnly);
-        stylesheet = native.readAll();
-        break;
-    }
-    }
-
-    qApp->setStyleSheet(stylesheet);
-    m_currentStyle = style;
-
-    // -- init palette for later usage; could be improved by parsing the stylesheet
-    switch (m_currentStyle) {
-    case ApplicationSettings::Style::light: {
-        m_styleSheetPalette.headlineText = QColor(48, 113, 145);
-        m_styleSheetPalette.headlineBackground = QColor(222, 232, 237);
-        break;
-    }
-    case ApplicationSettings::Style::dark: {
-        m_styleSheetPalette.headlineText = QColor(213, 220, 223);
-        m_styleSheetPalette.headlineBackground = QColor(29, 39, 44);
-        break;
-    }
-    default: {
-        m_styleSheetPalette.headlineText = Qt::black;
-        m_styleSheetPalette.headlineBackground = QColor(250, 250, 250);
-        break;
-    }
-    }
-}
-
-ApplicationSettings::Style GlobalSettings::currentStyle()
-{
-    return m_currentStyle;
-}
-
-const GlobalSettings::Palette& GlobalSettings::styleSheetPalette() const
-{
-    return m_styleSheetPalette;
-}
-
-QString GlobalSettings::appDataFolder() const
-{
-    return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
-}
diff --git a/GUI/Application/GlobalSettings.h b/GUI/Application/GlobalSettings.h
deleted file mode 100644
index c818ac69408..00000000000
--- a/GUI/Application/GlobalSettings.h
+++ /dev/null
@@ -1,52 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/Application/GlobalSettings.h
-//! @brief     Defines class GlobalSettings
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2021
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifndef BORNAGAIN_GUI_APPLICATION_GLOBALSETTINGS_H
-#define BORNAGAIN_GUI_APPLICATION_GLOBALSETTINGS_H
-
-#include "GUI/Application/ApplicationSettings.h"
-#include <QColor>
-
-//! Provides access to application wide stuff like settings.
-
-class GlobalSettings {
-public:
-    GlobalSettings();
-
-    ApplicationSettings& settings();
-
-    void loadStyle(ApplicationSettings::Style style);
-    ApplicationSettings::Style currentStyle();
-
-    struct Palette {
-        QColor headlineText;
-        QColor headlineBackground;
-    };
-
-    const Palette& styleSheetPalette() const;
-
-    //! The folder where persistent application data shall be stored. E.g. in Windows this is the
-    //! AppData/Roaming location.
-    //! Used e.g. for storing the instrument library.
-    QString appDataFolder() const;
-
-private:
-    ApplicationSettings m_settings;
-    ApplicationSettings::Style m_currentStyle;
-    Palette m_styleSheetPalette;
-};
-
-extern GlobalSettings* globalSettings; //!< global pointer to the single instance
-
-#endif // BORNAGAIN_GUI_APPLICATION_GLOBALSETTINGS_H
diff --git a/GUI/Model/Instrument/InstrumentsTreeModel.cpp b/GUI/Model/Instrument/InstrumentsTreeModel.cpp
index 7ba02804a7b..eadd50a476c 100644
--- a/GUI/Model/Instrument/InstrumentsTreeModel.cpp
+++ b/GUI/Model/Instrument/InstrumentsTreeModel.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Instrument/InstrumentsTreeModel.h"
-#include "GUI/Application/GlobalSettings.h" // globalSettings
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Instrument/InstrumentItems.h"
 #include "GUI/Model/Instrument/InstrumentModel.h"
 #include <QApplication>
@@ -216,10 +216,10 @@ QVariant InstrumentsTreeModel::data(const QModelIndex& index, int role) const
             return QVariant(Qt::AlignLeft | Qt::AlignVCenter);
 
         case Qt::BackgroundRole:
-            return globalSettings->styleSheetPalette().headlineBackground;
+            return appSettings->styleSheetPalette().headlineBackground;
 
         case Qt::ForegroundRole:
-            return globalSettings->styleSheetPalette().headlineText;
+            return appSettings->styleSheetPalette().headlineText;
 
         default:
             return QVariant();
diff --git a/GUI/View/Import/RealDataSelectorWidget.cpp b/GUI/View/Import/RealDataSelectorWidget.cpp
index 7ddf09cc59d..2820f52d0b9 100644
--- a/GUI/View/Import/RealDataSelectorWidget.cpp
+++ b/GUI/View/Import/RealDataSelectorWidget.cpp
@@ -14,7 +14,7 @@
 
 #include "GUI/View/Import/RealDataSelectorWidget.h"
 #include "Device/Data/DataUtils.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Data/RealDataItem.h"
 #include "GUI/Model/Data/RealDataModel.h"
 #include "GUI/Model/IO/AbstractDataLoader1D.h"
@@ -25,8 +25,8 @@
 #include "GUI/View/Import/ImportDataUtils.h"
 #include "GUI/View/Import/RealDataPropertiesWidget.h"
 #include "GUI/View/Import/RealDataTreeModel.h"
-#include "GUI/View/Main/ProjectManager.h"
 #include "GUI/View/Info/MessageBox.h"
+#include "GUI/View/Main/ProjectManager.h"
 #include <QFileDialog>
 #include <QItemSelectionModel>
 #include <QLineEdit>
@@ -233,8 +233,8 @@ void RealDataSelectorWidget::importData1D()
 
     const QStringList fileNames = QFileDialog::getOpenFileNames(
         Q_NULLPTR, "Open Intensity Files", dirname, filters, &selectedFilter,
-        globalSettings->settings().useNativeFileDialog() ? QFileDialog::Options()
-                                                : QFileDialog::DontUseNativeDialog);
+        appSettings->useNativeFileDialog() ? QFileDialog::Options()
+                                           : QFileDialog::DontUseNativeDialog);
 
     if (fileNames.isEmpty())
         return;
@@ -285,8 +285,8 @@ void RealDataSelectorWidget::importData2D()
     const QString dirname = ProjectManager::instance()->userImportDir();
     const QStringList fileNames = QFileDialog::getOpenFileNames(
         Q_NULLPTR, "Open Intensity Files", dirname, filters, &selectedFilter,
-        globalSettings->settings().useNativeFileDialog() ? QFileDialog::Options()
-                                                : QFileDialog::DontUseNativeDialog);
+        appSettings->useNativeFileDialog() ? QFileDialog::Options()
+                                           : QFileDialog::DontUseNativeDialog);
     if (fileNames.isEmpty())
         return;
 
diff --git a/GUI/View/Import/RealDataTreeModel.cpp b/GUI/View/Import/RealDataTreeModel.cpp
index a6e9a0fa4db..bdbbf76445a 100644
--- a/GUI/View/Import/RealDataTreeModel.cpp
+++ b/GUI/View/Import/RealDataTreeModel.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Import/RealDataTreeModel.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Data/RealDataItem.h"
 #include "GUI/Model/Data/RealDataModel.h"
 #include <QApplication>
@@ -214,10 +214,10 @@ QVariant RealDataTreeModel::data(const QModelIndex& index, int role) const
             return QVariant(Qt::AlignLeft | Qt::AlignVCenter);
 
         case Qt::BackgroundRole:
-            return globalSettings->styleSheetPalette().headlineBackground;
+            return appSettings->styleSheetPalette().headlineBackground;
 
         case Qt::ForegroundRole:
-            return globalSettings->styleSheetPalette().headlineText;
+            return appSettings->styleSheetPalette().headlineText;
 
         default:
             return QVariant();
diff --git a/GUI/View/Instrument/InstrumentLibraryEditor.cpp b/GUI/View/Instrument/InstrumentLibraryEditor.cpp
index f880b0012fb..2e8dc3bb6c2 100644
--- a/GUI/View/Instrument/InstrumentLibraryEditor.cpp
+++ b/GUI/View/Instrument/InstrumentLibraryEditor.cpp
@@ -13,12 +13,12 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Instrument/InstrumentLibraryEditor.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Instrument/InstrumentItems.h"
 #include "GUI/Model/State/SessionData.h"
-#include "GUI/View/Tool/ItemDelegateForHTML.h"
 #include "GUI/View/Common/ItemViewOverlayButtons.h"
 #include "GUI/View/Instrument/Detail/CreateDetails.h"
+#include "GUI/View/Tool/ItemDelegateForHTML.h"
 #include "GUI/View/Tool/StyleUtils.h"
 #include "ui_InstrumentLibraryEditor.h"
 #include <QAction>
@@ -61,12 +61,12 @@ InstrumentLibraryEditor::InstrumentLibraryEditor(QWidget* parent)
     // ensure a current item when widget is shown
     // setCurrentItem(m_treeModel->topMostItem());
     GUI::Util::Style::setResizable(this);
-    globalSettings->settings().loadWindowSizeAndPos(this);
+    appSettings->loadWindowSizeAndPos(this);
 }
 
 InstrumentLibraryEditor::~InstrumentLibraryEditor()
 {
-    globalSettings->settings().saveWindowSizeAndPos(this);
+    appSettings->saveWindowSizeAndPos(this);
 }
 
 void InstrumentLibraryEditor::setGisasEnabled(bool b)
@@ -214,13 +214,13 @@ void InstrumentLibraryEditor::editNameAndDescription(InstrumentItem* item)
     connect(buttonBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept);
     connect(buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject);
 
-    globalSettings->settings().loadWindowSizeAndPos(&dlg);
+    appSettings->loadWindowSizeAndPos(&dlg);
     if (dlg.exec() == QDialog::Accepted) {
         QModelIndex index = m_treeModel->indexForItem(item);
         m_treeModel->setData(index, nameEdit->text(), Qt::EditRole);
         m_treeModel->setData(index, descriptionEdit->toPlainText(), Qt::ToolTipRole);
     }
-    globalSettings->settings().saveWindowSizeAndPos(&dlg);
+    appSettings->saveWindowSizeAndPos(&dlg);
 }
 
 /*********************************************************************************************/
diff --git a/GUI/View/Intensity/SavePlotAssistant.cpp b/GUI/View/Intensity/SavePlotAssistant.cpp
index a75beddcd44..b1b25bbfe60 100644
--- a/GUI/View/Intensity/SavePlotAssistant.cpp
+++ b/GUI/View/Intensity/SavePlotAssistant.cpp
@@ -15,7 +15,7 @@
 #include "GUI/View/Intensity/SavePlotAssistant.h"
 #include "Base/Util/Assert.h"
 #include "Device/Histo/IntensityDataIOFactory.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/View/Intensity/ColorMap.h"
 #include <QFileDialog>
 #include <QMessageBox>
@@ -134,8 +134,8 @@ void GUI::Plot::savePlot(const QString& dirname, QCustomPlot* plot, OutputData<d
     QString defaultName = dirname + "/untitled";
     QString fileName = QFileDialog::getSaveFileName(
         0, "Save Plot", defaultName, getFilterString(), &selectedFilter,
-        globalSettings->settings().useNativeFileDialog() ? QFileDialog::Options()
-                                                : QFileDialog::DontUseNativeDialog);
+        appSettings->useNativeFileDialog() ? QFileDialog::Options()
+                                           : QFileDialog::DontUseNativeDialog);
 
     QString nameToSave = composeFileName(fileName, selectedFilter);
 
diff --git a/GUI/View/Main/ActionManager.cpp b/GUI/View/Main/ActionManager.cpp
index 02b85fd2b3c..37ec27ff6c8 100644
--- a/GUI/View/Main/ActionManager.cpp
+++ b/GUI/View/Main/ActionManager.cpp
@@ -15,7 +15,7 @@
 #include "GUI/View/Main/ActionManager.h"
 #include "Base/Util/Assert.h"
 #include "Base/Util/SysUtils.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/State/SessionData.h"
 #include "GUI/Util/OSInfo.h"
 #include "GUI/Util/Path.h"
@@ -249,18 +249,18 @@ void ActionManager::onAboutToShowSettingsMenu()
 
     action = m_settingsMenu->addAction("&Create project on startup");
     action->setCheckable(true);
-    action->setChecked(globalSettings->settings().createNewProjectOnStartup());
+    action->setChecked(appSettings->createNewProjectOnStartup());
     connect(action, &QAction::toggled,
-            [](bool b) { globalSettings->settings().setCreateNewProjectOnStartup(b); });
+            [](bool b) { appSettings->setCreateNewProjectOnStartup(b); });
 
     m_settingsMenu->addSeparator();
 
     QActionGroup* unitActions = new QActionGroup(this);
     const auto addUnitAction = [=](const QString& text, bool isAngstrom) {
         auto action = m_settingsMenu->addAction(
-            text, [=]() { globalSettings->settings().setDefaultUnitIsAngstrom(isAngstrom); });
+            text, [=]() { appSettings->setDefaultUnitIsAngstrom(isAngstrom); });
         action->setCheckable(true);
-        action->setChecked(globalSettings->settings().defaultUnitIsAngstrom() == isAngstrom);
+        action->setChecked(appSettings->defaultUnitIsAngstrom() == isAngstrom);
         unitActions->addAction(action);
     };
 
@@ -272,11 +272,11 @@ void ActionManager::onAboutToShowSettingsMenu()
     QActionGroup* styleActions = new QActionGroup(this);
     const auto addStyleAction = [=](const QString& text, ApplicationSettings::Style style) {
         auto action = m_settingsMenu->addAction(text, [=]() {
-            globalSettings->settings().setStyleToUse(style);
-            globalSettings->loadStyle(style);
+            appSettings->setStyleToUse(style);
+            appSettings->loadStyle(style);
         });
         action->setCheckable(true);
-        action->setChecked(globalSettings->currentStyle() == style);
+        action->setChecked(appSettings->currentStyle() == style);
         styleActions->addAction(action);
     };
 
diff --git a/GUI/View/Main/MainWindow.cpp b/GUI/View/Main/MainWindow.cpp
index fca01eb47f6..f5883aa3d50 100644
--- a/GUI/View/Main/MainWindow.cpp
+++ b/GUI/View/Main/MainWindow.cpp
@@ -13,18 +13,18 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Main/MainWindow.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Job/JobModel.h"
 #include "GUI/Model/State/SessionData.h"
 #include "GUI/Util/OSInfo.h"
 #include "GUI/Util/Path.h"
-#include "GUI/View/Tool/mainwindow_constants.h"
 #include "GUI/View/Import/ImportDataView.h"
 #include "GUI/View/Instrument/InstrumentView.h"
 #include "GUI/View/Job/JobView.h"
 #include "GUI/View/Main/ActionManager.h"
 #include "GUI/View/Main/ProjectManager.h"
 #include "GUI/View/SampleDesigner/SampleView.h"
+#include "GUI/View/Tool/mainwindow_constants.h"
 #include "GUI/View/Toplevel/ProjectSettingsView.h"
 #include "GUI/View/Toplevel/SessionModelView.h"
 #include "GUI/View/Toplevel/SimulationView.h"
@@ -111,7 +111,7 @@ MainWindow::MainWindow()
 
     updateTitle();
 
-    if (globalSettings->settings().createNewProjectOnStartup())
+    if (appSettings->createNewProjectOnStartup())
         m_projectManager->newProject();
 }
 
diff --git a/GUI/View/Main/NewProjectDialog.cpp b/GUI/View/Main/NewProjectDialog.cpp
index 36fd6ce695d..b782372d97c 100644
--- a/GUI/View/Main/NewProjectDialog.cpp
+++ b/GUI/View/Main/NewProjectDialog.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Main/NewProjectDialog.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/IO/ProjectUtils.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include <QFileDialog>
@@ -112,7 +112,7 @@ void NewProjectDialog::onBrowseDirectory()
 {
     QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly;
 
-    if (!globalSettings->settings().useNativeFileDialog())
+    if (!appSettings->useNativeFileDialog())
         options |= QFileDialog::DontUseNativeDialog;
 
     const QString dirname =
diff --git a/GUI/View/Main/ProjectManager.cpp b/GUI/View/Main/ProjectManager.cpp
index b4f041ac7f6..c6ac160fdd6 100644
--- a/GUI/View/Main/ProjectManager.cpp
+++ b/GUI/View/Main/ProjectManager.cpp
@@ -14,17 +14,17 @@
 
 #include "GUI/View/Main/ProjectManager.h"
 #include "Base/Util/Assert.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/IO/ProjectUtils.h"
 #include "GUI/Model/State/SessionData.h"
 #include "GUI/Util/Error.h"
 #include "GUI/Util/MessageService.h"
-#include "GUI/View/Tool/mainwindow_constants.h"
+#include "GUI/View/Info/MessageBox.h"
 #include "GUI/View/Info/ProjectLoadProblemDialog.h"
 #include "GUI/View/Main/MainWindow.h"
 #include "GUI/View/Main/NewProjectDialog.h"
 #include "GUI/View/Main/SaveService.h"
-#include "GUI/View/Info/MessageBox.h"
+#include "GUI/View/Tool/mainwindow_constants.h"
 #include <QApplication>
 #include <QDateTime>
 #include <QFileDialog>
@@ -309,8 +309,8 @@ void ProjectManager::openProject(QString fileName)
         fileName = QFileDialog::getOpenFileName(
             m_mainWindow, "Open project file", workingDirectory(),
             "BornAgain project Files (*.pro)", nullptr,
-            globalSettings->settings().useNativeFileDialog() ? QFileDialog::Options()
-                                                    : QFileDialog::DontUseNativeDialog);
+            appSettings->useNativeFileDialog() ? QFileDialog::Options()
+                                               : QFileDialog::DontUseNativeDialog);
         if (fileName.isEmpty())
             return;
     }
@@ -345,12 +345,11 @@ void ProjectManager::createNewProject()
     gSessionData->projectDocument = new ProjectDocument();
 
     const QVariant defFunctionalities =
-        globalSettings->settings().defaultFunctionalities(toVariant(ProjectDocument::All));
+        appSettings->defaultFunctionalities(toVariant(ProjectDocument::All));
     gSessionData->projectDocument->setFunctionalities(toFunctionalities(defFunctionalities));
     gSessionData->projectDocument->setSingleInstrumentMode(
-        globalSettings->settings().defaultIsSingleInstrumentMode());
-    gSessionData->projectDocument->setSingleSampleMode(
-        globalSettings->settings().defaultIsSingleSampleMode());
+        appSettings->defaultIsSingleInstrumentMode());
+    gSessionData->projectDocument->setSingleSampleMode(appSettings->defaultIsSingleSampleMode());
 
     gSessionData->projectDocument->setProjectName("Untitled");
     gSessionData->projectDocument->setModified(false);
diff --git a/GUI/View/Main/PyImportAssistant.cpp b/GUI/View/Main/PyImportAssistant.cpp
index b56de451281..5291f01e511 100644
--- a/GUI/View/Main/PyImportAssistant.cpp
+++ b/GUI/View/Main/PyImportAssistant.cpp
@@ -18,7 +18,7 @@
 #include "BABuild.h"
 #include "Base/Util/Assert.h"
 #include "Base/Util/SysUtils.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/From/GUIObjectBuilder.h"
 #include "GUI/Model/IO/ProjectUtils.h"
 #include "GUI/Model/Sample/GUIDomainSampleVisitor.h"
@@ -26,8 +26,8 @@
 #include "GUI/Util/String.h"
 #include "GUI/View/Info/ComboSelectorDialog.h"
 #include "GUI/View/Info/DetailedMessageBox.h"
-#include "GUI/View/Main/ProjectManager.h"
 #include "GUI/View/Info/MessageBox.h"
+#include "GUI/View/Main/ProjectManager.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/Multilayer/PyImport.h"
 #include <QApplication>
@@ -101,8 +101,8 @@ QString PyImportAssistant::fileNameToOpen()
 
     QString result = QFileDialog::getOpenFileName(
         m_parentForDialogs, "Open python script", dirname, "Python scripts (*.py)", nullptr,
-        globalSettings->settings().useNativeFileDialog() ? QFileDialog::Options()
-                                                : QFileDialog::DontUseNativeDialog);
+        appSettings->useNativeFileDialog() ? QFileDialog::Options()
+                                           : QFileDialog::DontUseNativeDialog);
 
     saveImportDir(result);
 
diff --git a/GUI/View/MaterialEditor/MaterialEditorDialog.cpp b/GUI/View/MaterialEditor/MaterialEditorDialog.cpp
index 03087f98ec9..b4ab351241a 100644
--- a/GUI/View/MaterialEditor/MaterialEditorDialog.cpp
+++ b/GUI/View/MaterialEditor/MaterialEditorDialog.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/View/MaterialEditor/MaterialEditorDialog.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Material/MaterialItem.h"
 #include "GUI/Model/Material/MaterialItemUtils.h"
 #include "GUI/Model/Material/MaterialModel.h"
@@ -22,10 +22,10 @@
 #include "GUI/Model/Sample/ItemWithMaterial.h"
 #include "GUI/Model/Sample/SampleModel.h"
 #include "GUI/Model/Types/VectorItem.h"
-#include "GUI/View/Tool/mainwindow_constants.h"
 #include "GUI/View/MaterialEditor/MaterialEditorModel.h"
 #include "GUI/View/Tool/EditUtil.h"
 #include "GUI/View/Tool/StyleUtils.h"
+#include "GUI/View/Tool/mainwindow_constants.h"
 #include "ui_MaterialEditorDialog.h"
 
 #include <QAction>
@@ -98,7 +98,7 @@ MaterialEditorDialog::MaterialEditorDialog(ProjectDocument* document, QWidget* p
     m_ui->mainLayout->insertWidget(0, toolbar);
 
     GUI::Util::Style::setResizable(this);
-    globalSettings->settings().loadWindowSizeAndPos(this);
+    appSettings->loadWindowSizeAndPos(this);
 
     connect(m_ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged, this,
             &MaterialEditorDialog::fill);
@@ -144,7 +144,7 @@ MaterialEditorDialog::MaterialEditorDialog(ProjectDocument* document, QWidget* p
 
 MaterialEditorDialog::~MaterialEditorDialog()
 {
-    globalSettings->settings().saveWindowSizeAndPos(this);
+    appSettings->saveWindowSizeAndPos(this);
 }
 
 //! replaces original material model with the model modified by MaterialEditor
diff --git a/GUI/View/Projection/SaveProjectionsAssistant.cpp b/GUI/View/Projection/SaveProjectionsAssistant.cpp
index fea7a475786..4dd0b9a5658 100644
--- a/GUI/View/Projection/SaveProjectionsAssistant.cpp
+++ b/GUI/View/Projection/SaveProjectionsAssistant.cpp
@@ -16,7 +16,7 @@
 #include "Base/Util/PyFmt.h"
 #include "Device/Histo/Histogram1D.h"
 #include "Device/Histo/Histogram2D.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Data/IntensityDataItem.h"
 #include "GUI/Model/Data/MaskItems.h"
 #include "GUI/Model/Data/ProjectionItems.h"
@@ -71,8 +71,8 @@ void SaveProjectionsAssistant::saveProjections(QWidget* parent, IntensityDataIte
     QString defaultName = gSessionData->projectDocument->userExportDir() + "/untitled.txt";
     QString fileName = QFileDialog::getSaveFileName(
         parent, "Save projections data", defaultName, "", nullptr,
-        globalSettings->settings().useNativeFileDialog() ? QFileDialog::Options()
-                                                : QFileDialog::DontUseNativeDialog);
+        appSettings->useNativeFileDialog() ? QFileDialog::Options()
+                                           : QFileDialog::DontUseNativeDialog);
 
     if (fileName.isEmpty())
         return;
diff --git a/GUI/View/Realspace/RealSpaceCanvas.cpp b/GUI/View/Realspace/RealSpaceCanvas.cpp
index 7cff2e0d7a1..3ec0d42d4b3 100644
--- a/GUI/View/Realspace/RealSpaceCanvas.cpp
+++ b/GUI/View/Realspace/RealSpaceCanvas.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Realspace/RealSpaceCanvas.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Group/FilterPropertyProxy.h"
 #include "GUI/Model/Sample/SampleModel.h"
 #include "GUI/Model/Session/SessionItemUtils.h"
@@ -99,8 +99,8 @@ void RealSpaceCanvas::savePicture(const QPixmap& pixmap)
     QString defaultName = dirname + "/untitled";
     QString fileName = QFileDialog::getSaveFileName(
         nullptr, "Save 3D real space view", defaultName, selectedFilter, nullptr,
-        globalSettings->settings().useNativeFileDialog() ? QFileDialog::Options()
-                                                : QFileDialog::DontUseNativeDialog);
+        appSettings->useNativeFileDialog() ? QFileDialog::Options()
+                                           : QFileDialog::DontUseNativeDialog);
     QString nameToSave =
         fileName.endsWith(defaultExtension) ? fileName : fileName + defaultExtension;
 
diff --git a/GUI/View/SampleDesigner/LayerOrientedSampleEditor.cpp b/GUI/View/SampleDesigner/LayerOrientedSampleEditor.cpp
index edb2e32b82b..42973039edb 100644
--- a/GUI/View/SampleDesigner/LayerOrientedSampleEditor.cpp
+++ b/GUI/View/SampleDesigner/LayerOrientedSampleEditor.cpp
@@ -20,7 +20,7 @@
 #include "GUI/View/SampleDesigner/MultiLayerForm.h"
 #include "GUI/View/SampleDesigner/SampleEditorController.h"
 
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include <QBoxLayout>
 #include <QScrollArea>
 
@@ -73,7 +73,7 @@ LayerOrientedSampleEditor::LayerOrientedSampleEditor(QWidget* parent)
     auto* ag = new QActionGroup(this);
     ag->addAction(asNanometerAction);
     ag->addAction(m_asAngstromAction);
-    if (globalSettings->settings().defaultUnitIsAngstrom())
+    if (appSettings->defaultUnitIsAngstrom())
         m_asAngstromAction->setChecked(true);
     else
         asNanometerAction->setChecked(true);
diff --git a/GUI/View/SampleDesigner/SampleListView.cpp b/GUI/View/SampleDesigner/SampleListView.cpp
index 0883862de6f..58b5aeafcb4 100644
--- a/GUI/View/SampleDesigner/SampleListView.cpp
+++ b/GUI/View/SampleDesigner/SampleListView.cpp
@@ -13,13 +13,13 @@
 //  ************************************************************************************************
 
 #include "GUI/View/SampleDesigner/SampleListView.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Sample/GUIExamplesFactory.h"
 #include "GUI/Model/Sample/MultiLayerItem.h"
 #include "GUI/Model/Sample/SampleListModel.h"
 #include "GUI/Model/State/SessionData.h"
-#include "GUI/View/Tool/ItemDelegateForHTML.h"
 #include "GUI/View/Common/ItemViewOverlayButtons.h"
+#include "GUI/View/Tool/ItemDelegateForHTML.h"
 #include <QAction>
 #include <QDialog>
 #include <QDialogButtonBox>
@@ -193,7 +193,7 @@ void SampleListView::editNameAndDescription(MultiLayerItem* item)
     connect(buttonBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept);
     connect(buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject);
 
-    globalSettings->settings().loadWindowSizeAndPos(&dlg);
+    appSettings->loadWindowSizeAndPos(&dlg);
     if (dlg.exec() == QDialog::Accepted) {
         QModelIndex index = m_model->indexForItem(item);
         m_model->setData(index, nameEdit->text(), Qt::EditRole);
@@ -202,7 +202,7 @@ void SampleListView::editNameAndDescription(MultiLayerItem* item)
         // has to be updated -> schedule a re-layout
         scheduleDelayedItemsLayout();
     }
-    globalSettings->settings().saveWindowSizeAndPos(&dlg);
+    appSettings->saveWindowSizeAndPos(&dlg);
 }
 
 void SampleListView::onCurrentChanged(const QModelIndex& index)
diff --git a/GUI/View/Script/PythonScriptWidget.cpp b/GUI/View/Script/PythonScriptWidget.cpp
index f68eb905e4e..d34f5ea4555 100644
--- a/GUI/View/Script/PythonScriptWidget.cpp
+++ b/GUI/View/Script/PythonScriptWidget.cpp
@@ -15,7 +15,7 @@
 #include "GUI/View/Script/PythonScriptWidget.h"
 #include "Core/Export/ExportToPython.h"
 #include "Core/Simulation/GISASSimulation.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/To/DomainSimulationBuilder.h"
 #include "GUI/View/Common/StyledToolBar.h"
 #include "GUI/View/Info/CautionSign.h"
@@ -72,13 +72,13 @@ PythonScriptWidget::PythonScriptWidget(QWidget* parent)
 
     setAttribute(Qt::WA_DeleteOnClose, true);
     GUI::Util::Style::setResizable(this);
-    globalSettings->settings().loadWindowSizeAndPos(this);
+    appSettings->loadWindowSizeAndPos(this);
 }
 
 
 PythonScriptWidget::~PythonScriptWidget()
 {
-    globalSettings->settings().saveWindowSizeAndPos(this);
+    appSettings->saveWindowSizeAndPos(this);
 }
 
 void PythonScriptWidget::generatePythonScript(const MultiLayerItem* sampleItem,
@@ -121,8 +121,8 @@ void PythonScriptWidget::onExportToFileButton()
 
     QString fileName = QFileDialog::getSaveFileName(
         nullptr, "Save file", defaultName, filters, &defaultFilter,
-        globalSettings->settings().useNativeFileDialog() ? QFileDialog::Options()
-                                                : QFileDialog::DontUseNativeDialog);
+        appSettings->useNativeFileDialog() ? QFileDialog::Options()
+                                           : QFileDialog::DontUseNativeDialog);
 
     if (fileName.isEmpty())
         return;
diff --git a/GUI/View/Tool/GroupBoxCollapser.cpp b/GUI/View/Tool/GroupBoxCollapser.cpp
index 0c72850b9aa..da06f1af307 100644
--- a/GUI/View/Tool/GroupBoxCollapser.cpp
+++ b/GUI/View/Tool/GroupBoxCollapser.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GroupBoxCollapser.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include <QAction>
 #include <QBoxLayout>
 #include <QGroupBox>
@@ -84,7 +84,7 @@ GroupBoxCollapser::GroupBoxCollapser(QGroupBox* groupBox) : QObject(groupBox)
 
     m_toggleButton = new QToolButton(groupBox);
     m_toggleButton->setObjectName("GroupBoxToggler");
-    if (globalSettings->currentStyle() == ApplicationSettings::Style::native)
+    if (appSettings->currentStyle() == ApplicationSettings::Style::native)
         m_toggleButton->setStyleSheet(
             "QToolButton { border: none; text-align: left; font: bold; padding: 5px}");
     m_toggleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
diff --git a/GUI/View/Toplevel/ProjectSettingsView.cpp b/GUI/View/Toplevel/ProjectSettingsView.cpp
index 8aceb07a6e9..55cd7d91f5c 100644
--- a/GUI/View/Toplevel/ProjectSettingsView.cpp
+++ b/GUI/View/Toplevel/ProjectSettingsView.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Toplevel/ProjectSettingsView.h"
-#include "GUI/Application/GlobalSettings.h"
+#include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Model/Instrument/InstrumentModel.h"
 #include "GUI/Model/Sample/SampleModel.h"
 #include "GUI/Util/Path.h"
@@ -108,10 +108,9 @@ void ProjectSettingsView::updateInformation()
 
 void ProjectSettingsView::storeAsDefaults()
 {
-    globalSettings->settings().setDefaultFunctionalities(toVariant(functionalities()));
-    globalSettings->settings().setDefaultIsSingleInstrumentMode(
-        m_ui->singleInstrumentModeRadio->isChecked());
-    globalSettings->settings().setDefaultIsSingleSampleMode(m_ui->singleSampleModeRadio->isChecked());
+    appSettings->setDefaultFunctionalities(toVariant(functionalities()));
+    appSettings->setDefaultIsSingleInstrumentMode(m_ui->singleInstrumentModeRadio->isChecked());
+    appSettings->setDefaultIsSingleSampleMode(m_ui->singleSampleModeRadio->isChecked());
 }
 
 void ProjectSettingsView::onSingleInstrumentRadioToggled(bool newState)
-- 
GitLab