]> sigrok.org Git - pulseview.git/blobdiff - pv/popups/channels.cpp
Channels: Break up logic and analog channels into separate grids
[pulseview.git] / pv / popups / channels.cpp
index 585d80df36d5774e566cc024e2fd766cd3882fdb..cbe9a2a2eb4fd7bd6b0ddb828739381261c5b597 100644 (file)
@@ -19,7 +19,9 @@
 
 #include <map>
 
+#include <QApplication>
 #include <QCheckBox>
+#include <QFontMetrics>
 #include <QFormLayout>
 #include <QGridLayout>
 #include <QLabel>
@@ -98,16 +100,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()));
@@ -118,19 +127,13 @@ Channels::Channels(Session &session, QWidget *parent) :
        connect(&enable_all_changing_channels_, SIGNAL(clicked()),
                this, SLOT(enable_all_changing_channels()));
 
-       enable_all_channels_.setFlat(true);
-       disable_all_channels_.setFlat(true);
-       enable_all_logic_channels_.setFlat(true);
-       enable_all_analog_channels_.setFlat(true);
-       enable_all_named_channels_.setFlat(true);
-       enable_all_changing_channels_.setFlat(true);
-
-       buttons_bar_.addWidget(&enable_all_channels_, 0, 0);
-       buttons_bar_.addWidget(&disable_all_channels_, 0, 1);
-       buttons_bar_.addWidget(&enable_all_logic_channels_, 1, 0);
-       buttons_bar_.addWidget(&enable_all_analog_channels_, 1, 1);
-       buttons_bar_.addWidget(&enable_all_named_channels_, 1, 2);
-       buttons_bar_.addWidget(&enable_all_changing_channels_, 1, 3);
+       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);
 
        layout_.addRow(&buttons_bar_);
 
@@ -315,6 +318,10 @@ void Channels::enable_all_changing_channels()
 {
        set_all_channels_conditionally([](const shared_ptr<SignalBase> signal)
                {
+                       // Never enable channels without sample data
+                       if (!signal->has_samples())
+                               return false;
+
                        // Non-logic channels are considered to always have a signal
                        if (signal->type() != SignalBase::LogicChannel)
                                return true;