]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/decodetrace.cpp
DecodeTrace: Fix on_setting_changed() handling
[pulseview.git] / pv / views / trace / decodetrace.cpp
index 638de4da5b84bd3686c8ff44afbdee5b562f9115..c2f78cc338c786e3d486a747e32dfe1860146d44 100644 (file)
@@ -70,7 +70,7 @@ using std::vector;
 
 using pv::data::decode::Annotation;
 using pv::data::decode::Row;
-using pv::data::DecodeChannel;
+using pv::data::decode::DecodeChannel;
 using pv::data::DecodeSignal;
 
 namespace pv {
@@ -102,6 +102,11 @@ DecodeTrace::DecodeTrace(pv::Session &session,
 {
        decode_signal_ = dynamic_pointer_cast<data::DecodeSignal>(base_);
 
+       GlobalSettings settings;
+       always_show_all_rows_ = settings.value(GlobalSettings::Key_Dec_AlwaysShowAllRows).toBool();
+
+       GlobalSettings::add_change_handler(this);
+
        // Determine shortest string we want to see displayed in full
        QFontMetrics m(QApplication::font());
        min_useful_label_width_ = m.width("XX"); // e.g. two hex characters
@@ -137,6 +142,11 @@ DecodeTrace::DecodeTrace(pv::Session &session,
        delayed_trace_updater_.setInterval(1000 / MaxTraceUpdateRate);
 }
 
+DecodeTrace::~DecodeTrace()
+{
+       GlobalSettings::remove_change_handler(this);
+}
+
 bool DecodeTrace::enabled() const
 {
        return true;
@@ -182,15 +192,17 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp)
        sample_range.second = min((int64_t)sample_range.second,
                decode_signal_->get_decoded_sample_count(current_segment_, false));
 
-       const vector<Row> rows = decode_signal_->visible_rows();
+       const vector<Row> rows = decode_signal_->get_rows();
 
        visible_rows_.clear();
        for (const Row& row : rows) {
                // Cache the row title widths
                int row_title_width;
-               try {
-                       row_title_width = row_title_widths_.at(row);
-               } catch (out_of_range&) {
+               auto cached_width = row_title_widths_.find(row);
+
+               if (cached_width != row_title_widths_.end())
+                       row_title_width = cached_width->second;
+               else {
                        const int w = p.boundingRect(QRectF(), 0, row.title()).width() +
                                RowTitleMargin;
                        row_title_widths_[row] = w;
@@ -200,7 +212,13 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp)
                vector<Annotation> annotations;
                decode_signal_->get_annotation_subset(annotations, row,
                        current_segment_, sample_range.first, sample_range.second);
-               if (!annotations.empty()) {
+
+               // Show row if there are visible annotations or when user wants to see
+               // all rows that have annotations somewhere and this one is one of them
+               bool row_visible = !annotations.empty() ||
+                       (always_show_all_rows_ && (decode_signal_->get_annotation_count(row, current_segment_) > 0));
+
+               if (row_visible) {
                        draw_annotations(annotations, p, annotation_height, pp, y,
                                get_row_color(row.index()), row_title_width);
                        y += row_height_;
@@ -278,6 +296,8 @@ void DecodeTrace::update_stack_button()
                        connect(decoder_menu, SIGNAL(decoder_selected(srd_decoder*)),
                                this, SLOT(on_stack_decoder(srd_decoder*)));
 
+                       decoder_menu->setStyleSheet("QMenu { menu-scrollable: 1; }");
+
                        stack_button_->setMenu(decoder_menu);
                        stack_button_->show();
                        return;
@@ -398,7 +418,7 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos)
        QAction *const copy_annotation_to_clipboard =
                new QAction(tr("Copy annotation text to clipboard"), this);
        copy_annotation_to_clipboard->setIcon(QIcon::fromTheme("edit-paste",
-               QIcon(":/icons/edit-paste.png")));
+               QIcon(":/icons/edit-paste.svg")));
        connect(copy_annotation_to_clipboard, SIGNAL(triggered()), this, SLOT(on_copy_annotation_to_clipboard()));
        menu->addAction(copy_annotation_to_clipboard);
 
@@ -1067,6 +1087,17 @@ void DecodeTrace::export_annotations(vector<Annotation> *annotations) const
        msg.exec();
 }
 
+void DecodeTrace::on_setting_changed(const QString &key, const QVariant &value)
+{
+       Trace::on_setting_changed(key, value);
+
+       if (key == GlobalSettings::Key_Dec_AlwaysShowAllRows) {
+               visible_rows_.clear();
+               max_visible_rows_ = 0;
+               always_show_all_rows_ = value.toBool();
+       }
+}
+
 void DecodeTrace::on_new_annotations()
 {
        if (!delayed_trace_updater_.isActive())
@@ -1196,8 +1227,11 @@ void DecodeTrace::on_copy_annotation_to_clipboard()
        if (annotations->empty())
                return;
 
-       QClipboard *clipboard = QGuiApplication::clipboard();
-       clipboard->setText(annotations->front().annotations().front());
+       QClipboard *clipboard = QApplication::clipboard();
+       clipboard->setText(annotations->front().annotations().front(), QClipboard::Clipboard);
+
+       if (clipboard->supportsSelection())
+               clipboard->setText(annotations->front().annotations().front(), QClipboard::Selection);
 
        delete annotations;
 }