From 35299cfeb4efc9277795f8330244a05253a59d0c Mon Sep 17 00:00:00 2001 From: oliverhaag Date: Sat, 22 Jan 2011 00:08:38 +0000 Subject: [PATCH] Saving positions of docking windows and toolbars now and made it possible to set their visibility via the View menu --- openhantek/src/openhantek.cpp | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------- openhantek/src/openhantek.h | 6 ++++-- openhantek/src/settings.cpp | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- openhantek/src/settings.h | 43 ++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 280 insertions(+), 29 deletions(-) diff --git a/openhantek/src/openhantek.cpp b/openhantek/src/openhantek.cpp index fd5fbf9..77595ce 100644 --- a/openhantek/src/openhantek.cpp +++ b/openhantek/src/openhantek.cpp @@ -3,7 +3,7 @@ // OpenHantek // openhantek.cpp // -// Copyright (C) 2010 Oliver Haag +// Copyright (C) 2010, 2011 Oliver Haag // oliver.haag@gmail.com // // This program is free software: you can redistribute it and/or modify it @@ -68,7 +68,6 @@ OpenHantekMainWindow::OpenHantekMainWindow(QWidget *parent, Qt::WindowFlags flag this->settings = new DsoSettings(); this->settings->setChannelCount(this->dsoControl->getChannelCount()); this->readSettings(); - this->applySettings(); // Create dock windows before the dso widget, they fix messed up settings this->createDockWindows(); @@ -82,10 +81,17 @@ OpenHantekMainWindow::OpenHantekMainWindow(QWidget *parent, Qt::WindowFlags flag // Subroutines for window elements this->createActions(); - this->createMenus(); this->createToolBars(); + this->createMenus(); this->createStatusBar(); + // 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 general signals connect(this, SIGNAL(settingsChanged()), this, SLOT(applySettings())); //connect(this->dsoWidget, SIGNAL(stopped()), this, SLOT(stopped())); @@ -254,6 +260,16 @@ void OpenHantekMainWindow::createMenus() { this->viewMenu = this->menuBar()->addMenu(tr("&View")); this->viewMenu->addAction(this->digitalPhosphorAction); this->viewMenu->addAction(this->zoomAction); + this->viewMenu->addSeparator(); + this->dockMenu = this->viewMenu->addMenu(tr("&Docking windows")); + this->dockMenu->addAction(this->horizontalDock->toggleViewAction()); + this->dockMenu->addAction(this->spectrumDock->toggleViewAction()); + this->dockMenu->addAction(this->triggerDock->toggleViewAction()); + this->dockMenu->addAction(this->voltageDock->toggleViewAction()); + this->toolbarMenu = this->viewMenu->addMenu(tr("&Toolbars")); + this->toolbarMenu->addAction(this->fileToolBar->toggleViewAction()); + this->toolbarMenu->addAction(this->oscilloscopeToolBar->toggleViewAction()); + this->toolbarMenu->addAction(this->viewToolBar->toggleViewAction()); this->oscilloscopeMenu = this->menuBar()->addMenu(tr("&Oscilloscope")); this->oscilloscopeMenu->addAction(this->configAction); @@ -318,13 +334,6 @@ void OpenHantekMainWindow::createDockWindows() this->triggerDock = new TriggerDock(this->settings, this->dsoControl->getSpecialTriggerSources()); this->spectrumDock = new SpectrumDock(this->settings); this->voltageDock = new VoltageDock(this->settings); - - this->addDockWidget(Qt::RightDockWidgetArea, this->horizontalDock); - this->addDockWidget(Qt::RightDockWidgetArea, this->triggerDock); - this->addDockWidget(Qt::RightDockWidgetArea, this->voltageDock); - this->addDockWidget(Qt::RightDockWidgetArea, this->spectrumDock); - - //viewMenu->addAction(this->horizontalDock->toggleViewAction()); } /// \brief Read the settings from an ini file. @@ -343,6 +352,8 @@ int OpenHantekMainWindow::readSettings(const QString &fileName) { /// \param fileName Optional filename to read the settings from an ini file. /// \return 0 on success, negative on error. int OpenHantekMainWindow::writeSettings(const QString &fileName) { + this->updateSettings(); + return this->settings->save(fileName); } @@ -351,7 +362,7 @@ int OpenHantekMainWindow::writeSettings(const QString &fileName) { void OpenHantekMainWindow::moveEvent(QMoveEvent *event) { Q_UNUSED(event); - this->settings->options.windowPosition = this->pos(); + this->settings->options.window.position = this->pos(); } /// \brief Called everytime the window is resized. @@ -359,7 +370,7 @@ void OpenHantekMainWindow::moveEvent(QMoveEvent *event) { void OpenHantekMainWindow::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); - this->settings->options.windowSize = this->size(); + this->settings->options.window.size = this->size(); } /// \brief Open a configuration file. @@ -419,6 +430,8 @@ void OpenHantekMainWindow::stopped() { /// \brief Configure the oscilloscope. void OpenHantekMainWindow::config() { + this->updateSettings(); + DsoConfigDialog configDialog(this->settings, this); if(configDialog.exec() == QDialog::Accepted) this->settingsChanged(); @@ -448,14 +461,121 @@ void OpenHantekMainWindow::zoom(bool enabled) { void OpenHantekMainWindow::about() { QMessageBox::about(this, tr("About OpenHantek %1").arg(VERSION), tr( "

This is a open source software for Hantek USB oscilloscopes.

" - "

Copyright © 2010 Oliver Haag <oliver.haag@gmail.com>

" + "

Copyright © 2010, 2011 Oliver Haag <oliver.haag@gmail.com>

" )); } /// \brief The settings have changed. void OpenHantekMainWindow::applySettings() { - this->move(this->settings->options.windowPosition); - this->resize(this->settings->options.windowSize); + // 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->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)); + + QList docked[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) { + docks[dockId]->move(dockSettings[dockId]->position); + } + else { + // Check in which order the docking windows where placed + int side = (dockSettings[dockId]->position.x() == 0) ? 0 : 1; + int index = 0; + while(index < docked[side].size() && dockSettings[docked[side][index]]->position.y() < dockSettings[dockId]->position.y()) + index++; + docked[side].insert(index, dockId); + //docks[dockId]->setVisible(false); + } + } + else { + this->addDockWidget(Qt::RightDockWidgetArea, docks[dockId]); + } + } + + // Put the docked docking windows into the main window + for(int position = 0; position < docked[0].size(); position++) + this->addDockWidget(Qt::LeftDockWidgetArea, docks[docked[0][position]]); + for(int position = 0; position < docked[1].size(); position++) + this->addDockWidget(Qt::RightDockWidgetArea, docks[docked[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)); + + for(int toolbarId = 0; toolbarId < toolbars.size(); toolbarId++) { + toolbars[toolbarId]->setVisible(toolbarSettings[toolbarId]->visible); + //toolbars[toolbarId]->setFloating(toolbarSettings[toolbarId]->floating); // setFloating missing, a bug in Qt? + if(!toolbarSettings[toolbarId]->position.isNull()) + toolbars[toolbarId]->move(toolbarSettings[toolbarId]->position); + } +} + +/// \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(); + } } /// \brief Apply new buffer size to settings. diff --git a/openhantek/src/openhantek.h b/openhantek/src/openhantek.h index 5d6a3ff..fb8eb65 100644 --- a/openhantek/src/openhantek.h +++ b/openhantek/src/openhantek.h @@ -4,7 +4,7 @@ /// \file openhantek.h /// \brief Declares the HantekDsoMainWindow class. // -// Copyright (C) 2010 Oliver Haag +// Copyright (C) 2010, 2011 Oliver Haag // oliver.haag@gmail.com // // This program is free software: you can redistribute it and/or modify it @@ -93,7 +93,7 @@ class OpenHantekMainWindow : public QMainWindow { // Menus QMenu *fileMenu; - QMenu *viewMenu; + QMenu *viewMenu, *dockMenu, *toolbarMenu; QMenu *oscilloscopeMenu, *bufferSizeMenu; QMenu *helpMenu; @@ -139,7 +139,9 @@ class OpenHantekMainWindow : public QMainWindow { void config(); void about(); + // Settings management void applySettings(); + void updateSettings(); void bufferSizeSelected(QAction *action); void updateOffset(unsigned int channel); diff --git a/openhantek/src/settings.cpp b/openhantek/src/settings.cpp index 095a9b9..33af816 100644 --- a/openhantek/src/settings.cpp +++ b/openhantek/src/settings.cpp @@ -3,7 +3,7 @@ // OpenHantek // settings.cpp // -// Copyright (C) 2010 Oliver Haag +// Copyright (C) 2010, 2011 Oliver Haag // oliver.haag@gmail.com // // This program is free software: you can redistribute it and/or modify it @@ -39,8 +39,23 @@ DsoSettings::DsoSettings(QWidget *parent) : QObject(parent) { // Options this->options.alwaysSave = true; this->options.imageSize = QSize(640, 480); - this->options.windowPosition = QPoint(0, 0); - this->options.windowSize = QSize(800, 560); + // Main window + this->options.window.position = QPoint(); + this->options.window.size = QSize(); + // 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 @@ -191,12 +206,54 @@ int DsoSettings::load(const QString &fileName) { if(settingsLoader->status() != QSettings::NoError) return -settingsLoader->status(); - // Window size and position and other general options + // 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.windowPosition = settingsLoader->value("pos").toPoint(); + this->options.window.position = settingsLoader->value("pos").toPoint(); if(settingsLoader->contains("size")) - this->options.windowSize = settingsLoader->value("size").toSize(); + this->options.window.size = settingsLoader->value("size").toSize(); + settingsLoader->endGroup(); + // General options if(settingsLoader->contains("alwaysSave")) this->options.alwaysSave = settingsLoader->value("alwaysSave").toBool(); if(settingsLoader->contains("imageSize")) @@ -340,10 +397,45 @@ int DsoSettings::save(const QString &fileName) { return -settingsSaver->status(); if(complete) { - // Window size and position + // Main window layout and other general options settingsSaver->beginGroup("options"); - settingsSaver->setValue("pos", this->options.windowPosition); - settingsSaver->setValue("size", this->options.windowSize); + 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(); diff --git a/openhantek/src/settings.h b/openhantek/src/settings.h index fe31c02..f4803d0 100644 --- a/openhantek/src/settings.h +++ b/openhantek/src/settings.h @@ -4,7 +4,7 @@ /// \file settings.h /// \brief Declares the DsoSettings class. // -// Copyright (C) 2010 Oliver Haag +// Copyright (C) 2010, 2011 Oliver Haag // oliver.haag@gmail.com // // This program is free software: you can redistribute it and/or modify it @@ -39,13 +39,50 @@ //////////////////////////////////////////////////////////////////////////////// +/// \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 - QPoint windowPosition; ///< Position of the main window - QSize windowSize; ///< Size of the main window + DsoSettingsOptionsWindow window; ///< Window layout }; //////////////////////////////////////////////////////////////////////////////// -- libgit2 0.21.4