X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fdecodetrace.cpp;h=50156ddf7f865bb0d0f58fda546423ebf4b2a522;hb=0a952555b9d153f42912e47f35fac5dd4643fca9;hp=638de4da5b84bd3686c8ff44afbdee5b562f9115;hpb=c764c995115fbcd3668a02ce1ce0950b5fb6c670;p=pulseview.git diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index 638de4da..50156ddf 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -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(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 rows = decode_signal_->visible_rows(); + const vector 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 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,15 @@ void DecodeTrace::export_annotations(vector *annotations) const msg.exec(); } +void DecodeTrace::on_setting_changed(const QString &key, const QVariant &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 +1225,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; }