From bd5eb2e554f296e31747e9ca922cf70b76f014c2 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Tue, 2 Nov 2021 16:03:11 +0100
Subject: [PATCH] move global settings out of qApp

---
 App/main.cpp                                  | 23 +++++++++----
 GUI/Application/Application.cpp               | 33 ++++++++-----------
 GUI/Application/Application.h                 |  7 ++--
 .../Instrument/InstrumentsTreeModel.cpp       |  1 +
 GUI/Project/projectmanager.cpp                |  1 +
 .../ImportDataWidgets/RealDataTreeModel.cpp   | 18 +++++-----
 GUI/mainwindow/PyImportAssistant.cpp          |  1 +
 GUI/mainwindow/mainwindow.cpp                 |  1 +
 8 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/App/main.cpp b/App/main.cpp
index d72f056457c..394d53c0d05 100644
--- a/App/main.cpp
+++ b/App/main.cpp
@@ -17,8 +17,11 @@
 #include "GUI/Application/Application.h"
 #include "GUI/DataLoaders/DataLoaderUtil.h"
 #include "GUI/mainwindow/mainwindow.h"
+#include "GUI/utils/hostosinfo.h"
+#include "GUI/utils/Helpers.h"
 #include "config_build.h"
 #include <QDir>
+#include <QIcon>
 #include <QLocale>
 #include <QMessageBox>
 #include <QMetaType>
@@ -38,7 +41,14 @@ int main(int argc, char* argv[])
     if (!options.disableHighDPISupport())
         QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
 
-    Application app(argc, argv);
+    QApplication app(argc, argv);
+    app.setApplicationName("BornAgain");
+    app.setApplicationVersion(GUI::Helpers::getBornAgainVersionString());
+    app.setOrganizationName("BornAgain");
+    if (!GUI::Utils::OS::HostOsInfo::isMacHost())
+        QApplication::setWindowIcon(QIcon(":/images/BornAgain.ico"));
+
+    GlobalSettings GSettings;
     int ret;
 
 #if !defined(BUILD_DEBUG)
@@ -48,12 +58,13 @@ int main(int argc, char* argv[])
 
         register1DDataLoaders();
 
-        app.loadStyle(app.settings().styleToUse());
+        auto style = baApp->settings().styleToUse();
+        baApp->loadStyle(style);
 
-        if (!QDir().exists(app.appDataFolder()))
-            QDir().mkpath(app.appDataFolder());
+        if (!QDir().exists(baApp->appDataFolder()))
+            QDir().mkpath(baApp->appDataFolder());
 
-        app.instrumentLibrary().load(app.instrumentLibraryFilePath());
+        baApp->instrumentLibrary().load(baApp->instrumentLibraryFilePath());
 
         MainWindow win;
         if (options.find("geometry"))
@@ -63,7 +74,7 @@ int main(int argc, char* argv[])
 
         ret = QApplication::exec();
 
-        app.instrumentLibrary().saveIfModified(app.instrumentLibraryFilePath());
+        baApp->instrumentLibrary().saveIfModified(baApp->instrumentLibraryFilePath());
 #if !defined(BUILD_DEBUG)
     } catch (...) {
         QMessageBox box;
diff --git a/GUI/Application/Application.cpp b/GUI/Application/Application.cpp
index d99d18019fd..1df382b2b13 100644
--- a/GUI/Application/Application.cpp
+++ b/GUI/Application/Application.cpp
@@ -13,29 +13,24 @@
 //  ************************************************************************************************
 
 #include "GUI/Application/Application.h"
-#include "GUI/utils/Helpers.h"
-#include "GUI/utils/hostosinfo.h"
+#include <QApplication>
 #include <QFile>
-#include <QIcon>
 #include <QStandardPaths>
 
-Application::Application(int& argc, char** argv)
-    : QApplication(argc, argv), m_currentStyle(ApplicationSettings::Style::native)
-{
-    setApplicationName("BornAgain");
-    setApplicationVersion(GUI::Helpers::getBornAgainVersionString());
-    setOrganizationName("BornAgain");
+GlobalSettings* baApp; //!< global pointer to _the_ instance
 
-    if (!GUI::Utils::OS::HostOsInfo::isMacHost())
-        QApplication::setWindowIcon(QIcon(":/images/BornAgain.ico"));
+GlobalSettings::GlobalSettings()
+    : m_currentStyle(ApplicationSettings::Style::native)
+{
+    baApp = this;
 }
 
-ApplicationSettings& Application::settings()
+ApplicationSettings& GlobalSettings::settings()
 {
     return m_settings;
 }
 
-void Application::loadStyle(ApplicationSettings::Style style)
+void GlobalSettings::loadStyle(ApplicationSettings::Style style)
 {
     QString stylesheet;
 
@@ -64,7 +59,7 @@ void Application::loadStyle(ApplicationSettings::Style style)
     }
     }
 
-    setStyleSheet(stylesheet);
+    qApp->setStyleSheet(stylesheet);
     m_currentStyle = style;
 
     // -- init palette for later usage; could be improved by parsing the stylesheet
@@ -87,27 +82,27 @@ void Application::loadStyle(ApplicationSettings::Style style)
     }
 }
 
-ApplicationSettings::Style Application::currentStyle()
+ApplicationSettings::Style GlobalSettings::currentStyle()
 {
     return m_currentStyle;
 }
 
-const Application::Palette& Application::styleSheetPalette() const
+const GlobalSettings::Palette& GlobalSettings::styleSheetPalette() const
 {
     return m_styleSheetPalette;
 }
 
-InstrumentLibrary& Application::instrumentLibrary()
+InstrumentLibrary& GlobalSettings::instrumentLibrary()
 {
     return m_instrumentLibrary;
 }
 
-QString Application::instrumentLibraryFilePath() const
+QString GlobalSettings::instrumentLibraryFilePath() const
 {
     return appDataFolder() + "/BornAgainInstrumentLibrary.balib";
 }
 
-QString Application::appDataFolder() const
+QString GlobalSettings::appDataFolder() const
 {
     return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
 }
diff --git a/GUI/Application/Application.h b/GUI/Application/Application.h
index 4d40388f6ff..38f433819f8 100644
--- a/GUI/Application/Application.h
+++ b/GUI/Application/Application.h
@@ -17,14 +17,13 @@
 
 #include "GUI/Application/ApplicationSettings.h"
 #include "GUI/Models/Instrument/InstrumentLibrary.h"
-#include <QApplication>
 #include <QColor>
 
 //! Provides access to application wide stuff like settings.
 
-class Application : public QApplication {
+class GlobalSettings {
 public:
-    Application(int& argc, char** argv);
+    GlobalSettings();
 
     ApplicationSettings& settings();
 
@@ -54,6 +53,6 @@ private:
     Palette m_styleSheetPalette;
 };
 
-#define baApp (static_cast<Application*>(qApp))
+extern GlobalSettings* baApp; //!< global pointer to the single instance
 
 #endif // BORNAGAIN_GUI_APPLICATION_APPLICATION_H
diff --git a/GUI/Models/Instrument/InstrumentsTreeModel.cpp b/GUI/Models/Instrument/InstrumentsTreeModel.cpp
index cb545ef99bd..a5624d9bc56 100644
--- a/GUI/Models/Instrument/InstrumentsTreeModel.cpp
+++ b/GUI/Models/Instrument/InstrumentsTreeModel.cpp
@@ -15,6 +15,7 @@
 #include "GUI/Models/Instrument/InstrumentsTreeModel.h"
 #include "GUI/Application/Application.h"
 #include "GUI/Items/InstrumentItems.h"
+#include <QApplication>
 #include <QtCore>
 #include <QtGui>
 
diff --git a/GUI/Project/projectmanager.cpp b/GUI/Project/projectmanager.cpp
index 756a0228d27..588b3ce47ec 100644
--- a/GUI/Project/projectmanager.cpp
+++ b/GUI/Project/projectmanager.cpp
@@ -26,6 +26,7 @@
 #include "GUI/utils/GUIHelpers.h"
 #include "GUI/utils/MessageService.h"
 #include "GUI/utils/mainwindow_constants.h"
+#include <QApplication>
 #include <QDateTime>
 #include <QFileDialog>
 #include <QMessageBox>
diff --git a/GUI/Views/ImportDataWidgets/RealDataTreeModel.cpp b/GUI/Views/ImportDataWidgets/RealDataTreeModel.cpp
index cdc178fb915..e6d21ac1116 100644
--- a/GUI/Views/ImportDataWidgets/RealDataTreeModel.cpp
+++ b/GUI/Views/ImportDataWidgets/RealDataTreeModel.cpp
@@ -16,6 +16,7 @@
 #include "GUI/Application/Application.h"
 #include "GUI/Items/RealDataItem.h"
 #include "GUI/Models/Data/RealDataModel.h"
+#include <QApplication>
 #include <QtCore>
 #include <QtGui>
 
@@ -33,16 +34,17 @@ RealDataTreeModel::RealDataTreeModel(QObject* parent, RealDataModel* model)
 
 void RealDataTreeModel::setVisibleRanks(QSet<int> visibleRanks)
 {
-    if (m_visibleRanks != visibleRanks) {
-        m_visibleRanks = visibleRanks;
+    if (m_visibleRanks == visibleRanks)
+        return;
 
-        beginResetModel();
-        for (auto rank : m_visibleRanks)
-            m_items[rank - 1] = m_model->realDataItems(rank);
-        endResetModel();
+    m_visibleRanks = visibleRanks;
 
-        updateSubsriptions();
-    }
+    beginResetModel();
+    for (auto rank : m_visibleRanks)
+        m_items[rank - 1] = m_model->realDataItems(rank);
+    endResetModel();
+
+    updateSubsriptions();
 }
 
 void RealDataTreeModel::refreshAfterModelChange()
diff --git a/GUI/mainwindow/PyImportAssistant.cpp b/GUI/mainwindow/PyImportAssistant.cpp
index 3e7d1c24c5e..136ff8c20dd 100644
--- a/GUI/mainwindow/PyImportAssistant.cpp
+++ b/GUI/mainwindow/PyImportAssistant.cpp
@@ -30,6 +30,7 @@
 #include "GUI/utils/Helpers.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/Multilayer/PyImport.h"
+#include <QApplication>
 #include <QFileDialog>
 #include <QTextStream>
 
diff --git a/GUI/mainwindow/mainwindow.cpp b/GUI/mainwindow/mainwindow.cpp
index 393eccd27c2..df26a6ed9b5 100644
--- a/GUI/mainwindow/mainwindow.cpp
+++ b/GUI/mainwindow/mainwindow.cpp
@@ -29,6 +29,7 @@
 #include "GUI/utils/hostosinfo.h"
 #include "GUI/utils/mainwindow_constants.h"
 #include <QAction>
+#include <QApplication>
 #include <QBoxLayout>
 #include <QButtonGroup>
 #include <QCloseEvent>
-- 
GitLab