X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=dbae983389691a013ca86f36619ff5f5bfe8723a;hb=d001f416aec37d5b13b804dec9ee9e1c011ffabb;hp=12c277d5434582a5e4b63ada3b85e4324154ff46;hpb=8a463dbc1da0a229a726c1d0f278d361d871cfe1;p=pulseview.git diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 12c277d..dbae983 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -62,6 +62,7 @@ using pv::data::SignalData; using pv::data::Segment; using pv::util::format_time; using pv::util::TimeUnit; +using pv::util::Timestamp; using std::deque; using std::dynamic_pointer_cast; @@ -83,8 +84,8 @@ using std::weak_ptr; namespace pv { namespace view { -const double View::MaxScale = 1e9; -const double View::MinScale = 1e-12; +const Timestamp View::MaxScale("1e9"); +const Timestamp View::MinScale("1e-12"); const int View::MaxScrollValue = INT_MAX / 2; const int View::MaxViewAutoUpdateRate = 25; // No more than 25 Hz with sticky scrolling @@ -103,9 +104,9 @@ View::View(Session &session, QWidget *parent) : sticky_scrolling_(false), // Default setting is set in MainWindow::setup_ui() always_zoom_to_fit_(false), tick_period_(0.0), - tick_prefix_(0), + tick_prefix_(pv::util::SIPrefix::yocto), tick_precision_(0), - time_unit_(util::Time), + time_unit_(util::TimeUnit::Time), show_cursors_(false), cursors_(new CursorPair(*this)), next_flag_text_('A'), @@ -210,7 +211,7 @@ double View::scale() const return scale_; } -double View::offset() const +const Timestamp& View::offset() const { return offset_; } @@ -232,7 +233,7 @@ unsigned int View::depth() const return 0; } -unsigned int View::tick_prefix() const +pv::util::SIPrefix View::tick_prefix() const { return tick_prefix_; } @@ -273,9 +274,9 @@ void View::zoom_fit(bool gui_state) always_zoom_to_fit_changed(gui_state); } - const pair extents = get_time_extents(); - const double delta = extents.second - extents.first; - if (delta < 1e-12) + const pair extents = get_time_extents(); + const Timestamp delta = extents.second - extents.first; + if (delta < Timestamp("1e-12")) return; assert(viewport_); @@ -283,8 +284,8 @@ void View::zoom_fit(bool gui_state) if (w <= 0) return; - const double scale = max(min(delta / w, MaxScale), MinScale); - set_scale_offset(scale, extents.first); + const Timestamp scale = max(min(delta / w, MaxScale), MinScale); + set_scale_offset(scale.convert_to(), extents.first); } void View::zoom_one_to_one() @@ -316,7 +317,7 @@ void View::zoom_one_to_one() set_zoom(1.0 / samplerate, w / 2); } -void View::set_scale_offset(double scale, double offset) +void View::set_scale_offset(double scale, const Timestamp& offset) { // Disable sticky scrolling / always zoom to fit when acquisition runs // and user drags the viewport @@ -359,9 +360,9 @@ set< shared_ptr > View::get_visible_data() const return visible_data; } -pair View::get_time_extents() const +pair View::get_time_extents() const { - double left_time = DBL_MAX, right_time = DBL_MIN; + boost::optional left_time, right_time; const set< shared_ptr > visible_data = get_visible_data(); for (const shared_ptr d : visible_data) { @@ -371,18 +372,21 @@ pair View::get_time_extents() const double samplerate = s->samplerate(); samplerate = (samplerate <= 0.0) ? 1.0 : samplerate; - const double start_time = s->start_time(); - left_time = min(left_time, start_time); - right_time = max(right_time, start_time + - d->max_sample_count() / samplerate); + const Timestamp start_time = s->start_time(); + left_time = left_time ? + min(*left_time, start_time) : + start_time; + right_time = right_time ? + max(*right_time, start_time + d->max_sample_count() / samplerate) : + start_time + d->max_sample_count() / samplerate; } } - if (left_time == DBL_MAX && right_time == DBL_MIN) - return make_pair(0.0, 0.0); + if (!left_time || !right_time) + return make_pair(0, 0); - assert(left_time < right_time); - return make_pair(left_time, right_time); + assert(*left_time < *right_time); + return make_pair(*left_time, *right_time); } void View::enable_sticky_scrolling(bool state) @@ -416,7 +420,7 @@ std::shared_ptr View::cursors() const return cursors_; } -void View::add_flag(double time) +void View::add_flag(const Timestamp& time) { flags_.push_back(shared_ptr(new Flag(*this, time, QString("%1").arg(next_flag_text_)))); @@ -472,10 +476,10 @@ void View::restack_all_row_items() r->animate_to_layout_v_offset(); } -void View::get_scroll_layout(double &length, double &offset) const +void View::get_scroll_layout(double &length, Timestamp &offset) const { - const pair extents = get_time_extents(); - length = (extents.second - extents.first) / scale_; + const pair extents = get_time_extents(); + length = ((extents.second - extents.first) / scale_).convert_to(); offset = offset_ / scale_; } @@ -485,10 +489,10 @@ void View::set_zoom(double scale, int offset) always_zoom_to_fit_ = false; always_zoom_to_fit_changed(false); - 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); + const Timestamp cursor_offset = offset_ + scale_ * offset; + const Timestamp new_scale = max(min(Timestamp(scale), MaxScale), MinScale); + const Timestamp new_offset = cursor_offset - new_scale * offset; + set_scale_offset(new_scale.convert_to(), new_offset); } void View::calculate_tick_spacing() @@ -498,7 +502,7 @@ void View::calculate_tick_spacing() // Figure out the highest numeric value visible on a label const QSize areaSize = viewport_->size(); - const double max_time = max(fabs(offset_), + const Timestamp max_time = max(fabs(offset_), fabs(offset_ + scale_ * areaSize.width())); double min_width = SpacingIncrement; @@ -525,7 +529,8 @@ void View::calculate_tick_spacing() } while (tp_with_margin < min_period && unit < countof(ScaleUnits)); tick_period_ = order_decimal * ScaleUnits[unit - 1]; - tick_prefix_ = (order - pv::util::FirstSIPrefixPower) / 3; + tick_prefix_ = static_cast( + (order - pv::util::exponent(pv::util::SIPrefix::yocto)) / 3); // Precision is the number of fractional digits required, not // taking the prefix into account (and it must never be negative) @@ -552,7 +557,8 @@ void View::update_scroll() const QSize areaSize = viewport_->size(); // Set the horizontal scroll bar - double length = 0, offset = 0; + double length = 0; + Timestamp offset; get_scroll_layout(length, offset); length = max(length - areaSize.width(), 0.0); @@ -565,11 +571,11 @@ void View::update_scroll() if (length < MaxScrollValue) { horizontalScrollBar()->setRange(0, length); - horizontalScrollBar()->setSliderPosition(offset); + horizontalScrollBar()->setSliderPosition(offset.convert_to()); } else { horizontalScrollBar()->setRange(0, MaxScrollValue); horizontalScrollBar()->setSliderPosition( - offset_ * MaxScrollValue / (scale_ * length)); + (offset_ * MaxScrollValue / (scale_ * length)).convert_to()); } updating_scroll_ = false; @@ -674,7 +680,7 @@ vector< shared_ptr > View::extract_new_traces_for_channels( void View::determine_time_unit() { // Check whether we know the sample rate and hence can use time as the unit - if (time_unit_ == util::Samples) { + if (time_unit_ == util::TimeUnit::Samples) { shared_lock lock(session().signals_mutex()); const unordered_set< shared_ptr > &sigs(session().signals()); @@ -686,7 +692,7 @@ void View::determine_time_unit() const vector< shared_ptr > segments = data->segments(); if (!segments.empty()) if (segments[0]->samplerate()) { - time_unit_ = util::Time; + time_unit_ = util::TimeUnit::Time; break; } } @@ -782,7 +788,8 @@ void View::h_scroll_value_changed(int value) if (range < MaxScrollValue) offset_ = scale_ * value; else { - double length = 0, offset; + double length = 0; + Timestamp offset; get_scroll_layout(length, offset); offset_ = scale_ * length * value / MaxScrollValue; } @@ -926,7 +933,7 @@ void View::signals_changed() void View::capture_state_updated(int state) { if (state == Session::Running) - time_unit_ = util::Samples; + time_unit_ = util::TimeUnit::Samples; if (state == Session::Stopped) { // After acquisition has stopped we need to re-calculate the ticks once @@ -961,7 +968,8 @@ void View::perform_delayed_view_update() if (sticky_scrolling_) { // Make right side of the view sticky - double length = 0, offset; + double length = 0; + Timestamp offset; get_scroll_layout(length, offset); const QSize areaSize = viewport_->size();