X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fruler.hpp;h=c8cb0e5f66fc364e7ab1f1acd8bd58b623fc0d9b;hb=5ccfc97e20bbea19b9bc37905dd4cf63ee1f6303;hp=e47c424ae6b53168535a37d6cfe68a835e6de0a4;hpb=819e2e95555b2b3c2190f24a3cfa82250d1f34e5;p=pulseview.git
diff --git a/pv/view/ruler.hpp b/pv/view/ruler.hpp
index e47c424..c8cb0e5 100644
--- a/pv/view/ruler.hpp
+++ b/pv/view/ruler.hpp
@@ -14,85 +14,168 @@
* 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;
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:
- static const int RulerHeight;
- static const int MinorTickSubdivision;
- static const int HoverArrowSize;
+ /// Height of the ruler in multipes of the text height
+ static const float RulerHeight;
- static const int Padding;
+ static const int MinorTickSubdivision;
- /**
- * The vertical offset, relative to the bottom line of the widget,
- * where the arrows of the cursor labels end.
- */
- static const int BaselineOffset;
+ /// Height of the hover arrow in multiples of the text height
+ static const float HoverArrowSize;
public:
Ruler(View &parent);
public:
- void clear_selection();
-
-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:
- void paintEvent(QPaintEvent *event);
+ /**
+ * Gets the time items.
+ */
+ std::vector< std::shared_ptr > items() override;
- void mouseMoveEvent(QMouseEvent *e);
- void mousePressEvent(QMouseEvent *e);
- void mouseReleaseEvent(QMouseEvent *);
- void leaveEvent(QEvent*);
+ /**
+ * Gets the first view item which has a label that contains @c pt .
+ * @param pt the point to search with.
+ * @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) override;
- void mouseDoubleClickEvent(QMouseEvent *e);
+ void paintEvent(QPaintEvent *event) override;
- void keyPressEvent(QKeyEvent *e);
+ void mouseDoubleClickEvent(QMouseEvent *event) override;
-private:
/**
* Draw a hover arrow under the cursor position.
+ * @param p The painter to draw into.
+ * @param text_height The height of a single text ascent.
*/
- void draw_hover_mark(QPainter &p);
+ void draw_hover_mark(QPainter &p, int text_height);
- int calculate_text_height();
+ int calculate_text_height() const;
-private:
- std::shared_ptr mouse_down_item_;
- const int text_height_;
+ 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