diff --git a/Telegram/Resources/icons/mediaview/draw.png b/Telegram/Resources/icons/mediaview/draw.png new file mode 100644 index 0000000000..96a1d8086e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/draw.png differ diff --git a/Telegram/Resources/icons/mediaview/draw@2x.png b/Telegram/Resources/icons/mediaview/draw@2x.png new file mode 100644 index 0000000000..40da849c7e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/draw@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/draw@3x.png b/Telegram/Resources/icons/mediaview/draw@3x.png new file mode 100644 index 0000000000..22ee4fb7bb Binary files /dev/null and b/Telegram/Resources/icons/mediaview/draw@3x.png differ diff --git a/Telegram/SourceFiles/media/view/media_view.style b/Telegram/SourceFiles/media/view/media_view.style index f39e3426de..e5a0c4af04 100644 --- a/Telegram/SourceFiles/media/view/media_view.style +++ b/Telegram/SourceFiles/media/view/media_view.style @@ -119,6 +119,7 @@ mediaviewShare: icon {{ "mediaview/viewer_share", mediaviewControlFg }}; mediaviewRotate: icon {{ "mediaview/rotate", mediaviewControlFg }}; mediaviewMore: icon {{ "title_menu_dots", mediaviewControlFg }}; mediaviewRecognize: icon {{ "mediaview/recognize", mediaviewControlFg }}; +mediaviewDraw: icon {{ "mediaview/draw", mediaviewControlFg }}; mediaviewFileRed: icon { { size(25px, 25px), mediaviewFileBg }, diff --git a/Telegram/SourceFiles/media/view/media_view_open_common.h b/Telegram/SourceFiles/media/view/media_view_open_common.h index 8655926354..0676cc9cd1 100644 --- a/Telegram/SourceFiles/media/view/media_view_open_common.h +++ b/Telegram/SourceFiles/media/view/media_view_open_common.h @@ -31,12 +31,14 @@ public: not_null photo, HistoryItem *item, MsgId topicRootId, - PeerId monoforumPeerId) + PeerId monoforumPeerId, + bool showDrawButton = false) : _controller(controller) , _photo(photo) , _item(item) , _topicRootId(topicRootId) - , _monoforumPeerId(monoforumPeerId) { + , _monoforumPeerId(monoforumPeerId) + , _showDrawButton(showDrawButton) { } OpenRequest( Window::SessionController *controller, @@ -54,14 +56,16 @@ public: MsgId topicRootId, PeerId monoforumPeerId, bool continueStreaming = false, - crl::time startTime = 0) + crl::time startTime = 0, + bool showDrawButton = false) : _controller(controller) , _document(document) , _item(item) , _topicRootId(topicRootId) , _monoforumPeerId(monoforumPeerId) , _continueStreaming(continueStreaming) - , _startTime(startTime) { + , _startTime(startTime) + , _showDrawButton(showDrawButton) { } OpenRequest( Window::SessionController *controller, @@ -148,6 +152,10 @@ public: return _startTime; } + [[nodiscard]] bool showDrawButton() const { + return _showDrawButton; + } + private: Window::SessionController *_controller = nullptr; DocumentData *_document = nullptr; @@ -161,6 +169,7 @@ private: std::optional _cloudTheme = std::nullopt; bool _continueStreaming = false; crl::time _startTime = 0; + bool _showDrawButton = false; std::shared_ptr _call; QString _callLinkSlug; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp index e1da206d12..cacf4d7de0 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp @@ -819,7 +819,8 @@ auto OverlayWidget::RendererGL::controlMeta(Over control) const -> Control { case Over::Share: return { 3, &st::mediaviewShare }; case Over::Rotate: return { 4, &st::mediaviewRotate }; case Over::More: return { 5, &st::mediaviewMore }; - case Over::Recognize: return { 6, &st::mediaviewRecognize }; + case Over::Draw: return { 6, &st::mediaviewDraw }; + case Over::Recognize: return { 7, &st::mediaviewRecognize }; } Unexpected("Control value in OverlayWidget::RendererGL::ControlIndex."); } @@ -835,6 +836,7 @@ void OverlayWidget::RendererGL::validateControls() { controlMeta(Over::Share), controlMeta(Over::Rotate), controlMeta(Over::More), + controlMeta(Over::Draw), controlMeta(Over::Recognize), }; auto maxWidth = 0; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h index e2e973e514..8438bc9dc5 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h @@ -152,7 +152,7 @@ private: static constexpr auto kStoriesSiblingPartsCount = 4; Ui::GL::Image _storiesSiblingParts[kStoriesSiblingPartsCount]; - static constexpr auto kControlsCount = 7; + static constexpr auto kControlsCount = 8; [[nodiscard]] Control controlMeta(Over control) const; // Last one is for the over circle image. diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 33de067e28..9315abd4b9 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -1452,6 +1452,10 @@ void OverlayWidget::updateControls() { _saveVisible = computeSaveButtonVisible(); _shareVisible = story && story->canShare(); _rotateVisible = !_themePreviewShown && !story; + _drawVisible = _drawButtonEnabled + && !_themePreviewShown + && !story + && (_photo || (_document && _document->isImage())); _recognizeVisible = _recognitionResult.success && !_recognitionResult.items.empty(); const auto navRect = [&](int i) { @@ -1484,6 +1488,12 @@ void OverlayWidget::updateControls() { if (_saveVisible) { ++index; } + _drawNav = navRect(index); + _drawNavOver = style::centerrect(_drawNav, overRect); + _drawNavIcon = style::centerrect(_drawNav, st::mediaviewDraw); + if (_drawVisible) { + ++index; + } _recognizeNav = navRect(index); _recognizeNavOver = style::centerrect(_recognizeNav, overRect); _recognizeNavIcon = style::centerrect(_recognizeNav, st::mediaviewRecognize); @@ -2004,6 +2014,10 @@ bool OverlayWidget::updateControlsAnimation(crl::time now) { + (_over == Over::Share ? _shareNavOver : _shareNavIcon) + (_over == Over::Rotate ? _rotateNavOver : _rotateNavIcon) + (_over == Over::More ? _moreNavOver : _moreNavIcon) + + (_over == Over::Draw ? _drawNavOver : _drawNavIcon) + + (_over == Over::Recognize + ? _recognizeNavOver + : _recognizeNavIcon) + ((_stories && (_over == Over::LeftStories || _over == Over::RightStories)) ? _stories->sibling(siblingType).layout.geometry @@ -3077,6 +3091,9 @@ void OverlayWidget::recognize() { st::widgetFadeDuration); } +void OverlayWidget::draw() { +} + void OverlayWidget::copyMedia() { if (showCopyMediaRestriction()) { return; @@ -3675,6 +3692,7 @@ void OverlayWidget::show(OpenRequest request) { const auto contextItem = request.item(); const auto contextPeer = request.peer(); const auto contextTopicRootId = request.topicRootId(); + _drawButtonEnabled = request.showDrawButton(); if (!request.continueStreaming() && !request.startTime() && !_reShow) { if (_message && (_message == contextItem)) { return close(); @@ -5621,6 +5639,12 @@ void OverlayWidget::paintControls( _moreNavOver, _moreNavIcon, st::mediaviewMore }, + { + Over::Draw, + _drawVisible, + _drawNavOver, + _drawNavIcon, + st::mediaviewDraw }, { Over::Recognize, _recognizeVisible, @@ -6283,6 +6307,7 @@ void OverlayWidget::handleMousePress( || _over == Over::Save || _over == Over::Share || _over == Over::Rotate + || _over == Over::Draw || _over == Over::Recognize || _over == Over::Icon || _over == Over::More @@ -6440,6 +6465,7 @@ void OverlayWidget::updateOverRect(Over state) { case Over::Save: update(_saveNavOver); break; case Over::Share: update(_shareNavOver); break; case Over::Rotate: update(_rotateNavOver); break; + case Over::Draw: update(_drawNavOver); break; case Over::Icon: update(_docIconRect); break; case Over::Header: update(_headerNav); break; case Over::More: update(_moreNavOver); break; @@ -6578,6 +6604,8 @@ void OverlayWidget::updateOver(QPoint pos) { updateOverState(Over::Icon); } else if (_moreNav.contains(pos)) { updateOverState(Over::More); + } else if (_drawVisible && _drawNav.contains(pos)) { + updateOverState(Over::Draw); } else if (_recognizeVisible && _recognizeNav.contains(pos)) { updateOverState(Over::Recognize); } else if (contentShown() && finalContentRect().contains(pos)) { @@ -6676,6 +6704,8 @@ void OverlayWidget::handleMouseRelease( handleDocumentClick(); } else if (_over == Over::More && _down == Over::More) { InvokeQueued(_widget, [=] { showDropdown(); }); + } else if (_over == Over::Draw && _down == Over::Draw) { + draw(); } else if (_over == Over::Recognize && _down == Over::Recognize) { recognize(); } else if (_over == Over::Video && _down == Over::Video) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 8c0deba771..2c16b09463 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -158,6 +158,7 @@ private: Share, Rotate, More, + Draw, Recognize, Icon, Video, @@ -287,6 +288,7 @@ private: void showMediaOverview(); void copyMedia(); void recognize(); + void draw(); void receiveMouse(); void showAttachedStickers(); [[nodiscard]] auto scaledRecognitionRect(QPoint position) @@ -594,6 +596,7 @@ private: QRect _headerNav, _nameNav, _dateNav, _separatorNav; QRect _rotateNav, _rotateNavOver, _rotateNavIcon; QRect _shareNav, _shareNavOver, _shareNavIcon; + QRect _drawNav, _drawNavOver, _drawNavIcon; QRect _recognizeNav, _recognizeNavOver, _recognizeNavIcon; QRect _saveNav, _saveNavOver, _saveNavIcon; QRect _moreNav, _moreNavOver, _moreNavIcon; @@ -602,6 +605,8 @@ private: bool _saveVisible = false; bool _shareVisible = false; bool _rotateVisible = false; + bool _drawButtonEnabled = true; + bool _drawVisible = false; bool _recognizeVisible = false; bool _headerHasLink = false; QString _dateText;