diff --git a/App/main.cpp b/App/main.cpp index 663f58a9ddeec1291bb5345e1ff49bf3efeb57f7..f017b48da80c0e31982c0028fd27568d99f28948 100644 --- a/App/main.cpp +++ b/App/main.cpp @@ -15,9 +15,8 @@ #include "App/AppOptions.h" #include "Base/Util/Assert.h" #include "GUI/Model/Project/ProjectDocument.h" -#include "GUI/Support/Data/Dirs.h" #include "GUI/Support/Util/Path.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Main/MainWindow.h" #include "GUI/View/Tool/Globals.h" #include "config_build.h" @@ -70,13 +69,7 @@ int main(int argc, char* argv[]) app.setWindowIcon(QIcon(":/images/BornAgain.ico")); #endif - ApplicationSettings applicationSettings; - - QString dir = GUI::Path::appDataFolder(); - if (!QDir().exists(dir)) - QDir().mkpath(dir); - - gDirs = std::make_unique<Dirs>(); + gApp = std::make_unique<AppConfig>(); gDoc = std::make_unique<ProjectDocument>(); MainWindow win; diff --git a/GUI/Support/Util/Path.cpp b/GUI/Support/Util/Path.cpp index a3f14db83d6fca0e551a662058243103a67d706e..3aa3bebafc09f8c426a9f5f04231d0689a100dfa 100644 --- a/GUI/Support/Util/Path.cpp +++ b/GUI/Support/Util/Path.cpp @@ -135,8 +135,3 @@ QString GUI::Path::baseName(const QString& fname) QFileInfo info(fname); return info.baseName(); } - -QString GUI::Path::appDataFolder() -{ - return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); -} diff --git a/GUI/Support/Util/Path.h b/GUI/Support/Util/Path.h index 0e79b20a2d81367d19d4380917c8c7b9a92a200d..13f936009168005138e408ea31746b8510e43d34 100644 --- a/GUI/Support/Util/Path.h +++ b/GUI/Support/Util/Path.h @@ -37,11 +37,6 @@ int versionCode(const QString& version); bool isVersionMatchMinimal(const QString& version, const QString& minimal_version); -//! The folder where persistent application data shall be stored. -//! Under Windows this is the AppData/Roaming location. -//! Used e.g. for storing the instrument library. -QString appDataFolder(); - } // namespace GUI::Path #endif // BORNAGAIN_GUI_SUPPORT_UTIL_PATH_H diff --git a/GUI/View/Canvas/SavePlotAssistant.cpp b/GUI/View/Canvas/SavePlotAssistant.cpp index 8ab027690fdfc4b093dbe8cac646bbacfa501599..2365e0215704573aec89e2b91d4cc2fcf91d68bf 100644 --- a/GUI/View/Canvas/SavePlotAssistant.cpp +++ b/GUI/View/Canvas/SavePlotAssistant.cpp @@ -15,8 +15,7 @@ #include "GUI/View/Canvas/SavePlotAssistant.h" #include "Base/Util/Assert.h" #include "Device/IO/IOFactory.h" -#include "GUI/Support/Data/Dirs.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Plotter/ColorMap.h" #include "GUI/View/Widget/FileDialog.h" #include <QFile> @@ -137,7 +136,7 @@ void GUI::Plot::savePlot(QCustomPlot* plot, const Datafield* output_data) { static const QString defaultExtension = ".png"; QString fname = - GUI::FileDialog::w1_1f("Save Plot", gDirs->artifact_export_dir, "*" + defaultExtension); + GUI::FileDialog::w1_1f("Save Plot", gApp->artifact_export_dir, "*" + defaultExtension); if (fname.isEmpty()) return; if (!fname.endsWith(defaultExtension)) diff --git a/GUI/Support/Data/Dirs.cpp b/GUI/View/Layout/AppConfig.cpp similarity index 56% rename from GUI/Support/Data/Dirs.cpp rename to GUI/View/Layout/AppConfig.cpp index 58c619e2c0b8cf998dfb27a90924bb6bde1e39bf..4fd4b06157676614740e3dc025f3a9960b0401cc 100644 --- a/GUI/Support/Data/Dirs.cpp +++ b/GUI/View/Layout/AppConfig.cpp @@ -2,19 +2,25 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file GUI/Support/Data/Dirs.cpp -//! @brief Implements class Dirs. +//! @file GUI/View/Layout/AppConfig.cpp +//! @brief Implements class AppConfig. //! //! @homepage http://www.bornagainproject.org //! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 +//! @copyright Forschungszentrum Jülich GmbH 2021 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) // // ************************************************************************************************ -#include "GUI/Support/Data/Dirs.h" +#include "GUI/View/Layout/AppConfig.h" +#include <QApplication> #include <QDir> +#include <QFile> #include <QSettings> +#include <QStandardPaths> +#include <QStyle> + +BA_GUI_API_ std::unique_ptr<AppConfig> gApp; //!< global pointer to _the_ instance namespace { @@ -28,21 +34,43 @@ const QString S_LASTUSEDIMPORFILTER2D = "LastUsedImportFilter2D"; } // namespace -BA_GUI_API_ std::unique_ptr<Dirs> gDirs; -Dirs::Dirs() +AppConfig::AppConfig() { + QFile base(":/styles/Base.stylesheet"); + base.open(QFile::ReadOnly); + QString stylesheet = base.readAll(); + qApp->setStyleSheet(stylesheet); + + QPalette styleSheetPalette = qApp->style()->standardPalette(); + styleSheetPalette.setColor(QPalette::Text, Qt::black); + styleSheetPalette.setColor(QPalette::WindowText, Qt::black); + styleSheetPalette.setColor(QPalette::Base, Qt::white); + styleSheetPalette.setColor(QPalette::AlternateBase, QColor(255, 255, 255).darker(105)); + styleSheetPalette.setColor(QPalette::Dark, QColor(255, 255, 255).darker(110)); + QApplication::setPalette(styleSheetPalette); + + xml_dir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); artifact_export_dir = QDir::homePath(); data_import_dir = QDir::homePath(); script_import_dir = QDir::homePath(); - readSettings(); + // TODO replace homePath by QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) ? + + loadSettings(); } -Dirs::~Dirs() = default; +bool AppConfig::useNativeFileDialog() const +{ +#ifdef _WIN32 + return true; +#else + return false; +#endif +} -//! Reads settings of Dirs from global settings. +//! Reads settings of AppConfig from global settings. -void Dirs::readSettings() +void AppConfig::loadSettings() { QSettings s; if (s.childGroups().contains(S_DIRS)) { @@ -59,9 +87,9 @@ void Dirs::readSettings() } } -//! Saves settings of Dirs in global settings. +//! Saves settings of AppConfig in global settings. -void Dirs::writeSettings() +void AppConfig::saveSettings() { QSettings s; s.beginGroup(S_DIRS); diff --git a/GUI/Support/Data/Dirs.h b/GUI/View/Layout/AppConfig.h similarity index 61% rename from GUI/Support/Data/Dirs.h rename to GUI/View/Layout/AppConfig.h index 68bda63afbdaa08d649b3d6b6c5a25ab54041fc8..a5a930ea6e106b95cab08db4c7041413845ae665 100644 --- a/GUI/Support/Data/Dirs.h +++ b/GUI/View/Layout/AppConfig.h @@ -2,28 +2,29 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file GUI/Support/Data/Dirs.h -//! @brief Defines class Dirs. +//! @file GUI/View/Layout/AppConfig.h +//! @brief Defines class AppConfig. //! //! @homepage http://www.bornagainproject.org //! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 +//! @copyright Forschungszentrum Jülich GmbH 2021 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) // // ************************************************************************************************ -#ifndef BORNAGAIN_GUI_SUPPORT_DATA_DIRS_H -#define BORNAGAIN_GUI_SUPPORT_DATA_DIRS_H +#ifndef BORNAGAIN_GUI_VIEW_LAYOUT_APPCONFIG_H +#define BORNAGAIN_GUI_VIEW_LAYOUT_APPCONFIG_H #include "Wrap/WinDllMacros.h" #include <QString> -//! Handles activity related to opening/save projects. +//! Application-wide settings. -class Dirs { +class AppConfig { public: - Dirs(); - ~Dirs(); + AppConfig(); + + bool useNativeFileDialog() const; QString import_filter_1D; //!< Last used import filter for 1D files QString import_filter_2D; //!< Last used import filter for 2D files @@ -31,13 +32,14 @@ public: QString artifact_export_dir; //!< Last used directory to save image, script, ... QString data_import_dir; //!< Last data were imported from this directory QString script_import_dir; //!< Last script was imported from this directory + QString xml_dir; //!< Last directory for component IO - void writeSettings(); + void saveSettings(); private: - void readSettings(); + void loadSettings(); }; -BA_GUI_API_ extern std::unique_ptr<Dirs> gDirs; +BA_GUI_API_ extern std::unique_ptr<AppConfig> gApp; //!< global pointer to _the_ instance -#endif // BORNAGAIN_GUI_SUPPORT_DATA_DIRS_H +#endif // BORNAGAIN_GUI_VIEW_LAYOUT_APPCONFIG_H diff --git a/GUI/View/Layout/ApplicationSettings.cpp b/GUI/View/Layout/ApplicationSettings.cpp deleted file mode 100644 index e70a085062c0a9446a38c571cb95ee522b34d909..0000000000000000000000000000000000000000 --- a/GUI/View/Layout/ApplicationSettings.cpp +++ /dev/null @@ -1,80 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/View/Layout/ApplicationSettings.cpp -//! @brief Implements class ApplicationSettings. -//! -//! @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/View/Layout/ApplicationSettings.h" -#include "Base/Util/Assert.h" -#include <QApplication> -#include <QFile> -#include <QSettings> -#include <QStandardPaths> -#include <QStyle> - -namespace { - -const QString S_SIZE = "Size"; -const QString S_POS = "Pos"; -const QString S_SINGLE_SAMPLE_MODE = "SingleSampleMode"; - -} // namespace - -ApplicationSettings* appSettings; //!< global pointer to _the_ instance - -ApplicationSettings::ApplicationSettings() -{ - appSettings = this; - - QFile base(":/styles/Base.stylesheet"); - base.open(QFile::ReadOnly); - QString stylesheet = base.readAll(); - qApp->setStyleSheet(stylesheet); - - QPalette styleSheetPalette = qApp->style()->standardPalette(); - styleSheetPalette.setColor(QPalette::Text, Qt::black); - styleSheetPalette.setColor(QPalette::WindowText, Qt::black); - styleSheetPalette.setColor(QPalette::Base, Qt::white); - styleSheetPalette.setColor(QPalette::AlternateBase, QColor(255, 255, 255).darker(105)); - styleSheetPalette.setColor(QPalette::Dark, QColor(255, 255, 255).darker(110)); - QApplication::setPalette(styleSheetPalette); - - xml_dir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); -} - -bool ApplicationSettings::useNativeFileDialog() const -{ -#ifdef _WIN32 - return true; -#else - return false; -#endif -} - -void ApplicationSettings::saveWindowSizeAndPos(const QWidget* w) -{ - ASSERT(!w->objectName().isEmpty()); - QSettings settings; - settings.setValue(S_SIZE + "/" + w->objectName(), w->size()); - settings.setValue(S_POS + "/" + w->objectName(), w->pos()); -} - -void ApplicationSettings::loadWindowSizeAndPos(QWidget* w) -{ - ASSERT(!w->objectName().isEmpty()); - - QSettings settings; - const QSize size = settings.value(S_SIZE + "/" + w->objectName(), QSize()).toSize(); - if (size.isValid()) - w->resize(size); - if (settings.contains(S_POS + "/" + w->objectName())) - w->move(settings.value(S_POS + "/" + w->objectName()).toPoint()); -} diff --git a/GUI/View/Layout/ApplicationSettings.h b/GUI/View/Layout/ApplicationSettings.h deleted file mode 100644 index ede86df61628235b1d38124548c6dabbe567a407..0000000000000000000000000000000000000000 --- a/GUI/View/Layout/ApplicationSettings.h +++ /dev/null @@ -1,38 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/View/Layout/ApplicationSettings.h -//! @brief Defines class ApplicationSettings. -//! -//! @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_VIEW_LAYOUT_APPLICATIONSETTINGS_H -#define BORNAGAIN_GUI_VIEW_LAYOUT_APPLICATIONSETTINGS_H - -#include <QWidget> - -//! Application wide settings. -//! -//! Contains settings which the user can change. Also -//! contains settings which may be user editable in the future. -class ApplicationSettings { -public: - ApplicationSettings(); - - bool useNativeFileDialog() const; - - void saveWindowSizeAndPos(const QWidget* w); - void loadWindowSizeAndPos(QWidget* w); - - QString xml_dir; -}; - -extern ApplicationSettings* appSettings; //!< global pointer to the single instance - -#endif // BORNAGAIN_GUI_VIEW_LAYOUT_APPLICATIONSETTINGS_H diff --git a/GUI/View/Loader/ComponentRW.cpp b/GUI/View/Loader/ComponentRW.cpp index 973108d84df43b251d14f41476ff8fafcc409f1a..e2f4ea4517ec2c035221a14cd109fb3bd76f50b2 100644 --- a/GUI/View/Loader/ComponentRW.cpp +++ b/GUI/View/Loader/ComponentRW.cpp @@ -15,7 +15,7 @@ #include "GUI/View/Loader/ComponentRW.h" #include "GUI/Model/Device/InstrumentItems.h" #include "GUI/Model/Device/InstrumentXML.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Widget/FileDialog.h" #include <QMessageBox> @@ -45,8 +45,8 @@ template <class T> void RW::saveComponentToXML(const QString& type, const T* t) if (!t) return; - QString fname = GUI::FileDialog::w1_1f("Save " + type, appSettings->xml_dir, - "XML files (*.xml)", t->name() + ".xml"); + QString fname = GUI::FileDialog::w1_1f("Save " + type, gApp->xml_dir, "XML files (*.xml)", + t->name() + ".xml"); if (fname.isEmpty()) return; @@ -61,8 +61,7 @@ template <class T> void RW::saveComponentToXML(const QString& type, const T* t) template <class T> T* RW::loadComponentFromXML(const QString& type) { - QString fname = - GUI::FileDialog::r1_1f("Load " + type, appSettings->xml_dir, "XML files (*.xml)"); + QString fname = GUI::FileDialog::r1_1f("Load " + type, gApp->xml_dir, "XML files (*.xml)"); if (fname.isEmpty()) return nullptr; diff --git a/GUI/View/Loader/DataLoader.cpp b/GUI/View/Loader/DataLoader.cpp index 5ed0de128605c4994afd277de12f39fe902104a9..f4e8d613ada2d584ae457091729f49a8f862aa52 100644 --- a/GUI/View/Loader/DataLoader.cpp +++ b/GUI/View/Loader/DataLoader.cpp @@ -19,10 +19,9 @@ #include "Device/IO/ZipUtil.h" #include "GUI/Model/Data/DataItem.h" #include "GUI/Model/Files/DatafileItem.h" -#include "GUI/Support/Data/Dirs.h" #include "GUI/Support/Util/Path.h" #include "GUI/View/Info/MessageBox.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Loader/ImportDialogs.h" #include <QFileDialog> #include <QFileInfo> @@ -66,15 +65,13 @@ std::vector<DatafileItem*> RW::importData1D() static const QString filters = ::join_filterkeys(filters1D, ";;"); const QStringList fnames = QFileDialog::getOpenFileNames( - Q_NULLPTR, "Open Intensity Files", gDirs->data_import_dir, filters, - &gDirs->import_filter_1D, - appSettings->useNativeFileDialog() ? QFileDialog::Options() - : QFileDialog::DontUseNativeDialog); + Q_NULLPTR, "Open Intensity Files", gApp->data_import_dir, filters, &gApp->import_filter_1D, + gApp->useNativeFileDialog() ? QFileDialog::Options() : QFileDialog::DontUseNativeDialog); if (fnames.isEmpty()) return {}; - gDirs->data_import_dir = GUI::Path::fileDir(fnames[0]); // all in list have same dir - const IO::Filetype1D global_ftype = ::filterkey2type(filters1D, gDirs->import_filter_1D); + gApp->data_import_dir = GUI::Path::fileDir(fnames[0]); // all in list have same dir + const IO::Filetype1D global_ftype = ::filterkey2type(filters1D, gApp->import_filter_1D); std::vector<DatafileItem*> result; for (const QString& fname : fnames) { @@ -123,15 +120,13 @@ std::vector<DatafileItem*> RW::importData2D() static const QString filters = ::join_filterkeys(filters2D, ";;"); const QStringList fnames = QFileDialog::getOpenFileNames( - Q_NULLPTR, "Open Intensity Files", gDirs->data_import_dir, filters, - &gDirs->import_filter_2D, - appSettings->useNativeFileDialog() ? QFileDialog::Options() - : QFileDialog::DontUseNativeDialog); + Q_NULLPTR, "Open Intensity Files", gApp->data_import_dir, filters, &gApp->import_filter_2D, + gApp->useNativeFileDialog() ? QFileDialog::Options() : QFileDialog::DontUseNativeDialog); if (fnames.isEmpty()) return {}; - gDirs->data_import_dir = GUI::Path::fileDir(fnames[0]); // all in list have same dir - const IO::Filetype2D global_ftype = ::filterkey2type(filters2D, gDirs->import_filter_2D); + gApp->data_import_dir = GUI::Path::fileDir(fnames[0]); // all in list have same dir + const IO::Filetype2D global_ftype = ::filterkey2type(filters2D, gApp->import_filter_2D); std::vector<DatafileItem*> result; for (const QString& fname : fnames) { diff --git a/GUI/View/Loader/ProjectionsSaver.cpp b/GUI/View/Loader/ProjectionsSaver.cpp index f641200481f9bf329aab2a5a778ac4321b17be86..8fbe7363e7ec7c9fa76ed5f796ecb7980f1ab644 100644 --- a/GUI/View/Loader/ProjectionsSaver.cpp +++ b/GUI/View/Loader/ProjectionsSaver.cpp @@ -19,8 +19,7 @@ #include "GUI/Model/Data/Data2DItem.h" #include "GUI/Model/Mask/MasksSet.h" #include "GUI/Model/Project/ProjectDocument.h" -#include "GUI/Support/Data/Dirs.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Widget/FileDialog.h" #include <QFile> #include <QString> @@ -152,7 +151,7 @@ void GUI::IO::saveProjections(const Data2DItem* data_item) if (!data_item) return; - QString fname = GUI::FileDialog::w1_1f("Save projections data", gDirs->artifact_export_dir, ""); + QString fname = GUI::FileDialog::w1_1f("Save projections data", gApp->artifact_export_dir, ""); if (fname.isEmpty()) return; diff --git a/GUI/View/Loader/PythonScriptWidget.cpp b/GUI/View/Loader/PythonScriptWidget.cpp index 35a8be98b9fc2d263bb5d99afefd0af877d99cf7..ff6f872004c168ef21b88bc5916a1bfbbf5eb16b 100644 --- a/GUI/View/Loader/PythonScriptWidget.cpp +++ b/GUI/View/Loader/PythonScriptWidget.cpp @@ -17,8 +17,9 @@ #include "GUI/Support/Style/Style.h" #include "GUI/View/Info/CautionSign.h" #include "GUI/View/Info/PythonSyntaxHighlighter.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Widget/StyledToolbar.h" +#include "GUI/View/Widget/WidgetSettings.h" #include "Sim/Export/ExportToPython.h" #include "Sim/Simulation/ScatteringSimulation.h" #include <QFileDialog> @@ -69,13 +70,12 @@ PythonScriptWidget::PythonScriptWidget(QWidget* parent) setAttribute(Qt::WA_DeleteOnClose, true); GUI::Style::setResizable(this); - appSettings->loadWindowSizeAndPos(this); + GUI::WidgetSettings::load(this); } - PythonScriptWidget::~PythonScriptWidget() { - appSettings->saveWindowSizeAndPos(this); + GUI::WidgetSettings::save(this); } void PythonScriptWidget::generatePythonScript(const SampleItem* sampleItem, @@ -119,8 +119,7 @@ void PythonScriptWidget::onExportToFileButton() QString fname = QFileDialog::getSaveFileName( nullptr, "Save file", defaultName, filters, &defaultFilter, - appSettings->useNativeFileDialog() ? QFileDialog::Options() - : QFileDialog::DontUseNativeDialog); + gApp->useNativeFileDialog() ? QFileDialog::Options() : QFileDialog::DontUseNativeDialog); if (fname.isEmpty()) return; diff --git a/GUI/View/Main/ActionManager.cpp b/GUI/View/Main/ActionManager.cpp index f49d31a3ab8b9094bef60589da35097d3a39d331..0e0b41c7ca0706594dddf77918e90e8c5711707f 100644 --- a/GUI/View/Main/ActionManager.cpp +++ b/GUI/View/Main/ActionManager.cpp @@ -17,7 +17,7 @@ #include "Base/Util/SysUtil.h" #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Support/Util/Path.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Layout/mainwindow_constants.h" #include "GUI/View/Main/AboutDialog.h" #include "GUI/View/Manager/ProjectManager.h" diff --git a/GUI/View/Main/MainWindow.cpp b/GUI/View/Main/MainWindow.cpp index b49e36213f606bdc292c97f427bc6ccf8b091f35..b5f2b2a2f30127afda6ec095201f3458b0392698 100644 --- a/GUI/View/Main/MainWindow.cpp +++ b/GUI/View/Main/MainWindow.cpp @@ -15,9 +15,8 @@ #include "GUI/View/Main/MainWindow.h" #include "GUI/Model/Job/JobsSet.h" #include "GUI/Model/Project/ProjectDocument.h" -#include "GUI/Support/Data/Dirs.h" #include "GUI/Support/Util/Path.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Layout/mainwindow_constants.h" #include "GUI/View/Main/ActionManager.h" #include "GUI/View/Main/CentralWidget.h" @@ -40,7 +39,7 @@ MainWindow::MainWindow() setCentralWidget(m_central_widget); initApplication(); - readSettings(); + loadSettings(); connect(m_project_manager, &ProjectManager::documentOpenedOrClosed, this, &MainWindow::onDocumentOpenedOrClosed); @@ -78,7 +77,7 @@ void MainWindow::closeEvent(QCloseEvent* event) return; } if (m_project_manager->saveOnQuit()) { - writeSettings(); + saveSettings(); event->accept(); } else { event->ignore(); @@ -105,25 +104,25 @@ void MainWindow::initApplication() setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea); } -void MainWindow::readSettings() +void MainWindow::loadSettings() { QSettings s; s.beginGroup(GUI::Style::S_MAIN_WINDOW); resize(s.value(GUI::Style::S_WINDOW_SIZE, QSize(1000, 600)).toSize()); move(s.value(GUI::Style::S_WINDOW_POSITION, QPoint(500, 300)).toPoint()); s.endGroup(); - m_project_manager->readSettings(); + m_project_manager->loadSettings(); } -void MainWindow::writeSettings() +void MainWindow::saveSettings() { QSettings s; s.beginGroup(GUI::Style::S_MAIN_WINDOW); s.setValue(GUI::Style::S_WINDOW_SIZE, size()); s.setValue(GUI::Style::S_WINDOW_POSITION, pos()); s.endGroup(); - m_project_manager->writeSettings(); - gDirs->writeSettings(); + m_project_manager->saveSettings(); + gApp->saveSettings(); s.sync(); } diff --git a/GUI/View/Main/MainWindow.h b/GUI/View/Main/MainWindow.h index 5097970b4fc1192bdd84bef629f22c34226e02df..d534e0dd4a1a3b95b930487771ad020b20d7bdf8 100644 --- a/GUI/View/Main/MainWindow.h +++ b/GUI/View/Main/MainWindow.h @@ -38,8 +38,8 @@ private: void closeEvent(QCloseEvent* event) override; void initApplication(); - void readSettings(); - void writeSettings(); + void loadSettings(); + void saveSettings(); //! Recalculate the size of the view selection buttons to show complete button text void onDocumentOpenedOrClosed(bool open); diff --git a/GUI/View/Manager/NewProjectDialog.cpp b/GUI/View/Manager/NewProjectDialog.cpp index aa6c0225f871387823af4be30f3b7147f51f04e1..0dbd8eca22f8f811cb92843e16f6173110c829d6 100644 --- a/GUI/View/Manager/NewProjectDialog.cpp +++ b/GUI/View/Manager/NewProjectDialog.cpp @@ -15,7 +15,7 @@ #include "GUI/View/Manager/NewProjectDialog.h" #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Model/Project/ProjectUtil.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include <QFileDialog> #include <QGroupBox> #include <QPushButton> @@ -109,7 +109,7 @@ void NewProjectDialog::onBrowseDirectory() { QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly; - if (!appSettings->useNativeFileDialog()) + if (!gApp->useNativeFileDialog()) options |= QFileDialog::DontUseNativeDialog; const QString dirname = diff --git a/GUI/View/Manager/ProjectManager.cpp b/GUI/View/Manager/ProjectManager.cpp index 41932cdbdc4464e2d0b990b91e3dcc25284bed87..418f92f95ff6065746fdcbbb8d13ff414f815380 100644 --- a/GUI/View/Manager/ProjectManager.cpp +++ b/GUI/View/Manager/ProjectManager.cpp @@ -18,7 +18,7 @@ #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Model/Project/ProjectUtil.h" #include "GUI/View/Info/MessageBox.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Manager/NewProjectDialog.h" #include "GUI/View/Tool/Globals.h" #include <QApplication> @@ -26,7 +26,6 @@ #include <QFileDialog> #include <QMessageBox> #include <QSettings> -#include <memory> namespace { @@ -48,7 +47,7 @@ ProjectManager::~ProjectManager() = default; //! Reads settings of ProjectManager from global settings. -void ProjectManager::readSettings() +void ProjectManager::loadSettings() { QSettings s; m_working_directory = QDir::homePath(); @@ -65,7 +64,7 @@ void ProjectManager::readSettings() //! Saves settings of ProjectManager in global settings. -void ProjectManager::writeSettings() +void ProjectManager::saveSettings() { QSettings s; s.beginGroup(S_PROJECTMANAGER); @@ -203,8 +202,8 @@ void ProjectManager::openProject(QString projectPullPath) projectPullPath = QFileDialog::getOpenFileName( GUI::Global::mainWindow, "Open project file", m_working_directory, "BornAgain project Files (*" + ext + ")", nullptr, - appSettings->useNativeFileDialog() ? QFileDialog::Options() - : QFileDialog::DontUseNativeDialog); + gApp->useNativeFileDialog() ? QFileDialog::Options() + : QFileDialog::DontUseNativeDialog); if (projectPullPath.isEmpty()) return; } diff --git a/GUI/View/Manager/ProjectManager.h b/GUI/View/Manager/ProjectManager.h index e362f402c47dceb9b1b3d94f052ee5b0add61744..becffeb113d2f8377256bf55978391cd9202e7a1 100644 --- a/GUI/View/Manager/ProjectManager.h +++ b/GUI/View/Manager/ProjectManager.h @@ -17,6 +17,7 @@ #include <QObject> #include <QStringList> +#include <memory> class AutosaveController; @@ -28,8 +29,8 @@ public: ProjectManager(QObject* parent); ~ProjectManager() override; - void readSettings(); - void writeSettings(); + void loadSettings(); + void saveSettings(); bool saveOnQuit(); diff --git a/GUI/View/Manager/PyImportAssistant.cpp b/GUI/View/Manager/PyImportAssistant.cpp index 54ab7632b4dac9084c5fec856735d6a706c05783..2143a44edd0c7b6a39b10aba703209363058ab0e 100644 --- a/GUI/View/Manager/PyImportAssistant.cpp +++ b/GUI/View/Manager/PyImportAssistant.cpp @@ -21,13 +21,12 @@ #include "GUI/Model/FromCore/ItemizeSample.h" #include "GUI/Model/FromCore/ItemizeSimulation.h" #include "GUI/Model/Project/ProjectUtil.h" -#include "GUI/Support/Data/Dirs.h" #include "GUI/Support/Util/Path.h" #include "GUI/Support/Util/String.h" #include "GUI/View/Info/ComboSelectorDialog.h" #include "GUI/View/Info/DetailedMessageBox.h" #include "GUI/View/Info/MessageBox.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Tool/Globals.h" #include "PyCore/Embed/PyInterpreter.h" // listOfFunctions #include "PyCore/Sample/ImportMultiLayer.h" // createMultiLayerFromPython @@ -70,10 +69,9 @@ QString getCandidate(const QStringList& funcNames) QString fnameToOpen() { QString result = QFileDialog::getOpenFileName( - GUI::Global::mainWindow, "Open python script", gDirs->script_import_dir, + GUI::Global::mainWindow, "Open python script", gApp->script_import_dir, "Python scripts (*.py)", nullptr, - appSettings->useNativeFileDialog() ? QFileDialog::Options() - : QFileDialog::DontUseNativeDialog); + gApp->useNativeFileDialog() ? QFileDialog::Options() : QFileDialog::DontUseNativeDialog); return result; } diff --git a/GUI/View/Material/MaterialEditorDialog.cpp b/GUI/View/Material/MaterialEditorDialog.cpp index 6a67fcaa214026381b1b6bc4c278512eeac42e1d..621a26f5bb896dec9169014d215bde52d2beda37 100644 --- a/GUI/View/Material/MaterialEditorDialog.cpp +++ b/GUI/View/Material/MaterialEditorDialog.cpp @@ -18,11 +18,11 @@ #include "GUI/Model/Sample/ItemWithMaterial.h" #include "GUI/Model/Sample/SampleItem.h" #include "GUI/Support/Style/Style.h" -#include "GUI/View/Layout/ApplicationSettings.h" #include "GUI/View/Material/MaterialsQModel.h" #include "GUI/View/Numeric/DoubleSpinBox.h" #include "GUI/View/Setup/FrameActions.h" #include "GUI/View/Widget/StyledToolbar.h" +#include "GUI/View/Widget/WidgetSettings.h" #include <QAction> #include <QColorDialog> #include <QDialog> @@ -235,7 +235,7 @@ MaterialEditorDialog::MaterialEditorDialog(SampleItem* sample, const QString& id layout->insertWidget(0, toolbar); GUI::Style::setResizable(this); - appSettings->loadWindowSizeAndPos(this); + GUI::WidgetSettings::load(this); connect(m_tree_view->selectionModel(), &QItemSelectionModel::currentChanged, this, &MaterialEditorDialog::onChangeCurrent); @@ -260,7 +260,7 @@ MaterialEditorDialog::MaterialEditorDialog(SampleItem* sample, const QString& id MaterialEditorDialog::~MaterialEditorDialog() { - appSettings->saveWindowSizeAndPos(this); + GUI::WidgetSettings::save(this); } void MaterialEditorDialog::addRefractiveMaterial() diff --git a/GUI/View/Realspace/RealspaceWidget.cpp b/GUI/View/Realspace/RealspaceWidget.cpp index 9dc711e71a70aa8d025967b23df53423fb1974ca..5461c6a6f5eff4c03a06a58f8e55116d5b9b3ce2 100644 --- a/GUI/View/Realspace/RealspaceWidget.cpp +++ b/GUI/View/Realspace/RealspaceWidget.cpp @@ -16,9 +16,8 @@ #include "Base/Util/Assert.h" #include "GUI/Model/Material/MaterialItem.h" #include "GUI/Model/Sample/SampleItem.h" -#include "GUI/Support/Data/Dirs.h" #include "GUI/View/Info/CautionSign.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Realspace/RealspaceBuilder.h" #include "GUI/View/Widget/FileDialog.h" #include "Img3D/Model/Model.h" @@ -79,7 +78,7 @@ void RealspaceWidget::showEvent(QShowEvent*) void RealspaceWidget::savePicture() { static const QString defaultExtension = ".png"; - QString fname = GUI::FileDialog::w1_1f("Save 3D real space view", gDirs->artifact_export_dir, + QString fname = GUI::FileDialog::w1_1f("Save 3D real space view", gApp->artifact_export_dir, "*" + defaultExtension); if (fname.isEmpty()) return; diff --git a/GUI/View/Sample/SampleForm.cpp b/GUI/View/Sample/SampleForm.cpp index 6dfe6e3de770e8fee681cfad9a06a995ed927992..dc8b853517cb0e9f010e86be111c12b75044f1e2 100644 --- a/GUI/View/Sample/SampleForm.cpp +++ b/GUI/View/Sample/SampleForm.cpp @@ -16,7 +16,7 @@ #include "Base/Util/Vec.h" #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Model/Sample/SamplesSet.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Layout/LayoutUtil.h" #include "GUI/View/Sample/CompoundForm.h" #include "GUI/View/Sample/CoreAndShellForm.h" diff --git a/GUI/View/Views/InstrumentView.cpp b/GUI/View/Views/InstrumentView.cpp index 2979c881e92674871e2bccab3c681e5b1ea586c3..903337a8efe4d4e61591301d2168b90f43934114 100644 --- a/GUI/View/Views/InstrumentView.cpp +++ b/GUI/View/Views/InstrumentView.cpp @@ -21,7 +21,7 @@ #include "GUI/View/Instrument/OffspecInstrumentEditor.h" #include "GUI/View/Instrument/Scatter2DInstrumentEditor.h" #include "GUI/View/Instrument/SpecularInstrumentEditor.h" -#include "GUI/View/Layout/ApplicationSettings.h" +#include "GUI/View/Layout/AppConfig.h" #include "GUI/View/Loader/ComponentRW.h" #include "GUI/View/Modelview/SetView.h" #include "GUI/View/Setup/FrameActions.h" diff --git a/GUI/View/Widget/WidgetSettings.cpp b/GUI/View/Widget/WidgetSettings.cpp new file mode 100644 index 0000000000000000000000000000000000000000..915cd401b44f70d395f8507f12b00b59190751b4 --- /dev/null +++ b/GUI/View/Widget/WidgetSettings.cpp @@ -0,0 +1,44 @@ +// ************************************************************************************************ +// +// BornAgain: simulate and fit reflection and scattering +// +//! @file GUI/View/Widget/WidgetSettings.cpp +//! @brief Implements namespace WidgetSettings +//! +//! @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/View/Widget/WidgetSettings.h" +#include "Base/Util/Assert.h" +#include <QSettings> + +namespace { + +const QString S_SIZE = "Size"; +const QString S_POS = "Pos"; + +} // namespace + +void GUI::WidgetSettings::save(const QWidget* w) +{ + ASSERT(!w->objectName().isEmpty()); + QSettings settings; + settings.setValue(S_SIZE + "/" + w->objectName(), w->size()); + settings.setValue(S_POS + "/" + w->objectName(), w->pos()); +} + +void GUI::WidgetSettings::load(QWidget* w) +{ + ASSERT(!w->objectName().isEmpty()); + + QSettings settings; + const QSize size = settings.value(S_SIZE + "/" + w->objectName(), QSize()).toSize(); + if (size.isValid()) + w->resize(size); + if (settings.contains(S_POS + "/" + w->objectName())) + w->move(settings.value(S_POS + "/" + w->objectName()).toPoint()); +} diff --git a/GUI/View/Widget/WidgetSettings.h b/GUI/View/Widget/WidgetSettings.h new file mode 100644 index 0000000000000000000000000000000000000000..274885ec0174e16a62a7336f0bdfa52ec5b9415e --- /dev/null +++ b/GUI/View/Widget/WidgetSettings.h @@ -0,0 +1,27 @@ +// ************************************************************************************************ +// +// BornAgain: simulate and fit reflection and scattering +// +//! @file GUI/View/Widget/WidgetSettings.h +//! @brief Defines namespace WidgetSettings +//! +//! @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_VIEW_WIDGET_WIDGETSETTINGS_H +#define BORNAGAIN_GUI_VIEW_WIDGET_WIDGETSETTINGS_H + +#include <QWidget> + +namespace GUI::WidgetSettings { + +void save(const QWidget* w); +void load(QWidget* w); + +} // namespace GUI::WidgetSettings + +#endif // BORNAGAIN_GUI_VIEW_WIDGET_WIDGETSETTINGS_H