diff --git a/Telegram/SourceFiles/history/view/controls/history_view_reply_options.cpp b/Telegram/SourceFiles/history/view/controls/history_view_reply_options.cpp index 7d348beb9..bd2898705 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_reply_options.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_reply_options.cpp @@ -176,14 +176,23 @@ private: } preview->update(); }; + const auto media = item->media(); + const auto onlyMessageText = media + && (media->webpage() + || media->game() + || (!media->photo() && !media->document())); preview->setMouseTracking(true); preview->events() | rpl::start_with_next([=](not_null e) { const auto type = e->type(); const auto mouse = static_cast(e.get()); if (type == QEvent::MouseMove) { + auto request = StateRequest{ + .flags = Ui::Text::StateRequest::Flag::LookupSymbol, + .onlyMessageText = onlyMessageText, + }; auto resolved = state->element->textState( mouse->pos() - state->position, - { .flags = Ui::Text::StateRequest::Flag::LookupSymbol }); + request); state->over = true; const auto text = (resolved.cursor == CursorState::Text); if (state->textCursor != text) { diff --git a/Telegram/SourceFiles/history/view/history_view_cursor_state.h b/Telegram/SourceFiles/history/view/history_view_cursor_state.h index d9ae01889..80cec91a9 100644 --- a/Telegram/SourceFiles/history/view/history_view_cursor_state.h +++ b/Telegram/SourceFiles/history/view/history_view_cursor_state.h @@ -63,6 +63,7 @@ struct StateRequest { result.flags = flags; return result; } + bool onlyMessageText = false; }; enum class InfoDisplayType : char { diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 142020884..c35d18d7a 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -2025,6 +2025,10 @@ TextState Message::textState( const auto media = this->media(); auto result = TextState(item); + const auto minSymbol = (_invertMedia && request.onlyMessageText) + ? visibleMediaTextLength() + : 0; + result.symbol = minSymbol; auto g = countGeometry(); if (g.width() < 1 || isHidden()) { @@ -2158,7 +2162,7 @@ TextState Message::textState( result = bottomInfoResult; } }; - if (!result.symbol && inBubble) { + if (result.symbol <= minSymbol && inBubble) { const auto mediaHeight = mediaDisplayed ? media->height() : 0; const auto mediaLeft = trect.x() - st::msgPadding.left(); const auto mediaTop = (!mediaDisplayed || _invertMedia) @@ -2174,7 +2178,17 @@ TextState Message::textState( result = media->textState( point - QPoint(mediaLeft, mediaTop), request); - if (!_invertMedia) { + if (_invertMedia) { + if (request.onlyMessageText) { + result.symbol = minSymbol; + result.afterSymbol = false; + result.cursor = CursorState::None; + } + } else if (request.onlyMessageText) { + result.symbol = visibleTextLength(); + result.afterSymbol = false; + result.cursor = CursorState::None; + } else { result.symbol += visibleTextLength(); } } else if (getStateText(point, trect, &result, request)) { @@ -2208,6 +2222,11 @@ TextState Message::textState( } } else if (media && media->isDisplayed()) { result = media->textState(point - g.topLeft(), request); + if (request.onlyMessageText) { + result.symbol = 0; + result.afterSymbol = false; + result.cursor = CursorState::None; + } result.symbol += visibleTextLength(); } @@ -2220,7 +2239,6 @@ TextState Message::textState( : 0); if (QRect(g.left(), keyboardTop, g.width(), keyboardHeight).contains(point)) { result.link = keyboard->getLink(point - QPoint(g.left(), keyboardTop)); - return result; } }