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 rescale() W_SIGNAL(rescale);
48
49protected:
50 virtual void createRulerPath() = 0;
51 virtual void computeGraduationSpacing() = 0;
52 QRectF boundingRect() const final override;
53 void mousePressEvent(QGraphicsSceneMouseEvent*) final override;
54 void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*) final override;
55 void mouseMoveEvent(QGraphicsSceneMouseEvent*) final override;
56 void mouseReleaseEvent(QGraphicsSceneMouseEvent*) final override;
57 ossia::time_value m_startPoint{};
58 qreal m_width{};
59};
60
61class TimeRuler final : public TimeRulerBase
62{
63 Q_INTERFACES(QGraphicsItem)
64
65public:
66 enum class Format
67 {
68 Hours,
69 Seconds,
70 Milliseconds,
71 Microseconds,
72 };
73
74 TimeRuler(QGraphicsView*);
75
76private:
77 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
78 override;
79
80 qreal graduationSpacing() const
81 {
82 return m_intervalsBetweenMark * m_graduationsSpacing;
83 }
84
85 void computeGraduationSpacing() override;
86 void createRulerPath() override;
87 void setZoomRatio(double factor) final override;
88
89 struct Mark
90 {
91 double pos;
92 std::chrono::nanoseconds time;
93 QGlyphRun text;
94 };
95
96 double m_pixelPerMillis{0.01};
97
98 std::vector<Mark> m_marks;
99
100 qreal m_graduationsSpacing{};
101 qreal m_graduationDelta{};
102 qreal m_intervalsBetweenMark{};
103 Format m_timeFormat{};
104
105 QPainterPath m_path;
106
107 QGraphicsView* m_viewport{};
108
109 QGlyphRun getGlyphs(std::chrono::nanoseconds);
110 QTextLayout m_layout;
111 std::deque<std::pair<std::chrono::nanoseconds, QGlyphRun>> m_stringCache;
112};
113
114class MusicalRuler final : public TimeRulerBase
115{
116 Q_INTERFACES(QGraphicsItem)
117
118public:
119 enum class Format
120 {
121 Bars,
122 Quarters,
123 Semiquavers,
124 Cents,
125 };
126
127 MusicalRuler(QGraphicsView*);
128
129private:
130 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
131 override;
132
133 void computeGraduationSpacing() override;
134 void createRulerPath() override;
135 void setZoomRatio(double factor) final override;
136 void setGrid(MusicalGrid& grid) final override;
137
138 QPointer<MusicalGrid> m_grid{};
139
140 QGraphicsView* m_viewport{};
141
142 QGlyphRun getGlyphs(ossia::bar_time timings, ossia::bar_time increments);
143 QTextLayout m_layout;
144 std::deque<std::tuple<ossia::bar_time, ossia::bar_time, QGlyphRun>> m_stringCache;
145};
146}
Definition MusicalGrid.hpp:16
Definition TimeRuler.hpp:115
Definition TimeRuler.hpp:36
Definition TimeRuler.hpp:62
Main plug-in of score.
Definition score-plugin-dataflow/Dataflow/PortItem.hpp:13