Channel popup: Don't disable channels when clicking the enable buttons
[pulseview.git] / pv / popups / channels.cpp
index fdb97728f59fe080506c81ecd9acbae0039f3d6d..ffe42fd8ea21717444c6294d5d3d89758d18189f 100644 (file)
@@ -24,6 +24,7 @@
 #include <QFontMetrics>
 #include <QFormLayout>
 #include <QGridLayout>
+#include <QHBoxLayout>
 #include <QLabel>
 
 #include "channels.hpp"
@@ -57,12 +58,12 @@ Channels::Channels(Session &session, QWidget *parent) :
        Popup(parent),
        session_(session),
        updating_channels_(false),
-       enable_all_channels_(tr("Enable All"), this),
-       disable_all_channels_(tr("Disable All"), this),
-       enable_all_logic_channels_(tr("Enable only logic"), this),
-       enable_all_analog_channels_(tr("Enable only analog"), this),
-       enable_all_named_channels_(tr("Enable only named"), this),
-       enable_all_changing_channels_(tr("Enable only changing"), this),
+       enable_all_channels_(tr("All"), this),
+       disable_all_channels_(tr("All"), this),
+       enable_all_logic_channels_(tr("Logic"), this),
+       enable_all_analog_channels_(tr("Analog"), this),
+       enable_all_named_channels_(tr("Named"), this),
+       enable_all_changing_channels_(tr("Changing"), this),
        check_box_mapper_(this)
 {
        // Create the layout
@@ -100,16 +101,23 @@ Channels::Channels(Session &session, QWidget *parent) :
        }
 
        // Make a vector of the remaining channels
-       vector< shared_ptr<SignalBase> > global_sigs;
+       vector< shared_ptr<SignalBase> > global_analog_sigs, global_logic_sigs;
        for (auto channel : device->channels()) {
                const map<shared_ptr<Channel>, shared_ptr<SignalBase> >::
                        const_iterator iter = signal_map.find(channel);
-               if (iter != signal_map.end())
-                       global_sigs.push_back((*iter).second);
+
+               if (iter != signal_map.end()) {
+                       const shared_ptr<SignalBase> signal = (*iter).second;
+                       if (signal->type() == SignalBase::AnalogChannel)
+                               global_analog_sigs.push_back(signal);
+                       else
+                               global_logic_sigs.push_back(signal);
+               }
        }
 
-       // Create a group
-       populate_group(nullptr, global_sigs);
+       // Create the groups for the ungrouped channels
+       populate_group(nullptr, global_logic_sigs);
+       populate_group(nullptr, global_analog_sigs);
 
        // Create the enable/disable all buttons
        connect(&enable_all_channels_, SIGNAL(clicked()), this, SLOT(enable_all_channels()));
@@ -120,13 +128,17 @@ Channels::Channels(Session &session, QWidget *parent) :
        connect(&enable_all_changing_channels_, SIGNAL(clicked()),
                this, SLOT(enable_all_changing_channels()));
 
-       buttons_bar_.setRowMinimumHeight(0, 2 * QFontMetrics(QApplication::font()).height());
-       buttons_bar_.addWidget(&enable_all_channels_, 1, 0);
-       buttons_bar_.addWidget(&disable_all_channels_, 1, 1);
-       buttons_bar_.addWidget(&enable_all_logic_channels_, 2, 0);
-       buttons_bar_.addWidget(&enable_all_analog_channels_, 2, 1);
-       buttons_bar_.addWidget(&enable_all_named_channels_, 2, 2);
-       buttons_bar_.addWidget(&enable_all_changing_channels_, 2, 3);
+       QLabel *label1 = new QLabel(tr("Disable: "));
+       buttons_bar_.addWidget(label1);
+       buttons_bar_.addWidget(&disable_all_channels_);
+       QLabel *label2 = new QLabel(tr("Enable: "));
+       buttons_bar_.addWidget(label2);
+       buttons_bar_.addWidget(&enable_all_channels_);
+       buttons_bar_.addWidget(&enable_all_logic_channels_);
+       buttons_bar_.addWidget(&enable_all_analog_channels_);
+       buttons_bar_.addWidget(&enable_all_named_channels_);
+       buttons_bar_.addWidget(&enable_all_changing_channels_);
+       buttons_bar_.addStretch();
 
        layout_.addRow(&buttons_bar_);
 
@@ -151,7 +163,7 @@ void Channels::set_all_channels(bool set)
        updating_channels_ = false;
 }
 
-void Channels::set_all_channels_conditionally(
+void Channels::enable_channels_conditionally(
        function<bool (const shared_ptr<data::SignalBase>)> cond_func)
 {
        updating_channels_ = true;
@@ -162,8 +174,10 @@ void Channels::set_all_channels_conditionally(
                assert(sig);
 
                const bool state = cond_func(sig);
-               sig->set_enabled(state);
-               cb->setChecked(state);
+               if (state) {
+                       sig->set_enabled(state);
+                       cb->setChecked(state);
+               }
        }
 
        updating_channels_ = false;
@@ -291,25 +305,25 @@ void Channels::disable_all_channels()
 
 void Channels::enable_all_logic_channels()
 {
-       set_all_channels_conditionally([](const shared_ptr<SignalBase> signal)
+       enable_channels_conditionally([](const shared_ptr<SignalBase> signal)
                { return signal->type() == SignalBase::LogicChannel; });
 }
 
 void Channels::enable_all_analog_channels()
 {
-       set_all_channels_conditionally([](const shared_ptr<SignalBase> signal)
+       enable_channels_conditionally([](const shared_ptr<SignalBase> signal)
                { return signal->type() == SignalBase::AnalogChannel; });
 }
 
 void Channels::enable_all_named_channels()
 {
-       set_all_channels_conditionally([](const shared_ptr<SignalBase> signal)
+       enable_channels_conditionally([](const shared_ptr<SignalBase> signal)
                { return signal->name() != signal->internal_name(); });
 }
 
 void Channels::enable_all_changing_channels()
 {
-       set_all_channels_conditionally([](const shared_ptr<SignalBase> signal)
+       enable_channels_conditionally([](const shared_ptr<SignalBase> signal)
                {
                        // Never enable channels without sample data
                        if (!signal->has_samples())