diff --git a/openhantek/src/dockwindows.cpp b/openhantek/src/dockwindows.cpp index ee64356..e99838a 100644 --- a/openhantek/src/dockwindows.cpp +++ b/openhantek/src/dockwindows.cpp @@ -35,6 +35,19 @@ #include "settings.h" #include "sispinbox.h" +namespace { + +void SetupDockWidget(QDockWidget *dockWindow, QWidget *dockWidget, QLayout *layout) { + dockWindow->setObjectName(dockWindow->windowTitle()); + dockWindow->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + dockWidget->setLayout(layout); + dockWidget->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed, + QSizePolicy::DefaultType)); + dockWindow->setWidget(dockWidget); +} + +} + //////////////////////////////////////////////////////////////////////////////// // class HorizontalDock /// \brief Initializes the horizontal axis docking window. @@ -90,11 +103,8 @@ HorizontalDock::HorizontalDock(DsoSettings *settings, QWidget *parent, this->dockLayout->addWidget(this->formatLabel, 4, 0); this->dockLayout->addWidget(this->formatComboBox, 4, 1); - this->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - this->dockWidget = new QWidget(); - this->dockWidget->setLayout(this->dockLayout); - this->setWidget(this->dockWidget); + SetupDockWidget(this, dockWidget, dockLayout); // Connect signals and slots connect(this->samplerateSiSpinBox, SIGNAL(valueChanged(double)), this, @@ -337,11 +347,8 @@ TriggerDock::TriggerDock(DsoSettings *settings, this->dockLayout->addWidget(this->slopeLabel, 2, 0); this->dockLayout->addWidget(this->slopeComboBox, 2, 1); - this->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - this->dockWidget = new QWidget(); - this->dockWidget->setLayout(this->dockLayout); - this->setWidget(this->dockWidget); + SetupDockWidget(this, dockWidget, dockLayout); // Connect signals and slots connect(this->modeComboBox, SIGNAL(currentIndexChanged(int)), this, @@ -479,11 +486,8 @@ SpectrumDock::SpectrumDock(DsoSettings *settings, QWidget *parent, this->dockLayout->addWidget(this->magnitudeComboBox[channel], channel, 1); } - this->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - this->dockWidget = new QWidget(); - this->dockWidget->setLayout(this->dockLayout); - this->setWidget(this->dockWidget); + SetupDockWidget(this, dockWidget, dockLayout); // Connect signals and slots for (int channel = 0; channel < this->settings->scope.voltage.count(); @@ -630,11 +634,8 @@ VoltageDock::VoltageDock(DsoSettings *settings, QWidget *parent, 1); } - this->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - this->dockWidget = new QWidget(); - this->dockWidget->setLayout(this->dockLayout); - this->setWidget(this->dockWidget); + SetupDockWidget(this, dockWidget, dockLayout); // Connect signals and slots for (int channel = 0; channel < this->settings->scope.voltage.count(); diff --git a/openhantek/src/openhantek.cpp b/openhantek/src/openhantek.cpp index d3ef896..73a1b49 100644 --- a/openhantek/src/openhantek.cpp +++ b/openhantek/src/openhantek.cpp @@ -88,10 +88,6 @@ OpenHantekMainWindow::OpenHantekMainWindow(QWidget *parent, // Apply the settings after the gui is initialized this->applySettings(); - // Update stored window size and position - this->settings->options.window.position = this->pos(); - this->settings->options.window.size = this->size(); - // Connect all signals this->connectSignals(); @@ -233,10 +229,22 @@ void OpenHantekMainWindow::createMenus() { this->helpMenu->addAction(this->aboutQtAction); } +namespace { + +QToolBar* CreateToolBar(const QString& title) { + QToolBar* newObj = new QToolBar(title); + newObj->setObjectName(title); + newObj->setAllowedAreas(Qt::TopToolBarArea | Qt::LeftToolBarArea); + return newObj; +} + +} + /// \brief Create the toolbars and their buttons. void OpenHantekMainWindow::createToolBars() { - this->fileToolBar = new QToolBar(tr("File")); - this->fileToolBar->setAllowedAreas(Qt::TopToolBarArea); + + // File + this->fileToolBar = CreateToolBar(tr("File")); this->fileToolBar->addAction(this->openAction); this->fileToolBar->addAction(this->saveAction); this->fileToolBar->addAction(this->saveAsAction); @@ -244,10 +252,12 @@ void OpenHantekMainWindow::createToolBars() { this->fileToolBar->addAction(this->printAction); this->fileToolBar->addAction(this->exportAsAction); - this->oscilloscopeToolBar = new QToolBar(tr("Oscilloscope")); + // Oscilloscope + this->oscilloscopeToolBar = CreateToolBar(tr("Oscilloscope")); this->oscilloscopeToolBar->addAction(this->startStopAction); - this->viewToolBar = new QToolBar(tr("View")); + // View + this->viewToolBar = CreateToolBar(tr("View")); this->viewToolBar->addAction(this->digitalPhosphorAction); this->viewToolBar->addAction(this->zoomAction); } @@ -427,22 +437,6 @@ int OpenHantekMainWindow::writeSettings(const QString &fileName) { return this->settings->save(fileName); } -/// \brief Called everytime the window is moved. -/// \param event The move event, it isn't used here though. -void OpenHantekMainWindow::moveEvent(QMoveEvent *event) { - Q_UNUSED(event); - - this->settings->options.window.position = this->pos(); -} - -/// \brief Called everytime the window is resized. -/// \param event The resize event, it isn't used here though. -void OpenHantekMainWindow::resizeEvent(QResizeEvent *event) { - Q_UNUSED(event); - - this->settings->options.window.size = this->size(); -} - /// \brief Open a configuration file. /// \return 0 on success, 1 on user abort, negative on error. int OpenHantekMainWindow::open() { @@ -546,143 +540,24 @@ void OpenHantekMainWindow::about() { /// \brief The settings have changed. void OpenHantekMainWindow::applySettings() { - // Main window - if (!this->settings->options.window.position.isNull()) - this->move(this->settings->options.window.position); - if (!this->settings->options.window.size.isNull()) - this->resize(this->settings->options.window.size); - - // Docking windows - QList docks; - docks.append(this->horizontalDock); - docks.append(this->triggerDock); - docks.append(this->voltageDock); - docks.append(this->spectrumDock); - - QList dockSettings; - dockSettings.append(&(this->settings->options.window.dock.horizontal)); - dockSettings.append(&(this->settings->options.window.dock.trigger)); - dockSettings.append(&(this->settings->options.window.dock.voltage)); - dockSettings.append(&(this->settings->options.window.dock.spectrum)); - - QList dockedWindows[2]; // Docks docked on the sides of the main window - - for (int dockId = 0; dockId < docks.size(); ++dockId) { - docks[dockId]->setVisible(dockSettings[dockId]->visible); - docks[dockId]->setFloating(dockSettings[dockId]->floating); - if (!dockSettings[dockId]->position.isNull()) { - if (dockSettings[dockId]->floating) { - this->addDockWidget(Qt::RightDockWidgetArea, docks[dockId]); - docks[dockId]->move(dockSettings[dockId]->position); - } else { - // Check in which order the docking windows where placed - int side = (dockSettings[dockId]->position.x() < - this->settings->options.window.size.width() / 2) - ? 0 - : 1; - int index = 0; - while (index < dockedWindows[side].size() && - dockSettings[dockedWindows[side][index]]->position.y() <= - dockSettings[dockId]->position.y()) - ++index; - dockedWindows[side].insert(index, dockId); - } - } else { - this->addDockWidget(Qt::RightDockWidgetArea, docks[dockId]); - } - } + addDockWidget(Qt::RightDockWidgetArea, horizontalDock); + addDockWidget(Qt::RightDockWidgetArea, triggerDock); + addDockWidget(Qt::RightDockWidgetArea, voltageDock); + addDockWidget(Qt::RightDockWidgetArea, spectrumDock); - // Put the docked docking windows into the main window - for (int position = 0; position < dockedWindows[0].size(); ++position) - this->addDockWidget(Qt::LeftDockWidgetArea, - docks[dockedWindows[0][position]]); - for (int position = 0; position < dockedWindows[1].size(); ++position) - this->addDockWidget(Qt::RightDockWidgetArea, - docks[dockedWindows[1][position]]); - - // Toolbars - QList toolbars; - toolbars.append(this->fileToolBar); - toolbars.append(this->oscilloscopeToolBar); - toolbars.append(this->viewToolBar); - - QList toolbarSettings; - toolbarSettings.append(&(this->settings->options.window.toolbar.file)); - toolbarSettings.append( - &(this->settings->options.window.toolbar.oscilloscope)); - toolbarSettings.append(&(this->settings->options.window.toolbar.view)); - - QList dockedToolbars; // Docks docked on the sides of the main window - - for (int toolbarId = 0; toolbarId < toolbars.size(); ++toolbarId) { - toolbars[toolbarId]->setVisible(toolbarSettings[toolbarId]->visible); - toolbars[toolbarId]->setWindowFlags(Qt::Tool); - if (!toolbarSettings[toolbarId]->position.isNull() && - !toolbarSettings[toolbarId]->floating) { - /*if(toolbarSettings[toolbarId]->floating) { - toolbars[toolbarId]->move(toolbarSettings[toolbarId]->position); - } - else*/ { - // Check in which order the toolbars where placed - int index = 0; - while (index < dockedToolbars.size() && - toolbarSettings[dockedToolbars[index]]->position.x() <= - toolbarSettings[toolbarId]->position.x()) - ++index; - dockedToolbars.insert(index, toolbarId); - } - } else { - this->addToolBar(toolbars[toolbarId]); - } - } + addToolBar(fileToolBar); + addToolBar(oscilloscopeToolBar); + addToolBar(viewToolBar); - // Put the docked toolbars into the main window - for (int position = 0; position < dockedToolbars.size(); ++position) - this->addToolBar(toolbars[dockedToolbars[position]]); + restoreGeometry(settings->mainWindowGeometry); + restoreState(settings->mainWindowState); } /// \brief Update the window layout in the settings. void OpenHantekMainWindow::updateSettings() { // Main window - this->settings->options.window.position = this->pos(); - this->settings->options.window.size = this->size(); - - // Docking windows - QList docks; - docks.append(this->horizontalDock); - docks.append(this->spectrumDock); - docks.append(this->triggerDock); - docks.append(this->voltageDock); - - QList dockSettings; - dockSettings.append(&(this->settings->options.window.dock.horizontal)); - dockSettings.append(&(this->settings->options.window.dock.spectrum)); - dockSettings.append(&(this->settings->options.window.dock.trigger)); - dockSettings.append(&(this->settings->options.window.dock.voltage)); - - for (int dockId = 0; dockId < docks.size(); ++dockId) { - dockSettings[dockId]->floating = docks[dockId]->isFloating(); - dockSettings[dockId]->position = docks[dockId]->pos(); - dockSettings[dockId]->visible = docks[dockId]->isVisible(); - } - - // Toolbars - QList toolbars; - toolbars.append(this->fileToolBar); - toolbars.append(this->oscilloscopeToolBar); - toolbars.append(this->viewToolBar); - - QList toolbarSettings; - toolbarSettings.append(&(this->settings->options.window.toolbar.file)); - toolbarSettings.append( - &(this->settings->options.window.toolbar.oscilloscope)); - toolbarSettings.append(&(this->settings->options.window.toolbar.view)); - - for (int toolbarId = 0; toolbarId < toolbars.size(); ++toolbarId) { - toolbarSettings[toolbarId]->floating = toolbars[toolbarId]->isFloating(); - toolbarSettings[toolbarId]->position = toolbars[toolbarId]->pos(); - toolbarSettings[toolbarId]->visible = toolbars[toolbarId]->isVisible(); - } + settings->mainWindowGeometry = saveGeometry(); + settings->mainWindowState = saveState(); } /// \brief The oscilloscope changed the record time. diff --git a/openhantek/src/openhantek.h b/openhantek/src/openhantek.h index b341eb2..9d640c5 100644 --- a/openhantek/src/openhantek.h +++ b/openhantek/src/openhantek.h @@ -70,10 +70,6 @@ private: int readSettings(const QString &fileName = QString()); int writeSettings(const QString &fileName = QString()); - // Window translation events - void moveEvent(QMoveEvent *event); - void resizeEvent(QResizeEvent *event); - // Actions QAction *newAction, *openAction, *saveAction, *saveAsAction; QAction *printAction, *exportAsAction; diff --git a/openhantek/src/settings.cpp b/openhantek/src/settings.cpp index 272bdb4..946271b 100644 --- a/openhantek/src/settings.cpp +++ b/openhantek/src/settings.cpp @@ -36,24 +36,6 @@ DsoSettings::DsoSettings(QWidget *parent) : QObject(parent) { // Options this->options.alwaysSave = true; this->options.imageSize = QSize(640, 480); - // Main window - this->options.window.position = QPoint(); - this->options.window.size = QSize(800, 600); - // Docking windows and toolbars - QList panels; - panels.append(&(this->options.window.dock.horizontal)); - panels.append(&(this->options.window.dock.spectrum)); - panels.append(&(this->options.window.dock.trigger)); - panels.append(&(this->options.window.dock.voltage)); - panels.append(&(this->options.window.toolbar.file)); - panels.append(&(this->options.window.toolbar.oscilloscope)); - panels.append(&(this->options.window.toolbar.view)); - for (int panelId = 0; panelId < panels.size(); ++panelId) { - panels[panelId]->floating = false; - panels[panelId]->position = QPoint(); - panels[panelId]->visible = true; - } - // Oscilloscope settings // Horizontal axis this->scope.horizontal.format = Dso::GRAPHFORMAT_TY; @@ -213,68 +195,17 @@ int DsoSettings::load(const QString &fileName) { if (settingsLoader->status() != QSettings::NoError) return -settingsLoader->status(); - // Main window layout and other general options - settingsLoader->beginGroup("options"); - settingsLoader->beginGroup("window"); - // Docking windows and toolbars - settingsLoader->beginGroup("docks"); - QList docks; - docks.append(&(this->options.window.dock.horizontal)); - docks.append(&(this->options.window.dock.spectrum)); - docks.append(&(this->options.window.dock.trigger)); - docks.append(&(this->options.window.dock.voltage)); - QStringList dockNames; - dockNames << "horizontal" - << "spectrum" - << "trigger" - << "voltage"; - for (int dockId = 0; dockId < docks.size(); ++dockId) { - settingsLoader->beginGroup(dockNames[dockId]); - if (settingsLoader->contains("floating")) - docks[dockId]->floating = settingsLoader->value("floating").toBool(); - if (settingsLoader->contains("position")) - docks[dockId]->position = settingsLoader->value("position").toPoint(); - if (settingsLoader->contains("visible")) - docks[dockId]->visible = settingsLoader->value("visible").toBool(); - settingsLoader->endGroup(); - } - settingsLoader->endGroup(); - settingsLoader->beginGroup("toolbars"); - QList toolbars; - toolbars.append(&(this->options.window.toolbar.file)); - toolbars.append(&(this->options.window.toolbar.oscilloscope)); - toolbars.append(&(this->options.window.toolbar.view)); - QStringList toolbarNames; - toolbarNames << "file" - << "oscilloscope" - << "view"; - for (int toolbarId = 0; toolbarId < toolbars.size(); ++toolbarId) { - settingsLoader->beginGroup(toolbarNames[toolbarId]); - if (settingsLoader->contains("floating")) - toolbars[toolbarId]->floating = - settingsLoader->value("floating").toBool(); - if (settingsLoader->contains("position")) - toolbars[toolbarId]->position = - settingsLoader->value("position").toPoint(); - if (settingsLoader->contains("visible")) - toolbars[toolbarId]->visible = settingsLoader->value("visible").toBool(); - settingsLoader->endGroup(); - } - settingsLoader->endGroup(); - // Main window - if (settingsLoader->contains("pos")) - this->options.window.position = settingsLoader->value("pos").toPoint(); - if (settingsLoader->contains("size")) - this->options.window.size = settingsLoader->value("size").toSize(); - settingsLoader->endGroup(); // General options + settingsLoader->beginGroup("options"); if (settingsLoader->contains("alwaysSave")) this->options.alwaysSave = settingsLoader->value("alwaysSave").toBool(); if (settingsLoader->contains("imageSize")) this->options.imageSize = settingsLoader->value("imageSize").toSize(); + // If the window/* keys were found in this group, remove them from settings + settingsLoader->remove("window"); settingsLoader->endGroup(); - // Oszilloskope settings + // Oscilloscope settings settingsLoader->beginGroup("scope"); // Horizontal axis settingsLoader->beginGroup("horizontal"); @@ -419,6 +350,11 @@ int DsoSettings::load(const QString &fileName) { (Dso::InterpolationMode)settingsLoader->value("zoom").toBool(); settingsLoader->endGroup(); + settingsLoader->beginGroup("window"); + mainWindowGeometry = settingsLoader->value("geometry").toByteArray(); + mainWindowState = settingsLoader->value("state").toByteArray(); + settingsLoader->endGroup(); + delete settingsLoader; return 0; @@ -441,48 +377,6 @@ int DsoSettings::save(const QString &fileName) { if (complete) { // Main window layout and other general options settingsSaver->beginGroup("options"); - settingsSaver->beginGroup("window"); - // Docking windows and toolbars - settingsSaver->beginGroup("docks"); - QList docks; - docks.append(&(this->options.window.dock.horizontal)); - docks.append(&(this->options.window.dock.spectrum)); - docks.append(&(this->options.window.dock.trigger)); - docks.append(&(this->options.window.dock.voltage)); - QStringList dockNames; - dockNames << "horizontal" - << "spectrum" - << "trigger" - << "voltage"; - for (int dockId = 0; dockId < docks.size(); ++dockId) { - settingsSaver->beginGroup(dockNames[dockId]); - settingsSaver->setValue("floating", docks[dockId]->floating); - settingsSaver->setValue("position", docks[dockId]->position); - settingsSaver->setValue("visible", docks[dockId]->visible); - settingsSaver->endGroup(); - } - settingsSaver->endGroup(); - settingsSaver->beginGroup("toolbars"); - QList toolbars; - toolbars.append(&(this->options.window.toolbar.file)); - toolbars.append(&(this->options.window.toolbar.oscilloscope)); - toolbars.append(&(this->options.window.toolbar.view)); - QStringList toolbarNames; - toolbarNames << "file" - << "oscilloscope" - << "view"; - for (int toolbarId = 0; toolbarId < toolbars.size(); ++toolbarId) { - settingsSaver->beginGroup(toolbarNames[toolbarId]); - settingsSaver->setValue("floating", toolbars[toolbarId]->floating); - settingsSaver->setValue("position", toolbars[toolbarId]->position); - settingsSaver->setValue("visible", toolbars[toolbarId]->visible); - settingsSaver->endGroup(); - } - settingsSaver->endGroup(); - // Main window - settingsSaver->setValue("pos", this->options.window.position); - settingsSaver->setValue("size", this->options.window.size); - settingsSaver->endGroup(); settingsSaver->setValue("alwaysSave", this->options.alwaysSave); settingsSaver->setValue("imageSize", this->options.imageSize); settingsSaver->endGroup(); @@ -576,6 +470,11 @@ int DsoSettings::save(const QString &fileName) { settingsSaver->setValue("zoom", this->view.zoom); settingsSaver->endGroup(); + settingsSaver->beginGroup("window"); + settingsSaver->setValue("geometry", mainWindowGeometry); + settingsSaver->setValue("state", mainWindowState); + settingsSaver->endGroup(); + delete settingsSaver; return 0; diff --git a/openhantek/src/settings.h b/openhantek/src/settings.h index 57dacf2..78089f8 100644 --- a/openhantek/src/settings.h +++ b/openhantek/src/settings.h @@ -35,50 +35,11 @@ #include "dso.h" //////////////////////////////////////////////////////////////////////////////// -/// \struct DsoSettingsOptionsWindowPanel settings.h -/// \brief Holds the position and state of a docking window or toolbar. -struct DsoSettingsOptionsWindowPanel { - bool floating; ///< true, if the panel is floating - QPoint position; ///< Position of the panel - bool visible; ///< true, if the panel is shown -}; - -//////////////////////////////////////////////////////////////////////////////// -/// \struct DsoSettingsOptionsWindowDock settings.h -/// \brief Holds the layout of the docking windows. -struct DsoSettingsOptionsWindowDock { - DsoSettingsOptionsWindowPanel horizontal; ///< "Horizontal" docking window - DsoSettingsOptionsWindowPanel spectrum; ///< "Spectrum" docking window - DsoSettingsOptionsWindowPanel trigger; ///< "Trigger" docking window - DsoSettingsOptionsWindowPanel voltage; ///< "Voltage" docking window -}; - -//////////////////////////////////////////////////////////////////////////////// -/// \struct DsoSettingsOptionsWindowToolbar settings.h -/// \brief Holds the layout of the toolbars. -struct DsoSettingsOptionsWindowToolbar { - DsoSettingsOptionsWindowPanel file; ///< "File" toolbar - DsoSettingsOptionsWindowPanel oscilloscope; ///< "Oscilloscope" toolbar - DsoSettingsOptionsWindowPanel view; ///< The "View" toolbar -}; - -//////////////////////////////////////////////////////////////////////////////// -/// \struct DsoSettingsOptionsWindow settings.h -/// \brief Holds the layout of the main window. -struct DsoSettingsOptionsWindow { - QPoint position; ///< Position of the main window - QSize size; ///< Size of the main window - DsoSettingsOptionsWindowDock dock; ///< Docking windows - DsoSettingsOptionsWindowToolbar toolbar; ///< Toolbars -}; - -//////////////////////////////////////////////////////////////////////////////// /// \struct DsoSettingsOptions settings.h /// \brief Holds the general options of the program. struct DsoSettingsOptions { bool alwaysSave; ///< Always save the settings on exit QSize imageSize; ///< Size of exported images in pixels - DsoSettingsOptionsWindow window; ///< Window layout }; //////////////////////////////////////////////////////////////////////////////// @@ -195,6 +156,9 @@ public: DsoSettingsScope scope; ///< All oscilloscope related settings DsoSettingsView view; ///< All view related settings + QByteArray mainWindowGeometry; ///< Geometry of the main window + QByteArray mainWindowState; ///< State of docking windows and toolbars + public slots: // Saving to and loading from configuration files int load(const QString &fileName = QString());