/* 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 VoiceRecordBar final : public Ui::RpWidget { public: using SendActionUpdate = Controls::SendActionUpdate; using VoiceToSend = Controls::VoiceToSend; 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]] bool isRecording() const; VoiceRecordBar( not_null parent, not_null controller, std::shared_ptr send, int recorderHeight); ~VoiceRecordBar(); private: void init(); void updateControlsGeometry(QSize size); 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); void recordStopCallback(bool active); void recordUpdateCallback(QPoint globalPos); bool showRecordButton() const; void drawRecording(Painter &p, float64 recordActive); void updateOverStates(QPoint pos); bool isTypeRecord() const; void activeAnimate(bool active); float64 activeAnimationRatio() const; const not_null _controller; const std::unique_ptr _wrap; const std::shared_ptr _send; rpl::event_stream _sendActionUpdates; rpl::event_stream _sendVoiceRequests; int _centerY = 0; QRect _redCircleRect; QRect _durationRect; rpl::variable _recording = false; rpl::variable _inField = false; int _recordingSamples = 0; const style::font &_cancelFont; int _recordCancelWidth; rpl::lifetime _recordingLifetime; // 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