]> sigrok.org Git - pulseview.git/blobdiff - pv/view/ruler.hpp
Random simplifications, cosmetics/whitespace/consistency fixes.
[pulseview.git] / pv / view / ruler.hpp
index 89b9ff4c801d22b009d30087fd4346d4db039689..1efd8737c9c938fb568bdf0948a8b9f5c0bc62d8 100644 (file)
  * 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 <http://www.gnu.org/licenses/>.
  */
 
-#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 <functional>
 #include <memory>
 
+#include <boost/optional.hpp>
+
 #include "marginwidget.hpp"
+#include <pv/util.hpp>
+
+using std::function;
+using std::pair;
+using std::shared_ptr;
+using std::vector;
+
+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
 
-private:
+       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
        static const float RulerHeight;
 
@@ -48,37 +67,66 @@ 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;
 
-private:
-       std::shared_ptr<pv::view::TimeItem> get_mouse_over_item(
-               const QPoint &pt);
+       /**
+        * 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);
-
-       void mouseMoveEvent(QMouseEvent *e);
-       void mousePressEvent(QMouseEvent *e);
-       void mouseReleaseEvent(QMouseEvent *);
-       void leaveEvent(QEvent*);
+       /**
+        * Gets the time items.
+        */
+       vector< shared_ptr<ViewItem> > items() override;
 
-       void mouseDoubleClickEvent(QMouseEvent *e);
+       /**
+        * 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.
+        */
+       shared_ptr<ViewItem> get_mouse_over_item(const QPoint &pt) override;
 
-       void contextMenuEvent(QContextMenuEvent *event);
+       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.
@@ -88,11 +136,49 @@ private:
 
        int calculate_text_height() const;
 
+       struct TickPositions
+       {
+               vector<pair<double, QString>> major;
+               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,
+               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 TraceView
+} // namespace views
 } // namespace pv
 
-#endif // PULSEVIEW_PV_VIEW_RULER_H
+#endif // PULSEVIEW_PV_VIEWS_TRACEVIEW_RULER_HPP