]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/ruler.cpp
Fix #1292/1294 by snapping to any edge when not hovering over a signal
[pulseview.git] / pv / views / trace / ruler.cpp
index 0526bb2ceb21646f8e49bb9c4e1c64dbb1b67f6c..63d3d23fcb946536f173ee0e184aacd1084d0039 100644 (file)
@@ -29,6 +29,8 @@
 using namespace Qt;
 
 using std::function;
+using std::max;
+using std::min;
 using std::shared_ptr;
 using std::vector;
 
@@ -37,7 +39,6 @@ namespace views {
 namespace trace {
 
 const float Ruler::RulerHeight = 2.5f; // x Text Height
-const int Ruler::MinorTickSubdivision = 4;
 
 const float Ruler::HoverArrowSize = 0.5f; // x Text Height
 
@@ -140,9 +141,10 @@ void Ruler::paintEvent(QPaintEvent*)
 
                tick_position_cache_ = calculate_tick_positions(
                        view_.tick_period(),
-                       view_.offset(),
+                       view_.ruler_offset(),
                        view_.scale(),
                        width(),
+                       view_.minor_tick_count(),
                        ffunc);
        }
 
@@ -159,10 +161,18 @@ void Ruler::paintEvent(QPaintEvent*)
        p.setPen(palette().color(foregroundRole()));
 
        for (const auto& tick: tick_position_cache_->major) {
-               p.drawText(tick.first, ValueMargin, 0, text_height,
+               const int leftedge = 0;
+               const int rightedge = width();
+               const int x_tick = tick.first;
+               if ((x_tick > leftedge) && (x_tick < rightedge)) {
+                       const int x_left_bound = QFontMetrics(font()).width(tick.second) / 2;
+                       const int x_right_bound = rightedge - x_left_bound;
+                       const int x_legend = min(max(x_tick, x_left_bound), x_right_bound);
+                       p.drawText(x_legend, ValueMargin, 0, text_height,
                                AlignCenter | AlignTop | TextDontClip, tick.second);
-               p.drawLine(QPointF(tick.first, major_tick_y1),
+                       p.drawLine(QPointF(x_tick, major_tick_y1),
                        QPointF(tick.first, ruler_height));
+               }
        }
 
        for (const auto& tick: tick_position_cache_->minor) {
@@ -194,17 +204,18 @@ Ruler::TickPositions Ruler::calculate_tick_positions(
        const pv::util::Timestamp& offset,
        const double scale,
        const int width,
+       const unsigned int minor_tick_count,
        function<QString(const pv::util::Timestamp&)> format_function)
 {
        TickPositions tp;
 
-       const pv::util::Timestamp minor_period = major_period / MinorTickSubdivision;
+       const pv::util::Timestamp minor_period = major_period / minor_tick_count;
        const pv::util::Timestamp first_major_division = floor(offset / major_period);
        const pv::util::Timestamp first_minor_division = ceil(offset / minor_period);
        const pv::util::Timestamp t0 = first_major_division * major_period;
 
        int division = (round(first_minor_division -
-               first_major_division * MinorTickSubdivision)).convert_to<int>() - 1;
+               first_major_division * minor_tick_count)).convert_to<int>() - 1;
 
        double x;
 
@@ -212,9 +223,9 @@ Ruler::TickPositions Ruler::calculate_tick_positions(
                pv::util::Timestamp t = t0 + division * minor_period;
                x = ((t - offset) / scale).convert_to<double>();
 
-               if (division % MinorTickSubdivision == 0) {
+               if (division % minor_tick_count == 0) {
                        // Recalculate 't' without using 'minor_period' which is a fraction
-                       t = t0 + division / MinorTickSubdivision * major_period;
+                       t = t0 + division / minor_tick_count * major_period;
                        tp.major.emplace_back(x, format_function(t));
                } else {
                        tp.minor.emplace_back(x);
@@ -228,7 +239,7 @@ Ruler::TickPositions Ruler::calculate_tick_positions(
 
 void Ruler::mouseDoubleClickEvent(QMouseEvent *event)
 {
-       view_.add_flag(view_.offset() + ((double)event->x() + 0.5) * view_.scale());
+       view_.add_flag(view_.ruler_offset() + ((double)event->x() + 0.5) * view_.scale());
 }
 
 void Ruler::draw_hover_mark(QPainter &p, int text_height)