]> sigrok.org Git - pulseview.git/blobdiff - pv/toolbars/samplingbar.cpp
icons: Added menu icon
[pulseview.git] / pv / toolbars / samplingbar.cpp
index 14990d81567704843fc08f05d7fb0ca17a40e430..710f3128af727cf4ef51ce90178d6efaa94f3ab6 100644 (file)
 #include <QHelpEvent>
 #include <QToolTip>
 
-#include "samplingbar.h"
+#include "samplingbar.hpp"
 
-#include <pv/devicemanager.h>
-#include <pv/popups/deviceoptions.h>
-#include <pv/popups/channels.h>
-#include <pv/util.h>
+#include <pv/devicemanager.hpp>
+#include <pv/mainwindow.hpp>
+#include <pv/popups/deviceoptions.hpp>
+#include <pv/popups/channels.hpp>
+#include <pv/util.hpp>
 
 #include <libsigrok/libsigrok.hpp>
 
@@ -55,108 +56,110 @@ const uint64_t SamplingBar::MinSampleCount = 100ULL;
 const uint64_t SamplingBar::MaxSampleCount = 1000000000000ULL;
 const uint64_t SamplingBar::DefaultSampleCount = 1000000;
 
-SamplingBar::SamplingBar(SigSession &session, QWidget *parent) :
-       QToolBar("Sampling Bar", parent),
-       _session(session),
-       _device_selector(this),
-       _updating_device_selector(false),
-       _configure_button(this),
-       _configure_button_action(NULL),
-       _channels_button(this),
-       _sample_count(" samples", this),
-       _sample_rate("Hz", this),
-       _updating_sample_rate(false),
-       _updating_sample_count(false),
-       _sample_count_supported(false),
-       _icon_red(":/icons/status-red.svg"),
-       _icon_green(":/icons/status-green.svg"),
-       _icon_grey(":/icons/status-grey.svg"),
-       _run_stop_button(this)
+SamplingBar::SamplingBar(Session &session, MainWindow &main_window) :
+       QToolBar("Sampling Bar", &main_window),
+       session_(session),
+       main_window_(main_window),
+       device_selector_(this),
+       updating_device_selector_(false),
+       configure_button_(this),
+       configure_button_action_(NULL),
+       channels_button_(this),
+       sample_count_(" samples", this),
+       sample_rate_("Hz", this),
+       updating_sample_rate_(false),
+       updating_sample_count_(false),
+       sample_count_supported_(false),
+       icon_red_(":/icons/status-red.svg"),
+       icon_green_(":/icons/status-green.svg"),
+       icon_grey_(":/icons/status-grey.svg"),
+       run_stop_button_(this)
 {
        setObjectName(QString::fromUtf8("SamplingBar"));
 
-       connect(&_run_stop_button, SIGNAL(clicked()),
+       connect(&run_stop_button_, SIGNAL(clicked()),
                this, SLOT(on_run_stop()));
-       connect(&_device_selector, SIGNAL(currentIndexChanged (int)),
+       connect(&device_selector_, SIGNAL(currentIndexChanged (int)),
                this, SLOT(on_device_selected()));
-       connect(&_sample_count, SIGNAL(value_changed()),
+       connect(&sample_count_, SIGNAL(value_changed()),
                this, SLOT(on_sample_count_changed()));
-       connect(&_sample_rate, SIGNAL(value_changed()),
+       connect(&sample_rate_, SIGNAL(value_changed()),
                this, SLOT(on_sample_rate_changed()));
 
-       _sample_count.show_min_max_step(0, UINT64_MAX, 1);
+       sample_count_.show_min_max_step(0, UINT64_MAX, 1);
 
-       set_capture_state(pv::SigSession::Stopped);
+       set_capture_state(pv::Session::Stopped);
 
-       _configure_button.setIcon(QIcon::fromTheme("configure",
+       configure_button_.setIcon(QIcon::fromTheme("configure",
                QIcon(":/icons/configure.png")));
 
-       _channels_button.setIcon(QIcon::fromTheme("channels",
+       channels_button_.setIcon(QIcon::fromTheme("channels",
                QIcon(":/icons/channels.svg")));
 
-       _run_stop_button.setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+       run_stop_button_.setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
 
-       addWidget(&_device_selector);
-       _configure_button_action = addWidget(&_configure_button);
-       addWidget(&_channels_button);
-       addWidget(&_sample_count);
-       addWidget(&_sample_rate);
+       addWidget(&device_selector_);
+       configure_button_action_ = addWidget(&configure_button_);
+       addWidget(&channels_button_);
+       addWidget(&sample_count_);
+       addWidget(&sample_rate_);
 
-       addWidget(&_run_stop_button);
+       addWidget(&run_stop_button_);
 
-       _sample_count.installEventFilter(this);
-       _sample_rate.installEventFilter(this);
+       sample_count_.installEventFilter(this);
+       sample_rate_.installEventFilter(this);
 }
 
 void SamplingBar::set_device_list(
-       const std::list< std::pair<std::shared_ptr<sigrok::Device>, std::string> > &devices,
+       const std::list< std::shared_ptr<sigrok::Device> > &devices,
        shared_ptr<Device> selected)
 {
        int selected_index = -1;
 
        assert(selected);
 
-       _updating_device_selector = true;
+       updating_device_selector_ = true;
 
-       _device_selector.clear();
-
-       for (auto entry : devices) {
-               auto device = entry.first;
-               auto display_name = entry.second;
+       device_selector_.clear();
 
+       for (auto device : devices) {
                assert(device);
 
+               string display_name =
+                       session_.device_manager().get_display_name(device);
+
                if (selected == device)
-                       selected_index = _device_selector.count();
+                       selected_index = device_selector_.count();
 
-               _device_selector.addItem(display_name.c_str(),
+               device_selector_.addItem(display_name.c_str(),
                        qVariantFromValue(device));
        }
 
        // The selected device should have been in the list
        assert(selected_index != -1);
-       _device_selector.setCurrentIndex(selected_index);
+       device_selector_.setCurrentIndex(selected_index);
 
        update_device_config_widgets();
 
-       _updating_device_selector = false;
+       updating_device_selector_ = false;
 }
 
 shared_ptr<Device> SamplingBar::get_selected_device() const
 {
-       const int index = _device_selector.currentIndex();
+       const int index = device_selector_.currentIndex();
        if (index < 0)
                return shared_ptr<Device>();
 
-       return _device_selector.itemData(index).value<shared_ptr<Device>>();
+       return device_selector_.itemData(index).value<shared_ptr<Device>>();
 }
 
-void SamplingBar::set_capture_state(pv::SigSession::capture_state state)
+void SamplingBar::set_capture_state(pv::Session::capture_state state)
 {
-       const QIcon *icons[] = {&_icon_grey, &_icon_red, &_icon_green};
-       _run_stop_button.setIcon(*icons[state]);
-       _run_stop_button.setText((state == pv::SigSession::Stopped) ?
+       const QIcon *icons[] = {&icon_grey_, &icon_red_, &icon_green_};
+       run_stop_button_.setIcon(*icons[state]);
+       run_stop_button_.setText((state == pv::Session::Stopped) ?
                tr("Run") : tr("Stop"));
+       run_stop_button_.setShortcut(QKeySequence(Qt::Key_Space));
 }
 
 void SamplingBar::update_sample_rate_selector()
@@ -166,21 +169,33 @@ void SamplingBar::update_sample_rate_selector()
        const uint64_t *elements = NULL;
        gsize num_elements;
 
-       if (_updating_sample_rate)
+       if (updating_sample_rate_)
                return;
 
        const shared_ptr<Device> device = get_selected_device();
        if (!device)
                return;
 
-       assert(!_updating_sample_rate);
-       _updating_sample_rate = true;
+       assert(!updating_sample_rate_);
+       updating_sample_rate_ = true;
 
-       try {
-               gvar_dict = device->config_list(ConfigKey::SAMPLERATE);
-       } catch (Error error) {
-               _sample_rate.show_none();
-               _updating_sample_rate = false;
+       const auto keys = device->config_keys(ConfigKey::DEVICE_OPTIONS);
+       const auto iter = keys.find(ConfigKey::SAMPLERATE);
+       if (iter != keys.end() &&
+               (*iter).second.find(sigrok::LIST) != (*iter).second.end()) {
+               const auto keys = device->config_keys(
+                       ConfigKey::DEVICE_OPTIONS);
+               try {
+                       gvar_dict = device->config_list(ConfigKey::SAMPLERATE);
+               } catch(const sigrok::Error &e) {
+                       // Failed to enunmerate samplerate
+                       (void)e;
+               }
+       }
+
+       if (!gvar_dict) {
+               sample_rate_.show_none();
+               updating_sample_rate_ = false;
                return;
        }
 
@@ -202,14 +217,14 @@ void SamplingBar::update_sample_rate_selector()
                assert(step > 0);
 
                if (step == 1)
-                       _sample_rate.show_125_list(min, max);
+                       sample_rate_.show_125_list(min, max);
                else
                {
                        // When the step is not 1, we cam't make a 1-2-5-10
                        // list of sample rates, because we may not be able to
                        // make round numbers. Therefore in this case, show a
                        // spin box.
-                       _sample_rate.show_min_max_step(min, max, step);
+                       sample_rate_.show_min_max_step(min, max, step);
                }
        }
        else if ((gvar_list = g_variant_lookup_value(gvar_dict.gobj(),
@@ -217,17 +232,17 @@ void SamplingBar::update_sample_rate_selector()
        {
                elements = (const uint64_t *)g_variant_get_fixed_array(
                                gvar_list, &num_elements, sizeof(uint64_t));
-               _sample_rate.show_list(elements, num_elements);
+               sample_rate_.show_list(elements, num_elements);
                g_variant_unref(gvar_list);
        }
-       _updating_sample_rate = false;
+       updating_sample_rate_ = false;
 
        update_sample_rate_selector_value();
 }
 
 void SamplingBar::update_sample_rate_selector_value()
 {
-       if (_updating_sample_rate)
+       if (updating_sample_rate_)
                return;
 
        const shared_ptr<Device> device = get_selected_device();
@@ -237,11 +252,11 @@ void SamplingBar::update_sample_rate_selector_value()
        try {
                auto gvar = device->config_get(ConfigKey::SAMPLERATE);
                uint64_t samplerate =
-                       Glib::VariantBase::cast_dynamic<Glib::Variant<uint64_t>>(gvar).get();
-               assert(!_updating_sample_rate);
-               _updating_sample_rate = true;
-               _sample_rate.set_value(samplerate);
-               _updating_sample_rate = false;
+                       Glib::VariantBase::cast_dynamic<Glib::Variant<guint64>>(gvar).get();
+               assert(!updating_sample_rate_);
+               updating_sample_rate_ = true;
+               sample_rate_.set_value(samplerate);
+               updating_sample_rate_ = false;
        } catch (Error error) {
                qDebug() << "WARNING: Failed to get value of sample rate";
                return;
@@ -250,52 +265,64 @@ void SamplingBar::update_sample_rate_selector_value()
 
 void SamplingBar::update_sample_count_selector()
 {
-       if (_updating_sample_count)
+       if (updating_sample_count_)
                return;
 
        const shared_ptr<Device> device = get_selected_device();
        if (!device)
                return;
 
-       assert(!_updating_sample_count);
-       _updating_sample_count = true;
+       assert(!updating_sample_count_);
+       updating_sample_count_ = true;
 
-       if (_sample_count_supported)
+       if (!sample_count_supported_)
        {
-               uint64_t sample_count = _sample_count.value();
-               uint64_t min_sample_count = 0;
-               uint64_t max_sample_count = MaxSampleCount;
+               sample_count_.show_none();
+               updating_sample_count_ = false;
+               return;
+       }
 
-               if (sample_count == 0)
-                       sample_count = DefaultSampleCount;
+       uint64_t sample_count = sample_count_.value();
+       uint64_t min_sample_count = 0;
+       uint64_t max_sample_count = MaxSampleCount;
 
+       if (sample_count == 0)
+               sample_count = DefaultSampleCount;
+
+       const auto keys = device->config_keys(ConfigKey::DEVICE_OPTIONS);
+       const auto iter = keys.find(ConfigKey::LIMIT_SAMPLES);
+       if (iter != keys.end() &&
+               (*iter).second.find(sigrok::LIST) != (*iter).second.end()) {
                try {
-                       auto gvar = device->config_list(ConfigKey::LIMIT_SAMPLES);
-                       g_variant_get(gvar.gobj(), "(tt)",
-                               &min_sample_count, &max_sample_count);
-               } catch (Error error) {}
+                       auto gvar =
+                               device->config_list(ConfigKey::LIMIT_SAMPLES);
+                       if (gvar)
+                               g_variant_get(gvar.gobj(), "(tt)",
+                                       &min_sample_count, &max_sample_count);
+               } catch(const sigrok::Error &e) {
+                       // Failed to query sample limit
+                       (void)e;
+               }
+       }
 
-               min_sample_count = min(max(min_sample_count, MinSampleCount),
-                       max_sample_count);
+       min_sample_count = min(max(min_sample_count, MinSampleCount),
+               max_sample_count);
 
-               _sample_count.show_125_list(
-                       min_sample_count, max_sample_count);
+       sample_count_.show_125_list(
+               min_sample_count, max_sample_count);
 
-               try {
-                       auto gvar = device->config_get(ConfigKey::LIMIT_SAMPLES);
-                       sample_count = g_variant_get_uint64(gvar.gobj());
-                       if (sample_count == 0)
-                               sample_count = DefaultSampleCount;
-                       sample_count = min(max(sample_count, MinSampleCount),
-                               max_sample_count);
-               } catch (Error error) {}
-
-               _sample_count.set_value(sample_count);
-       }
-       else
-               _sample_count.show_none();
+       try {
+               auto gvar = device->config_get(ConfigKey::LIMIT_SAMPLES);
+               sample_count = g_variant_get_uint64(gvar.gobj());
+               if (sample_count == 0)
+                       sample_count = DefaultSampleCount;
+               sample_count = min(max(sample_count, MinSampleCount),
+                       max_sample_count);
+       } catch (Error error) {}
+
+       sample_count_.set_value(sample_count);
 
-       _updating_sample_count = false;
+       updating_sample_count_ = false;
 }
 
 void SamplingBar::update_device_config_widgets()
@@ -308,16 +335,16 @@ void SamplingBar::update_device_config_widgets()
 
        // Update the configure popup
        DeviceOptions *const opts = new DeviceOptions(device, this);
-       _configure_button_action->setVisible(
+       configure_button_action_->setVisible(
                !opts->binding().properties().empty());
-       _configure_button.set_popup(opts);
+       configure_button_.set_popup(opts);
 
        // Update the channels popup
-       Channels *const channels = new Channels(_session, this);
-       _channels_button.set_popup(channels);
+       Channels *const channels = new Channels(session_, this);
+       channels_button_.set_popup(channels);
 
        // Update supported options.
-       _sample_count_supported = false;
+       sample_count_supported_ = false;
 
        try {
                for (auto entry : device->config_keys(ConfigKey::DEVICE_OPTIONS))
@@ -327,13 +354,13 @@ void SamplingBar::update_device_config_widgets()
                        switch (key->id()) {
                        case SR_CONF_LIMIT_SAMPLES:
                                if (capabilities.count(Capability::SET))
-                                       _sample_count_supported = true;
+                                       sample_count_supported_ = true;
                                break;
                        case SR_CONF_LIMIT_FRAMES:
                                if (capabilities.count(Capability::SET))
                                {
                                        device->config_set(ConfigKey::LIMIT_FRAMES,
-                                               Glib::Variant<uint64_t>::create(1));
+                                               Glib::Variant<guint64>::create(1));
                                        on_config_changed();
                                }
                                break;
@@ -357,71 +384,71 @@ void SamplingBar::commit_sample_count()
 {
        uint64_t sample_count = 0;
 
-       if (_updating_sample_count)
+       if (updating_sample_count_)
                return;
 
        const shared_ptr<Device> device = get_selected_device();
        if (!device)
                return;
 
-       sample_count = _sample_count.value();
+       sample_count = sample_count_.value();
 
        // Set the sample count
-       assert(!_updating_sample_count);
-       _updating_sample_count = true;
-       if (_sample_count_supported)
+       assert(!updating_sample_count_);
+       updating_sample_count_ = true;
+       if (sample_count_supported_)
        {
                try {
                        device->config_set(ConfigKey::LIMIT_SAMPLES,
-                               Glib::Variant<uint64_t>::create(sample_count));
+                               Glib::Variant<guint64>::create(sample_count));
                        on_config_changed();
                } catch (Error error) {
                        qDebug() << "Failed to configure sample count.";
                        return;
                }
        }
-       _updating_sample_count = false;
+       updating_sample_count_ = false;
 }
 
 void SamplingBar::commit_sample_rate()
 {
        uint64_t sample_rate = 0;
 
-       if (_updating_sample_rate)
+       if (updating_sample_rate_)
                return;
 
        const shared_ptr<Device> device = get_selected_device();
        if (!device)
                return;
 
-       sample_rate = _sample_rate.value();
+       sample_rate = sample_rate_.value();
        if (sample_rate == 0)
                return;
 
        // Set the samplerate
-       assert(!_updating_sample_rate);
-       _updating_sample_rate = true;
+       assert(!updating_sample_rate_);
+       updating_sample_rate_ = true;
        try {
                device->config_set(ConfigKey::SAMPLERATE,
-                       Glib::Variant<uint64_t>::create(sample_rate));
+                       Glib::Variant<guint64>::create(sample_rate));
                on_config_changed();
        } catch (Error error) {
                qDebug() << "Failed to configure samplerate.";
                return;
        }
-       _updating_sample_rate = false;
+       updating_sample_rate_ = false;
 }
 
 void SamplingBar::on_device_selected()
 {
-       if (_updating_device_selector)
+       if (updating_device_selector_)
                return;
 
        shared_ptr<Device> device = get_selected_device();
        if (!device)
                return;
 
-       _session.set_device(device);
+       main_window_.select_device(device);
 
        update_device_config_widgets();
 }
@@ -440,7 +467,7 @@ void SamplingBar::on_run_stop()
 {
        commit_sample_count();
        commit_sample_rate();   
-       run_stop();
+       main_window_.run_stop();
 }
 
 void SamplingBar::on_config_changed()
@@ -453,9 +480,9 @@ void SamplingBar::on_config_changed()
 
 bool SamplingBar::eventFilter(QObject *watched, QEvent *event)
 {
-       if ((watched == &_sample_count || watched == &_sample_rate) &&
+       if ((watched == &sample_count_ || watched == &sample_rate_) &&
                (event->type() == QEvent::ToolTip)) {
-               double sec = (double)_sample_count.value() / _sample_rate.value();
+               double sec = (double)sample_count_.value() / sample_rate_.value();
                QHelpEvent *help_event = static_cast<QHelpEvent*>(event);
 
                QString str = tr("Total sampling time: %1").arg(pv::util::format_second(sec));