X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fview.cpp;h=2bfe68c22468858d3bc24bd47034798dad78f607;hp=52a13255cef585253b747812dac554d0b7349772;hb=3734c4645fc071fe7ecfb552d65d343e50b098e1;hpb=9510aea0fca1c7438be30a4f43988c001b5f0b11 diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index 52a13255..2bfe68c2 100644 --- a/pv/views/trace/view.cpp +++ b/pv/views/trace/view.cpp @@ -125,6 +125,8 @@ bool CustomScrollArea::viewportEvent(QEvent *event) View::View(Session &session, bool is_main_view, QWidget *parent) : ViewBase(session, is_main_view, parent), splitter_(new QSplitter()), + segment_display_mode_(Trace::ShowLastSegmentOnly), + segment_selectable_(false), scale_(1e-3), offset_(0), updating_scroll_(false), @@ -227,6 +229,9 @@ View::View(Session &session, bool is_main_view, QWidget *parent) : // Update the zoom state calculate_tick_spacing(); + + // Make sure the standard bar's segment selector is in sync + set_segment_display_mode(segment_display_mode_); } Session& View::session() @@ -255,6 +260,8 @@ void View::add_signal(const shared_ptr signal) ViewBase::add_signalbase(signal->base()); signals_.insert(signal); + signal->set_segment_display_mode(segment_display_mode_); + connect(signal->base().get(), SIGNAL(name_changed(const QString&)), this, SLOT(on_signal_name_changed())); } @@ -271,6 +278,8 @@ void View::add_decode_signal(shared_ptr signal) new DecodeTrace(session_, signal, decode_traces_.size())); decode_traces_.push_back(d); + d->set_segment_display_mode(segment_display_mode_); + connect(signal.get(), SIGNAL(name_changed(const QString&)), this, SLOT(on_signal_name_changed())); } @@ -477,6 +486,26 @@ void View::set_time_unit(pv::util::TimeUnit time_unit) } } +bool View::segment_is_selectable() const +{ + return segment_selectable_; +} + +void View::set_segment_display_mode(Trace::SegmentDisplayMode mode) +{ + for (shared_ptr signal : signals_) + signal->set_segment_display_mode(mode); + + viewport_->update(); + + segment_selectable_ = true; + + if (mode == Trace::ShowLastSegmentOnly) + segment_selectable_ = false; + + segment_display_mode_changed(segment_selectable_); +} + void View::zoom(double steps) { zoom(steps, viewport_->width() / 2); @@ -898,7 +927,7 @@ void View::determine_if_header_was_shrunk() header_was_shrunk_ = (header_pane_width < (header_width - 10)); } -void View::expand_header_to_fit() +void View::resize_header_to_fit() { // Setting the maximum width of the header widget doesn't work as // expected because the splitter would allow the user to make the @@ -1036,8 +1065,10 @@ bool View::eventFilter(QObject *object, QEvent *event) // resized to their final sizes. update_layout(); - if (!settings_restored_) - expand_header_to_fit(); + if (settings_restored_) + determine_if_header_was_shrunk(); + else + resize_header_to_fit(); if (scroll_needs_defaults_) { set_scroll_default(); @@ -1105,7 +1136,7 @@ void View::extents_changed(bool horz, bool vert) void View::on_signal_name_changed() { if (!header_was_shrunk_) - expand_header_to_fit(); + resize_header_to_fit(); } void View::on_splitter_moved() @@ -1114,7 +1145,7 @@ void View::on_splitter_moved() determine_if_header_was_shrunk(); if (!header_was_shrunk_) - expand_header_to_fit(); + resize_header_to_fit(); } void View::h_scroll_value_changed(int value) @@ -1155,6 +1186,7 @@ void View::signals_changed() vector< shared_ptr > channels; shared_ptr sr_dev; + bool signals_added_or_removed = false; // Do we need to set the vertical scrollbar to its default position later? // We do if there are no traces, i.e. the scroll bar has no range set @@ -1286,6 +1318,7 @@ void View::signals_changed() TraceTreeItemOwner *const owner = trace->owner(); assert(owner); owner->remove_child_item(trace); + signals_added_or_removed = true; } // Remove any empty trace groups @@ -1310,13 +1343,12 @@ void View::signals_changed() if (item->enabled()) offset += extents.second; + signals_added_or_removed = true; } - if (!new_top_level_items.empty()) - // Expand the header pane because the header should become fully - // visible when new signals are added - expand_header_to_fit(); + if (signals_added_or_removed && !header_was_shrunk_) + resize_header_to_fit(); update_layout(); @@ -1380,14 +1412,30 @@ void View::capture_state_updated(int state) } } -void View::on_segment_changed(int segment) +void View::on_new_segment(int new_segment_id) { - current_segment_ = segment - 1; + on_segment_changed(new_segment_id); + segment_changed(new_segment_id); +} - for (shared_ptr signal : signals_) - signal->set_current_segment(current_segment_); +void View::on_segment_changed(int segment) +{ + switch (segment_display_mode_) { + case Trace::ShowLastSegmentOnly: + case Trace::ShowSingleSegmentOnly: + current_segment_ = segment; + for (shared_ptr signal : signals_) + signal->set_current_segment(current_segment_); + for (shared_ptr dt : decode_traces_) + dt->set_current_segment(current_segment_); + viewport_->update(); + break; - viewport_->update(); + case Trace::ShowAllSegments: + case Trace::ShowAccumulatedIntensity: + default: + break; + } } void View::perform_delayed_view_update()