scene_item_canvas.h 1.7 KB

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