]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/logicsignal.cpp
fix catching polymorphic types by value
[pulseview.git] / pv / views / trace / logicsignal.cpp
index e536171667307c8e43a2a81876de90c3ca9f815c..759f85881c1ed7ba9afb0b6ad1a2b1003063d1df 100644 (file)
@@ -192,18 +192,9 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp)
        const float high_offset = y - signal_height_ + 0.5f;
        const float low_offset = y + 0.5f;
 
-       const deque< shared_ptr<pv::data::LogicSegment> > &segments =
-               base_->logic_data()->logic_segments();
-       if (segments.empty())
-               return;
-
-       shared_ptr<pv::data::LogicSegment> segment;
-       try {
-               segment = segments.at(current_segment_);
-       } catch (out_of_range) {
-               qDebug() << "Current logic segment out of range for signal" << base_->name();
+       shared_ptr<pv::data::LogicSegment> segment = get_logic_segment_to_paint();
+       if (!segment)
                return;
-       }
 
        double samplerate = segment->samplerate();
 
@@ -213,7 +204,7 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp)
 
        const double pixels_offset = pp.pixels_offset();
        const pv::util::Timestamp& start_time = segment->start_time();
-       const int64_t last_sample = segment->get_sample_count() - 1;
+       const int64_t last_sample = (int64_t)segment->get_sample_count() - 1;
        const double samples_per_pixel = samplerate * pp.scale();
        const double pixels_per_sample = 1 / samples_per_pixel;
        const pv::util::Timestamp start = samplerate * (pp.offset() - start_time);
@@ -355,6 +346,31 @@ void LogicSignal::paint_caps(QPainter &p, QLineF *const lines,
        p.drawLines(lines, line - lines);
 }
 
+shared_ptr<pv::data::LogicSegment> LogicSignal::get_logic_segment_to_paint() const
+{
+       shared_ptr<pv::data::LogicSegment> segment;
+
+       const deque< shared_ptr<pv::data::LogicSegment> > &segments =
+               base_->logic_data()->logic_segments();
+
+       if (!segments.empty()) {
+               if (segment_display_mode_ == ShowLastSegmentOnly) {
+                       segment = segments.back();
+               }
+
+       if ((segment_display_mode_ == ShowSingleSegmentOnly) ||
+               (segment_display_mode_ == ShowLastCompleteSegmentOnly)) {
+                       try {
+                               segment = segments.at(current_segment_);
+                       } catch (out_of_range&) {
+                               qDebug() << "Current logic segment out of range for signal" << base_->name() << ":" << current_segment_;
+                       }
+               }
+       }
+
+       return segment;
+}
+
 void LogicSignal::init_trigger_actions(QWidget *parent)
 {
        trigger_none_ = new QAction(*get_icon(":/icons/trigger-none.svg"),