- 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<double>(), 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<double>(), offset);
+ }