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
};
////////////////////////////////////////////////////////////////////////////////