Commit 35299cfeb4efc9277795f8330244a05253a59d0c

Authored by oliverhaag
1 parent ecc9e1d7

Saving positions of docking windows and toolbars now and made it possible to set…

… their visibility via the View menu
openhantek/src/openhantek.cpp
... ... @@ -3,7 +3,7 @@
3 3 // OpenHantek
4 4 // openhantek.cpp
5 5 //
6   -// Copyright (C) 2010 Oliver Haag
  6 +// Copyright (C) 2010, 2011 Oliver Haag
7 7 // oliver.haag@gmail.com
8 8 //
9 9 // This program is free software: you can redistribute it and/or modify it
... ... @@ -68,7 +68,6 @@ OpenHantekMainWindow::OpenHantekMainWindow(QWidget *parent, Qt::WindowFlags flag
68 68 this->settings = new DsoSettings();
69 69 this->settings->setChannelCount(this->dsoControl->getChannelCount());
70 70 this->readSettings();
71   - this->applySettings();
72 71  
73 72 // Create dock windows before the dso widget, they fix messed up settings
74 73 this->createDockWindows();
... ... @@ -82,10 +81,17 @@ OpenHantekMainWindow::OpenHantekMainWindow(QWidget *parent, Qt::WindowFlags flag
82 81  
83 82 // Subroutines for window elements
84 83 this->createActions();
85   - this->createMenus();
86 84 this->createToolBars();
  85 + this->createMenus();
87 86 this->createStatusBar();
88 87  
  88 + // Apply the settings after the gui is initialized
  89 + this->applySettings();
  90 +
  91 + // Update stored window size and position
  92 + this->settings->options.window.position = this->pos();
  93 + this->settings->options.window.size = this->size();
  94 +
89 95 // Connect general signals
90 96 connect(this, SIGNAL(settingsChanged()), this, SLOT(applySettings()));
91 97 //connect(this->dsoWidget, SIGNAL(stopped()), this, SLOT(stopped()));
... ... @@ -254,6 +260,16 @@ void OpenHantekMainWindow::createMenus() {
254 260 this->viewMenu = this->menuBar()->addMenu(tr("&View"));
255 261 this->viewMenu->addAction(this->digitalPhosphorAction);
256 262 this->viewMenu->addAction(this->zoomAction);
  263 + this->viewMenu->addSeparator();
  264 + this->dockMenu = this->viewMenu->addMenu(tr("&Docking windows"));
  265 + this->dockMenu->addAction(this->horizontalDock->toggleViewAction());
  266 + this->dockMenu->addAction(this->spectrumDock->toggleViewAction());
  267 + this->dockMenu->addAction(this->triggerDock->toggleViewAction());
  268 + this->dockMenu->addAction(this->voltageDock->toggleViewAction());
  269 + this->toolbarMenu = this->viewMenu->addMenu(tr("&Toolbars"));
  270 + this->toolbarMenu->addAction(this->fileToolBar->toggleViewAction());
  271 + this->toolbarMenu->addAction(this->oscilloscopeToolBar->toggleViewAction());
  272 + this->toolbarMenu->addAction(this->viewToolBar->toggleViewAction());
257 273  
258 274 this->oscilloscopeMenu = this->menuBar()->addMenu(tr("&Oscilloscope"));
259 275 this->oscilloscopeMenu->addAction(this->configAction);
... ... @@ -318,13 +334,6 @@ void OpenHantekMainWindow::createDockWindows()
318 334 this->triggerDock = new TriggerDock(this->settings, this->dsoControl->getSpecialTriggerSources());
319 335 this->spectrumDock = new SpectrumDock(this->settings);
320 336 this->voltageDock = new VoltageDock(this->settings);
321   -
322   - this->addDockWidget(Qt::RightDockWidgetArea, this->horizontalDock);
323   - this->addDockWidget(Qt::RightDockWidgetArea, this->triggerDock);
324   - this->addDockWidget(Qt::RightDockWidgetArea, this->voltageDock);
325   - this->addDockWidget(Qt::RightDockWidgetArea, this->spectrumDock);
326   -
327   - //viewMenu->addAction(this->horizontalDock->toggleViewAction());
328 337 }
329 338  
330 339 /// \brief Read the settings from an ini file.
... ... @@ -343,6 +352,8 @@ int OpenHantekMainWindow::readSettings(const QString &fileName) {
343 352 /// \param fileName Optional filename to read the settings from an ini file.
344 353 /// \return 0 on success, negative on error.
345 354 int OpenHantekMainWindow::writeSettings(const QString &fileName) {
  355 + this->updateSettings();
  356 +
346 357 return this->settings->save(fileName);
347 358 }
348 359  
... ... @@ -351,7 +362,7 @@ int OpenHantekMainWindow::writeSettings(const QString &fileName) {
351 362 void OpenHantekMainWindow::moveEvent(QMoveEvent *event) {
352 363 Q_UNUSED(event);
353 364  
354   - this->settings->options.windowPosition = this->pos();
  365 + this->settings->options.window.position = this->pos();
355 366 }
356 367  
357 368 /// \brief Called everytime the window is resized.
... ... @@ -359,7 +370,7 @@ void OpenHantekMainWindow::moveEvent(QMoveEvent *event) {
359 370 void OpenHantekMainWindow::resizeEvent(QResizeEvent *event) {
360 371 Q_UNUSED(event);
361 372  
362   - this->settings->options.windowSize = this->size();
  373 + this->settings->options.window.size = this->size();
363 374 }
364 375  
365 376 /// \brief Open a configuration file.
... ... @@ -419,6 +430,8 @@ void OpenHantekMainWindow::stopped() {
419 430  
420 431 /// \brief Configure the oscilloscope.
421 432 void OpenHantekMainWindow::config() {
  433 + this->updateSettings();
  434 +
422 435 DsoConfigDialog configDialog(this->settings, this);
423 436 if(configDialog.exec() == QDialog::Accepted)
424 437 this->settingsChanged();
... ... @@ -448,14 +461,121 @@ void OpenHantekMainWindow::zoom(bool enabled) {
448 461 void OpenHantekMainWindow::about() {
449 462 QMessageBox::about(this, tr("About OpenHantek %1").arg(VERSION), tr(
450 463 "<p>This is a open source software for Hantek USB oscilloscopes.</p>"
451   - "<p>Copyright &copy; 2010 Oliver Haag &lt;oliver.haag@gmail.com&gt;</p>"
  464 + "<p>Copyright &copy; 2010, 2011 Oliver Haag &lt;oliver.haag@gmail.com&gt;</p>"
452 465 ));
453 466 }
454 467  
455 468 /// \brief The settings have changed.
456 469 void OpenHantekMainWindow::applySettings() {
457   - this->move(this->settings->options.windowPosition);
458   - this->resize(this->settings->options.windowSize);
  470 + // Main window
  471 + if(!this->settings->options.window.position.isNull())
  472 + this->move(this->settings->options.window.position);
  473 + if(!this->settings->options.window.size.isNull())
  474 + this->resize(this->settings->options.window.size);
  475 +
  476 + // Docking windows
  477 + QList<QDockWidget *> docks;
  478 + docks.append(this->horizontalDock);
  479 + docks.append(this->spectrumDock);
  480 + docks.append(this->triggerDock);
  481 + docks.append(this->voltageDock);
  482 +
  483 + QList<DsoSettingsOptionsWindowPanel *> dockSettings;
  484 + dockSettings.append(&(this->settings->options.window.dock.horizontal));
  485 + dockSettings.append(&(this->settings->options.window.dock.spectrum));
  486 + dockSettings.append(&(this->settings->options.window.dock.trigger));
  487 + dockSettings.append(&(this->settings->options.window.dock.voltage));
  488 +
  489 + QList<int> docked[2]; // Docks docked on the sides of the main window
  490 +
  491 + for(int dockId = 0; dockId < docks.size(); dockId++) {
  492 + docks[dockId]->setVisible(dockSettings[dockId]->visible);
  493 + docks[dockId]->setFloating(dockSettings[dockId]->floating);
  494 + if(!dockSettings[dockId]->position.isNull()) {
  495 + if(dockSettings[dockId]->floating) {
  496 + docks[dockId]->move(dockSettings[dockId]->position);
  497 + }
  498 + else {
  499 + // Check in which order the docking windows where placed
  500 + int side = (dockSettings[dockId]->position.x() == 0) ? 0 : 1;
  501 + int index = 0;
  502 + while(index < docked[side].size() && dockSettings[docked[side][index]]->position.y() < dockSettings[dockId]->position.y())
  503 + index++;
  504 + docked[side].insert(index, dockId);
  505 + //docks[dockId]->setVisible(false);
  506 + }
  507 + }
  508 + else {
  509 + this->addDockWidget(Qt::RightDockWidgetArea, docks[dockId]);
  510 + }
  511 + }
  512 +
  513 + // Put the docked docking windows into the main window
  514 + for(int position = 0; position < docked[0].size(); position++)
  515 + this->addDockWidget(Qt::LeftDockWidgetArea, docks[docked[0][position]]);
  516 + for(int position = 0; position < docked[1].size(); position++)
  517 + this->addDockWidget(Qt::RightDockWidgetArea, docks[docked[1][position]]);
  518 +
  519 + // Toolbars
  520 + QList<QToolBar *> toolbars;
  521 + toolbars.append(this->fileToolBar);
  522 + toolbars.append(this->oscilloscopeToolBar);
  523 + toolbars.append(this->viewToolBar);
  524 +
  525 + QList<DsoSettingsOptionsWindowPanel *> toolbarSettings;
  526 + toolbarSettings.append(&(this->settings->options.window.toolbar.file));
  527 + toolbarSettings.append(&(this->settings->options.window.toolbar.oscilloscope));
  528 + toolbarSettings.append(&(this->settings->options.window.toolbar.view));
  529 +
  530 + for(int toolbarId = 0; toolbarId < toolbars.size(); toolbarId++) {
  531 + toolbars[toolbarId]->setVisible(toolbarSettings[toolbarId]->visible);
  532 + //toolbars[toolbarId]->setFloating(toolbarSettings[toolbarId]->floating); // setFloating missing, a bug in Qt?
  533 + if(!toolbarSettings[toolbarId]->position.isNull())
  534 + toolbars[toolbarId]->move(toolbarSettings[toolbarId]->position);
  535 + }
  536 +}
  537 +
  538 +/// \brief Update the window layout in the settings.
  539 +void OpenHantekMainWindow::updateSettings() {
  540 + // Main window
  541 + this->settings->options.window.position = this->pos();
  542 + this->settings->options.window.size = this->size();
  543 +
  544 + // Docking windows
  545 + QList<QDockWidget *> docks;
  546 + docks.append(this->horizontalDock);
  547 + docks.append(this->spectrumDock);
  548 + docks.append(this->triggerDock);
  549 + docks.append(this->voltageDock);
  550 +
  551 + QList<DsoSettingsOptionsWindowPanel *> dockSettings;
  552 + dockSettings.append(&(this->settings->options.window.dock.horizontal));
  553 + dockSettings.append(&(this->settings->options.window.dock.spectrum));
  554 + dockSettings.append(&(this->settings->options.window.dock.trigger));
  555 + dockSettings.append(&(this->settings->options.window.dock.voltage));
  556 +
  557 + for(int dockId = 0; dockId < docks.size(); dockId++) {
  558 + dockSettings[dockId]->floating = docks[dockId]->isFloating();
  559 + dockSettings[dockId]->position = docks[dockId]->pos();
  560 + dockSettings[dockId]->visible = docks[dockId]->isVisible();
  561 + }
  562 +
  563 + // Toolbars
  564 + QList<QToolBar *> toolbars;
  565 + toolbars.append(this->fileToolBar);
  566 + toolbars.append(this->oscilloscopeToolBar);
  567 + toolbars.append(this->viewToolBar);
  568 +
  569 + QList<DsoSettingsOptionsWindowPanel *> toolbarSettings;
  570 + toolbarSettings.append(&(this->settings->options.window.toolbar.file));
  571 + toolbarSettings.append(&(this->settings->options.window.toolbar.oscilloscope));
  572 + toolbarSettings.append(&(this->settings->options.window.toolbar.view));
  573 +
  574 + for(int toolbarId = 0; toolbarId < toolbars.size(); toolbarId++) {
  575 + toolbarSettings[toolbarId]->floating = toolbars[toolbarId]->isFloating();
  576 + toolbarSettings[toolbarId]->position = toolbars[toolbarId]->pos();
  577 + toolbarSettings[toolbarId]->visible = toolbars[toolbarId]->isVisible();
  578 + }
459 579 }
460 580  
461 581 /// \brief Apply new buffer size to settings.
... ...
openhantek/src/openhantek.h
... ... @@ -4,7 +4,7 @@
4 4 /// \file openhantek.h
5 5 /// \brief Declares the HantekDsoMainWindow class.
6 6 //
7   -// Copyright (C) 2010 Oliver Haag
  7 +// Copyright (C) 2010, 2011 Oliver Haag
8 8 // oliver.haag@gmail.com
9 9 //
10 10 // This program is free software: you can redistribute it and/or modify it
... ... @@ -93,7 +93,7 @@ class OpenHantekMainWindow : public QMainWindow {
93 93  
94 94 // Menus
95 95 QMenu *fileMenu;
96   - QMenu *viewMenu;
  96 + QMenu *viewMenu, *dockMenu, *toolbarMenu;
97 97 QMenu *oscilloscopeMenu, *bufferSizeMenu;
98 98 QMenu *helpMenu;
99 99  
... ... @@ -139,7 +139,9 @@ class OpenHantekMainWindow : public QMainWindow {
139 139 void config();
140 140 void about();
141 141  
  142 + // Settings management
142 143 void applySettings();
  144 + void updateSettings();
143 145  
144 146 void bufferSizeSelected(QAction *action);
145 147 void updateOffset(unsigned int channel);
... ...
openhantek/src/settings.cpp
... ... @@ -3,7 +3,7 @@
3 3 // OpenHantek
4 4 // settings.cpp
5 5 //
6   -// Copyright (C) 2010 Oliver Haag
  6 +// Copyright (C) 2010, 2011 Oliver Haag
7 7 // oliver.haag@gmail.com
8 8 //
9 9 // This program is free software: you can redistribute it and/or modify it
... ... @@ -39,8 +39,23 @@ DsoSettings::DsoSettings(QWidget *parent) : QObject(parent) {
39 39 // Options
40 40 this->options.alwaysSave = true;
41 41 this->options.imageSize = QSize(640, 480);
42   - this->options.windowPosition = QPoint(0, 0);
43   - this->options.windowSize = QSize(800, 560);
  42 + // Main window
  43 + this->options.window.position = QPoint();
  44 + this->options.window.size = QSize();
  45 + // Docking windows and toolbars
  46 + QList<DsoSettingsOptionsWindowPanel *> panels;
  47 + panels.append(&(this->options.window.dock.horizontal));
  48 + panels.append(&(this->options.window.dock.spectrum));
  49 + panels.append(&(this->options.window.dock.trigger));
  50 + panels.append(&(this->options.window.dock.voltage));
  51 + panels.append(&(this->options.window.toolbar.file));
  52 + panels.append(&(this->options.window.toolbar.oscilloscope));
  53 + panels.append(&(this->options.window.toolbar.view));
  54 + for(int panelId = 0; panelId < panels.size(); panelId++) {
  55 + panels[panelId]->floating = false;
  56 + panels[panelId]->position = QPoint();
  57 + panels[panelId]->visible = true;
  58 + }
44 59  
45 60 // Oscilloscope settings
46 61 // Horizontal axis
... ... @@ -191,12 +206,54 @@ int DsoSettings::load(const QString &amp;fileName) {
191 206 if(settingsLoader->status() != QSettings::NoError)
192 207 return -settingsLoader->status();
193 208  
194   - // Window size and position and other general options
  209 + // Main window layout and other general options
195 210 settingsLoader->beginGroup("options");
  211 + settingsLoader->beginGroup("window");
  212 + // Docking windows and toolbars
  213 + settingsLoader->beginGroup("docks");
  214 + QList<DsoSettingsOptionsWindowPanel *> docks;
  215 + docks.append(&(this->options.window.dock.horizontal));
  216 + docks.append(&(this->options.window.dock.spectrum));
  217 + docks.append(&(this->options.window.dock.trigger));
  218 + docks.append(&(this->options.window.dock.voltage));
  219 + QStringList dockNames;
  220 + dockNames << "horizontal" << "spectrum" << "trigger" << "voltage";
  221 + for(int dockId = 0; dockId < docks.size(); dockId++) {
  222 + settingsLoader->beginGroup(dockNames[dockId]);
  223 + if(settingsLoader->contains("floating"))
  224 + docks[dockId]->floating = settingsLoader->value("floating").toBool();
  225 + if(settingsLoader->contains("position"))
  226 + docks[dockId]->position = settingsLoader->value("position").toPoint();
  227 + if(settingsLoader->contains("visible"))
  228 + docks[dockId]->visible = settingsLoader->value("visible").toBool();
  229 + settingsLoader->endGroup();
  230 + }
  231 + settingsLoader->endGroup();
  232 + settingsLoader->beginGroup("toolbars");
  233 + QList<DsoSettingsOptionsWindowPanel *> toolbars;
  234 + toolbars.append(&(this->options.window.toolbar.file));
  235 + toolbars.append(&(this->options.window.toolbar.oscilloscope));
  236 + toolbars.append(&(this->options.window.toolbar.view));
  237 + QStringList toolbarNames;
  238 + toolbarNames << "file" << "oscilloscope" << "view";
  239 + for(int toolbarId = 0; toolbarId < toolbars.size(); toolbarId++) {
  240 + settingsLoader->beginGroup(toolbarNames[toolbarId]);
  241 + if(settingsLoader->contains("floating"))
  242 + toolbars[toolbarId]->floating = settingsLoader->value("floating").toBool();
  243 + if(settingsLoader->contains("position"))
  244 + toolbars[toolbarId]->position = settingsLoader->value("position").toPoint();
  245 + if(settingsLoader->contains("visible"))
  246 + toolbars[toolbarId]->visible = settingsLoader->value("visible").toBool();
  247 + settingsLoader->endGroup();
  248 + }
  249 + settingsLoader->endGroup();
  250 + // Main window
196 251 if(settingsLoader->contains("pos"))
197   - this->options.windowPosition = settingsLoader->value("pos").toPoint();
  252 + this->options.window.position = settingsLoader->value("pos").toPoint();
198 253 if(settingsLoader->contains("size"))
199   - this->options.windowSize = settingsLoader->value("size").toSize();
  254 + this->options.window.size = settingsLoader->value("size").toSize();
  255 + settingsLoader->endGroup();
  256 + // General options
200 257 if(settingsLoader->contains("alwaysSave"))
201 258 this->options.alwaysSave = settingsLoader->value("alwaysSave").toBool();
202 259 if(settingsLoader->contains("imageSize"))
... ... @@ -340,10 +397,45 @@ int DsoSettings::save(const QString &amp;fileName) {
340 397 return -settingsSaver->status();
341 398  
342 399 if(complete) {
343   - // Window size and position
  400 + // Main window layout and other general options
344 401 settingsSaver->beginGroup("options");
345   - settingsSaver->setValue("pos", this->options.windowPosition);
346   - settingsSaver->setValue("size", this->options.windowSize);
  402 + settingsSaver->beginGroup("window");
  403 + // Docking windows and toolbars
  404 + settingsSaver->beginGroup("docks");
  405 + QList<DsoSettingsOptionsWindowPanel *> docks;
  406 + docks.append(&(this->options.window.dock.horizontal));
  407 + docks.append(&(this->options.window.dock.spectrum));
  408 + docks.append(&(this->options.window.dock.trigger));
  409 + docks.append(&(this->options.window.dock.voltage));
  410 + QStringList dockNames;
  411 + dockNames << "horizontal" << "spectrum" << "trigger" << "voltage";
  412 + for(int dockId = 0; dockId < docks.size(); dockId++) {
  413 + settingsSaver->beginGroup(dockNames[dockId]);
  414 + settingsSaver->setValue("floating", docks[dockId]->floating);
  415 + settingsSaver->setValue("position", docks[dockId]->position);
  416 + settingsSaver->setValue("visible", docks[dockId]->visible);
  417 + settingsSaver->endGroup();
  418 + }
  419 + settingsSaver->endGroup();
  420 + settingsSaver->beginGroup("toolbars");
  421 + QList<DsoSettingsOptionsWindowPanel *> toolbars;
  422 + toolbars.append(&(this->options.window.toolbar.file));
  423 + toolbars.append(&(this->options.window.toolbar.oscilloscope));
  424 + toolbars.append(&(this->options.window.toolbar.view));
  425 + QStringList toolbarNames;
  426 + toolbarNames << "file" << "oscilloscope" << "view";
  427 + for(int toolbarId = 0; toolbarId < toolbars.size(); toolbarId++) {
  428 + settingsSaver->beginGroup(toolbarNames[toolbarId]);
  429 + settingsSaver->setValue("floating", toolbars[toolbarId]->floating);
  430 + settingsSaver->setValue("position", toolbars[toolbarId]->position);
  431 + settingsSaver->setValue("visible", toolbars[toolbarId]->visible);
  432 + settingsSaver->endGroup();
  433 + }
  434 + settingsSaver->endGroup();
  435 + // Main window
  436 + settingsSaver->setValue("pos", this->options.window.position);
  437 + settingsSaver->setValue("size", this->options.window.size);
  438 + settingsSaver->endGroup();
347 439 settingsSaver->setValue("alwaysSave", this->options.alwaysSave);
348 440 settingsSaver->setValue("imageSize", this->options.imageSize);
349 441 settingsSaver->endGroup();
... ...
openhantek/src/settings.h
... ... @@ -4,7 +4,7 @@
4 4 /// \file settings.h
5 5 /// \brief Declares the DsoSettings class.
6 6 //
7   -// Copyright (C) 2010 Oliver Haag
  7 +// Copyright (C) 2010, 2011 Oliver Haag
8 8 // oliver.haag@gmail.com
9 9 //
10 10 // This program is free software: you can redistribute it and/or modify it
... ... @@ -39,13 +39,50 @@
39 39  
40 40  
41 41 ////////////////////////////////////////////////////////////////////////////////
  42 +/// \struct DsoSettingsOptionsWindowPanel settings.h
  43 +/// \brief Holds the position and state of a docking window or toolbar.
  44 +struct DsoSettingsOptionsWindowPanel {
  45 + bool floating; ///< true, if the panel is floating
  46 + QPoint position; ///< Position of the panel
  47 + bool visible; ///< true, if the panel is shown
  48 +};
  49 +
  50 +////////////////////////////////////////////////////////////////////////////////
  51 +/// \struct DsoSettingsOptionsWindowDock settings.h
  52 +/// \brief Holds the layout of the docking windows.
  53 +struct DsoSettingsOptionsWindowDock {
  54 + DsoSettingsOptionsWindowPanel horizontal; ///< "Horizontal" docking window
  55 + DsoSettingsOptionsWindowPanel spectrum; ///< "Spectrum" docking window
  56 + DsoSettingsOptionsWindowPanel trigger; ///< "Trigger" docking window
  57 + DsoSettingsOptionsWindowPanel voltage; ///< "Voltage" docking window
  58 +};
  59 +
  60 +////////////////////////////////////////////////////////////////////////////////
  61 +/// \struct DsoSettingsOptionsWindowToolbar settings.h
  62 +/// \brief Holds the layout of the toolbars.
  63 +struct DsoSettingsOptionsWindowToolbar {
  64 + DsoSettingsOptionsWindowPanel file; ///< "File" toolbar
  65 + DsoSettingsOptionsWindowPanel oscilloscope; ///< "Oscilloscope" toolbar
  66 + DsoSettingsOptionsWindowPanel view; ///< The "View" toolbar
  67 +};
  68 +
  69 +////////////////////////////////////////////////////////////////////////////////
  70 +/// \struct DsoSettingsOptionsWindow settings.h
  71 +/// \brief Holds the layout of the main window.
  72 +struct DsoSettingsOptionsWindow {
  73 + QPoint position; ///< Position of the main window
  74 + QSize size; ///< Size of the main window
  75 + DsoSettingsOptionsWindowDock dock; ///< Docking windows
  76 + DsoSettingsOptionsWindowToolbar toolbar; ///< Toolbars
  77 +};
  78 +
  79 +////////////////////////////////////////////////////////////////////////////////
42 80 /// \struct DsoSettingsOptions settings.h
43 81 /// \brief Holds the general options of the program.
44 82 struct DsoSettingsOptions {
45 83 bool alwaysSave; ///< Always save the settings on exit
46 84 QSize imageSize; ///< Size of exported images in pixels
47   - QPoint windowPosition; ///< Position of the main window
48   - QSize windowSize; ///< Size of the main window
  85 + DsoSettingsOptionsWindow window; ///< Window layout
49 86 };
50 87  
51 88 ////////////////////////////////////////////////////////////////////////////////
... ...