X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fdecodetrace.cpp;h=1f9e4c4e1b9bd7e0e2af3dad77817b33fec7f1bc;hp=651b8c3d77b27f7797d66285896ab56da69f9959;hb=79b53a1ae4a451ef60c18dff9957d311ab90c396;hpb=a20c1fcc6c86659439a368f4d56c1b60c70dc62c diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index 651b8c3d..1f9e4c4e 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -173,7 +173,7 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp) // Iterate through the rows int y = get_visual_y(); - pair sample_range = get_sample_range(pp.left(), pp.right()); + pair sample_range = get_view_sample_range(pp.left(), pp.right()); // Just because the view says we see a certain sample range it // doesn't mean we have this many decoded samples, too, so crop @@ -328,6 +328,23 @@ QMenu* DecodeTrace::create_header_context_menu(QWidget *parent) QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos) { + // Get entries from default menu before adding our own + QMenu *const menu = new QMenu(parent); + + QMenu* default_menu = Trace::create_view_context_menu(parent, click_pos); + if (default_menu) { + for (QAction *action : default_menu->actions()) { + menu->addAction(action); + if (action->parent() == default_menu) + action->setParent(menu); + } + delete default_menu; + + // Add separator if needed + if (menu->actions().length() > 0) + menu->addSeparator(); + } + try { selected_row_ = &visible_rows_[get_row_at_point(click_pos)]; } catch (out_of_range&) { @@ -336,20 +353,36 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos) // Default sample range is "from here" const pair sample_range = - get_sample_range(click_pos.x(), click_pos.x() + 1); + get_view_sample_range(click_pos.x(), click_pos.x() + 1); selected_sample_range_ = make_pair(sample_range.first, numeric_limits::max()); - QMenu *const menu = new QMenu(parent); + if (decode_signal_->is_paused()) { + QAction *const resume = + new QAction(tr("Resume decoding"), this); + resume->setIcon(QIcon::fromTheme("media-playback-start", + QIcon(":/icons/media-playback-start.png"))); + connect(resume, SIGNAL(triggered()), this, SLOT(on_pause_decode())); + menu->addAction(resume); + } else { + QAction *const pause = + new QAction(tr("Pause decoding"), this); + pause->setIcon(QIcon::fromTheme("media-playback-pause", + QIcon(":/icons/media-playback-pause.png"))); + connect(pause, SIGNAL(triggered()), this, SLOT(on_pause_decode())); + menu->addAction(pause); + } + + menu->addSeparator(); QAction *const export_all_rows = - new QAction(tr("Export all annotations"), this); + new QAction(tr("Export all annotations"), this); export_all_rows->setIcon(QIcon::fromTheme("document-save-as", QIcon(":/icons/document-save-as.png"))); connect(export_all_rows, SIGNAL(triggered()), this, SLOT(on_export_all_rows())); menu->addAction(export_all_rows); QAction *const export_row = - new QAction(tr("Export all annotations for this row"), this); + new QAction(tr("Export all annotations for this row"), this); export_row->setIcon(QIcon::fromTheme("document-save-as", QIcon(":/icons/document-save-as.png"))); connect(export_row, SIGNAL(triggered()), this, SLOT(on_export_row())); @@ -701,7 +734,7 @@ pair DecodeTrace::get_pixels_offset_samples_per_pixel() const return make_pair(pixels_offset, samplerate * scale); } -pair DecodeTrace::get_sample_range( +pair DecodeTrace::get_view_sample_range( int x_start, int x_end) const { double samples_per_pixel, pixels_offset; @@ -771,7 +804,7 @@ const QString DecodeTrace::get_annotation_at_point(const QPoint &point) return QString(); const pair sample_range = - get_sample_range(point.x(), point.x() + 1); + get_view_sample_range(point.x(), point.x() + 1); const int row = get_row_at_point(point); if (row < 0) return QString(); @@ -1037,6 +1070,14 @@ void DecodeTrace::on_decode_finished() owner_->row_item_appearance_changed(false, true); } +void DecodeTrace::on_pause_decode() +{ + if (decode_signal_->is_paused()) + decode_signal_->resume_decode(); + else + decode_signal_->pause_decode(); +} + void DecodeTrace::delete_pressed() { on_delete();