From: Soeren Apel Date: Wed, 6 Nov 2019 21:43:51 +0000 (+0100) Subject: Fix #1107 by implementing a copy-to-clipboard menu entry X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=c764c995115fbcd3668a02ce1ce0950b5fb6c670;p=pulseview.git Fix #1107 by implementing a copy-to-clipboard menu entry In the process, it turned out that the sample range for cursor position-based menu commands was wrong: it didn't take the width of the viewport header into account. This is now fixed as well. --- diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index 8ff00cd2..638de4da 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -31,6 +31,7 @@ extern "C" { #include #include +#include #include #include #include @@ -370,9 +371,12 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos) selected_row_ = nullptr; } + const View *const view = owner_->view(); + assert(view); + QPoint pos = view->viewport()->mapFrom(parent, click_pos); + // Default sample range is "from here" - const pair sample_range = - get_view_sample_range(click_pos.x(), click_pos.x() + 1); + const pair sample_range = get_view_sample_range(pos.x(), pos.x() + 1); selected_sample_range_ = make_pair(sample_range.first, numeric_limits::max()); if (decode_signal_->is_paused()) { @@ -391,6 +395,13 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos) menu->addAction(pause); } + 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"))); + connect(copy_annotation_to_clipboard, SIGNAL(triggered()), this, SLOT(on_copy_annotation_to_clipboard())); + menu->addAction(copy_annotation_to_clipboard); + menu->addSeparator(); QAction *const export_all_rows = @@ -439,9 +450,6 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos) connect(export_row_with_cursor, SIGNAL(triggered()), this, SLOT(on_export_row_with_cursor())); menu->addAction(export_row_with_cursor); - const View *view = owner_->view(); - assert(view); - if (!view->cursors()->enabled()) { export_all_rows_with_cursor->setEnabled(false); export_row_with_cursor->setEnabled(false); @@ -853,8 +861,6 @@ void DecodeTrace::hover_point_changed(const QPoint &hp) QString ann = get_annotation_at_point(hp); - assert(view); - if (!row_height_ || ann.isEmpty()) { QToolTip::hideText(); return; @@ -1175,6 +1181,27 @@ void DecodeTrace::on_show_hide_decoder(int index) owner_->row_item_appearance_changed(false, true); } +void DecodeTrace::on_copy_annotation_to_clipboard() +{ + using namespace pv::data::decode; + + if (!selected_row_) + return; + + vector *annotations = new vector(); + + decode_signal_->get_annotation_subset(*annotations, *selected_row_, + current_segment_, selected_sample_range_.first, selected_sample_range_.first); + + if (annotations->empty()) + return; + + QClipboard *clipboard = QGuiApplication::clipboard(); + clipboard->setText(annotations->front().annotations().front()); + + delete annotations; +} + void DecodeTrace::on_export_row() { selected_sample_range_ = make_pair(0, numeric_limits::max()); diff --git a/pv/views/trace/decodetrace.hpp b/pv/views/trace/decodetrace.hpp index 6779712e..a65f7078 100644 --- a/pv/views/trace/decodetrace.hpp +++ b/pv/views/trace/decodetrace.hpp @@ -206,6 +206,8 @@ private Q_SLOTS: void on_show_hide_decoder(int index); + void on_copy_annotation_to_clipboard(); + void on_export_row(); void on_export_all_rows(); void on_export_row_with_cursor();