X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fruler.hpp;h=c8cb0e5f66fc364e7ab1f1acd8bd58b623fc0d9b;hb=26a883ede0bcf68d087eda5dd2082890d36c7aef;hp=7fa58452fe76cd5fa7210d8b35a27420c6f00847;hpb=6a2cc8dd37f6d128ad7e16b9a7a78bb44d5a5aa5;p=pulseview.git
diff --git a/pv/view/ruler.hpp b/pv/view/ruler.hpp
index 7fa5845..c8cb0e5 100644
--- a/pv/view/ruler.hpp
+++ b/pv/view/ruler.hpp
@@ -14,19 +14,29 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * along with this program; if not, see .
*/
-#ifndef PULSEVIEW_PV_VIEW_RULER_H
-#define PULSEVIEW_PV_VIEW_RULER_H
+#ifndef PULSEVIEW_PV_VIEWS_TRACEVIEW_RULER_HPP
+#define PULSEVIEW_PV_VIEWS_TRACEVIEW_RULER_HPP
+#include
#include
+#include
+
#include "marginwidget.hpp"
+#include
+
+namespace RulerTest {
+struct tick_position_test_0;
+struct tick_position_test_1;
+struct tick_position_test_2;
+}
namespace pv {
-namespace view {
+namespace views {
+namespace TraceView {
class TimeItem;
class ViewItem;
@@ -35,6 +45,10 @@ class Ruler : public MarginWidget
{
Q_OBJECT
+ friend struct RulerTest::tick_position_test_0;
+ friend struct RulerTest::tick_position_test_1;
+ friend struct RulerTest::tick_position_test_2;
+
private:
/// Height of the ruler in multipes of the text height
@@ -49,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 > items();
+ std::vector< std::shared_ptr > items() override;
/**
* Gets the first view item which has a label that contains @c pt .
@@ -70,20 +117,13 @@ private:
* @return the view item that has been found, or and empty
* @c shared_ptr if no item was found.
*/
- std::shared_ptr get_mouse_over_item(
- const QPoint &pt);
-
-private:
- void paintEvent(QPaintEvent *event);
+ std::shared_ptr get_mouse_over_item(
+ const QPoint &pt) override;
- void mouseMoveEvent(QMouseEvent *e);
- void mouseReleaseEvent(QMouseEvent *);
+ void paintEvent(QPaintEvent *event) override;
- void mouseDoubleClickEvent(QMouseEvent *e);
+ void mouseDoubleClickEvent(QMouseEvent *event) override;
- void keyPressEvent(QKeyEvent *e);
-
-private:
/**
* Draw a hover arrow under the cursor position.
* @param p The painter to draw into.
@@ -93,11 +133,49 @@ private:
int calculate_text_height() const;
+ struct TickPositions
+ {
+ std::vector> major;
+ std::vector minor;
+ };
+
+ /**
+ * Holds the tick positions so that they don't have to be recalculated on
+ * every redraw. Set by 'paintEvent()' when needed.
+ */
+ boost::optional 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 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 TraceView
+} // namespace views
} // namespace pv
-#endif // PULSEVIEW_PV_VIEW_RULER_H
+#endif // PULSEVIEW_PV_VIEWS_TRACEVIEW_RULER_HPP