summaryrefslogtreecommitdiffstats
path: root/qt-ui/profilegraphics.h
blob: a45243ba3d9122aa68de98e36edc12faa0de324d (plain) (blame)
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
214
#ifndef PROFILEGRAPHICS_H
#define PROFILEGRAPHICS_H

#include "graphicsview-common.h"
#include "../display.h"
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QIcon>
#include <QDoubleSpinBox>
#include <QPushButton>
#include <QGraphicsProxyWidget>

struct text_render_options;
struct graphics_context;
struct plot_info;
typedef struct text_render_options text_render_options_t;

/* To use a tooltip, simply ->setToolTip on the QGraphicsItem that you want
 * or, if it's a "global" tooltip, set it on the mouseMoveEvent of the ProfileGraphicsView.
 */
class ToolTipItem :public QObject, public QGraphicsPathItem
{
	Q_OBJECT
	void updateTitlePosition();
	Q_PROPERTY(QRectF rect READ boundingRect WRITE setRect)

public:
	enum Status{COLLAPSED, EXPANDED};
	enum {ICON_SMALL = 16, ICON_MEDIUM = 24, ICON_BIG = 32, SPACING=4};

	explicit ToolTipItem(QGraphicsItem* parent = 0);
	virtual ~ToolTipItem();

	void collapse();
	void expand();
	void clear();
	void addToolTip(const QString& toolTip, const QIcon& icon = QIcon());
	void refresh(struct graphics_context* gc, QPointF pos);
	bool isExpanded();
	void persistPos();
	void readPos();
	void mousePressEvent(QGraphicsSceneMouseEvent* event);
	void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
	bool eventFilter(QObject* , QEvent* );
public slots:
	void setRect(const QRectF& rect);

private:
	typedef QPair<QGraphicsPixmapItem*, QGraphicsSimpleTextItem*> ToolTip;
	QList<ToolTip> toolTips;
	QGraphicsPathItem *background;
	QGraphicsLineItem *separator;
	QGraphicsSimpleTextItem *title;
	Status status;
	QRectF rectangle;
	bool dragging;
	QRectF nextRectangle;
};

class RulerItem;

class RulerNodeItem : public QObject, public QGraphicsEllipseItem
{
	Q_OBJECT
	friend class RulerItem;
public:
	explicit RulerNodeItem(QGraphicsItem* parent, graphics_context gc);
	void setRuler(RulerItem *r);
	void recalculate();

protected:
	QVariant itemChange(GraphicsItemChange change, const QVariant & value );

private:
	graphics_context gc;
	struct plot_data *entry;
	RulerItem* ruler;
};

class RulerItem : public QGraphicsObject
{
	Q_OBJECT
public:
	explicit RulerItem(QGraphicsItem* parent,
			   RulerNodeItem *sourceMarker,
			   RulerNodeItem *destMarker);
	void recalculate();

	RulerNodeItem* sourceNode() const;
	RulerNodeItem* destNode() const;
	void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget * widget = 0);
	QRectF boundingRect() const;
	QPainterPath shape() const;

private:
	QPointF startPoint, endPoint;
	RulerNodeItem *source, *dest;
	QString text;
	int height;
	int paint_direction;
};

class EventItem : public QGraphicsPolygonItem
{
public:
	explicit EventItem(QGraphicsItem* parent = 0, bool grayscale = FALSE);

private:
	ToolTipItem *controller;
	QString text;
	QIcon icon;
	bool isGrayscale;

	QColor getColor(const color_indice_t i);
};

class GraphicsTextEditor : public QGraphicsTextItem{
	Q_OBJECT
public:
	GraphicsTextEditor(QGraphicsItem* parent = 0);

protected:
	virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);
	virtual void keyReleaseEvent(QKeyEvent* event);

signals:
	void textChanged(const QString& text);
	void editingFinished(const QString& text);
};

class ProfileGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
	enum Mode{DIVE, PLAN};

	ProfileGraphicsView(QWidget* parent = 0);
	void plot(struct dive *d, bool forceRedraw = FALSE);
	bool eventFilter(QObject* obj, QEvent* event);
	void clear();
	void setPrintMode(bool mode, bool grayscale = FALSE);

protected:
	void resizeEvent(QResizeEvent *event);
	void mouseMoveEvent(QMouseEvent* event);
	void wheelEvent(QWheelEvent* event);
	void showEvent(QShowEvent* event);

public slots:
	void refresh();
	void edit_dive_time(const QString& time);
	void on_rulerAction();
	void on_scaleAction();

private:
	void plot_depth_profile();
	QGraphicsItemGroup *plot_text(text_render_options_t *tro, const QPointF& pos, const QString &text, QGraphicsItem *parent = 0);
	void plot_events(struct divecomputer *dc);
	void plot_one_event(struct event *event);
	void plot_temperature_profile();
	void plot_cylinder_pressure();
	void plot_temperature_text();
	void plot_single_temp_text(int sec, int mkelvin);
	void plot_depth_text();
	void plot_text_samples();
	void plot_depth_sample(struct plot_data *entry, text_render_options_t *tro);
	void plot_cylinder_pressure_text();
	void plot_pressure_value(int mbar, int sec, double xalign, double yalign);
	void plot_gas_value(int mbar, int sec, double xalign, double yalign, int o2, int he);
	void plot_deco_text();
	void plot_add_line(int sec, double val, QColor c, QPointF &from);
	void plot_pp_gas_profile();
	void plot_pp_text();
	void plot_depth_scale();


	void addControlItems();

	void create_ruler();
	void add_ruler();
	void remove_ruler();

	QColor getColor(const color_indice_t i);
	QColor get_sac_color(int sac, int avg_sac);
	void scrollViewTo(const QPoint pos);

	QPen defaultPen;
	QBrush defaultBrush;
	ToolTipItem *toolTip;
	graphics_context gc;
	struct dive *dive;
	struct divecomputer *diveDC;
	int zoomLevel;

	bool rulerEnabled;
	bool printMode;
	bool isGrayscale;

	// Top Level Items.
	QGraphicsItem* profileGrid;
	QGraphicsItem* timeMarkers;
	QGraphicsItem* depthMarkers;
	QGraphicsItem* diveComputer;
	RulerItem *rulerItem;
	QGraphicsProxyWidget *toolBarProxy;

	// For 'Plan' mode.:
	GraphicsTextEditor *depthEditor;
	GraphicsTextEditor *timeEditor;

	enum Mode mode;
};

#endif