]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/decodetrace.cpp
Fix #1292/1294 by snapping to any edge when not hovering over a signal
[pulseview.git] / pv / views / trace / decodetrace.cpp
index 651b8c3d77b27f7797d66285896ab56da69f9959..2797891138ffcd691b4c65ce241bb720547f2583 100644 (file)
@@ -173,7 +173,7 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp)
 
        // Iterate through the rows
        int y = get_visual_y();
-       pair<uint64_t, uint64_t> sample_range = get_sample_range(pp.left(), pp.right());
+       pair<uint64_t, uint64_t> 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
@@ -336,20 +336,38 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos)
 
        // Default sample range is "from here"
        const pair<uint64_t, uint64_t> 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<uint64_t>::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 +719,7 @@ pair<double, double> DecodeTrace::get_pixels_offset_samples_per_pixel() const
        return make_pair(pixels_offset, samplerate * scale);
 }
 
-pair<uint64_t, uint64_t> DecodeTrace::get_sample_range(
+pair<uint64_t, uint64_t> DecodeTrace::get_view_sample_range(
        int x_start, int x_end) const
 {
        double samples_per_pixel, pixels_offset;
@@ -771,7 +789,7 @@ const QString DecodeTrace::get_annotation_at_point(const QPoint &point)
                return QString();
 
        const pair<uint64_t, uint64_t> 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 +1055,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();