]> sigrok.org Git - pulseview.git/blobdiff - pv/view/ruler.cpp
Ruler: Make RulerHeight proportional to text size
[pulseview.git] / pv / view / ruler.cpp
index 7018c212db52f8b72f1449400b9160594a746dde..e0ee753138df1c6495e686070262481188d87648 100644 (file)
@@ -38,7 +38,7 @@ using std::vector;
 namespace pv {
 namespace view {
 
-const int Ruler::RulerHeight = 30;
+const float Ruler::RulerHeight = 2.5f;  // x Text Height
 const int Ruler::MinorTickSubdivision = 4;
 
 const int Ruler::HoverArrowSize = 5;
@@ -47,8 +47,7 @@ const int Ruler::Padding = 20;
 const int Ruler::BaselineOffset = 5;
 
 Ruler::Ruler(View &parent) :
-       MarginWidget(parent),
-       text_height_(calculate_text_height())
+       MarginWidget(parent)
 {
        setMouseTracking(true);
 
@@ -66,13 +65,15 @@ void Ruler::clear_selection()
 
 QSize Ruler::sizeHint() const
 {
-       return QSize(0, RulerHeight);
+       const int text_height = calculate_text_height();
+       return QSize(0, RulerHeight * text_height);
 }
 
 QSize Ruler::extended_size_hint() const
 {
-       return QSize(0, RulerHeight +
-               (text_height_ + Padding + BaselineOffset) / 2);
+       const int text_height = calculate_text_height();
+       return QSize(0, RulerHeight * text_height +
+               (text_height + Padding + BaselineOffset) / 2);
 }
 
 void Ruler::paintEvent(QPaintEvent*)
@@ -98,9 +99,10 @@ void Ruler::paintEvent(QPaintEvent*)
        int division = (int)round(first_minor_division -
                first_major_division * MinorTickSubdivision) - 1;
 
-       const int major_tick_y1 = text_height_ + ValueMargin * 2;
-       const int tick_y2 = RulerHeight;
-       const int minor_tick_y1 = (major_tick_y1 + tick_y2) / 2;
+       const int text_height = calculate_text_height();
+       const int ruler_height = RulerHeight * text_height;
+       const int major_tick_y1 = text_height + ValueMargin * 2;
+       const int minor_tick_y1 = (major_tick_y1 + ruler_height) / 2;
 
        double x;
 
@@ -111,17 +113,17 @@ void Ruler::paintEvent(QPaintEvent*)
                if (division % MinorTickSubdivision == 0)
                {
                        // Draw a major tick
-                       p.drawText(x, ValueMargin, 0, text_height_,
+                       p.drawText(x, ValueMargin, 0, text_height,
                                AlignCenter | AlignTop | TextDontClip,
                                pv::util::format_time(t, prefix));
                        p.drawLine(QPointF(x, major_tick_y1),
-                               QPointF(x, tick_y2));
+                               QPointF(x, ruler_height));
                }
                else
                {
                        // Draw a minor tick
                        p.drawLine(QPointF(x, minor_tick_y1),
-                               QPointF(x, tick_y2));
+                               QPointF(x, ruler_height));
                }
 
                division++;
@@ -129,7 +131,7 @@ void Ruler::paintEvent(QPaintEvent*)
        } while (x < width());
 
        // Draw the hover mark
-       draw_hover_mark(p);
+       draw_hover_mark(p, text_height);
 
        // The cursor labels are not drawn with the arrows exactly on the
        // bottom line of the widget, because then the selection shadow
@@ -138,8 +140,11 @@ void Ruler::paintEvent(QPaintEvent*)
 
        // Draw the items
        const vector< shared_ptr<TimeItem> > items(view_.time_items());
-       for (auto &i : items)
-               i->paint_label(p, r);
+       for (auto &i : items) {
+               const bool highlight = !dragging_ &&
+                       i->label_rect(r).contains(mouse_point_);
+               i->paint_label(p, r, highlight);
+       }
 }
 
 void Ruler::mouseMoveEvent(QMouseEvent *e)
@@ -236,7 +241,7 @@ void Ruler::keyPressEvent(QKeyEvent *e)
        }
 }
 
-void Ruler::draw_hover_mark(QPainter &p)
+void Ruler::draw_hover_mark(QPainter &p, int text_height)
 {
        const int x = view_.hover_point().x();
 
@@ -246,7 +251,7 @@ void Ruler::draw_hover_mark(QPainter &p)
        p.setPen(QPen(Qt::NoPen));
        p.setBrush(QBrush(palette().color(foregroundRole())));
 
-       const int b = RulerHeight;
+       const int b = RulerHeight * text_height;
        const QPointF points[] = {
                QPointF(x, b),
                QPointF(x - HoverArrowSize, b - HoverArrowSize),
@@ -255,11 +260,9 @@ void Ruler::draw_hover_mark(QPainter &p)
        p.drawPolygon(points, countof(points));
 }
 
-int Ruler::calculate_text_height()
+int Ruler::calculate_text_height() const
 {
-       QFontMetrics fm(font());
-       return fm.boundingRect(0, 0, INT_MAX, INT_MAX,
-               Qt::AlignLeft | Qt::AlignTop, "8").height();
+       return QFontMetrics(font()).ascent();
 }
 
 void Ruler::hover_point_changed()