Allow quote selection only in captions.

This commit is contained in:
John Preston 2023-10-24 21:39:25 +04:00
parent d62fb5786d
commit b463c76eca
3 changed files with 32 additions and 4 deletions

View File

@ -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<QEvent*> e) {
const auto type = e->type();
const auto mouse = static_cast<QMouseEvent*>(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) {

View File

@ -63,6 +63,7 @@ struct StateRequest {
result.flags = flags;
return result;
}
bool onlyMessageText = false;
};
enum class InfoDisplayType : char {

View File

@ -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;
}
}