X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fview.cpp;h=e2d9365efaf12d4c09a8a3df9b3891dd9ab38e94;hp=cfafdc082ca6dc4d439c034a2e3b3a39a08faadd;hb=20c99cfc69d3c7430817abd9a1f810698deb4a18;hpb=5a8c6b596a36e8c07fee234aa208ef23c8520c92 diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index cfafdc08..e2d9365e 100644 --- a/pv/views/trace/view.cpp +++ b/pv/views/trace/view.cpp @@ -578,6 +578,9 @@ void View::set_scale(double scale) { if (scale_ != scale) { scale_ = scale; + + update_view_range_metaobject(); + scale_changed(); } } @@ -588,20 +591,7 @@ void View::set_offset(const pv::util::Timestamp& offset, bool force_update) offset_ = offset; ruler_offset_ = offset_ + zero_offset_; - const int w = viewport_->width(); - if (w > 0) { - const double samplerate = session_.get_samplerate(); - // Note: sample_num = time * samplerate - // Note: samples_per_pixel = samplerate * scale - int64_t start_sample = (offset_ * samplerate).convert_to(); - int64_t end_sample = (offset_ * samplerate).convert_to() + - (w * session_.get_samplerate() * scale_); - - MetadataObject* md_obj = - session_.metadata_obj_manager()->find_object_by_type(MetadataObjMainViewRange); - md_obj->set_value(MetadataValueStartSample, QVariant((qlonglong)start_sample)); - md_obj->set_value(MetadataValueEndSample, QVariant((qlonglong)end_sample)); - } + update_view_range_metaobject(); offset_changed(); } @@ -864,21 +854,31 @@ void View::zoom_fit(bool gui_state) void View::focus_on_range(uint64_t start_sample, uint64_t end_sample) { assert(viewport_); - const int w = viewport_->width(); + const uint64_t w = viewport_->width(); if (w <= 0) return; const double samplerate = session_.get_samplerate(); + const double samples_per_pixel = samplerate * scale_; + const uint64_t viewport_samples = w * samples_per_pixel; const uint64_t sample_delta = (end_sample - start_sample); // Note: We add 20% margin on the left and 5% on the right - const Timestamp delta = (sample_delta * 1.25) / samplerate; - - const Timestamp scale = max(min(delta / w, MaxScale), MinScale); - const Timestamp offset = (start_sample - sample_delta * 0.20) / samplerate; - - set_scale_offset(scale.convert_to(), offset); + const uint64_t ext_sample_delta = sample_delta * 1.25; + + // Check if we can keep the zoom level and just center the supplied range + if (viewport_samples >= ext_sample_delta) { + // Note: offset is the left edge of the view so to center, we subtract half the view width + const int64_t sample_offset = (start_sample + (sample_delta / 2) - (viewport_samples / 2)); + const Timestamp offset = sample_offset / samplerate; + set_scale_offset(scale_, offset); + } else { + const Timestamp offset = (start_sample - sample_delta * 0.20) / samplerate; + const Timestamp delta = ext_sample_delta / samplerate; + const Timestamp scale = max(min(delta / w, MaxScale), MinScale); + set_scale_offset(scale.convert_to(), offset); + } } void View::set_scale_offset(double scale, const Timestamp& offset) @@ -928,7 +928,9 @@ pair View::get_time_extents() const if (signals_.size() == 0) return make_pair(0, 0); - data.push_back(signals_.front()->data()); + for (shared_ptr s : signals_) + if (s->data()->segments().size() > 0) + data.push_back(s->data()); for (const shared_ptr& d : data) { const vector< shared_ptr > segments = d->segments(); @@ -1425,6 +1427,8 @@ void View::resize_header_to_fit() void View::update_layout() { update_scroll(); + + update_view_range_metaobject(); } TraceTreeItemOwner* View::find_prevalent_trace_group( @@ -1602,6 +1606,31 @@ void View::resizeEvent(QResizeEvent* event) update_layout(); } +void View::update_view_range_metaobject() const +{ + const int w = viewport_->width(); + if (w > 0) { + const double samplerate = session_.get_samplerate(); + // Note: sample_num = time * samplerate + // Note: samples_per_pixel = samplerate * scale + const int64_t start_sample = (offset_ * samplerate).convert_to(); + const int64_t end_sample = (offset_ * samplerate).convert_to() + + (w * session_.get_samplerate() * scale_); + + MetadataObject* md_obj = + session_.metadata_obj_manager()->find_object_by_type(MetadataObjMainViewRange); + + const int64_t old_start_sample = md_obj->value(MetadataValueStartSample).toLongLong(); + const int64_t old_end_sample = md_obj->value(MetadataValueEndSample).toLongLong(); + + if (start_sample != old_start_sample) + md_obj->set_value(MetadataValueStartSample, QVariant((qlonglong)start_sample)); + + if (end_sample != old_end_sample) + md_obj->set_value(MetadataValueEndSample, QVariant((qlonglong)end_sample)); + } +} + void View::update_hover_point() { // Determine signal that the mouse cursor is hovering over