]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/decodetrace.cpp
DecodeTrace: Don't show tooltips destined for the header area
[pulseview.git] / pv / views / trace / decodetrace.cpp
index 4ea297555260ddd3a2491d554d176b4440c8e72b..e6b977ae01952ea1d22f377e8898b060c6fc3c1c 100644 (file)
@@ -48,25 +48,19 @@ extern "C" {
 #include <pv/data/decodesignal.hpp>
 #include <pv/data/decode/annotation.hpp>
 #include <pv/data/decode/decoder.hpp>
-#include <pv/data/decoderstack.hpp>
 #include <pv/data/logic.hpp>
 #include <pv/data/logicsegment.hpp>
 #include <pv/widgets/decodergroupbox.hpp>
 #include <pv/widgets/decodermenu.hpp>
 
 using std::all_of;
-using std::list;
 using std::make_pair;
 using std::max;
-using std::make_pair;
-using std::map;
 using std::min;
 using std::out_of_range;
 using std::pair;
 using std::shared_ptr;
-using std::make_shared;
 using std::tie;
-using std::unordered_set;
 using std::vector;
 
 using pv::data::decode::Annotation;
@@ -93,6 +87,8 @@ const double DecodeTrace::EndCapWidth = 5;
 const int DecodeTrace::RowTitleMargin = 10;
 const int DecodeTrace::DrawPadding = 100;
 
+const int DecodeTrace::MaxTraceUpdateRate = 1; // No more than 1 Hz
+
 const QColor DecodeTrace::Colours[16] = {
        QColor(0xEF, 0x29, 0x29),
        QColor(0xF6, 0x6A, 0x32),
@@ -150,6 +146,8 @@ DecodeTrace::DecodeTrace(pv::Session &session,
 
        connect(decode_signal_.get(), SIGNAL(new_annotations()),
                this, SLOT(on_new_annotations()));
+       connect(decode_signal_.get(), SIGNAL(decode_finished()),
+               this, SLOT(on_decode_finished()));
        connect(decode_signal_.get(), SIGNAL(channels_updated()),
                this, SLOT(on_channels_updated()));
 
@@ -157,6 +155,11 @@ DecodeTrace::DecodeTrace(pv::Session &session,
                this, SLOT(on_delete_decoder(int)));
        connect(&show_hide_mapper_, SIGNAL(mapped(int)),
                this, SLOT(on_show_hide_decoder(int)));
+
+       connect(&delayed_trace_updater_, SIGNAL(timeout()),
+               this, SLOT(on_delayed_trace_update()));
+       delayed_trace_updater_.setSingleShot(true);
+       delayed_trace_updater_.setInterval(1000 / MaxTraceUpdateRate);
 }
 
 bool DecodeTrace::enabled() const
@@ -305,8 +308,7 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form)
        init_state_map_.clear();
        decoder_forms_.clear();
 
-       const list< shared_ptr<Decoder> >& stack =
-               decode_signal_->decoder_stack_list();
+       const vector< shared_ptr<Decoder> > &stack = decode_signal_->decoder_stack();
 
        if (stack.empty()) {
                QLabel *const l = new QLabel(
@@ -594,49 +596,24 @@ void DecodeTrace::draw_error(QPainter &p, const QString &message,
        p.drawText(text_rect, message);
 }
 
-void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left,
-       int right) const
+void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, int right) const
 {
        using namespace pv::data;
        using pv::data::decode::Decoder;
 
        double samples_per_pixel, pixels_offset;
 
-       shared_ptr<pv::data::DecoderStack> decoder_stack = base_->decoder_stack();
-
-       assert(decoder_stack);
-
-       shared_ptr<Logic> data;
-       shared_ptr<data::SignalBase> signalbase;
-
-       const list< shared_ptr<Decoder> > &stack = decoder_stack->stack();
-
-       // We get the logic data of the first channel in the list.
-       // This works because we are currently assuming all
-       // LogicSignals have the same data/segment
-       for (const shared_ptr<Decoder> &dec : stack)
-               if (dec && !dec->channels().empty() &&
-                       ((signalbase = (*dec->channels().begin()).second)) &&
-                       ((data = signalbase->logic_data())))
-                       break;
-
-       if (!data || data->logic_segments().empty())
-               return;
-
-       const shared_ptr<LogicSegment> segment = data->logic_segments().front();
-       assert(segment);
-       const int64_t sample_count = (int64_t)segment->get_sample_count();
+       const int64_t sample_count = decode_signal_->get_working_sample_count();
        if (sample_count == 0)
                return;
 
-       const int64_t samples_decoded = decoder_stack->samples_decoded();
+       const int64_t samples_decoded = decode_signal_->get_decoded_sample_count();
        if (sample_count == samples_decoded)
                return;
 
        const int y = get_visual_y();
 
-       tie(pixels_offset, samples_per_pixel) =
-               get_pixels_offset_samples_per_pixel();
+       tie(pixels_offset, samples_per_pixel) = get_pixels_offset_samples_per_pixel();
 
        const double start = max(samples_decoded /
                samples_per_pixel - pixels_offset, left - 1.0);
@@ -655,10 +632,7 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left,
 
 pair<double, double> DecodeTrace::get_pixels_offset_samples_per_pixel() const
 {
-       shared_ptr<pv::data::DecoderStack> decoder_stack = base_->decoder_stack();
-
        assert(owner_);
-       assert(decoder_stack);
 
        const View *view = owner_->view();
        assert(view);
@@ -667,9 +641,9 @@ pair<double, double> DecodeTrace::get_pixels_offset_samples_per_pixel() const
        assert(scale > 0);
 
        const double pixels_offset =
-               ((view->offset() - decoder_stack->start_time()) / scale).convert_to<double>();
+               ((view->offset() - decode_signal_->start_time()) / scale).convert_to<double>();
 
-       double samplerate = decoder_stack->samplerate();
+       double samplerate = decode_signal_->samplerate();
 
        // Show sample rate as 1Hz when it is unknown
        if (samplerate == 0.0)
@@ -727,10 +701,7 @@ const QString DecodeTrace::get_annotation_at_point(const QPoint &point)
 
        vector<pv::data::decode::Annotation> annotations;
 
-       shared_ptr<pv::data::DecoderStack> decoder_stack = base_->decoder_stack();
-
-       assert(decoder_stack);
-       decoder_stack->get_annotation_subset(annotations, visible_rows_[row],
+       decode_signal_->get_annotation_subset(annotations, visible_rows_[row],
                sample_range.first, sample_range.second);
 
        return (annotations.empty()) ?
@@ -745,6 +716,12 @@ void DecodeTrace::hover_point_changed()
        assert(view);
 
        QPoint hp = view->hover_point();
+
+       if (hp.x() == 0) {
+               QToolTip::hideText();
+               return;
+       }
+
        QString ann = get_annotation_at_point(hp);
 
        assert(view);
@@ -808,7 +785,7 @@ void DecodeTrace::create_decoder_form(int index,
        QFormLayout *const decoder_form = new QFormLayout;
        group->add_layout(decoder_form);
 
-       const list<DecodeChannel> channels = decode_signal_->get_channels();
+       const vector<DecodeChannel> channels = decode_signal_->get_channels();
 
        // Add the channels
        for (DecodeChannel ch : channels) {
@@ -839,11 +816,9 @@ void DecodeTrace::create_decoder_form(int index,
                        .arg(ch.name, ch.desc, required_flag), hlayout);
        }
 
-       shared_ptr<pv::data::DecoderStack> decoder_stack = base_->decoder_stack();
-
        // Add the options
        shared_ptr<binding::Decoder> binding(
-               new binding::Decoder(decoder_stack, dec));
+               new binding::Decoder(decode_signal_, dec));
        binding->add_properties_to_form(decoder_form, true);
 
        bindings_.push_back(binding);
@@ -902,6 +877,18 @@ QComboBox* DecodeTrace::create_channel_selector_init_state(QWidget *parent,
 }
 
 void DecodeTrace::on_new_annotations()
+{
+       if (!delayed_trace_updater_.isActive())
+               delayed_trace_updater_.start();
+}
+
+void DecodeTrace::on_delayed_trace_update()
+{
+       if (owner_)
+               owner_->row_item_appearance_changed(false, true);
+}
+
+void DecodeTrace::on_decode_finished()
 {
        if (owner_)
                owner_->row_item_appearance_changed(false, true);