/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "api/api_common.h" #include "history/view/controls/compose_controls_common.h" #include "ui/effects/animations.h" #include "ui/rp_widget.h" namespace Ui { class SendButton; } // namespace Ui namespace Window { class SessionController; } // namespace Window namespace HistoryView::Controls { class RecordLevel; class RecordLock; class VoiceRecordBar final : public Ui::RpWidget { public: using SendActionUpdate = Controls::SendActionUpdate; using VoiceToSend = Controls::VoiceToSend; VoiceRecordBar( not_null parent, not_null controller, std::shared_ptr send, int recorderHeight); ~VoiceRecordBar(); void startRecording(); void finishAnimating(); [[nodiscard]] rpl::producer sendActionUpdates() const; [[nodiscard]] rpl::producer sendVoiceRequests() const; [[nodiscard]] rpl::producer recordingStateChanges() const; [[nodiscard]] rpl::producer<> startRecordingRequests() const; [[nodiscard]] rpl::producer lockShowStarts() const; void setLockBottom(rpl::producer &&bottom); void setEscFilter(Fn &&callback); [[nodiscard]] bool isRecording() const; [[nodiscard]] bool isLockPresent() const; private: void init(); void updateMessageGeometry(); void updateLockGeometry(); void updateLevelGeometry(); void recordError(); void recordUpdated(quint16 level, int samples); bool recordingAnimationCallback(crl::time now); void stop(bool send); void stopRecording(bool send); void visibilityAnimate(bool show, Fn &&callback); bool showRecordButton() const; void drawDuration(Painter &p); void drawRecording(Painter &p); void drawMessage(Painter &p, float64 recordActive); void updateOverStates(QPoint pos); void installClickOutsideFilter(); bool isTypeRecord() const; void activeAnimate(bool active); float64 activeAnimationRatio() const; void computeAndSetLockProgress(QPoint globalPos); QString cancelMessage() const; const not_null _controller; const std::shared_ptr _send; const std::unique_ptr _lock; const std::unique_ptr _level; rpl::event_stream _sendActionUpdates; rpl::event_stream _sendVoiceRequests; int _centerY = 0; QRect _redCircleRect; QRect _durationRect; QRect _messageRect; Ui::Text::String _message; Fn _escFilter; rpl::variable _recording = false; rpl::variable _inField = false; int _recordingSamples = 0; const style::font &_cancelFont; rpl::lifetime _recordingLifetime; rpl::variable _lockShowing = false; Ui::Animations::Simple _showLockAnimation; // This can animate for a very long time (like in music playing), // so it should be a Basic, not a Simple animation. Ui::Animations::Basic _recordingAnimation; Ui::Animations::Simple _activeAnimation; Ui::Animations::Simple _showAnimation; anim::value _recordingLevel; }; } // namespace HistoryView::Controls