From d0656b15d320441970ee45c11bc9c86400ccb130 Mon Sep 17 00:00:00 2001 From: oliverhaag Date: Thu, 2 Dec 2010 23:41:39 +0000 Subject: [PATCH] Added configuration file loading/saving and some settings to the dialog --- openhantek/res/configdialog.qrc | 14 +++++++------- openhantek/res/images/config/files.png | Bin 0 -> 1592 bytes openhantek/src/configdialog.cpp | 7 +++++++ openhantek/src/configdialog.h | 2 ++ openhantek/src/configpages.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- openhantek/src/configpages.h | 34 ++++++++++++++++++++++++++++++++++ openhantek/src/exporter.cpp | 9 +-------- openhantek/src/exporter.h | 1 - openhantek/src/openhantek.cpp | 316 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- openhantek/src/openhantek.h | 14 +++++++++----- openhantek/src/settings.cpp | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- openhantek/src/settings.h | 17 +++++++++++++++-- 12 files changed, 460 insertions(+), 285 deletions(-) create mode 100644 openhantek/res/images/config/files.png diff --git a/openhantek/res/configdialog.qrc b/openhantek/res/configdialog.qrc index 63f6393..72ad7f3 100644 --- a/openhantek/res/configdialog.qrc +++ b/openhantek/res/configdialog.qrc @@ -1,8 +1,8 @@ - - - - images/config/analysis.png - images/config/colors.png - images/config/scope.png - + + + images/config/analysis.png + images/config/colors.png + images/config/scope.png + images/config/files.png + diff --git a/openhantek/res/images/config/files.png b/openhantek/res/images/config/files.png new file mode 100644 index 0000000..3f55aa6 Binary files /dev/null and b/openhantek/res/images/config/files.png differ diff --git a/openhantek/src/configdialog.cpp b/openhantek/src/configdialog.cpp index d904742..9218621 100644 --- a/openhantek/src/configdialog.cpp +++ b/openhantek/src/configdialog.cpp @@ -58,10 +58,12 @@ DsoConfigDialog::DsoConfigDialog(DsoSettings *settings, QWidget *parent, Qt::Win this->analysisPage = new DsoConfigAnalysisPage(this->settings); this->colorsPage = new DsoConfigColorsPage(this->settings); + this->filesPage = new DsoConfigFilesPage(this->settings); this->scopePage = new DsoConfigScopePage(this->settings); this->pagesWidget = new QStackedWidget; this->pagesWidget->addWidget(this->analysisPage); this->pagesWidget->addWidget(this->colorsPage); + this->pagesWidget->addWidget(this->filesPage); this->pagesWidget->addWidget(this->scopePage); this->acceptButton = new QPushButton(tr("&Ok")); @@ -109,6 +111,10 @@ void DsoConfigDialog::createIcons() { colorsButton->setIcon(QIcon(":config/colors.png")); colorsButton->setText(tr("Colors")); + QListWidgetItem *filesButton = new QListWidgetItem(contentsWidget); + filesButton->setIcon(QIcon(":config/files.png")); + filesButton->setText(tr("Files")); + QListWidgetItem *scopeButton = new QListWidgetItem(contentsWidget); scopeButton->setIcon(QIcon(":config/scope.png")); scopeButton->setText(tr("Scope")); @@ -127,6 +133,7 @@ void DsoConfigDialog::accept() { void DsoConfigDialog::apply() { this->analysisPage->saveSettings(); this->colorsPage->saveSettings(); + this->filesPage->saveSettings(); this->scopePage->saveSettings(); } diff --git a/openhantek/src/configdialog.h b/openhantek/src/configdialog.h index beede76..6d30cea 100644 --- a/openhantek/src/configdialog.h +++ b/openhantek/src/configdialog.h @@ -48,6 +48,7 @@ class DsoConfigAnalysisPage; class DsoConfigColorsPage; +class DsoConfigFilesPage; class DsoConfigScopePage; class DsoSettings; @@ -89,6 +90,7 @@ class DsoConfigDialog : public QDialog { DsoConfigAnalysisPage *analysisPage; DsoConfigColorsPage *colorsPage; + DsoConfigFilesPage *filesPage; DsoConfigScopePage *scopePage; QPushButton *acceptButton, *applyButton, *rejectButton; diff --git a/openhantek/src/configpages.cpp b/openhantek/src/configpages.cpp index 3c92965..d61f675 100644 --- a/openhantek/src/configpages.cpp +++ b/openhantek/src/configpages.cpp @@ -223,6 +223,68 @@ void DsoConfigColorsPage::saveSettings() { //////////////////////////////////////////////////////////////////////////////// +// class DsoConfigFilesPage +/// \brief Creates the widgets and sets their initial value. +/// \param settings The target settings object. +/// \param parent The parent widget. +DsoConfigFilesPage::DsoConfigFilesPage(DsoSettings *settings, QWidget *parent) : QWidget(parent) { + this->settings = settings; + + // Initialize elements + this->saveOnExitCheckBox = new QCheckBox(tr("Save default settings on exit")); + this->saveOnExitCheckBox->setChecked(this->settings->options.alwaysSave); + this->saveNowButton = new QPushButton(tr("Save default settings now")); + + this->configurationLayout = new QVBoxLayout(); + this->configurationLayout->addWidget(this->saveOnExitCheckBox, 0); + this->configurationLayout->addWidget(this->saveNowButton, 1); + + this->configurationGroup = new QGroupBox(tr("Configuration")); + this->configurationGroup->setLayout(this->configurationLayout); + + this->imageWidthLabel = new QLabel(tr("Image width")); + this->imageWidthSpinBox = new QSpinBox(); + this->imageWidthSpinBox->setMinimum(100); + this->imageWidthSpinBox->setMaximum(9999); + this->imageWidthSpinBox->setValue(this->settings->options.imageSize.width()); + this->imageHeightLabel = new QLabel(tr("Image height")); + this->imageHeightSpinBox = new QSpinBox(); + this->imageHeightSpinBox->setMinimum(100); + this->imageHeightSpinBox->setMaximum(9999); + this->imageHeightSpinBox->setValue(this->settings->options.imageSize.height()); + + this->exportLayout = new QGridLayout(); + this->exportLayout->addWidget(this->imageWidthLabel, 0, 0); + this->exportLayout->addWidget(this->imageWidthSpinBox, 0, 1); + this->exportLayout->addWidget(this->imageHeightLabel, 1, 0); + this->exportLayout->addWidget(this->imageHeightSpinBox, 1, 1); + + this->exportGroup = new QGroupBox(tr("Export")); + this->exportGroup->setLayout(this->exportLayout); + + this->mainLayout = new QVBoxLayout(); + this->mainLayout->addWidget(this->configurationGroup); + this->mainLayout->addWidget(this->exportGroup); + this->mainLayout->addStretch(1); + + this->setLayout(this->mainLayout); + + connect(this->saveNowButton, SIGNAL(clicked()), this->settings, SLOT(save())); +} + +/// \brief Cleans up the widget. +DsoConfigFilesPage::~DsoConfigFilesPage() { +} + +/// \brief Saves the new settings. +void DsoConfigFilesPage::saveSettings() { + this->settings->options.alwaysSave = this->saveOnExitCheckBox->isChecked(); + this->settings->options.imageSize.setWidth(this->imageWidthSpinBox->value()); + this->settings->options.imageSize.setHeight(this->imageHeightSpinBox->value()); +} + + +//////////////////////////////////////////////////////////////////////////////// // class DsoConfigScopePage /// \brief Creates the widgets and sets their initial value. /// \param settings The target settings object. @@ -277,4 +339,3 @@ void DsoConfigScopePage::saveSettings() { this->settings->view.interpolation = (Dso::InterpolationMode) this->interpolationComboBox->currentIndex(); this->settings->view.digitalPhosphorDepth = this->digitalPhosphorDepthSpinBox->value(); } - diff --git a/openhantek/src/configpages.h b/openhantek/src/configpages.h index 4ca14d4..c829f57 100644 --- a/openhantek/src/configpages.h +++ b/openhantek/src/configpages.h @@ -115,6 +115,40 @@ class DsoConfigColorsPage : public QWidget { //////////////////////////////////////////////////////////////////////////////// +/// \class DsoConfigFilesPage configpages.h +/// \brief Config page for file loading/saving. +class DsoConfigFilesPage : public QWidget { + Q_OBJECT + + public: + DsoConfigFilesPage(DsoSettings *settings, QWidget *parent = 0); + ~DsoConfigFilesPage(); + + public slots: + void saveSettings(); + + private: + DsoSettings *settings; + + QVBoxLayout *mainLayout; + + QGroupBox *configurationGroup; + QVBoxLayout *configurationLayout; + QCheckBox *saveOnExitCheckBox; + QPushButton *saveNowButton; + + QGroupBox *exportGroup; + QGridLayout *exportLayout; + QLabel *imageWidthLabel; + QSpinBox *imageWidthSpinBox; + QLabel *imageHeightLabel; + QSpinBox *imageHeightSpinBox; + + private slots: +}; + + +//////////////////////////////////////////////////////////////////////////////// /// \class DsoConfigScopePage configpages.h /// \brief Config page for the scope screen. class DsoConfigScopePage : public QWidget { diff --git a/openhantek/src/exporter.cpp b/openhantek/src/exporter.cpp index dabbdd3..17dec68 100644 --- a/openhantek/src/exporter.cpp +++ b/openhantek/src/exporter.cpp @@ -51,7 +51,6 @@ Exporter::Exporter(DsoSettings *settings, DataAnalyzer *dataAnalyzer, QWidget *p this->dataAnalyzer = dataAnalyzer; this->format = EXPORT_FORMAT_PRINTER; - this->size = QSize(640, 480); } /// \brief Cleans up everything. @@ -70,12 +69,6 @@ void Exporter::setFormat(ExportFormat format) { this->format = format; } -/// \brief Set the size for the output image. -void Exporter::setSize(QSize size) { - if(size.isValid()) - this->size = size; -} - /// \brief Print the document (May be a file too) bool Exporter::doExport() { if(this->format < EXPORT_FORMAT_CSV) { @@ -109,7 +102,7 @@ bool Exporter::doExport() { } else { // We need a QPixmap for image-export - paintDevice = new QPixmap(this->size); + paintDevice = new QPixmap(this->settings->options.imageSize); ((QPixmap *) paintDevice)->fill(colorValues->background); } diff --git a/openhantek/src/exporter.h b/openhantek/src/exporter.h index 6bf67e6..e6fd22d 100644 --- a/openhantek/src/exporter.h +++ b/openhantek/src/exporter.h @@ -57,7 +57,6 @@ class Exporter : public QObject { void setFilename(QString filename); void setFormat(ExportFormat format); - void setSize(QSize size); bool doExport(); diff --git a/openhantek/src/openhantek.cpp b/openhantek/src/openhantek.cpp index f4316a2..fd5fbf9 100644 --- a/openhantek/src/openhantek.cpp +++ b/openhantek/src/openhantek.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include @@ -62,10 +61,6 @@ OpenHantekMainWindow::OpenHantekMainWindow(QWidget *parent, Qt::WindowFlags flag this->setWindowIcon(QIcon(":openhantek.png")); this->setWindowTitle(tr("OpenHantek")); - // Default window dimensions - //this->move(152, 144); - this->resize(720, 480); - // Create the controller for the oscilloscope, provides channel count for settings this->dsoControl = new Hantek::Control(); @@ -73,6 +68,7 @@ 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(); @@ -155,7 +151,8 @@ OpenHantekMainWindow::~OpenHantekMainWindow() { /// \brief Save the settings before exiting. /// \param event The close event that should be handled. void OpenHantekMainWindow::closeEvent(QCloseEvent *event) { - this->writeSettings(); + if(this->settings->options.alwaysSave) + this->writeSettings(); QMainWindow::closeEvent(event); } @@ -330,271 +327,74 @@ void OpenHantekMainWindow::createDockWindows() //viewMenu->addAction(this->horizontalDock->toggleViewAction()); } -/// \brief Read the settings from the last session. +/// \brief Read the settings from an ini file. /// \param fileName Optional filename to export the settings to a specific file. -void OpenHantekMainWindow::readSettings(const QString &fileName) { - // Use main configuration if the fileName wasn't set - QSettings *settingsLoader; - if(fileName.isEmpty()) - settingsLoader = new QSettings(this); - else - settingsLoader = new QSettings(fileName, QSettings::IniFormat, this); - - // Window size and position - settingsLoader->beginGroup("window"); - if(settingsLoader->contains("pos")) - this->move(settingsLoader->value("pos").toPoint()); - if(settingsLoader->contains("size")) - this->resize(settingsLoader->value("size").toSize()); - settingsLoader->endGroup(); - - // Oszilloskope settings - settingsLoader->beginGroup("scope"); - // Horizontal axis - settingsLoader->beginGroup("horizontal"); - if(settingsLoader->contains("format")) - this->settings->scope.horizontal.format = (Dso::GraphFormat) settingsLoader->value("format").toInt(); - if(settingsLoader->contains("frequencybase")) - this->settings->scope.horizontal.frequencybase = settingsLoader->value("frequencybase").toDouble(); - for(int marker = 0; marker < 2; marker++) { - QString name; - name = QString("marker%1").arg(marker); - if(settingsLoader->contains(name)) - this->settings->scope.horizontal.marker[marker] = settingsLoader->value(name).toDouble(); - } - if(settingsLoader->contains("timebase")) - this->settings->scope.horizontal.timebase = settingsLoader->value("timebase").toDouble(); - settingsLoader->endGroup(); - // Trigger - settingsLoader->beginGroup("trigger"); - if(settingsLoader->contains("filter")) - this->settings->scope.trigger.filter = settingsLoader->value("filter").toBool(); - if(settingsLoader->contains("mode")) - this->settings->scope.trigger.mode = (Dso::TriggerMode) settingsLoader->value("mode").toInt(); - if(settingsLoader->contains("position")) - this->settings->scope.trigger.position = settingsLoader->value("position").toDouble(); - if(settingsLoader->contains("slope")) - this->settings->scope.trigger.slope = (Dso::Slope) settingsLoader->value("slope").toInt(); - if(settingsLoader->contains("source")) - this->settings->scope.trigger.source = settingsLoader->value("source").toInt(); - if(settingsLoader->contains("special")) - this->settings->scope.trigger.special = settingsLoader->value("special").toInt(); - settingsLoader->endGroup(); - // Spectrum - for(int channel = 0; channel < this->settings->scope.spectrum.count(); channel++) { - settingsLoader->beginGroup(QString("spectrum%1").arg(channel)); - if(settingsLoader->contains("magnitude")) - this->settings->scope.spectrum[channel].magnitude = settingsLoader->value("magnitude").toDouble(); - if(settingsLoader->contains("offset")) - this->settings->scope.spectrum[channel].offset = settingsLoader->value("offset").toDouble(); - if(settingsLoader->contains("used")) - this->settings->scope.spectrum[channel].used = settingsLoader->value("used").toBool(); - settingsLoader->endGroup(); - } - // Vertical axis - for(int channel = 0; channel < this->settings->scope.voltage.count(); channel++) { - settingsLoader->beginGroup(QString("vertical%1").arg(channel)); - if(settingsLoader->contains("gain")) - this->settings->scope.voltage[channel].gain = settingsLoader->value("gain").toDouble(); - if(settingsLoader->contains("misc")) - this->settings->scope.voltage[channel].misc = settingsLoader->value("misc").toInt(); - if(settingsLoader->contains("offset")) - this->settings->scope.voltage[channel].offset = settingsLoader->value("offset").toDouble(); - if(settingsLoader->contains("trigger")) - this->settings->scope.voltage[channel].trigger = settingsLoader->value("trigger").toDouble(); - if(settingsLoader->contains("used")) - this->settings->scope.voltage[channel].used = settingsLoader->value("used").toBool(); - settingsLoader->endGroup(); - } - if(settingsLoader->contains("spectrumLimit")) - this->settings->scope.spectrumLimit = settingsLoader->value("spectrumLimit").toDouble(); - if(settingsLoader->contains("spectrumReference")) - this->settings->scope.spectrumReference = settingsLoader->value("spectrumReference").toDouble(); - if(settingsLoader->contains("spectrumWindow")) - this->settings->scope.spectrumWindow = (Dso::WindowFunction) settingsLoader->value("spectrumWindow").toInt(); - settingsLoader->endGroup(); - - // View - settingsLoader->beginGroup("view"); - // Colors - settingsLoader->beginGroup("color"); - DsoSettingsColorValues *colors; - for(int mode = 0; mode < 2; mode++) { - if(mode == 0) { - colors = &this->settings->view.color.screen; - settingsLoader->beginGroup("screen"); - } - else { - colors = &this->settings->view.color.print; - settingsLoader->beginGroup("print"); - } - - if(settingsLoader->contains("axes")) - colors->axes = settingsLoader->value("axes").value(); - if(settingsLoader->contains("background")) - colors->background = settingsLoader->value("background").value(); - if(settingsLoader->contains("border")) - colors->border = settingsLoader->value("border").value(); - if(settingsLoader->contains("grid")) - colors->grid = settingsLoader->value("grid").value(); - if(settingsLoader->contains("markers")) - colors->markers = settingsLoader->value("markers").value(); - for(int channel = 0; channel < this->settings->scope.spectrum.count(); channel++) { - QString key = QString("spectrum%1").arg(channel); - if(settingsLoader->contains(key)) - colors->spectrum[channel] = settingsLoader->value(key).value(); - } - if(settingsLoader->contains("text")) - colors->text = settingsLoader->value("text").value(); - for(int channel = 0; channel < this->settings->scope.voltage.count(); channel++) { - QString key = QString("voltage%1").arg(channel); - if(settingsLoader->contains(key)) - colors->voltage[channel] = settingsLoader->value(key).value(); - } - settingsLoader->endGroup(); - } - settingsLoader->endGroup(); - // Other view settings - if(settingsLoader->contains("digitalPhosphor")) - this->settings->view.digitalPhosphor = settingsLoader->value("digitalPhosphor").toBool(); - if(settingsLoader->contains("interpolation")) - this->settings->view.interpolation = (Dso::InterpolationMode) settingsLoader->value("interpolation").toInt(); - if(settingsLoader->contains("screenColorImages")) - this->settings->view.screenColorImages = (Dso::InterpolationMode) settingsLoader->value("screenColorImages").toBool(); - if(settingsLoader->contains("zoom")) - this->settings->view.zoom = (Dso::InterpolationMode) settingsLoader->value("zoom").toBool(); - settingsLoader->endGroup(); - - delete settingsLoader; - - emit(settingsChanged()); +/// \return 0 on success, negative on error. +int OpenHantekMainWindow::readSettings(const QString &fileName) { + int status = this->settings->load(fileName); + + if(status == 0) + emit(settingsChanged()); + + return status; } /// \brief Save the settings to the harddisk. -void OpenHantekMainWindow::writeSettings(const QString &fileName) { - // Use main configuration and save everything if the fileName wasn't set - QSettings *settingsSaver; - bool complete = fileName.isEmpty(); - if(complete) - settingsSaver = new QSettings(this); - else - settingsSaver = new QSettings(fileName, QSettings::IniFormat, this); - - if(complete) { - // Window size and position - settingsSaver->beginGroup("window"); - settingsSaver->setValue("pos", this->pos()); - settingsSaver->setValue("size", this->size()); - settingsSaver->endGroup(); - } - // Oszilloskope settings - settingsSaver->beginGroup("scope"); - // Horizontal axis - settingsSaver->beginGroup("horizontal"); - settingsSaver->setValue("format", this->settings->scope.horizontal.format); - settingsSaver->setValue("frequencybase", this->settings->scope.horizontal.frequencybase); - for(int marker = 0; marker < 2; marker++) - settingsSaver->setValue(QString("marker%1").arg(marker), this->settings->scope.horizontal.marker[marker]); - settingsSaver->setValue("timebase", this->settings->scope.horizontal.timebase); - settingsSaver->endGroup(); - // Trigger - settingsSaver->beginGroup("trigger"); - settingsSaver->setValue("filter", this->settings->scope.trigger.filter); - settingsSaver->setValue("mode", this->settings->scope.trigger.mode); - settingsSaver->setValue("position", this->settings->scope.trigger.position); - settingsSaver->setValue("slope", this->settings->scope.trigger.slope); - settingsSaver->setValue("source", this->settings->scope.trigger.source); - settingsSaver->endGroup(); - // Spectrum - for(int channel = 0; channel < this->settings->scope.spectrum.count(); channel++) { - settingsSaver->beginGroup(QString("spectrum%1").arg(channel)); - settingsSaver->setValue("magnitude", this->settings->scope.spectrum[channel].magnitude); - settingsSaver->setValue("offset", this->settings->scope.spectrum[channel].offset); - settingsSaver->setValue("used", this->settings->scope.spectrum[channel].used); - settingsSaver->endGroup(); - } - // Vertical axis - for(int channel = 0; channel < this->settings->scope.voltage.count(); channel++) { - settingsSaver->beginGroup(QString("vertical%1").arg(channel)); - settingsSaver->setValue("gain", this->settings->scope.voltage[channel].gain); - settingsSaver->setValue("misc", this->settings->scope.voltage[channel].misc); - settingsSaver->setValue("offset", this->settings->scope.voltage[channel].offset); - settingsSaver->setValue("trigger", this->settings->scope.voltage[channel].trigger); - settingsSaver->setValue("used", this->settings->scope.voltage[channel].used); - settingsSaver->endGroup(); - } - settingsSaver->setValue("spectrumLimit", this->settings->scope.spectrumLimit); - settingsSaver->setValue("spectrumReference", this->settings->scope.spectrumReference); - settingsSaver->setValue("spectrumWindow", this->settings->scope.spectrumWindow); - settingsSaver->endGroup(); - - // View - settingsSaver->beginGroup("view"); - // Colors - if(complete) { - settingsSaver->beginGroup("color"); - DsoSettingsColorValues *colors; - for(int mode = 0; mode < 2; mode++) { - if(mode == 0) { - colors = &this->settings->view.color.screen; - settingsSaver->beginGroup("screen"); - } - else { - colors = &this->settings->view.color.print; - settingsSaver->beginGroup("print"); - } - - settingsSaver->setValue("axes", colors->axes); - settingsSaver->setValue("background", colors->background); - settingsSaver->setValue("border", colors->border); - settingsSaver->setValue("grid", colors->grid); - settingsSaver->setValue("markers", colors->markers); - for(int channel = 0; channel < this->settings->scope.spectrum.count(); channel++) - settingsSaver->setValue(QString("spectrum%1").arg(channel), colors->spectrum[channel]); - settingsSaver->setValue("text", colors->text); - for(int channel = 0; channel < this->settings->scope.voltage.count(); channel++) - settingsSaver->setValue(QString("voltage%1").arg(channel), colors->voltage[channel]); - settingsSaver->endGroup(); - } - settingsSaver->endGroup(); - } - // Other view settings - settingsSaver->setValue("digitalPhosphor", this->settings->view.digitalPhosphor); - if(complete) { - settingsSaver->setValue("interpolation", this->settings->view.interpolation); - settingsSaver->setValue("screenColorImages", this->settings->view.screenColorImages); - } - settingsSaver->setValue("zoom", this->settings->view.zoom); - settingsSaver->endGroup(); +/// \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) { + 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); - delete settingsSaver; + this->settings->options.windowPosition = this->pos(); } -/// \brief Open a existing file. -void OpenHantekMainWindow::open() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), "", "*.xml"); +/// \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.windowSize = this->size(); +} + +/// \brief Open a configuration file. +/// \return 0 on success, 1 on user abort, negative on error. +int OpenHantekMainWindow::open() { + QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), "", tr("Settings (*.ini)")); + if(!fileName.isEmpty()) - return; // TODO + return this->readSettings(fileName); + else + return 1; } -/// \brief Save the file. -/// \return true if the file was saved, false if not. -bool OpenHantekMainWindow::save() { - if (this->currentFile.isEmpty()) { +/// \brief Save the current configuration to a file. +/// \return 0 on success, negative on error. +int OpenHantekMainWindow::save() { + if (this->currentFile.isEmpty()) return saveAs(); - } else { - return false; /// \todo Saving of individual setting files - } + else + return this->writeSettings(this->currentFile); } -/// \brief Save the mapping to another filename. -/// \return true if the file was saved, false if not. -bool OpenHantekMainWindow::saveAs() { - QString fileName = QFileDialog::getSaveFileName(this, tr("Save settings..."), "", "*.xml"); +/// \brief Save the configuration to another filename. +/// \return 0 on success, 1 on user abort, negative on error. +int OpenHantekMainWindow::saveAs() { + QString fileName = QFileDialog::getSaveFileName(this, tr("Save settings"), "", tr("Settings (*.ini)")); if (fileName.isEmpty()) - return false; - - return false; /// \todo Saving of individual setting files + return 1; + + int status = this->writeSettings(fileName); + + if(status == 0) + this->currentFile = fileName; + + return status; } /// \brief The oscilloscope started sampling. @@ -654,6 +454,8 @@ void OpenHantekMainWindow::about() { /// \brief The settings have changed. void OpenHantekMainWindow::applySettings() { + this->move(this->settings->options.windowPosition); + this->resize(this->settings->options.windowSize); } /// \brief Apply new buffer size to settings. diff --git a/openhantek/src/openhantek.h b/openhantek/src/openhantek.h index 000c85e..5d6a3ff 100644 --- a/openhantek/src/openhantek.h +++ b/openhantek/src/openhantek.h @@ -67,8 +67,12 @@ class OpenHantekMainWindow : public QMainWindow { void createDockWindows(); // Settings - void readSettings(const QString &fileName = QString()); - void writeSettings(const QString &fileName = QString()); + 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; @@ -122,9 +126,9 @@ class OpenHantekMainWindow : public QMainWindow { private slots: // File operations - void open(); - bool save(); - bool saveAs(); + int open(); + int save(); + int saveAs(); // View void digitalPhosphor(bool enabled); void zoom(bool enabled); diff --git a/openhantek/src/settings.cpp b/openhantek/src/settings.cpp index 41364d3..095a9b9 100644 --- a/openhantek/src/settings.cpp +++ b/openhantek/src/settings.cpp @@ -23,6 +23,7 @@ #include +#include #include "settings.h" @@ -34,9 +35,12 @@ //////////////////////////////////////////////////////////////////////////////// // class DsoSettings /// \brief Sets the values to their defaults. -DsoSettings::DsoSettings() { +DsoSettings::DsoSettings(QWidget *parent) : QObject(parent) { // Options - this->options.alwaysSave = false; + this->options.alwaysSave = true; + this->options.imageSize = QSize(640, 480); + this->options.windowPosition = QPoint(0, 0); + this->options.windowSize = QSize(800, 560); // Oscilloscope settings // Horizontal axis @@ -86,6 +90,10 @@ DsoSettings::DsoSettings() { this->view.zoom = false; } +/// \brief Cleans up. +DsoSettings::~DsoSettings() { +} + /// \brief Set the number of channels. /// \param channels The new channel count, that will be applied to lists. void DsoSettings::setChannelCount(unsigned int channels) { @@ -169,6 +177,258 @@ void DsoSettings::setChannelCount(unsigned int channels) { this->view.color.print.spectrum.append(this->view.color.print.voltage[channels].darker()); } -/// \brief Cleans up. -DsoSettings::~DsoSettings() { +/// \brief Read the settings from the last session or another file. +/// \param fileName Optional filename to load the settings from an ini file. +/// \return 0 on success, negative on error. +int DsoSettings::load(const QString &fileName) { + // Use main configuration if the fileName wasn't set + QSettings *settingsLoader; + if(fileName.isEmpty()) + settingsLoader = new QSettings(this); + else { + settingsLoader = new QSettings(fileName, QSettings::IniFormat, this); + } + if(settingsLoader->status() != QSettings::NoError) + return -settingsLoader->status(); + + // Window size and position and other general options + settingsLoader->beginGroup("options"); + if(settingsLoader->contains("pos")) + this->options.windowPosition = settingsLoader->value("pos").toPoint(); + if(settingsLoader->contains("size")) + this->options.windowSize = settingsLoader->value("size").toSize(); + if(settingsLoader->contains("alwaysSave")) + this->options.alwaysSave = settingsLoader->value("alwaysSave").toBool(); + if(settingsLoader->contains("imageSize")) + this->options.imageSize = settingsLoader->value("imageSize").toSize(); + settingsLoader->endGroup(); + + // Oszilloskope settings + settingsLoader->beginGroup("scope"); + // Horizontal axis + settingsLoader->beginGroup("horizontal"); + if(settingsLoader->contains("format")) + this->scope.horizontal.format = (Dso::GraphFormat) settingsLoader->value("format").toInt(); + if(settingsLoader->contains("frequencybase")) + this->scope.horizontal.frequencybase = settingsLoader->value("frequencybase").toDouble(); + for(int marker = 0; marker < 2; marker++) { + QString name; + name = QString("marker%1").arg(marker); + if(settingsLoader->contains(name)) + this->scope.horizontal.marker[marker] = settingsLoader->value(name).toDouble(); + } + if(settingsLoader->contains("timebase")) + this->scope.horizontal.timebase = settingsLoader->value("timebase").toDouble(); + settingsLoader->endGroup(); + // Trigger + settingsLoader->beginGroup("trigger"); + if(settingsLoader->contains("filter")) + this->scope.trigger.filter = settingsLoader->value("filter").toBool(); + if(settingsLoader->contains("mode")) + this->scope.trigger.mode = (Dso::TriggerMode) settingsLoader->value("mode").toInt(); + if(settingsLoader->contains("position")) + this->scope.trigger.position = settingsLoader->value("position").toDouble(); + if(settingsLoader->contains("slope")) + this->scope.trigger.slope = (Dso::Slope) settingsLoader->value("slope").toInt(); + if(settingsLoader->contains("source")) + this->scope.trigger.source = settingsLoader->value("source").toInt(); + if(settingsLoader->contains("special")) + this->scope.trigger.special = settingsLoader->value("special").toInt(); + settingsLoader->endGroup(); + // Spectrum + for(int channel = 0; channel < this->scope.spectrum.count(); channel++) { + settingsLoader->beginGroup(QString("spectrum%1").arg(channel)); + if(settingsLoader->contains("magnitude")) + this->scope.spectrum[channel].magnitude = settingsLoader->value("magnitude").toDouble(); + if(settingsLoader->contains("offset")) + this->scope.spectrum[channel].offset = settingsLoader->value("offset").toDouble(); + if(settingsLoader->contains("used")) + this->scope.spectrum[channel].used = settingsLoader->value("used").toBool(); + settingsLoader->endGroup(); + } + // Vertical axis + for(int channel = 0; channel < this->scope.voltage.count(); channel++) { + settingsLoader->beginGroup(QString("vertical%1").arg(channel)); + if(settingsLoader->contains("gain")) + this->scope.voltage[channel].gain = settingsLoader->value("gain").toDouble(); + if(settingsLoader->contains("misc")) + this->scope.voltage[channel].misc = settingsLoader->value("misc").toInt(); + if(settingsLoader->contains("offset")) + this->scope.voltage[channel].offset = settingsLoader->value("offset").toDouble(); + if(settingsLoader->contains("trigger")) + this->scope.voltage[channel].trigger = settingsLoader->value("trigger").toDouble(); + if(settingsLoader->contains("used")) + this->scope.voltage[channel].used = settingsLoader->value("used").toBool(); + settingsLoader->endGroup(); + } + if(settingsLoader->contains("spectrumLimit")) + this->scope.spectrumLimit = settingsLoader->value("spectrumLimit").toDouble(); + if(settingsLoader->contains("spectrumReference")) + this->scope.spectrumReference = settingsLoader->value("spectrumReference").toDouble(); + if(settingsLoader->contains("spectrumWindow")) + this->scope.spectrumWindow = (Dso::WindowFunction) settingsLoader->value("spectrumWindow").toInt(); + settingsLoader->endGroup(); + + // View + settingsLoader->beginGroup("view"); + // Colors + settingsLoader->beginGroup("color"); + DsoSettingsColorValues *colors; + for(int mode = 0; mode < 2; mode++) { + if(mode == 0) { + colors = &this->view.color.screen; + settingsLoader->beginGroup("screen"); + } + else { + colors = &this->view.color.print; + settingsLoader->beginGroup("print"); + } + + if(settingsLoader->contains("axes")) + colors->axes = settingsLoader->value("axes").value(); + if(settingsLoader->contains("background")) + colors->background = settingsLoader->value("background").value(); + if(settingsLoader->contains("border")) + colors->border = settingsLoader->value("border").value(); + if(settingsLoader->contains("grid")) + colors->grid = settingsLoader->value("grid").value(); + if(settingsLoader->contains("markers")) + colors->markers = settingsLoader->value("markers").value(); + for(int channel = 0; channel < this->scope.spectrum.count(); channel++) { + QString key = QString("spectrum%1").arg(channel); + if(settingsLoader->contains(key)) + colors->spectrum[channel] = settingsLoader->value(key).value(); + } + if(settingsLoader->contains("text")) + colors->text = settingsLoader->value("text").value(); + for(int channel = 0; channel < this->scope.voltage.count(); channel++) { + QString key = QString("voltage%1").arg(channel); + if(settingsLoader->contains(key)) + colors->voltage[channel] = settingsLoader->value(key).value(); + } + settingsLoader->endGroup(); + } + settingsLoader->endGroup(); + // Other view settings + if(settingsLoader->contains("digitalPhosphor")) + this->view.digitalPhosphor = settingsLoader->value("digitalPhosphor").toBool(); + if(settingsLoader->contains("interpolation")) + this->view.interpolation = (Dso::InterpolationMode) settingsLoader->value("interpolation").toInt(); + if(settingsLoader->contains("screenColorImages")) + this->view.screenColorImages = (Dso::InterpolationMode) settingsLoader->value("screenColorImages").toBool(); + if(settingsLoader->contains("zoom")) + this->view.zoom = (Dso::InterpolationMode) settingsLoader->value("zoom").toBool(); + settingsLoader->endGroup(); + + delete settingsLoader; + + return 0; +} + +/// \brief Save the settings to the harddisk. +/// \param fileName Optional filename to read the settings from an ini file. +/// \return 0 on success, negative on error. +int DsoSettings::save(const QString &fileName) { + // Use main configuration and save everything if the fileName wasn't set + QSettings *settingsSaver; + bool complete = fileName.isEmpty(); + if(complete) + settingsSaver = new QSettings(this); + else + settingsSaver = new QSettings(fileName, QSettings::IniFormat, this); + if(settingsSaver->status() != QSettings::NoError) + return -settingsSaver->status(); + + if(complete) { + // Window size and position + settingsSaver->beginGroup("options"); + settingsSaver->setValue("pos", this->options.windowPosition); + settingsSaver->setValue("size", this->options.windowSize); + settingsSaver->setValue("alwaysSave", this->options.alwaysSave); + settingsSaver->setValue("imageSize", this->options.imageSize); + settingsSaver->endGroup(); + } + // Oszilloskope settings + settingsSaver->beginGroup("scope"); + // Horizontal axis + settingsSaver->beginGroup("horizontal"); + settingsSaver->setValue("format", this->scope.horizontal.format); + settingsSaver->setValue("frequencybase", this->scope.horizontal.frequencybase); + for(int marker = 0; marker < 2; marker++) + settingsSaver->setValue(QString("marker%1").arg(marker), this->scope.horizontal.marker[marker]); + settingsSaver->setValue("timebase", this->scope.horizontal.timebase); + settingsSaver->endGroup(); + // Trigger + settingsSaver->beginGroup("trigger"); + settingsSaver->setValue("filter", this->scope.trigger.filter); + settingsSaver->setValue("mode", this->scope.trigger.mode); + settingsSaver->setValue("position", this->scope.trigger.position); + settingsSaver->setValue("slope", this->scope.trigger.slope); + settingsSaver->setValue("source", this->scope.trigger.source); + settingsSaver->endGroup(); + // Spectrum + for(int channel = 0; channel < this->scope.spectrum.count(); channel++) { + settingsSaver->beginGroup(QString("spectrum%1").arg(channel)); + settingsSaver->setValue("magnitude", this->scope.spectrum[channel].magnitude); + settingsSaver->setValue("offset", this->scope.spectrum[channel].offset); + settingsSaver->setValue("used", this->scope.spectrum[channel].used); + settingsSaver->endGroup(); + } + // Vertical axis + for(int channel = 0; channel < this->scope.voltage.count(); channel++) { + settingsSaver->beginGroup(QString("vertical%1").arg(channel)); + settingsSaver->setValue("gain", this->scope.voltage[channel].gain); + settingsSaver->setValue("misc", this->scope.voltage[channel].misc); + settingsSaver->setValue("offset", this->scope.voltage[channel].offset); + settingsSaver->setValue("trigger", this->scope.voltage[channel].trigger); + settingsSaver->setValue("used", this->scope.voltage[channel].used); + settingsSaver->endGroup(); + } + settingsSaver->setValue("spectrumLimit", this->scope.spectrumLimit); + settingsSaver->setValue("spectrumReference", this->scope.spectrumReference); + settingsSaver->setValue("spectrumWindow", this->scope.spectrumWindow); + settingsSaver->endGroup(); + + // View + settingsSaver->beginGroup("view"); + // Colors + if(complete) { + settingsSaver->beginGroup("color"); + DsoSettingsColorValues *colors; + for(int mode = 0; mode < 2; mode++) { + if(mode == 0) { + colors = &this->view.color.screen; + settingsSaver->beginGroup("screen"); + } + else { + colors = &this->view.color.print; + settingsSaver->beginGroup("print"); + } + + settingsSaver->setValue("axes", colors->axes); + settingsSaver->setValue("background", colors->background); + settingsSaver->setValue("border", colors->border); + settingsSaver->setValue("grid", colors->grid); + settingsSaver->setValue("markers", colors->markers); + for(int channel = 0; channel < this->scope.spectrum.count(); channel++) + settingsSaver->setValue(QString("spectrum%1").arg(channel), colors->spectrum[channel]); + settingsSaver->setValue("text", colors->text); + for(int channel = 0; channel < this->scope.voltage.count(); channel++) + settingsSaver->setValue(QString("voltage%1").arg(channel), colors->voltage[channel]); + settingsSaver->endGroup(); + } + settingsSaver->endGroup(); + } + // Other view settings + settingsSaver->setValue("digitalPhosphor", this->view.digitalPhosphor); + if(complete) { + settingsSaver->setValue("interpolation", this->view.interpolation); + settingsSaver->setValue("screenColorImages", this->view.screenColorImages); + } + settingsSaver->setValue("zoom", this->view.zoom); + settingsSaver->endGroup(); + + delete settingsSaver; + + return 0; } diff --git a/openhantek/src/settings.h b/openhantek/src/settings.h index 2bcc4e2..fe31c02 100644 --- a/openhantek/src/settings.h +++ b/openhantek/src/settings.h @@ -29,6 +29,9 @@ #include #include +#include +#include +#include #include @@ -40,6 +43,9 @@ /// \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 }; //////////////////////////////////////////////////////////////////////////////// @@ -141,9 +147,11 @@ struct DsoSettingsView { //////////////////////////////////////////////////////////////////////////////// /// \class DsoSettings settings.h /// \brief Holds the settings of the program. -class DsoSettings { +class DsoSettings : public QObject { + Q_OBJECT + public: - DsoSettings(); + DsoSettings(QWidget *parent = 0); ~DsoSettings(); void setChannelCount(unsigned int channels); @@ -151,6 +159,11 @@ class DsoSettings { DsoSettingsOptions options; ///< General options of the program DsoSettingsScope scope; ///< All oscilloscope related settings DsoSettingsView view; ///< All view related settings + + public slots: + // Saving to and loading from configuration files + int load(const QString &fileName = QString()); + int save(const QString &fileName = QString()); }; -- libgit2 0.21.4