1 /*
2 This file is part of Telegram Desktop,
3 the official desktop application for the Telegram messaging service.
4 
5 For license and copyright information please follow this link:
6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
7 */
8 #pragma once
9 
10 #include <QGraphicsItem>
11 
12 class QGraphicsSceneMouseEvent;
13 
14 namespace Editor {
15 
16 class ItemCanvas : public QGraphicsItem {
17 public:
18 	struct Content {
19 		QPixmap pixmap;
20 		QPointF position;
21 	};
22 
23 	ItemCanvas();
24 	~ItemCanvas();
25 
26 	void applyBrush(const QColor &color, float size);
27 	void clearPixmap();
28 	void cancelDrawing();
29 
30 	QRectF boundingRect() const override;
31 	void paint(
32 		QPainter *p,
33 		const QStyleOptionGraphicsItem *option,
34 		QWidget *widget) override;
35 
36 	void handleMousePressEvent(not_null<QGraphicsSceneMouseEvent*> event);
37 	void handleMouseReleaseEvent(not_null<QGraphicsSceneMouseEvent*> event);
38 	void handleMouseMoveEvent(not_null<QGraphicsSceneMouseEvent*> event);
39 
40 	[[nodiscard]] rpl::producer<Content> grabContentRequests() const;
41 
42 protected:
43 	bool collidesWithItem(
44 		const QGraphicsItem *,
45 		Qt::ItemSelectionMode) const override;
46 
47 	bool collidesWithPath(
48 		const QPainterPath &,
49 		Qt::ItemSelectionMode) const override;
50 private:
51 	void computeContentRect(const QPointF &p);
52 	void drawLine(const QPointF &currentPoint, const QPointF &lastPoint);
53 
54 	bool _drawing = false;
55 
56 	std::unique_ptr<PainterHighQualityEnabler> _hq;
57 	std::unique_ptr<Painter> _p;
58 
59 	QRectF _rectToUpdate;
60 	QRectF _contentRect;
61 	QMarginsF _brushMargins;
62 
63 	QPointF _lastPoint;
64 
65 	QPixmap _pixmap;
66 
67 	struct {
68 		float size = 1.;
69 		QColor color;
70 	} _brushData;
71 
72 	rpl::event_stream<Content> _grabContentRequests;
73 
74 };
75 
76 } // namespace Editor
77