]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/logicsignal.cpp
Fix #1292/1294 by snapping to any edge when not hovering over a signal
[pulseview.git] / pv / views / trace / logicsignal.cpp
index 38f204b6e255c2bf93940a7b3b70d2baac91cd9e..6a9bf432a07157c2a2e7713e60dbd7972c8abd8f 100644 (file)
@@ -57,6 +57,8 @@ using sigrok::Trigger;
 using sigrok::TriggerMatch;
 using sigrok::TriggerMatchType;
 
+using pv::data::LogicSegment;
+
 namespace pv {
 namespace views {
 namespace trace {
@@ -103,6 +105,7 @@ LogicSignal::LogicSignal(
        shared_ptr<data::SignalBase> base) :
        Signal(session, base),
        device_(device),
+       trigger_types_(get_trigger_types()),
        trigger_none_(nullptr),
        trigger_rising_(nullptr),
        trigger_high_(nullptr),
@@ -163,18 +166,6 @@ pair<int, int> LogicSignal::v_extents() const
        return make_pair(-signal_height_ - signal_margin, signal_margin);
 }
 
-int LogicSignal::scale_handle_offset() const
-{
-       return -signal_height_;
-}
-
-void LogicSignal::scale_handle_dragged(int offset)
-{
-       const int font_height = QFontMetrics(QApplication::font()).height();
-       const int units = (-offset / font_height);
-       signal_height_ = ((units < 1) ? 1 : units) * font_height;
-}
-
 void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp)
 {
        QLineF *line;
@@ -192,7 +183,7 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp)
        const float high_offset = y - signal_height_ + 0.5f;
        const float low_offset = y + 0.5f;
 
-       shared_ptr<pv::data::LogicSegment> segment = get_logic_segment_to_paint();
+       shared_ptr<LogicSegment> segment = get_logic_segment_to_paint();
        if (!segment || (segment->get_sample_count() == 0))
                return;
 
@@ -292,41 +283,72 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp)
 
 void LogicSignal::paint_fore(QPainter &p, ViewItemPaintParams &pp)
 {
-       // Draw the trigger marker
-       if (!trigger_match_ || !base_->enabled())
-               return;
+       if (base_->enabled()) {
+               if (trigger_match_) {
+                       // Draw the trigger marker
+                       const int y = get_visual_y();
+
+                       for (int32_t type_id : trigger_types_) {
+                               const TriggerMatchType *const type =
+                                       TriggerMatchType::get(type_id);
+                               if (trigger_match_ != type || type_id < 0 ||
+                                       (size_t)type_id >= countof(TriggerMarkerIcons) ||
+                                       !TriggerMarkerIcons[type_id])
+                                       continue;
 
-       const int y = get_visual_y();
-       const vector<int32_t> trig_types = get_trigger_types();
-       for (int32_t type_id : trig_types) {
-               const TriggerMatchType *const type =
-                       TriggerMatchType::get(type_id);
-               if (trigger_match_ != type || type_id < 0 ||
-                       (size_t)type_id >= countof(TriggerMarkerIcons) ||
-                       !TriggerMarkerIcons[type_id])
-                       continue;
-
-               const QPixmap *const pixmap = get_pixmap(
-                       TriggerMarkerIcons[type_id]);
-               if (!pixmap)
-                       continue;
-
-               const float pad = TriggerMarkerPadding - 0.5f;
-               const QSize size = pixmap->size();
-               const QPoint point(
-                       pp.right() - size.width() - pad * 2,
-                       y - (signal_height_ + size.height()) / 2);
-
-               p.setPen(QPen(TriggerMarkerBackgroundColor.darker()));
-               p.setBrush(TriggerMarkerBackgroundColor);
-               p.drawRoundedRect(QRectF(point, size).adjusted(
-                       -pad, -pad, pad, pad), pad, pad);
-               p.drawPixmap(point, *pixmap);
-
-               break;
+                               const QPixmap *const pixmap = get_pixmap(
+                                       TriggerMarkerIcons[type_id]);
+                               if (!pixmap)
+                                       continue;
+
+                               const float pad = TriggerMarkerPadding - 0.5f;
+                               const QSize size = pixmap->size();
+                               const QPoint point(
+                                       pp.right() - size.width() - pad * 2,
+                                       y - (signal_height_ + size.height()) / 2);
+
+                               p.setPen(QPen(TriggerMarkerBackgroundColor.darker()));
+                               p.setBrush(TriggerMarkerBackgroundColor);
+                               p.drawRoundedRect(QRectF(point, size).adjusted(
+                                       -pad, -pad, pad, pad), pad, pad);
+                               p.drawPixmap(point, *pixmap);
+
+                               break;
+                       }
+               }
+
+               if (show_hover_marker_)
+                       paint_hover_marker(p);
        }
 }
 
+vector<LogicSegment::EdgePair> LogicSignal::get_nearest_level_changes(uint64_t sample_pos)
+{
+       assert(base_);
+       assert(owner_);
+
+       if (sample_pos == 0)
+               return vector<LogicSegment::EdgePair>();
+
+       shared_ptr<LogicSegment> segment = get_logic_segment_to_paint();
+       if (!segment || (segment->get_sample_count() == 0))
+               return vector<LogicSegment::EdgePair>();
+
+       const View *view = owner_->view();
+       assert(view);
+       const double samples_per_pixel = base_->get_samplerate() * view->scale();
+
+       vector<LogicSegment::EdgePair> edges;
+
+       segment->get_surrounding_edges(edges, sample_pos,
+               samples_per_pixel / Oversampling, base_->index());
+
+       if (edges.empty())
+               return vector<LogicSegment::EdgePair>();
+
+       return edges;
+}
+
 void LogicSignal::paint_caps(QPainter &p, QLineF *const lines,
        vector< pair<int64_t, bool> > &edges, bool level,
        double samples_per_pixel, double pixels_offset, float x_offset,