]> sigrok.org Git - pulseview.git/blobdiff - pv/views/tabular_decoder/model.cpp
Session: Fix issue #67 by improving error handling
[pulseview.git] / pv / views / tabular_decoder / model.cpp
index 110cfd62b98d2280acea700a1ce130a50eb5f5a3..def753b2fa44b99f8e71d1db508ed103d25b422d 100644 (file)
@@ -164,8 +164,11 @@ uint8_t AnnotationCollectionModel::first_hidden_column() const
 QVariant AnnotationCollectionModel::headerData(int section, Qt::Orientation orientation,
        int role) const
 {
+       if ((section < 0) || (section >= (int)header_data_.size()))
+               return QVariant();
+
        if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole))
-               return header_data_.at(section);
+               return header_data_[section];
 
        return QVariant();
 }
@@ -225,7 +228,9 @@ void AnnotationCollectionModel::set_signal_and_segment(data::DecodeSignal* signa
                return;
        }
 
-       disconnect(this, SLOT(on_annotation_visibility_changed()));
+       if (signal_)
+               for (const shared_ptr<Decoder>& dec : signal_->decoder_stack())
+                       disconnect(dec.get(), nullptr, this, SLOT(on_annotation_visibility_changed()));
 
        all_annotations_ = signal->get_all_annotations_by_segment(current_segment);
        signal_ = signal;
@@ -234,9 +239,10 @@ void AnnotationCollectionModel::set_signal_and_segment(data::DecodeSignal* signa
                connect(dec.get(), SIGNAL(annotation_visibility_changed()),
                        this, SLOT(on_annotation_visibility_changed()));
 
-       if (hide_hidden_)
+       if (hide_hidden_) {
                update_annotations_without_hidden();
-       else
+               dataset_ = &all_annotations_without_hidden_;
+       } else
                dataset_ = all_annotations_;
 
        if (!dataset_ || dataset_->empty()) {
@@ -324,9 +330,9 @@ QModelIndex AnnotationCollectionModel::update_highlighted_rows(QModelIndex first
                // we would need to highlight - only then do we do so
                QModelIndex index = first;
                do {
-                       const Annotation* ann =
-                               static_cast<const Annotation*>(index.internalPointer());
-                       assert(ann);
+                       const Annotation* ann = static_cast<const Annotation*>(index.internalPointer());
+                       if (!ann)  // Can happen if the table is being modified at this exact time
+                               return result;
 
                        if (((int64_t)ann->start_sample() <= sample_num) &&
                                ((int64_t)ann->end_sample() >= sample_num)) {