From 51d4a9ab96a6bf64a1fcd1700e7e174498d4c118 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Mon, 7 Oct 2013 19:10:40 +0100 Subject: [PATCH] Split DeviceOptions dialog into two popups: DeviceOptions and Probes --- CMakeLists.txt | 6 +- pv/popups/deviceoptions.cpp | 53 +++++++++ pv/popups/deviceoptions.h | 54 +++++++++ .../deviceoptions.cpp => popups/probes.cpp} | 105 ++++++------------ .../deviceoptions.h => popups/probes.h} | 39 ++----- pv/toolbars/samplingbar.cpp | 29 +++-- pv/toolbars/samplingbar.h | 7 +- 7 files changed, 176 insertions(+), 117 deletions(-) create mode 100644 pv/popups/deviceoptions.cpp create mode 100644 pv/popups/deviceoptions.h rename pv/{dialogs/deviceoptions.cpp => popups/probes.cpp} (57%) rename pv/{dialogs/deviceoptions.h => popups/probes.h} (64%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 945b40cd..43208aae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,7 +115,8 @@ set(pulseview_SOURCES pv/dialogs/about.cpp pv/dialogs/connect.cpp pv/dialogs/decoder.cpp - pv/dialogs/deviceoptions.cpp + pv/popups/deviceoptions.cpp + pv/popups/probes.cpp pv/prop/bool.cpp pv/prop/double.cpp pv/prop/enum.cpp @@ -156,7 +157,8 @@ set(pulseview_HEADERS pv/data/decoder.h pv/dialogs/about.h pv/dialogs/connect.h - pv/dialogs/deviceoptions.h + pv/popups/deviceoptions.h + pv/popups/probes.h pv/toolbars/samplingbar.h pv/view/cursor.h pv/view/decodesignal.h diff --git a/pv/popups/deviceoptions.cpp b/pv/popups/deviceoptions.cpp new file mode 100644 index 00000000..c864865f --- /dev/null +++ b/pv/popups/deviceoptions.cpp @@ -0,0 +1,53 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2012 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "deviceoptions.h" + +#include + +#include +#include + +#include + +using namespace boost; +using namespace std; + +namespace pv { +namespace popups { + +DeviceOptions::DeviceOptions(sr_dev_inst *sdi, QWidget *parent) : + Popup(parent), + _sdi(sdi), + _layout(this), + _binding(sdi) +{ + setLayout(&_layout); + + _layout.addWidget(_binding.get_property_form(this)); +} + +void DeviceOptions::closeEvent(QCloseEvent*) +{ + _binding.commit(); +} + +} // namespace popups +} // namespace pv diff --git a/pv/popups/deviceoptions.h b/pv/popups/deviceoptions.h new file mode 100644 index 00000000..50fc4fba --- /dev/null +++ b/pv/popups/deviceoptions.h @@ -0,0 +1,54 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2012 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PULSEVIEW_PV_POPUPS_DEVICEOPTIONS_H +#define PULSEVIEW_PV_POPUPS_DEVICEOPTIONS_H + +#include +#include + +#include +#include + +namespace pv { +namespace popups { + +class DeviceOptions : public pv::widgets::Popup +{ + Q_OBJECT + +public: + DeviceOptions(sr_dev_inst *sdi, QWidget *parent); + +private: + void closeEvent(QCloseEvent*); + +private: + sr_dev_inst *const _sdi; + + QVBoxLayout _layout; + + pv::prop::binding::DeviceOptions _binding; +}; + +} // namespace popups +} // namespace pv + +#endif // PULSEVIEW_PV_POPUPS_DEVICEOPTIONS_H diff --git a/pv/dialogs/deviceoptions.cpp b/pv/popups/probes.cpp similarity index 57% rename from pv/dialogs/deviceoptions.cpp rename to pv/popups/probes.cpp index fe21c9a4..9684d435 100644 --- a/pv/dialogs/deviceoptions.cpp +++ b/pv/popups/probes.cpp @@ -18,50 +18,32 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "deviceoptions.h" +#include "probes.h" -#include - -#include -#include - -#include - -using namespace boost; -using namespace std; +using namespace Qt; namespace pv { -namespace dialogs { +namespace popups { -DeviceOptions::DeviceOptions(QWidget *parent, struct sr_dev_inst *sdi) : - QDialog(parent), +Probes::Probes(sr_dev_inst *sdi, QWidget *parent) : + Popup(parent), _sdi(sdi), _layout(this), - _probes_box(tr("Probes"), this), _probes(this), _probes_bar(this), _enable_all_probes(this), - _disable_all_probes(this), - _props_box(tr("Configuration"), this), - _button_box(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, - Qt::Horizontal, this), - _device_options_binding(sdi) + _disable_all_probes(this) { - setWindowTitle(tr("Configure Device")); + assert(_sdi); + + setLayout(&_layout); connect(&_enable_all_probes, SIGNAL(clicked()), this, SLOT(enable_all_probes())); connect(&_disable_all_probes, SIGNAL(clicked()), this, SLOT(disable_all_probes())); - connect(&_button_box, SIGNAL(accepted()), this, SLOT(accept())); - connect(&_button_box, SIGNAL(rejected()), this, SLOT(reject())); - - setLayout(&_layout); - - setup_probes(); - _probes_box.setLayout(&_probes_box_layout); - _probes_box_layout.addWidget(&_probes); + _layout.addWidget(&_probes); _enable_all_probes.setText(tr("Enable All")); _probes_bar.addWidget(&_enable_all_probes); @@ -69,41 +51,7 @@ DeviceOptions::DeviceOptions(QWidget *parent, struct sr_dev_inst *sdi) : _disable_all_probes.setText(tr("Disable All")); _probes_bar.addWidget(&_disable_all_probes); - _probes_box_layout.addWidget(&_probes_bar); - _layout.addWidget(&_probes_box); - - - _props_box.setLayout(&_props_box_layout); - _props_box_layout.addWidget( - _device_options_binding.get_property_form(this)); - _layout.addWidget(&_props_box); - - _layout.addWidget(&_button_box); -} - -void DeviceOptions::accept() -{ - using namespace Qt; - - QDialog::accept(); - - // Commit the probes - for (int i = 0; i < _probes.count(); i++) { - const QListWidgetItem *const item = _probes.item(i); - assert(item); - sr_probe *const probe = (sr_probe*) - item->data(UserRole).value(); - assert(probe); - probe->enabled = item->checkState() == Checked; - } - - // Commit the properties - _device_options_binding.commit(); -} - -void DeviceOptions::setup_probes() -{ - using namespace Qt; + _layout.addWidget(&_probes_bar); for (const GSList *l = _sdi->probes; l; l = l->next) { sr_probe *const probe = (sr_probe*)l->data; @@ -111,32 +59,49 @@ void DeviceOptions::setup_probes() QListWidgetItem *const item = new QListWidgetItem( probe->name, &_probes); assert(item); - item->setCheckState(probe->enabled ? - Checked : Unchecked); item->setData(UserRole, qVariantFromValue((void*)probe)); + item->setCheckState(probe->enabled ? + Checked : Unchecked); _probes.addItem(item); } + + connect(&_probes, SIGNAL(itemChanged(QListWidgetItem*)), + this, SLOT(item_changed(QListWidgetItem*))); } -void DeviceOptions::set_all_probes(bool set) +void Probes::set_all_probes(bool set) { for (int i = 0; i < _probes.count(); i++) { QListWidgetItem *const item = _probes.item(i); assert(item); item->setCheckState(set ? Qt::Checked : Qt::Unchecked); + + sr_probe *const probe = (sr_probe*) + item->data(UserRole).value(); + assert(probe); + probe->enabled = item->checkState() == Checked; } } -void DeviceOptions::enable_all_probes() +void Probes::item_changed(QListWidgetItem *item) +{ + assert(item); + sr_probe *const probe = (sr_probe*) + item->data(UserRole).value(); + assert(probe); + probe->enabled = item->checkState() == Checked; +} + +void Probes::enable_all_probes() { set_all_probes(true); } -void DeviceOptions::disable_all_probes() +void Probes::disable_all_probes() { set_all_probes(false); } -} // namespace dialogs -} // namespace pv +} // popups +} // pv diff --git a/pv/dialogs/deviceoptions.h b/pv/popups/probes.h similarity index 64% rename from pv/dialogs/deviceoptions.h rename to pv/popups/probes.h index 059d336e..33f5d996 100644 --- a/pv/dialogs/deviceoptions.h +++ b/pv/popups/probes.h @@ -18,62 +18,47 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef PULSEVIEW_PV_DEVICEOPTIONS_H -#define PULSEVIEW_PV_DEVICEOPTIONS_H +#ifndef PULSEVIEW_PV_POPUPS_PROBES_H +#define PULSEVIEW_PV_POPUPS_PROBES_H -#include -#include -#include #include #include #include #include -#include +#include namespace pv { -namespace dialogs { +namespace popups { -class DeviceOptions : public QDialog +class Probes : public pv::widgets::Popup { Q_OBJECT public: - DeviceOptions(QWidget *parent, struct sr_dev_inst *sdi); - -protected: - void accept(); + Probes(sr_dev_inst *sdi, QWidget *parent); private: - void setup_probes(); - void set_all_probes(bool set); private slots: + void item_changed(QListWidgetItem *item); + void enable_all_probes(); void disable_all_probes(); private: - struct sr_dev_inst *const _sdi; + sr_dev_inst *_sdi; QVBoxLayout _layout; - QGroupBox _probes_box; - QVBoxLayout _probes_box_layout; QListWidget _probes; QToolBar _probes_bar; QToolButton _enable_all_probes; QToolButton _disable_all_probes; - - QGroupBox _props_box; - QVBoxLayout _props_box_layout; - - QDialogButtonBox _button_box; - - pv::prop::binding::DeviceOptions _device_options_binding; }; -} // namespace dialogs -} // namespace pv +} // popups +} // pv -#endif // PULSEVIEW_PV_DEVICEOPTIONS_H +#endif // PULSEVIEW_PV_POPUPS_PROBES_H diff --git a/pv/toolbars/samplingbar.cpp b/pv/toolbars/samplingbar.cpp index 7d94594c..ae4f298b 100644 --- a/pv/toolbars/samplingbar.cpp +++ b/pv/toolbars/samplingbar.cpp @@ -32,7 +32,7 @@ #include "samplingbar.h" #include -#include +#include using namespace std; @@ -68,6 +68,7 @@ SamplingBar::SamplingBar(QWidget *parent) : QToolBar("Sampling Bar", parent), _device_selector(this), _configure_button(this), + _probes_button(this), _record_length_selector(this), _sample_rate_list(this), _icon_red(":/icons/status-red.svg"), @@ -79,8 +80,6 @@ SamplingBar::SamplingBar(QWidget *parent) : this, SLOT(on_run_stop())); connect(&_device_selector, SIGNAL(currentIndexChanged (int)), this, SLOT(on_device_selected())); - connect(&_configure_button, SIGNAL(clicked()), - this, SLOT(on_configure())); _sample_rate_value.setDecimals(0); _sample_rate_value.setSuffix("Hz"); @@ -101,11 +100,14 @@ SamplingBar::SamplingBar(QWidget *parent) : _configure_button.setIcon(QIcon::fromTheme("configure", QIcon(":/icons/configure.png"))); + _probes_button.setIcon(QIcon::fromTheme("probes", + QIcon(":/icons/probes.svg"))); _run_stop_button.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); addWidget(&_device_selector); addWidget(&_configure_button); + addWidget(&_probes_button); addWidget(&_record_length_selector); _sample_rate_list_action = addWidget(&_sample_rate_list); _sample_rate_value_action = addWidget(&_sample_rate_value); @@ -292,7 +294,15 @@ void SamplingBar::commit_sample_rate() void SamplingBar::on_device_selected() { + using namespace pv::popups; + update_sample_rate_selector(); + + sr_dev_inst *const sdi = get_selected_device(); + + _configure_button.set_popup(new DeviceOptions(sdi, this)); + _probes_button.set_popup(new Probes(sdi, this)); + device_selected(); } @@ -301,19 +311,6 @@ void SamplingBar::on_sample_rate_changed() commit_sample_rate(); } -void SamplingBar::on_configure() -{ - commit_sample_rate(); - - sr_dev_inst *const sdi = get_selected_device(); - assert(sdi); - - pv::dialogs::DeviceOptions dlg(this, sdi); - dlg.exec(); - - update_sample_rate_selector_value(); -} - void SamplingBar::on_run_stop() { commit_sample_rate(); diff --git a/pv/toolbars/samplingbar.h b/pv/toolbars/samplingbar.h index 1f40d045..0c1a0539 100644 --- a/pv/toolbars/samplingbar.h +++ b/pv/toolbars/samplingbar.h @@ -31,6 +31,8 @@ #include #include +#include +#include struct st_dev_inst; class QAction; @@ -71,12 +73,13 @@ private: private slots: void on_device_selected(); void on_sample_rate_changed(); - void on_configure(); void on_run_stop(); private: QComboBox _device_selector; - QToolButton _configure_button; + + pv::widgets::PopupToolButton _configure_button; + pv::widgets::PopupToolButton _probes_button; QComboBox _record_length_selector; -- 2.30.2