X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=e6be30e0680b48670a885fb0630d25209b9953b7;hb=1e124d4b75b7b6b6a87b93a4e175d669909c2e04;hp=0844b6a47e6fd13c16d34ba85eddfc7850ec3974;hpb=7ee199a77ecbb7edd6decca4786648cfe07e6eec;p=pulseview.git diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 0844b6a4..e6be30e0 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -104,6 +104,7 @@ View::View(Session &session, QWidget *parent) : always_zoom_to_fit_(false), tick_period_(0.0), tick_prefix_(0), + tick_precision_(0), time_unit_(util::Time), show_cursors_(false), cursors_(new CursorPair(*this)), @@ -236,6 +237,11 @@ unsigned int View::tick_prefix() const return tick_prefix_; } +unsigned int View::tick_precision() const +{ + return tick_precision_; +} + double View::tick_period() const { return tick_period_; @@ -490,7 +496,13 @@ void View::calculate_tick_spacing() const double SpacingIncrement = 32.0f; const double MinValueSpacing = 32.0f; - double min_width = SpacingIncrement, typical_width; + // Figure out the highest numeric value visible on a label + const QSize areaSize = viewport_->size(); + const double max_time = max(fabs(offset_), + fabs(offset_ + scale_ * areaSize.width())); + + double min_width = SpacingIncrement; + double label_width, tick_period_width; QFontMetrics m(QApplication::font()); @@ -509,14 +521,22 @@ void View::calculate_tick_spacing() tick_prefix_ = (order - pv::util::FirstSIPrefixPower) / 3; - typical_width = m.boundingRect(0, 0, INT_MAX, INT_MAX, - Qt::AlignLeft | Qt::AlignTop, - format_time(offset_, tick_prefix_, time_unit_)).width() + + // Precision is the number of fractional digits required, not + // taking the prefix into account (and it must never be negative) + tick_precision_ = std::max((int)ceil(log10f(1 / tick_period_)), 0); + + tick_period_width = tick_period_ / scale_; + + const QString label_text = + format_time(max_time, tick_prefix_, time_unit_, tick_precision_); + + label_width = m.boundingRect(0, 0, INT_MAX, INT_MAX, + Qt::AlignLeft | Qt::AlignTop, label_text).width() + MinValueSpacing; min_width += SpacingIncrement; - } while (typical_width > tick_period_ / scale_); + } while (tick_period_width < label_width); } void View::update_scroll()