ImagingTools Core SDK
CTimeAxis.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QDateTime>
7#include <QtWidgets/QGraphicsRectItem>
8#include <QtWidgets/QStyleOptionGraphicsItem>
9
10// ImtCore includes
11#include <imtloggui/IEventScenePositionProvider.h>
12
13
14namespace imtloggui
15{
16
17
18class CTimeAxis : public QObject, public QGraphicsRectItem, virtual public IEventScenePositionProvider
19{
20 Q_OBJECT
21
22public:
23 typedef QGraphicsRectItem BaseClass;
24
25 // Quantization thresholds in secs
26 enum QuantizationThresholds
27 {
28 QUA_DAY = 86400 * 3,
29 QUA_MONTH = 86400 * 365,
30 };
31
32 enum ChangeFlags
33 {
34 CF_POSITION = 0,
35 CF_BEGIN_VALUE,
36 CF_END_VALUE,
37 CF_SCALE
38 };
39
40 CTimeAxis(QGraphicsItem* parent = nullptr);
41
42 void SetColor(const QColor& color);
43 void EnsureTimeRange(const QDateTime& time);
44 int GetMargin();
45 void CreateTimeItemTable();
46
47 // reimplemented (QGraphicsRectItem)
48 virtual QRectF boundingRect() const override;
49 virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
50
51 // reimplemented (QGraphicsItem)
52 void setPos(const QPointF& origin);
53 void setPos(double x, double y);
54
55 // reimplemented (IEventScenePositionProvider)
56 virtual double GetScenePositionFromTime(const QDateTime& time) const override;
57 virtual QDateTime GetTimeFromScenePosition(double position) const override;
58 virtual QDateTime GetBeginTime() const override;
59 virtual QDateTime GetEndTime() const override;
60 virtual QDateTime GetVisibleBeginTime() const override;
61 virtual QDateTime GetVisibleEndTime() const override;
62
63Q_SIGNALS:
64 void EmitAxisPosChanged(const QPointF& oldPos, const QPointF& newPos);
65 void EmitAxisBeginTimeChanged(const QDateTime& oldTime, const QDateTime& newTime);
66 void EmitAxisEndTimeChanged(const QDateTime& oldTime, const QDateTime& newTime);
67
68protected:
69 enum TickType
70 {
71 TT_MAJOR = 0,
72 TT_MINOR
73 };
74
75 enum TimeInterval
76 {
77 TI_1MS = 0,
78 TI_10MS,
79 TI_100MS,
80
81 TI_1S,
82 TI_5S,
83 TI_15S,
84 TI_30S,
85
86 TI_1M,
87 TI_5M,
88 TI_15M,
89 TI_30M,
90
91 TI_1H,
92 TI_3H,
93 TI_6H,
94 TI_12H,
95
96 TI_DAY,
97 TI_WEEK,
98 TI_MONTH,
99 TI_QUARTER,
100 TI_YEAR,
101
102 TI_COUNT,
103 TI_NONE
104 };
105
106 struct IntervalsInfo
107 {
108 TimeInterval majorInterval;
109 TimeInterval minorInterval;
110 QString timeFormat;
111 };
112
113 struct TickInfo
114 {
115 TickType type;
116 QString timeFormat;
117 };
118
119 typedef QMap<QDateTime, TickInfo> Ticks;
120
121 struct MinorIntervalItem
122 {
123 double scaleMin;
124 double distance;
125 TimeInterval interval;
126 };
127
128 struct MajorIntervalItem
129 {
130 double scaleMin;
131 double scaleMax;
132 double distance;
133 TimeInterval interval;
134 QString timeFormat;
135
136 QVector<MinorIntervalItem> minorIntervals;
137 };
138
139 QVector<MajorIntervalItem> m_intervals;
140
141protected:
142 IntervalsInfo CalculateIntervals(double scale) const;
143 Ticks CalculateTicks(const IntervalsInfo& intervalsInfo) const;
144
145 double GetCurrentScaleX() const;
146 double GetCurrentScaleY() const;
147 QRectF GetSceneVisibleRect() const;
148 QRectF GetItemVisibleRect() const;
149
150 double GetRectPositionFromTime(const QDateTime& time) const;
151 QDateTime GetTimeFromRectPosition(double position) const;
152
153private:
154 QDateTime m_firstEvent;
155 QDateTime m_lastEvent;
156 QDateTime m_beginTime;
157 QDateTime m_endTime;
158 QColor m_color;
159 QFontMetrics m_fontMetrics;
160
161 double m_minMinorTickStep;
162 double m_labelWidthFactor;
163};
164
165
166} // namespace imtloggui
167
168