X-Git-Url: http://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fview.cpp;fp=pv%2Fviews%2Ftrace%2Fview.cpp;h=a470715b48595d94ec89eff74a3f12ddd34a3a52;hp=46bae5d8b27755287fe17a187ded3ea31e79cb59;hb=f9a0fd83226d97af7458d8c9dac0b88c83a54d29;hpb=999869aa676f7077b7181355eee28e9b025d4cea diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index 46bae5d8..a470715b 100644 --- a/pv/views/trace/view.cpp +++ b/pv/views/trace/view.cpp @@ -389,6 +389,11 @@ void View::add_signalbase(const shared_ptr signalbase) void View::remove_signalbase(const shared_ptr signalbase) { ViewBase::remove_signalbase(signalbase); + + shared_ptr signal = get_signal_by_signalbase(signalbase); + + if (signal) + remove_trace(signal); } #ifdef ENABLE_DECODE @@ -418,14 +423,34 @@ void View::remove_decode_signal(shared_ptr signal) for (auto i = decode_traces_.begin(); i != decode_traces_.end(); i++) if ((*i)->base() == signal) { decode_traces_.erase(i); - signals_changed(); - return; + break; } ViewBase::remove_decode_signal(signal); } #endif +void View::remove_trace(shared_ptr trace) +{ + TraceTreeItemOwner *const owner = trace->owner(); + assert(owner); + owner->remove_child_item(trace); + + for (auto i = signals_.begin(); i != signals_.end(); i++) + if ((*i) == trace) { + signals_.erase(i); + break; + } + + if (!header_was_shrunk_) + resize_header_to_fit(); + + update_layout(); + + header_->update(); + viewport_->update(); +} + shared_ptr View::get_signal_under_mouse_cursor() const { return signal_under_mouse_cursor_; @@ -1773,7 +1798,6 @@ void View::signals_changed() #ifdef ENABLE_DECODE traces.insert(decode_traces_.begin(), decode_traces_.end()); #endif - set< shared_ptr > add_traces; set_difference(traces.begin(), traces.end(), prev_traces.begin(), prev_traces.end(), @@ -1887,6 +1911,10 @@ void View::signals_changed() // Add and position the pending top levels items int offset = v_extents().second; for (shared_ptr item : new_top_level_items) { + // items may already have gained an owner when they were added to a group above + if (item->owner()) + continue; + add_child_item(item); // Position the item after the last item or at the top if there is none