diff --git a/Telegram/SourceFiles/history/view/history_view_chat_preview.cpp b/Telegram/SourceFiles/history/view/history_view_chat_preview.cpp index 3ab2ada32..118474695 100644 --- a/Telegram/SourceFiles/history/view/history_view_chat_preview.cpp +++ b/Telegram/SourceFiles/history/view/history_view_chat_preview.cpp @@ -480,6 +480,11 @@ void Item::setupHistory() { using Type = Ui::ElasticScroll::OverscrollType; _scroll->setOverscrollTypes(Type::Real, Type::Real); + _inner->scrollKeyEvents( + ) | rpl::start_with_next([=](not_null e) { + _scroll->keyPressEvent(e); + }, lifetime()); + _scroll->events() | rpl::start_with_next([=](not_null e) { if (e->type() == QEvent::MouseButtonDblClick) { const auto button = static_cast(e.get())->button(); diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index 6f6484dc9..cef7612e9 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -2604,7 +2604,11 @@ auto ListWidget::countScrollState() const -> ScrollTopState { } void ListWidget::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Back) { + const auto key = e->key(); + const auto hasModifiers = (Qt::NoModifier != + (e->modifiers() + & ~(Qt::KeypadModifier | Qt::GroupSwitchModifier))); + if (key == Qt::Key_Escape || key == Qt::Key_Back) { if (hasSelectedText() || hasSelectedItems()) { cancelSelection(); } else { @@ -2616,22 +2620,33 @@ void ListWidget::keyPressEvent(QKeyEvent *e) { && !hasCopyRestrictionForSelected()) { TextUtilities::SetClipboardText(getSelectedText()); #ifdef Q_OS_MAC - } else if (e->key() == Qt::Key_E + } else if (key == Qt::Key_E && e->modifiers().testFlag(Qt::ControlModifier) && !showCopyRestriction() && !hasCopyRestrictionForSelected()) { TextUtilities::SetClipboardText(getSelectedText(), QClipboard::FindBuffer); #endif // Q_OS_MAC - } else if (e == QKeySequence::Delete || e->key() == Qt::Key_Backspace) { + } else if (e == QKeySequence::Delete || key == Qt::Key_Backspace) { _delegate->listDeleteRequest(); + } else if (!hasModifiers + && ((key == Qt::Key_Up) + || (key == Qt::Key_Down) + || (key == Qt::Key_PageUp) + || (key == Qt::Key_PageDown))) { + _scrollKeyEvents.fire(std::move(e)); } else if (!(e->modifiers() & ~Qt::ShiftModifier) - && e->key() != Qt::Key_Shift) { + && key != Qt::Key_Shift) { _delegate->listTryProcessKeyInput(e); } else { e->ignore(); } } +auto ListWidget::scrollKeyEvents() const +-> rpl::producer> { + return _scrollKeyEvents.events(); +} + void ListWidget::mouseDoubleClickEvent(QMouseEvent *e) { mouseActionStart(e->globalPos(), e->button()); trySwitchToWordSelection(); diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index 09121d357..6be426406 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -382,6 +382,10 @@ public: const TextState &reactionState) const; void toggleFavoriteReaction(not_null view) const; + + [[nodiscard]] auto scrollKeyEvents() const + -> rpl::producer>; + // ElementDelegate interface. Context elementContext() override; bool elementUnderCursor(not_null view) override; @@ -851,6 +855,7 @@ private: rpl::event_stream _requestedToReplyToMessage; rpl::event_stream _requestedToReadMessage; rpl::event_stream _requestedToShowMessage; + rpl::event_stream> _scrollKeyEvents; rpl::lifetime _viewerLifetime; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 845b70fce..1ecf43c29 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -797,7 +797,9 @@ void RepliesWidget::setupComposeControls() { } }, lifetime()); - _composeControls->scrollKeyEvents( + rpl::merge( + _composeControls->scrollKeyEvents(), + _inner->scrollKeyEvents() ) | rpl::start_with_next([=](not_null e) { _scroll->keyPressEvent(e); }, lifetime()); diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index 054c8f66b..cb5352f0b 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -378,7 +378,9 @@ void ScheduledWidget::setupComposeControls() { } }, lifetime()); - _composeControls->scrollKeyEvents( + rpl::merge( + _composeControls->scrollKeyEvents(), + _inner->scrollKeyEvents() ) | rpl::start_with_next([=](not_null e) { _scroll->keyPressEvent(e); }, lifetime()); diff --git a/Telegram/SourceFiles/settings/business/settings_shortcut_messages.cpp b/Telegram/SourceFiles/settings/business/settings_shortcut_messages.cpp index 68e4b8cc1..1610aafee 100644 --- a/Telegram/SourceFiles/settings/business/settings_shortcut_messages.cpp +++ b/Telegram/SourceFiles/settings/business/settings_shortcut_messages.cpp @@ -715,7 +715,9 @@ void ShortcutMessages::setupComposeControls() { } }, lifetime()); - _composeControls->scrollKeyEvents( + rpl::merge( + _composeControls->scrollKeyEvents(), + _inner->scrollKeyEvents() ) | rpl::start_with_next([=](not_null e) { _scroll->keyPressEvent(e); }, lifetime()); diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 6ce5ec6e4..4ae0ffe56 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 6ce5ec6e43a28678ca89fd89b2fa90164e5bcef1 +Subproject commit 4ae0ffe56efb20f795062713780c79e79cd39879