X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=18ce679df877f030b2f35a11e208f9ef72e63bcd;hb=269528f55e7fd77f762c2008d257921cd30e1519;hp=abf522c0dfbc39d11d43988cb08bdab0d46d4812;hpb=ca46b5342f79e4786b973c83ed6a4cde5a51908d;p=pulseview.git diff --git a/pv/view/view.cpp b/pv/view/view.cpp index abf522c..18ce679 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -18,7 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef ENABLE_DECODE #include +#endif #include #include @@ -52,9 +54,6 @@ namespace view { const double View::MaxScale = 1e9; const double View::MinScale = 1e-15; -const int View::LabelMarginWidth = 70; -const int View::RulerHeight = 30; - const int View::MaxScrollValue = INT_MAX / 2; const int View::SignalHeight = 30; @@ -95,6 +94,8 @@ View::View(SigSession &session, QWidget *parent) : connect(_cursors.second().get(), SIGNAL(time_changed()), this, SLOT(marker_time_changed())); + connect(_header, SIGNAL(geometry_updated()), + this, SLOT(on_geometry_updated())); connect(_header, SIGNAL(signals_moved()), this, SLOT(on_signals_moved())); @@ -108,7 +109,6 @@ View::View(SigSession &session, QWidget *parent) : connect(_ruler, SIGNAL(selection_changed()), this, SIGNAL(selection_changed())); - setViewportMargins(LabelMarginWidth, RulerHeight, 0, 0); setViewport(_viewport); _viewport->installEventFilter(this); @@ -143,16 +143,14 @@ int View::v_offset() const void View::zoom(double steps) { - zoom(steps, (width() - LabelMarginWidth) / 2); + zoom(steps, _viewport->width() / 2); } void View::zoom(double steps, int offset) { - const double cursor_offset = _offset + _scale * offset; const double new_scale = max(min(_scale * pow(3.0/2.0, -steps), MaxScale), MinScale); - const double new_offset = cursor_offset - new_scale * offset; - set_scale_offset(new_scale, new_offset); + set_zoom(new_scale, offset); } void View::zoom_fit() @@ -177,7 +175,7 @@ void View::zoom_fit() 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()); + d->get_max_sample_count() / d->samplerate()); } assert(left_time < right_time); @@ -192,6 +190,39 @@ void View::zoom_fit() 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) { _scale = scale; @@ -207,16 +238,22 @@ vector< shared_ptr > View::get_traces() const { const vector< shared_ptr > sigs( session().get_signals()); +#ifdef ENABLE_DECODE const vector< shared_ptr > decode_sigs( session().get_decode_signals()); vector< shared_ptr > traces( sigs.size() + decode_sigs.size()); +#else + vector< shared_ptr > traces(sigs.size()); +#endif vector< shared_ptr >::iterator i = traces.begin(); i = copy(sigs.begin(), sigs.end(), i); +#ifdef ENABLE_DECODE i = copy(decode_sigs.begin(), decode_sigs.end(), i); +#endif - sort(traces.begin(), traces.end(), compare_trace_v_offsets); + stable_sort(traces.begin(), traces.end(), compare_trace_v_offsets); return traces; } @@ -305,10 +342,18 @@ void View::get_scroll_layout(double &length, double &offset) const 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); @@ -342,6 +387,17 @@ void View::update_scroll() areaSize.height()); } +void View::update_layout() +{ + setViewportMargins(_header->sizeHint().width(), + _ruler->sizeHint().height(), 0, 0); + _ruler->setGeometry(_viewport->x(), 0, + _viewport->width(), _viewport->y()); + _header->setGeometry(0, _viewport->y(), + _viewport->x(), _viewport->height()); + update_scroll(); +} + bool View::compare_trace_v_offsets(const shared_ptr &a, const shared_ptr &b) { @@ -393,11 +449,7 @@ bool View::viewportEvent(QEvent *e) void View::resizeEvent(QResizeEvent*) { - _ruler->setGeometry(_viewport->x(), 0, - _viewport->width(), _viewport->y()); - _header->setGeometry(0, _viewport->y(), - _viewport->x(), _viewport->height()); - update_scroll(); + update_layout(); } void View::h_scroll_value_changed(int value) @@ -435,6 +487,7 @@ void View::signals_changed() offset += SignalHeight + 2 * SignalMargin; } + update_layout(); normalize_layout(); } @@ -471,5 +524,10 @@ void View::on_signals_moved() signals_moved(); } +void View::on_geometry_updated() +{ + update_layout(); +} + } // namespace view } // namespace pv