X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=abf522c0dfbc39d11d43988cb08bdab0d46d4812;hp=4cfb39783319a258732b28e14a34b5f884d3b17f;hb=ca46b5342f79e4786b973c83ed6a4cde5a51908d;hpb=a007f5ad25bad88cf62443d5471449ce8a6f5f29 diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 4cfb3978..abf522c0 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -24,6 +24,8 @@ #include #include +#include + #include #include @@ -153,6 +155,43 @@ void View::zoom(double steps, int offset) set_scale_offset(new_scale, new_offset); } +void View::zoom_fit() +{ + using pv::data::SignalData; + + const vector< shared_ptr > sigs( + session().get_signals()); + + // Make a set of all the visible data objects + set< shared_ptr > visible_data; + BOOST_FOREACH(const shared_ptr sig, sigs) + if (sig->enabled()) + visible_data.insert(sig->data()); + + if (visible_data.empty()) + return; + + double left_time = DBL_MAX, right_time = DBL_MIN; + BOOST_FOREACH(const shared_ptr d, visible_data) + { + const double start_time = d->get_start_time(); + left_time = min(left_time, start_time); + right_time = max(right_time, start_time + + d->get_max_sample_count() / d->get_samplerate()); + } + + assert(left_time < right_time); + if (right_time - left_time < 1e-12) + return; + + assert(_viewport); + const int w = _viewport->width(); + if (w <= 0) + return; + + set_scale_offset((right_time - left_time) / w, left_time); +} + void View::set_scale_offset(double scale, double offset) { _scale = scale;