/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include #include #include class QGraphicsSceneMouseEvent; class QGraphicsTextItem; namespace Ui { class RpWidget; } // namespace Ui namespace Editor { class ItemCanvas; class ItemText; class NumberedItem; class Scene final : public QGraphicsScene { public: using ItemPtr = std::shared_ptr; Scene(const QRectF &rect); ~Scene(); void applyBrush(const QColor &color, float64 size, Brush::Tool tool); void setBlurSource(Fn source); void setTextDefaults(const QColor &color, float64 fontSize, int style); [[nodiscard]] std::vector items( Qt::SortOrder order = Qt::DescendingOrder) const; void addItem(ItemPtr item); void removeItem(not_null item); void removeItem(const ItemPtr &item); [[nodiscard]] rpl::producer<> addsItem() const; [[nodiscard]] rpl::producer<> removesItem() const; [[nodiscard]] std::shared_ptr lastZ() const; void updateZoom(float64 zoom); void cancelDrawing(); void startTextEditing(ItemText *item); void createTextAtCenter(); void setTextColor(const QColor &color); void setSelectedTextColor(const QColor &color); [[nodiscard]] rpl::producer textColorRequests() const; [[nodiscard]] rpl::producer textItemSelections() const; [[nodiscard]] rpl::producer<> textItemDeselections() const; [[nodiscard]] rpl::producer textEditStates() const; [[nodiscard]] bool hasUndo() const; [[nodiscard]] bool hasRedo() const; void performUndo(); void performRedo(); void save(SaveState state); void restore(SaveState state); void clearRedoList(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event) override; void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; private: void removeIf(Fn proj); void finishTextEditing(bool save); void setTextEditing(bool editing); void setupTextProxy( QGraphicsTextItem *proxy, const QColor &color, float64 fontSize); const std::shared_ptr _canvas; const std::shared_ptr _lastZ; Fn _blurSource; std::vector _items; std::unordered_map _itemsByPointer; float64 _lastLineZ = 0.; float64 _currentZoom = 1.; int _itemNumber = 0; QColor _textColor; float64 _textFontSize = 0.; int _textStyle = 0; int _textEditStyle = 0; struct { std::weak_ptr item; base::unique_qptr proxy; } _textEdit; rpl::event_stream<> _addsItem, _removesItem; rpl::event_stream _textColorRequests; rpl::event_stream _textItemSelections; rpl::event_stream<> _textItemDeselections; rpl::event_stream _textEditStates; ItemText *_selectedTextItem = nullptr; bool _textEditing = false; int _textEditGeneration = 0; rpl::lifetime _lifetime; }; } // namespace Editor