Added draw-to-reply button to media view.

This commit is contained in:
23rd
2026-03-11 10:36:03 +03:00
committed by John Preston
parent a242e76f26
commit a8452601d7
9 changed files with 53 additions and 6 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

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