Moved active animation processing from SendButton to VoiceRecordBar.

This commit is contained in:
23rd 2020-10-04 16:32:45 +03:00 committed by John Preston
parent db564ca486
commit 3e4866d3b7
4 changed files with 48 additions and 32 deletions

View file

@ -92,8 +92,28 @@ void VoiceRecordBar::init() {
Painter p(this);
p.fillRect(rect(), st::historyComposeAreaBg);
drawRecording(p, _send->recordActiveRatio());
drawRecording(p, activeAnimationRatio());
}, lifetime());
_inField.changes(
) | rpl::start_with_next([=](bool value) {
activeAnimate(value);
}, lifetime());
}
void VoiceRecordBar::activeAnimate(bool active) {
const auto to = active ? 1. : 0.;
const auto duration = st::historyRecordVoiceDuration;
if (_activeAnimation.animating()) {
_activeAnimation.change(to, duration);
} else {
auto callback = [=] {
update();
_send->requestPaintRecord(activeAnimationRatio());
};
const auto from = active ? 0. : 1.;
_activeAnimation.start(std::move(callback), from, to, duration);
}
}
void VoiceRecordBar::startRecording() {
@ -116,7 +136,7 @@ void VoiceRecordBar::startRecording() {
_controller->widget()->setInnerFocus();
update();
_send->setRecordActive(true);
activeAnimate(true);
_send->events(
) | rpl::filter([=](not_null<QEvent*> e) {
@ -127,14 +147,9 @@ void VoiceRecordBar::startRecording() {
const auto type = e->type();
if (type == QEvent::MouseMove) {
const auto mouse = static_cast<QMouseEvent*>(e.get());
const auto pos = mapFromGlobal(mouse->globalPos());
const auto inField = rect().contains(pos);
if (inField != _inField) {
_inField = inField;
_send->setRecordActive(_inField);
}
_inField = rect().contains(mapFromGlobal(mouse->globalPos()));
} else if (type == QEvent::MouseButtonRelease) {
stopRecording(_inField);
stopRecording(_inField.current());
}
}, _recordingLifetime);
}
@ -160,7 +175,7 @@ void VoiceRecordBar::recordUpdated(quint16 level, int samples) {
_recordingAnimation.start();
_recordingSamples = samples;
if (samples < 0 || samples >= kMaxSamples) {
stopRecording(samples > 0 && _inField);
stopRecording(samples > 0 && _inField.current());
}
Core::App().updateNonIdle();
update();
@ -189,6 +204,8 @@ void VoiceRecordBar::stopRecording(bool send) {
_recordingLevel = anim::value();
_recordingAnimation.stop();
_inField = false;
_recordingLifetime.destroy();
_recordingSamples = 0;
_sendActionUpdates.fire({ Api::SendProgressType::RecordVoice, -1 });
@ -196,7 +213,6 @@ void VoiceRecordBar::stopRecording(bool send) {
_controller->widget()->setInnerFocus();
update();
_send->setRecordActive(false);
}
void VoiceRecordBar::drawRecording(Painter &p, float64 recordActive) {
@ -277,4 +293,8 @@ bool VoiceRecordBar::isTypeRecord() const {
return (_send->type() == Ui::SendButton::Type::Record);
}
float64 VoiceRecordBar::activeAnimationRatio() const {
return _activeAnimation.value(_inField.current() ? 1. : 0.);
}
} // namespace HistoryView::Controls

View file

@ -64,6 +64,9 @@ private:
bool isTypeRecord() const;
void activeAnimate(bool active);
float64 activeAnimationRatio() const;
const not_null<Window::SessionController*> _controller;
const std::unique_ptr<Ui::RpWidget> _wrap;
const std::shared_ptr<Ui::SendButton> _send;
@ -75,7 +78,7 @@ private:
QRect _redCircleRect;
rpl::variable<bool> _recording = false;
bool _inField = false;
rpl::variable<bool> _inField = false;
int _recordingSamples = 0;
const style::font &_cancelFont;
@ -86,6 +89,7 @@ private:
// 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;
anim::value _recordingLevel;
};

View file

@ -43,20 +43,7 @@ void SendButton::setType(Type type) {
update();
}
if (_type != Type::Record) {
_recordActive = false;
_a_recordActive.stop();
}
}
void SendButton::setRecordActive(bool recordActive) {
if (_recordActive != recordActive) {
_recordActive = recordActive;
_a_recordActive.start(
[=] { recordAnimationCallback(); },
_recordActive ? 0. : 1.,
_recordActive ? 1. : 0,
st::historyRecordVoiceDuration);
update();
_recordProgress = 0.;
}
}
@ -76,7 +63,6 @@ void SendButton::setSlowmodeDelay(int seconds) {
void SendButton::finishAnimating() {
_a_typeChanged.stop();
_a_recordActive.stop();
update();
}
@ -89,6 +75,13 @@ void SendButton::mouseMoveEvent(QMouseEvent *e) {
}
}
void SendButton::requestPaintRecord(float64 progress) {
if (_type == Type::Record) {
_recordProgress = progress;
update();
}
}
void SendButton::paintEvent(QPaintEvent *e) {
Painter p(this);
@ -118,7 +111,7 @@ void SendButton::paintEvent(QPaintEvent *e) {
}
void SendButton::paintRecord(Painter &p, bool over) {
auto recordActive = recordActiveRatio();
const auto recordActive = _recordProgress;
if (!isDisabled()) {
auto rippleColor = anim::color(st::historyAttachEmoji.ripple.color, st::historyRecordVoiceRippleBgActive, recordActive);
paintRipple(p, (width() - st::historyAttachEmoji.rippleAreaSize) / 2, st::historyAttachEmoji.rippleAreaPosition.y(), &rippleColor);

View file

@ -46,9 +46,7 @@ public:
_recordAnimationCallback = std::move(callback);
}
[[nodiscard]] float64 recordActiveRatio() {
return _a_recordActive.value(_recordActive ? 1. : 0.);
}
void requestPaintRecord(float64 progress);
protected:
void mouseMoveEvent(QMouseEvent *e) override;
@ -76,7 +74,8 @@ private:
QPixmap _contentFrom, _contentTo;
Ui::Animations::Simple _a_typeChanged;
Ui::Animations::Simple _a_recordActive;
float64 _recordProgress = 0.;
bool _recording = false;
Fn<void()> _recordStartCallback;