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 ¤tPoint, 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