-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoscview.h
More file actions
213 lines (168 loc) · 5.67 KB
/
oscview.h
File metadata and controls
213 lines (168 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#ifndef OSCVIEW_H
#define OSCVIEW_H
#include <QWidget>
#include <QPointF>
#include <QPoint>
#include <QVector>
#include <QHash>
#include <QStack>
#include <QSize>
#include <QPair>
#include <QColor>
#include "driveoscillogram.h"
class QPaintEvent;
class QResizeEvent;
class QMouseEvent;
class QWheelEvent;
class QPainter;
class QPixmap;
class OscView : public QWidget
{
Q_OBJECT
public:
explicit OscView(QWidget *parent = 0);
~OscView();
class Waveform{
public:
Waveform();
Waveform(const Waveform& wave);
Waveform(const DriveOscillogram::Channel* channel);
~Waveform();
/**
* @brief Получает количество точек в осциллограмме.
* @return Количество точек.
*/
size_t size() const;
/**
* @brief Устанавливает новый размер осциллограммы.
* @param s Размер осциллограммы.
*/
void resize(size_t s);
/**
* @brief Получает точку с заданным индексом.
* @param index Индекс точки.
* @return Точка с заданным индексом.
*/
const QPointF& point(size_t index) const;
/**
* @brief Получает точку с заданным индексом.
* @param index Индекс точки.
* @return Точка с заданным индексом.
*/
QPointF& point(size_t index);
/**
* @brief Получает прямоугольник - границу осциллограммы.
* @return Граница осциллограммы.
*/
QRectF boundRect() const;
private:
QVector<QPointF>* points;
};
/**
* @brief Получает количество осциллограмм.
* @return Количество осциллограмм.
*/
size_t count() const;
QSize sizeHint() const;
QSize minimumSizeHint() const;
/**
* @brief Устанавливает осциллограмму для просмотра.
* Осциллограмма будет удалена просмотрщиком.
* @param id Идентификатор осциллограммы.
* @param wf Осциллограмма.
* @param color Цвет осциллограммы.
*/
void setWaveform(int id, Waveform* wf, const QColor& color);
/**
* @brief Устанавливает осциллограмму для просмотра.
* Осциллограмма будет удалена просмотрщиком.
* @param id Идентификатор осциллограммы.
* @param wf Осциллограмма.
*/
void setWaveform(int id, Waveform* wf);
/**
* @brief Устанавливает цвет осциллограммы.
* @param id Идентификатор осциллограммы.
* @param color Цвет осциллограммы.
*/
void setWaveformColor(int id, const QColor& color);
/**
* @brief Удаляет осциллограмму.
* @param id Идентификатор осциллограммы.
*/
void delWaveform(int id);
/**
* @brief Удаляет все осциллограммы.
*/
void clearWaveforms();
/**
* @brief Приводит окно просмотра к наилучшему виду на осциллограммы.
*/
void adjustView();
signals:
public slots:
protected:
void paintEvent(QPaintEvent* event);
void resizeEvent(QResizeEvent* event);
void mouseDoubleClickEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
private:
class ViewSettings {
public:
ViewSettings();
ViewSettings(const ViewSettings& settings);
~ViewSettings();
QRectF& rect();
const QRectF& rect() const;
qreal dx() const;
qreal dy() const;
qreal left() const;
qreal bottom() const;
qreal top() const;
qreal right() const;
void adjustMarks(size_t ideal_x_count, size_t ideal_y_count);
const QVector<qreal>& marksX() const;
const QVector<qreal>& marksY() const;
void stepX(qreal steps);
void stepY(qreal steps);
void step(QPointF steps);
void zoomInX(qreal mult);
void zoomInY(qreal mult);
void zoomIn(qreal mult);
void zoomOutX(qreal mult);
void zoomOutY(qreal mult);
void zoomOut(qreal mult);
void view(const QRectF& rect_view);
private:
QRectF view_rect;
QVector<qreal> x_marks;
QVector<qreal> y_marks;
qreal adjustAxisStep(qreal ideal_step);
};
typedef QHash<int, QPair<Waveform*, QColor>> WaveformsList;
WaveformsList* waveforms;
QStack<ViewSettings>* view_settings;
QPixmap* main_pixmap;
bool is_dragging;
bool is_selecting;
QPoint old_pos;
QRect sel_rect;
const int MARK_LEN = 5;
const int XMARGIN = 55;
const int YMARGIN = 25;
void updatePixmap();
void drawAxes(QPainter* painter);
void drawXAxis(QPainter* painter);
void drawYAxis(QPainter* painter);
void drawWaveform(QPainter* painter, Waveform* wf);
int mapX(qreal point_x);
int mapY(qreal point_y);
QPoint map(const QPointF& point);
qreal unmapX(int point_x);
qreal unmapY(int point_y);
QPointF unmap(const QPoint& point);
};
#endif // OSCVIEW_H