From 50ed60f443e155fa5dd974750a2a0aa178542ff4 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 18 Dec 2020 03:40:43 +0300 Subject: [PATCH] Fixed ability to reply with voice message. --- .../SourceFiles/history/history_widget.cpp | 24 ++++++++++++------- .../history_view_voice_record_bar.cpp | 5 ++++ .../controls/history_view_voice_record_bar.h | 2 ++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 912389af6..4e141e7b5 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -773,6 +773,12 @@ void HistoryWidget::initVoiceRecordBar() { return false; }); + const auto applyLocalDraft = [=] { + if (_history && _history->localDraft()) { + applyDraft(); + } + }; + _voiceRecordBar->sendActionUpdates( ) | rpl::start_with_next([=](const auto &data) { if (!_history) { @@ -799,8 +805,12 @@ void HistoryWidget::initVoiceRecordBar() { data.duration, action); _voiceRecordBar->clearListenState(); + applyLocalDraft(); }, lifetime()); + _voiceRecordBar->cancelRequests( + ) | rpl::start_with_next(applyLocalDraft, lifetime()); + _voiceRecordBar->lockShowStarts( ) | rpl::start_with_next([=] { updateHistoryDownVisibility(); @@ -817,13 +827,6 @@ void HistoryWidget::initVoiceRecordBar() { _scroll->viewportEvent(e); }, lifetime()); - _voiceRecordBar->shownValue( - ) | rpl::start_with_next([=](bool shown) { - if (!shown) { - applyDraft(); - } - }, lifetime()); - _voiceRecordBar->hideFast(); } @@ -1620,13 +1623,16 @@ void HistoryWidget::fastShowAtEnd(not_null history) { void HistoryWidget::applyDraft(FieldHistoryAction fieldHistoryAction) { InvokeQueued(this, [=] { updateStickersByEmoji(); }); + if (_voiceRecordBar->isActive()) { + return; + } + auto draft = !_history ? nullptr : _history->localEditDraft() ? _history->localEditDraft() : _history->localDraft(); - auto fieldAvailable = canWriteMessage() - && !_voiceRecordBar->isActive(); + auto fieldAvailable = canWriteMessage(); if (!draft || (!_history->localEditDraft() && !fieldAvailable)) { auto fieldWillBeHiddenAfterEdit = (!fieldAvailable && _editMsgId != 0); clearFieldText(0, fieldHistoryAction); 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 f6505a1d5..92f603fbf 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 @@ -1307,6 +1307,7 @@ void VoiceRecordBar::hideFast() { void VoiceRecordBar::stopRecording(StopType type) { using namespace ::Media::Capture; if (type == StopType::Cancel) { + _cancelRequests.fire({}); instance()->stop(); return; } @@ -1404,6 +1405,10 @@ rpl::producer VoiceRecordBar::sendVoiceRequests() const { return _sendVoiceRequests.events(); } +rpl::producer<> VoiceRecordBar::cancelRequests() const { + return _cancelRequests.events(); +} + bool VoiceRecordBar::isRecording() const { return _recording.current(); } 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 c7653ebc4..398bedb56 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 @@ -61,6 +61,7 @@ public: [[nodiscard]] rpl::producer sendActionUpdates() const; [[nodiscard]] rpl::producer sendVoiceRequests() const; + [[nodiscard]] rpl::producer<> cancelRequests() const; [[nodiscard]] rpl::producer recordingStateChanges() const; [[nodiscard]] rpl::producer lockShowStarts() const; [[nodiscard]] rpl::producer> lockViewportEvents() const; @@ -128,6 +129,7 @@ private: rpl::event_stream _sendActionUpdates; rpl::event_stream _sendVoiceRequests; + rpl::event_stream<> _cancelRequests; rpl::event_stream<> _listenChanges; int _centerY = 0;