From b5d20c6d003d853ad0828d15b365988519e73e88 Mon Sep 17 00:00:00 2001 From: Soeren Apel Date: Thu, 8 Feb 2018 16:32:19 +0100 Subject: [PATCH] Fix #1089 by updating the signal labels and group labels Group names currently don't change, so this doesn't do much but they may change in the future, so it's useful to do anyway. --- pv/data/signalbase.cpp | 8 ++++++ pv/data/signalbase.hpp | 6 ++++ pv/popups/channels.cpp | 63 +++++++++++++++++++++++++----------------- pv/popups/channels.hpp | 1 + 4 files changed, 53 insertions(+), 25 deletions(-) diff --git a/pv/data/signalbase.cpp b/pv/data/signalbase.cpp index f421e760..5aec9ba8 100644 --- a/pv/data/signalbase.cpp +++ b/pv/data/signalbase.cpp @@ -81,6 +81,14 @@ QString SignalBase::internal_name() const return internal_name_; } +QString SignalBase::display_name() const +{ + if (name() != internal_name_) + return name() + " (" + internal_name_ + ")"; + else + return name(); +} + void SignalBase::set_name(QString name) { if (channel_) diff --git a/pv/data/signalbase.hpp b/pv/data/signalbase.hpp index 6a3af14b..7375c1db 100644 --- a/pv/data/signalbase.hpp +++ b/pv/data/signalbase.hpp @@ -140,6 +140,12 @@ public: */ QString internal_name() const; + /** + * Produces a string for this signal that can be used for display, + * i.e. it contains one or both of the signal/internal names. + */ + QString display_name() const; + /** * Sets the name of the signal. */ diff --git a/pv/popups/channels.cpp b/pv/popups/channels.cpp index ca142d68..3fb90ae7 100644 --- a/pv/popups/channels.cpp +++ b/pv/popups/channels.cpp @@ -26,19 +26,15 @@ #include "channels.hpp" +#include #include #include #include -#include -#include - -#include - -using namespace Qt; +using std::make_shared; using std::map; +using std::out_of_range; using std::shared_ptr; -using std::make_shared; using std::unordered_set; using std::vector; @@ -77,9 +73,8 @@ Channels::Channels(Session &session, QWidget *parent) : // Populate channel groups for (auto entry : device->channel_groups()) { - shared_ptr group = entry.second; - // Make a set of signals, and removed this signals from the - // signal map. + const shared_ptr group = entry.second; + // Make a set of signals and remove these signals from the signal map vector< shared_ptr > group_sigs; for (auto channel : group->channels()) { const auto iter = signal_map.find(channel); @@ -130,14 +125,13 @@ void Channels::set_all_channels(bool set) { updating_channels_ = true; - for (map >::const_iterator i = - check_box_signal_map_.begin(); - i != check_box_signal_map_.end(); i++) { - const shared_ptr sig = (*i).second; + for (auto entry : check_box_signal_map_) { + QCheckBox *cb = entry.first; + const shared_ptr sig = entry.second; assert(sig); sig->set_enabled(set); - (*i).first->setChecked(set); + cb->setChecked(set); } updating_channels_ = false; @@ -156,10 +150,13 @@ void Channels::populate_group(shared_ptr group, binding = make_shared(group); // Create a title if the group is going to have any content - if ((!sigs.empty() || (binding && !binding->properties().empty())) && - group) - layout_.addRow(new QLabel( - QString("

%1

").arg(group->name().c_str()))); + if ((!sigs.empty() || (binding && !binding->properties().empty())) && group) + { + QLabel *label = new QLabel( + QString("

%1

").arg(group->name().c_str())); + layout_.addRow(label); + group_label_map_[group] = label; + } // Create the channel group grid QGridLayout *const channel_grid = create_channel_group_grid(sigs); @@ -181,7 +178,7 @@ QGridLayout* Channels::create_channel_group_grid( for (const shared_ptr& sig : sigs) { assert(sig); - QCheckBox *const checkbox = new QCheckBox(sig->name()); + QCheckBox *const checkbox = new QCheckBox(sig->display_name()); check_box_mapper_.setMapping(checkbox, checkbox); connect(checkbox, SIGNAL(toggled(bool)), &check_box_mapper_, SLOT(map())); @@ -201,15 +198,31 @@ void Channels::showEvent(QShowEvent *event) { pv::widgets::Popup::showEvent(event); + const shared_ptr device = session_.device()->device(); + assert(device); + + // Update group labels + for (auto entry : device->channel_groups()) { + const shared_ptr group = entry.second; + + try { + QLabel* label = group_label_map_.at(group); + label->setText(QString("

%1

").arg(group->name().c_str())); + } catch (out_of_range) { + // Do nothing + } + } + updating_channels_ = true; - for (map >::const_iterator i = - check_box_signal_map_.begin(); - i != check_box_signal_map_.end(); i++) { - const shared_ptr sig = (*i).second; + for (auto entry : check_box_signal_map_) { + QCheckBox *cb = entry.first; + const shared_ptr sig = entry.second; assert(sig); - (*i).first->setChecked(sig->enabled()); + // Update the check box + cb->setChecked(sig->enabled()); + cb->setText(sig->display_name()); } updating_channels_ = false; diff --git a/pv/popups/channels.hpp b/pv/popups/channels.hpp index 3701325b..b23af570 100644 --- a/pv/popups/channels.hpp +++ b/pv/popups/channels.hpp @@ -95,6 +95,7 @@ private: vector< shared_ptr > group_bindings_; map< QCheckBox*, shared_ptr > check_box_signal_map_; + map< shared_ptr, QLabel*> group_label_map_; QHBoxLayout buttons_bar_; QPushButton enable_all_channels_; -- 2.30.2