diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 2f706afca..1ad11462f 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -726,6 +726,9 @@ void HistoryWidget::initVoiceRecordBar() { }); _voiceRecordBar->setLockBottom(std::move(scrollHeight)); } + _voiceRecordBar->setEscFilter([=]() -> bool { + return _replyToId || (_nonEmptySelection && _list); + }); _voiceRecordBar->startRecordingRequests( ) | rpl::start_with_next([=] { diff --git a/Telegram/SourceFiles/history/view/controls/history_view_voice_record_bar.cpp b/Telegram/SourceFiles/history/view/controls/history_view_voice_record_bar.cpp index d822a0f05..02f05e4d3 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_voice_record_bar.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_voice_record_bar.cpp @@ -391,6 +391,10 @@ void VoiceRecordBar::visibilityAnimate(bool show, Fn &&callback) { _showAnimation.start(std::move(animationCallback), from, to, duration); } +void VoiceRecordBar::setEscFilter(Fn &&callback) { + _escFilter = std::move(callback); +} + void VoiceRecordBar::setLockBottom(rpl::producer &&bottom) { std::move( bottom @@ -412,6 +416,7 @@ void VoiceRecordBar::startRecording() { const auto shown = _recordingLifetime.make_state(false); _recording = true; + _controller->widget()->setInnerFocus(); instance()->start(); instance()->updated( ) | rpl::start_with_next_error([=](const Update &update) { @@ -429,7 +434,6 @@ void VoiceRecordBar::startRecording() { show(); _inField = true; - _controller->widget()->setInnerFocus(); _send->events( ) | rpl::filter([=](not_null e) { @@ -645,11 +649,15 @@ void VoiceRecordBar::installClickOutsideFilter() { const auto type = e->type(); const auto noBox = !(*box); if (type == QEvent::KeyPress) { + const auto key = static_cast(e.get())->key(); + const auto isEsc = (key == Qt::Key_Escape); if (noBox) { + if (isEsc && (_escFilter && _escFilter())) { + return Result::Continue; + } return Result::Cancel; } - const auto key = static_cast(e.get())->key(); - const auto cancelOrConfirmBox = (key == Qt::Key_Escape + const auto cancelOrConfirmBox = (isEsc || (key == Qt::Key_Enter || key == Qt::Key_Return)); return cancelOrConfirmBox ? Result::Continue : Result::Cancel; } else if (type == QEvent::ContextMenu || type == QEvent::Shortcut) { diff --git a/Telegram/SourceFiles/history/view/controls/history_view_voice_record_bar.h b/Telegram/SourceFiles/history/view/controls/history_view_voice_record_bar.h index 29ed0cab8..d3c6f28a7 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_voice_record_bar.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_voice_record_bar.h @@ -46,6 +46,7 @@ public: [[nodiscard]] rpl::producer lockShowStarts() const; void setLockBottom(rpl::producer &&bottom); + void setEscFilter(Fn &&callback); [[nodiscard]] bool isRecording() const; [[nodiscard]] bool isLockPresent() const; @@ -93,6 +94,8 @@ private: QRect _durationRect; QRect _messageRect; + Fn _escFilter; + rpl::variable _recording = false; rpl::variable _inField = false; int _recordingSamples = 0;