View: Change the type of tick_period to pv::util::Timestamp
[pulseview.git] / pv / view / ruler.hpp
index d13a31b8e7a0a0826b50b9244829429ee293e9a9..f717c3785674c2b814838b915a18d18741ad6fed 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
-#ifndef PULSEVIEW_PV_VIEW_RULER_H
-#define PULSEVIEW_PV_VIEW_RULER_H
+#ifndef PULSEVIEW_PV_VIEW_RULER_HPP
+#define PULSEVIEW_PV_VIEW_RULER_HPP
 
+#include <functional>
 #include <memory>
 
+#include <boost/optional.hpp>
+
 #include "marginwidget.hpp"
+#include <pv/util.hpp>
+
+namespace RulerTest {
+class tick_position_test_0;
+class tick_position_test_1;
+class tick_position_test_2;
+}
 
 namespace pv {
 namespace view {
@@ -35,6 +45,10 @@ 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;
+
 private:
 
        /// Height of the ruler in multipes of the text height
@@ -76,12 +90,8 @@ private:
 private:
        void paintEvent(QPaintEvent *event);
 
-       void mouseMoveEvent(QMouseEvent *e);
-       void mouseReleaseEvent(QMouseEvent *);
-
        void mouseDoubleClickEvent(QMouseEvent *e);
 
-private:
        /**
         * Draw a hover arrow under the cursor position.
         * @param p The painter to draw into.
@@ -91,11 +101,48 @@ private:
 
        int calculate_text_height() const;
 
+       struct TickPositions
+       {
+               std::vector<std::pair<double, QString>> major;
+               std::vector<double> minor;
+       };
+
+       /**
+        * Holds the tick positions so that they don't have to be recalculated on
+        * every redraw. Set by 'paintEvent()' when needed.
+        */
+       boost::optional<TickPositions> tick_position_cache_;
+
+       /**
+        * Calculates the major and minor tick positions.
+        *
+        * @param major_period The period between the major ticks.
+        * @param offset The time at the left border of the ruler.
+        * @param scale The scale in seconds per pixel.
+        * @param width the Width of the ruler.
+        * @param format_function A function used to format the major tick times.
+        * @return An object of type 'TickPositions' that contains the major tick
+        *         positions together with the labels at that ticks, and the minor
+        *         tick positions.
+        */
+       static TickPositions calculate_tick_positions(
+               const pv::util::Timestamp& major_period,
+               const pv::util::Timestamp& offset,
+               const double scale,
+               const int width,
+               std::function<QString(const pv::util::Timestamp&)> format_function);
+
+protected:
+       void resizeEvent(QResizeEvent*) override;
+
 private Q_SLOTS:
        void hover_point_changed();
+
+       // Resets the 'tick_position_cache_'.
+       void invalidate_tick_position_cache();
 };
 
 } // namespace view
 } // namespace pv
 
-#endif // PULSEVIEW_PV_VIEW_RULER_H
+#endif // PULSEVIEW_PV_VIEW_RULER_HPP