Loading...
Searching...
No Matches
TimeRuler.hpp
1#pragma once
2#include <Process/TimeValue.hpp>
3
4#include <Scenario/Document/TimeRuler/TimeRuler.hpp>
5
6#include <score/model/ColorReference.hpp>
7
8#include <ossia/editor/scenario/time_value.hpp>
9
10#include <ossia-qt/time.hpp>
11
12#include <QGlyphRun>
13#include <QGraphicsItem>
14#include <QPainterPath>
15#include <QPoint>
16#include <QPointer>
17#include <QTextLayout>
18
19#include <score_plugin_scenario_export.h>
20
21#include <chrono>
22#include <deque>
23#include <verdigris>
24class QGraphicsSceneMouseEvent;
25class QPainter;
26class QStyleOptionGraphicsItem;
27class QWidget;
28class QGraphicsView;
29
30namespace Scenario
31{
32class MusicalGrid;
33class SCORE_PLUGIN_SCENARIO_EXPORT TimeRulerBase
34 : public QObject
35 , public QGraphicsItem
36{
37 W_OBJECT(TimeRulerBase)
38public:
39 qreal width() const { return m_width; }
40 void setWidth(qreal newWidth);
41 void setStartPoint(ossia::time_value dur);
42 virtual void setZoomRatio(double factor) = 0;
43 virtual void setGrid(MusicalGrid& grid);
44
45 void doubleClicked(QPointF pt) W_SIGNAL(doubleClicked, pt);
46 void drag(QPointF arg_1, QPointF arg_2) W_SIGNAL(drag, arg_1, arg_2);
47 void scrubPressed(QPointF arg_1, QPointF arg_2) W_SIGNAL(scrubPressed, arg_1, arg_2);
48 void scrubMoved(QPointF arg_1, QPointF arg_2) W_SIGNAL(scrubMoved, arg_1, arg_2);
49 void scrubReleased(QPointF arg_1, QPointF arg_2) W_SIGNAL(scrubReleased, arg_1, arg_2);
50 void rescale() W_SIGNAL(rescale);
51
52protected:
53 virtual void createRulerPath() = 0;
54 virtual void computeGraduationSpacing() = 0;
55 QRectF boundingRect() const final override;
56 void mousePressEvent(QGraphicsSceneMouseEvent*) final override;
57 void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*) final override;
58 void mouseMoveEvent(QGraphicsSceneMouseEvent*) final override;
59 void mouseReleaseEvent(QGraphicsSceneMouseEvent*) final override;
60 ossia::time_value m_startPoint{};
61 qreal m_width{};
62 bool m_inScrub{};
63};
64
65class TimeRuler final : public TimeRulerBase
66{
67 Q_INTERFACES(QGraphicsItem)
68
69public:
70 enum class Format
71 {
72 Hours,
73 Seconds,
74 Milliseconds,
75 Microseconds,
76 };
77
78 TimeRuler(QGraphicsView*);
79
80private:
81 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
82 override;
83
84 qreal graduationSpacing() const
85 {
86 return m_intervalsBetweenMark * m_graduationsSpacing;
87 }
88
89 void computeGraduationSpacing() override;
90 void createRulerPath() override;
91 void setZoomRatio(double factor) final override;
92
93 struct Mark
94 {
95 double pos;
96 std::chrono::nanoseconds time;
97 QGlyphRun text;
98 };
99
100 double m_pixelPerMillis{0.01};
101
102 std::vector<Mark> m_marks;
103
104 qreal m_graduationsSpacing{};
105 qreal m_graduationDelta{};
106 qreal m_intervalsBetweenMark{};
107 Format m_timeFormat{};
108
109 QPainterPath m_path;
110
111 QGraphicsView* m_viewport{};
112
113 QGlyphRun getGlyphs(std::chrono::nanoseconds);
114 QTextLayout m_layout;
115 std::deque<std::pair<std::chrono::nanoseconds, QGlyphRun>> m_stringCache;
116};
117
118class MusicalRuler final : public TimeRulerBase
119{
120 Q_INTERFACES(QGraphicsItem)
121
122public:
123 enum class Format
124 {
125 Bars,
126 Quarters,
127 Semiquavers,
128 Cents,
129 };
130
131 MusicalRuler(QGraphicsView*);
132
133private:
134 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
135 override;
136
137 void computeGraduationSpacing() override;
138 void createRulerPath() override;
139 void setZoomRatio(double factor) final override;
140 void setGrid(MusicalGrid& grid) final override;
141
142 QPointer<MusicalGrid> m_grid{};
143
144 QGraphicsView* m_viewport{};
145
146 QGlyphRun getGlyphs(ossia::bar_time timings, ossia::bar_time increments);
147 QTextLayout m_layout;
148 std::deque<std::tuple<ossia::bar_time, ossia::bar_time, QGlyphRun>> m_stringCache;
149};
150}
Definition MusicalGrid.hpp:16
Definition TimeRuler.hpp:119
Definition TimeRuler.hpp:36
Definition TimeRuler.hpp:66
Main plug-in of score.
Definition score-plugin-dataflow/Dataflow/PortItem.hpp:13