From 12a78c1f45e52637f0e7cfd4830f4fb4f850132f Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 26 Apr 2024 16:06:30 +0400 Subject: [PATCH] Allow pasting text to the unfocused search. --- .../SourceFiles/dialogs/dialogs_widget.cpp | 33 +++++++++++++++---- Telegram/SourceFiles/dialogs/dialogs_widget.h | 2 ++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 856019d0f..13b83753c 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -3264,13 +3264,7 @@ void Widget::keyPressEvent(QKeyEvent *e) { } else { _inner->selectSkipPage(_scroll->height(), -1); } - } else if (!(e->modifiers() & ~Qt::ShiftModifier) - && e->key() != Qt::Key_Shift - && !_openedFolder - && !_openedForum - && _search->isVisible() - && !_search->hasFocus() - && !e->text().isEmpty()) { + } else if (redirectKeyToSearch(e)) { // This delay in search focus processing allows us not to create // _suggestions in case the event inserts some non-whitespace search // query while still show _suggestions animated, if it is a space. @@ -3284,6 +3278,31 @@ void Widget::keyPressEvent(QKeyEvent *e) { } } +bool Widget::redirectKeyToSearch(QKeyEvent *e) const { + if (_openedFolder + || _openedForum + || !_search->isVisible() + || _search->hasFocus()) { + return false; + } + const auto character = !(e->modifiers() & ~Qt::ShiftModifier) + && (e->key() != Qt::Key_Shift) + && !e->text().isEmpty(); + if (character) { + return true; + } else if (e != QKeySequence::Paste) { + return false; + } + const auto useSelectionMode = (e->key() == Qt::Key_Insert) + && (e->modifiers() == (Qt::CTRL | Qt::SHIFT)) + && QGuiApplication::clipboard()->supportsSelection(); + const auto pasteMode = useSelectionMode + ? QClipboard::Selection + : QClipboard::Clipboard; + const auto data = QGuiApplication::clipboard()->mimeData(pasteMode); + return data && data->hasText(); +} + void Widget::paintEvent(QPaintEvent *e) { if (controller()->contentOverlapped(this, e)) { return; diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index 7218c2513..ecd2f3608 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -250,6 +250,8 @@ private: void updateSuggestions(anim::type animated); void processSearchFocusChange(); + [[nodiscard]] bool redirectKeyToSearch(QKeyEvent *e) const; + MTP::Sender _api; bool _dragInScroll = false;