]> sigrok.org Git - pulseview.git/commitdiff
Stopped ruler values colliding at high zoom
authorJoel Holdsworth <redacted>
Sat, 23 Mar 2013 10:54:54 +0000 (10:54 +0000)
committerJoel Holdsworth <redacted>
Sat, 23 Mar 2013 10:54:54 +0000 (10:54 +0000)
pv/view/ruler.cpp
pv/view/ruler.h

index 9f7cff2c6341e6f40dd86de31e388c6ee66f701f..350e49dcff0a2ee14656173ced94b422a9fc2697 100644 (file)
@@ -63,28 +63,45 @@ void Ruler::paintEvent(QPaintEvent*)
 {
        using namespace Qt;
 
 {
        using namespace Qt;
 
+       const double SpacingIncrement = 32.0f;
+       const double MinValueSpacing = 32.0f;
+
        QPainter p(this);
        p.setRenderHint(QPainter::Antialiasing);
 
        QPainter p(this);
        p.setRenderHint(QPainter::Antialiasing);
 
-       const double MinSpacing = 80;
+       double min_width = SpacingIncrement, typical_width;
+       double tick_period;
+       unsigned int prefix;
+       double multiplier;
 
 
-       const double min_period = _view.scale() * MinSpacing;
+       // Find tick spacing, and number formatting that does not cause
+       // value to collide.
+       do
+       {
+               const double min_period = _view.scale() * min_width;
 
 
-       const int order = (int)floorf(log10f(min_period));
-       const double order_decimal = pow(10, order);
+               const int order = (int)floorf(log10f(min_period));
+               const double order_decimal = pow(10, order);
 
 
-       unsigned int unit = 0;
-       double tick_period = 0.0f;
+               unsigned int unit = 0;
 
 
-       do
-       {
-               tick_period = order_decimal * ScaleUnits[unit++];
-       } while (tick_period < min_period && unit < countof(ScaleUnits));
+               do
+               {
+                       tick_period = order_decimal * ScaleUnits[unit++];
+               } while (tick_period < min_period && unit < countof(ScaleUnits));
 
 
-       const unsigned int prefix = (order - FirstSIPrefixPower) / 3;
-       assert(prefix < countof(SIPrefixes));
+               prefix = (order - FirstSIPrefixPower) / 3;
+               assert(prefix < countof(SIPrefixes));
 
 
-       const double multiplier = pow(10.0, - prefix * 3 - FirstSIPrefixPower);
+               multiplier = pow(10.0, - prefix * 3 - FirstSIPrefixPower);
+
+               typical_width = p.boundingRect(0, 0, INT_MAX, INT_MAX,
+                       AlignLeft | AlignTop, format_time(_view.offset(),
+                       multiplier, prefix)).width() + MinValueSpacing;
+
+               min_width += SpacingIncrement;
+
+       } while(typical_width > tick_period / _view.scale());
 
        const int text_height = p.boundingRect(0, 0, INT_MAX, INT_MAX,
                AlignLeft | AlignTop, "8").height();
 
        const int text_height = p.boundingRect(0, 0, INT_MAX, INT_MAX,
                AlignLeft | AlignTop, "8").height();
@@ -112,11 +129,9 @@ void Ruler::paintEvent(QPaintEvent*)
                if (division % MinorTickSubdivision == 0)
                {
                        // Draw a major tick
                if (division % MinorTickSubdivision == 0)
                {
                        // Draw a major tick
-                       QString s;
-                       QTextStream ts(&s);
-                       ts << (t * multiplier) << SIPrefixes[prefix] << "s";
                        p.drawText(x, 0, 0, text_height, AlignCenter |
                        p.drawText(x, 0, 0, text_height, AlignCenter |
-                               AlignTop | TextDontClip, s);
+                               AlignTop | TextDontClip,
+                               format_time(t, multiplier, prefix));
                        p.drawLine(QPointF(x, text_height),
                                QPointF(x, height()));
                }
                        p.drawLine(QPointF(x, text_height),
                                QPointF(x, height()));
                }
@@ -171,6 +186,17 @@ void Ruler::mouseReleaseEvent(QMouseEvent *)
        _grabbed_marker = NULL;
 }
 
        _grabbed_marker = NULL;
 }
 
+QString Ruler::format_time(double t, double multiplier,
+       unsigned int prefix)
+{
+       QString s;
+       QTextStream ts(&s);
+       ts.setRealNumberPrecision(0);
+       ts << fixed << forcesign << (t  * multiplier) <<
+               SIPrefixes[prefix] << "s";
+       return s;
+}
+
 void Ruler::draw_cursors(QPainter &p)
 {
        if (!_view.cursors_shown())
 void Ruler::draw_cursors(QPainter &p)
 {
        if (!_view.cursors_shown())
index 129b70cbe54520d0ccebb2b829a91f3b7211e496..7bdde99c15c3066dfaac5a1e37b6ee95306e123f 100644 (file)
@@ -53,6 +53,9 @@ private:
        void mouseReleaseEvent(QMouseEvent *);
 
 private:
        void mouseReleaseEvent(QMouseEvent *);
 
 private:
+       static QString format_time(double t, double multiplier,
+               unsigned int prefix);
+
        void draw_cursors(QPainter &p);
 
        /**
        void draw_cursors(QPainter &p);
 
        /**