/* 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 "base/timer.h" #include "history/view/controls/compose_controls_common.h" #include "ui/effects/animations.h" #include "ui/rp_widget.h" struct VoiceData; namespace Ui { class SendButton; } // namespace Ui namespace Window { class SessionController; } // namespace Window namespace HistoryView::Controls { class VoiceRecordButton; class ListenWrap; class RecordLock; class VoiceRecordBar final : public Ui::RpWidget { public: using SendActionUpdate = Controls::SendActionUpdate; using VoiceToSend = Controls::VoiceToSend; VoiceRecordBar( not_null parent, not_null sectionWidget, not_null controller, std::shared_ptr send, int recorderHeight); VoiceRecordBar( not_null parent, not_null controller, std::shared_ptr send, int recorderHeight); ~VoiceRecordBar(); void startRecording(); void finishAnimating(); void hideFast(); void orderControls(); [[nodiscard]] rpl::producer sendActionUpdates() const; [[nodiscard]] rpl::producer sendVoiceRequests() const; [[nodiscard]] rpl::producer recordingStateChanges() const; [[nodiscard]] rpl::producer lockShowStarts() const; void setLockBottom(rpl::producer &&bottom); void setSendButtonGeometryValue(rpl::producer &&geometry); void setEscFilter(Fn &&callback); void setStartRecordingFilter(Fn &&callback); [[nodiscard]] bool isRecording() const; [[nodiscard]] bool isLockPresent() const; private: enum class StopType { Cancel, Send, Listen, }; void init(); void updateMessageGeometry(); void updateLockGeometry(); void recordUpdated(quint16 level, int samples); bool recordingAnimationCallback(crl::time now); void stop(bool send); void stopRecording(StopType type); void visibilityAnimate(bool show, Fn &&callback); bool showRecordButton() const; void drawDuration(Painter &p); void drawRedCircle(Painter &p); void drawMessage(Painter &p, float64 recordActive); void startRedCircleAnimation(); void installClickOutsideFilter(); bool isTypeRecord() const; bool hasDuration() const; void finish(); void activeAnimate(bool active); float64 showAnimationRatio() const; float64 showListenAnimationRatio() const; float64 activeAnimationRatio() const; void computeAndSetLockProgress(QPoint globalPos); const not_null _sectionWidget; const not_null _controller; const std::shared_ptr _send; const std::unique_ptr _lock; const std::unique_ptr _level; std::unique_ptr _listen; base::Timer _startTimer; rpl::event_stream _sendActionUpdates; rpl::event_stream _sendVoiceRequests; int _centerY = 0; QRect _redCircleRect; QRect _durationRect; QRect _messageRect; Ui::Text::String _message; Fn _escFilter; Fn _startRecordingFilter; rpl::variable _recording = false; rpl::variable _inField = false; int _recordingSamples = 0; float64 _redCircleProgress = 0.; const style::font &_cancelFont; rpl::lifetime _recordingLifetime; rpl::variable _lockShowing = false; Ui::Animations::Simple _showLockAnimation; Ui::Animations::Simple _showListenAnimation; Ui::Animations::Simple _activeAnimation; Ui::Animations::Simple _showAnimation; }; } // namespace HistoryView::Controls