]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/decodetrace.cpp
Session: Use ordered container to preserve DecodeTrace order
[pulseview.git] / pv / views / trace / decodetrace.cpp
index 8ca8d580c8b4a4bb4fadf89e84421491fd567056..06db505596f0331932fca77d51e23c74323106db 100644 (file)
@@ -242,6 +242,17 @@ shared_ptr<data::SignalBase> DecodeTrace::base() const
        return base_;
 }
 
+void DecodeTrace::set_owner(TraceTreeItemOwner *owner)
+{
+       Trace::set_owner(owner);
+
+       // The owner is set in trace::View::signals_changed(), which is a slot.
+       // So after this trace was added to the view, we won't have an owner
+       // that we need to initialize in update_rows(). Once we do, we call it
+       // from on_decode_reset().
+       on_decode_reset();
+}
+
 pair<int, int> DecodeTrace::v_extents() const
 {
        // Make an empty decode trace appear symmetrical
@@ -1316,6 +1327,7 @@ void DecodeTrace::initialize_row_widgets(DecodeTraceRow* r, unsigned int row_id)
 
        // Add widgets inside the header container
        QCheckBox* cb = new QCheckBox();
+       r->row_visibility_checkbox = cb;
        header_container_layout->addWidget(cb);
        cb->setText(tr("Show this row"));
        cb->setChecked(r->decode_row->visible());
@@ -1377,6 +1389,9 @@ void DecodeTrace::initialize_row_widgets(DecodeTraceRow* r, unsigned int row_id)
 
 void DecodeTrace::update_rows()
 {
+       if (!owner_)
+               return;
+
        lock_guard<mutex> lock(row_modification_mutex_);
 
        for (DecodeTraceRow& r : rows_)
@@ -1426,6 +1441,10 @@ void DecodeTrace::update_rows()
                row_id++;
        }
 
+       // If there's only one row, it must not be hidden or else it can't be un-hidden
+       if (row_id == 1)
+               rows_.front().row_visibility_checkbox->setEnabled(false);
+
        // Remove any rows that no longer exist, obeying that iterators are invalidated
        bool any_exists;
        do {
@@ -1433,6 +1452,8 @@ void DecodeTrace::update_rows()
 
                for (unsigned int i = 0; i < rows_.size(); i++)
                        if (!rows_[i].exists) {
+                               delete rows_[i].row_visibility_checkbox;
+
                                for (QCheckBox* cb : rows_[i].selectors)
                                        delete cb;