X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=f727cc33b540b4fddc18b77f154a08051d3a78d4;hb=d1e7d82c6327c15f38d66602e65c4d3abe114df7;hp=b4815e704ac6b002f21fc0eb42aa6850e33619cf;hpb=38eeddeab105aea3f8015dda5399ebbead21550a;p=pulseview.git diff --git a/pv/view/view.cpp b/pv/view/view.cpp index b4815e7..f727cc3 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -18,17 +18,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include #include #include +#include + #include #include #include #include -#include "decodesignal.h" +#include "decodetrace.h" #include "header.h" #include "ruler.h" #include "signal.h" @@ -144,16 +148,80 @@ void View::zoom(double steps) void View::zoom(double steps, int offset) { - const double cursor_offset = _offset + _scale * offset; - _scale *= pow(3.0/2.0, -steps); - _scale = max(min(_scale, MaxScale), MinScale); - _offset = cursor_offset - _scale * offset; + const double new_scale = max(min(_scale * pow(3.0/2.0, -steps), + MaxScale), MinScale); + set_zoom(new_scale, offset); +} - _ruler->update(); - _viewport->update(); - update_scroll(); +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->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::zoom_one_to_one() +{ + 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 samplerate = 0.0; + BOOST_FOREACH(const shared_ptr d, visible_data) { + assert(d); + samplerate = max(samplerate, d->samplerate()); + } + + if (samplerate == 0.0) + return; + + assert(_viewport); + const int w = _viewport->width(); + if (w <= 0) + return; + + set_zoom(1.0 / samplerate, w / 2); +} void View::set_scale_offset(double scale, double offset) { @@ -163,13 +231,14 @@ void View::set_scale_offset(double scale, double offset) update_scroll(); _ruler->update(); _viewport->update(); + scale_offset_changed(); } vector< shared_ptr > View::get_traces() const { const vector< shared_ptr > sigs( session().get_signals()); - const vector< shared_ptr > decode_sigs( + const vector< shared_ptr > decode_sigs( session().get_decode_signals()); vector< shared_ptr > traces( sigs.size() + decode_sigs.size()); @@ -178,7 +247,7 @@ vector< shared_ptr > View::get_traces() const i = copy(sigs.begin(), sigs.end(), i); i = copy(decode_sigs.begin(), decode_sigs.end(), i); - sort(traces.begin(), traces.end(), compare_trace_v_offsets); + stable_sort(traces.begin(), traces.end(), compare_trace_v_offsets); return traces; } @@ -255,16 +324,30 @@ void View::normalize_layout() v_scroll_value_changed(verticalScrollBar()->sliderPosition()); } +void View::update_viewport() +{ + assert(_viewport); + _viewport->update(); +} + void View::get_scroll_layout(double &length, double &offset) const { const shared_ptr sig_data = _session.get_data(); if (!sig_data) return; - length = _data_length / (sig_data->get_samplerate() * _scale); + length = _data_length / (sig_data->samplerate() * _scale); offset = _offset / _scale; } +void View::set_zoom(double scale, int offset) +{ + const double cursor_offset = _offset + _scale * offset; + const double new_scale = max(min(scale, MaxScale), MinScale); + const double new_offset = cursor_offset - new_scale * offset; + set_scale_offset(new_scale, new_offset); +} + void View::update_scroll() { assert(_viewport); @@ -384,10 +467,10 @@ void View::v_scroll_value_changed(int value) void View::signals_changed() { int offset = SignalMargin + SignalHeight; - const vector< shared_ptr > sigs(_session.get_signals()); - BOOST_FOREACH(shared_ptr s, sigs) { - s->init_context_bar_actions(NULL); - s->set_v_offset(offset); + const vector< shared_ptr > traces(get_traces()); + BOOST_FOREACH(shared_ptr t, traces) { + t->set_view(this); + t->set_v_offset(offset); offset += SignalHeight + 2 * SignalMargin; }