X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fview.cpp;h=58056e5c9a82279285a4357de17d91b9b0bf5329;hb=558ad6ceb934ab7406d286c1a4ae08da4aba1448;hp=29c6fef4ee4f1ec3bb24742e46865ef8806eca1c;hpb=60c426a05dee6636b61c29a747eb50ec5b005209;p=pulseview.git diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index 29c6fef..58056e5 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,9 @@ void View::add_signal(const shared_ptr signal) ViewBase::add_signalbase(signal->base()); signals_.insert(signal); + signal->set_segment_display_mode(segment_display_mode_); + signal->set_current_segment(current_segment_); + connect(signal->base().get(), SIGNAL(name_changed(const QString&)), this, SLOT(on_signal_name_changed())); } @@ -271,6 +279,9 @@ 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_); + d->set_current_segment(current_segment_); + connect(signal.get(), SIGNAL(name_changed(const QString&)), this, SLOT(on_signal_name_changed())); } @@ -477,6 +488,38 @@ void View::set_time_unit(pv::util::TimeUnit time_unit) } } +void View::set_current_segment(uint32_t segment_id) +{ + current_segment_ = segment_id; + + 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(); +} + +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); @@ -1353,6 +1396,10 @@ void View::capture_state_updated(int state) // Enable sticky scrolling if the setting is enabled sticky_scrolling_ = settings.value(GlobalSettings::Key_View_StickyScrolling).toBool(); + + // Reset all traces to segment 0 + current_segment_ = 0; + set_current_segment(current_segment_); } if (state == Session::Stopped) { @@ -1383,14 +1430,45 @@ void View::capture_state_updated(int state) } } +void View::on_new_segment(int new_segment_id) +{ + on_segment_changed(new_segment_id); + segment_changed(new_segment_id); +} + +void View::on_segment_completed(int segment_id) +{ + on_segment_changed(segment_id); + segment_changed(segment_id); +} + void View::on_segment_changed(int segment) { - current_segment_ = segment - 1; + switch (segment_display_mode_) { + case Trace::ShowLastSegmentOnly: + case Trace::ShowSingleSegmentOnly: + set_current_segment(segment); + break; - for (shared_ptr signal : signals_) - signal->set_current_segment(current_segment_); + case Trace::ShowLastCompleteSegmentOnly: + { + // Only update if all segments are complete + bool all_complete = true; - viewport_->update(); + for (shared_ptr signal : signals_) + if (!signal->base()->segment_is_complete(segment)) + all_complete = false; + + if (all_complete) + set_current_segment(segment); + } + break; + + case Trace::ShowAllSegments: + case Trace::ShowAccumulatedIntensity: + default: + break; + } } void View::perform_delayed_view_update()