]> sigrok.org Git - pulseview.git/blobdiff - pv/view/ruler.hpp
DecodeTrace: Try to keep annotation labels within the view
[pulseview.git] / pv / view / ruler.hpp
index f717c3785674c2b814838b915a18d18741ad6fed..aabbe486cd8a93f8d3b986a26150aee4f40f739c 100644 (file)
@@ -30,9 +30,9 @@
 #include <pv/util.hpp>
 
 namespace RulerTest {
-class tick_position_test_0;
-class tick_position_test_1;
-class tick_position_test_2;
+struct tick_position_test_0;
+struct tick_position_test_1;
+struct tick_position_test_2;
 }
 
 namespace pv {
@@ -45,9 +45,9 @@ class Ruler : public MarginWidget
 {
        Q_OBJECT
 
-       friend class RulerTest::tick_position_test_0;
-       friend class RulerTest::tick_position_test_1;
-       friend class RulerTest::tick_position_test_2;
+       friend struct RulerTest::tick_position_test_0;
+       friend struct RulerTest::tick_position_test_1;
+       friend struct RulerTest::tick_position_test_2;
 
 private:
 
@@ -63,20 +63,53 @@ public:
        Ruler(View &parent);
 
 public:
-       QSize sizeHint() const;
+       QSize sizeHint() const override;
 
        /**
         * The extended area that the header widget would like to be sized to.
         * @remarks This area is the area specified by sizeHint, extended by
         * the area to overlap the viewport.
         */
-       QSize extended_size_hint() const;
+       QSize extended_size_hint() const override;
+
+       /**
+        * Formats a timestamp depending on its distance to another timestamp.
+        *
+        * Heuristic function, useful when multiple timestamps should be put side by
+        * side. The function procedes in the following order:
+        *   - If 't' is zero, "0" is returned.
+        *   - If 'unit' is 'TimeUnit::Samples', 'pv::util::format_time_si_adjusted()'
+        *     is used to format 't'.
+        *   - If a zoomed out view is detected (determined by 'precision' and
+        *     'distance'), 'pv::util::format_time_minutes() is used.
+        *   - For timestamps "near the origin" (determined by 'distance'),
+        *    'pv::util::format_time_si_adjusted()' is used.
+        *   - If none of the previous was true, 'pv::util::format_time_minutes()'
+        *     is used again.
+        *
+        * @param distance The distance between the timestamp to format and
+        *        an adjacent one.
+        * @param t The value to format
+        * @param prefix The SI prefix to use.
+        * @param unit The representation of the timestamp value.
+        * @param precision The number of digits after the decimal separator.
+        * @param sign Whether or not to add a sign also for positive numbers.
+        *
+        * @return The formated value.
+        */
+       static QString format_time_with_distance(
+               const pv::util::Timestamp& distance,
+               const pv::util::Timestamp& t,
+               pv::util::SIPrefix prefix = pv::util::SIPrefix::unspecified,
+               pv::util::TimeUnit unit = pv::util::TimeUnit::Time,
+               unsigned precision = 0,
+               bool sign = true);
 
 private:
        /**
         * Gets the time items.
         */
-       std::vector< std::shared_ptr<pv::view::ViewItem> > items();
+       std::vector< std::shared_ptr<pv::view::ViewItem> > items() override;
 
        /**
         * Gets the first view item which has a label that contains @c pt .
@@ -85,12 +118,11 @@ private:
         *   @c shared_ptr if no item was found.
         */
        std::shared_ptr<pv::view::ViewItem> get_mouse_over_item(
-               const QPoint &pt);
+               const QPoint &pt) override;
 
-private:
-       void paintEvent(QPaintEvent *event);
+       void paintEvent(QPaintEvent *event) override;
 
-       void mouseDoubleClickEvent(QMouseEvent *e);
+       void mouseDoubleClickEvent(QMouseEvent *e) override;
 
        /**
         * Draw a hover arrow under the cursor position.