From ebe1fa74089688bcdca36c4935f4fbe21e3a8d42 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 4 Oct 2020 23:13:00 +0300 Subject: [PATCH] Improved duration text paint in VoiceRecordBar. --- .../history_view_voice_record_bar.cpp | 45 ++++++++++++------- .../controls/history_view_voice_record_bar.h | 1 + 2 files changed, 30 insertions(+), 16 deletions(-) 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 5933067b78..5cb05356f7 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 @@ -30,10 +30,23 @@ constexpr auto kAudioVoiceMaxLength = 100 * 60; // 100 minutes constexpr auto kMaxSamples = ::Media::Player::kDefaultFrequency * kAudioVoiceMaxLength; +constexpr auto kPrecision = 10; + [[nodiscard]] auto Duration(int samples) { return samples / ::Media::Player::kDefaultFrequency; } +[[nodiscard]] auto FormatVoiceDuration(int samples) { + const int duration = kPrecision + * (float64(samples) / ::Media::Player::kDefaultFrequency); + const auto durationString = Ui::FormatDurationText(duration / kPrecision); + const auto decimalPart = duration % kPrecision; + return QString("%1%2%3") + .arg(durationString) + .arg(QLocale::system().decimalPoint()) + .arg(decimalPart); +} + } // namespace VoiceRecordBar::VoiceRecordBar( @@ -67,6 +80,16 @@ void VoiceRecordBar::updateControlsGeometry(QSize size) { const auto point = _centerY - st::historyRecordSignalMax; _redCircleRect = { point, point, maxD, maxD }; } + { + const auto durationLeft = _redCircleRect.x() + + _redCircleRect.width() + + st::historyRecordDurationSkip; + _durationRect = QRect( + durationLeft, + _redCircleRect.y(), + _cancelFont->width(FormatVoiceDuration(kMaxSamples)), + _redCircleRect.height()); + } } void VoiceRecordBar::init() { @@ -197,7 +220,7 @@ void VoiceRecordBar::recordUpdated(quint16 level, int samples) { stop(samples > 0 && _inField.current()); } Core::App().updateNonIdle(); - update(); + update(_durationRect); _sendActionUpdates.fire({ Api::SendProgressType::RecordVoice }); } @@ -255,25 +278,15 @@ void VoiceRecordBar::drawRecording(Painter &p, float64 recordActive) { p.drawEllipse(center, radii, radii); } - const auto duration = Ui::FormatDurationText(Duration(_recordingSamples)); + const auto duration = FormatVoiceDuration(_recordingSamples); p.setFont(_cancelFont); p.setPen(st::historyRecordDurationFg); - const auto durationLeft = _redCircleRect.x() - + _redCircleRect.width() - + st::historyRecordDurationSkip; - const auto durationWidth = _cancelFont->width(duration); - p.drawText( - QRect( - durationLeft, - _redCircleRect.y(), - durationWidth, - _redCircleRect.height()), - style::al_left, - duration); + p.fillRect(_durationRect, Qt::red); + p.drawText(_durationRect, style::al_left, duration); - const auto leftCancel = durationLeft - + durationWidth + const auto leftCancel = _durationRect.x() + + _durationRect.width() + ((_send->width() - st::historyRecordVoice.width()) / 2); const auto rightCancel = width() - _send->width(); 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 667d9a5583..a0d8b92bf9 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 @@ -79,6 +79,7 @@ private: int _centerY = 0; QRect _redCircleRect; + QRect _durationRect; rpl::variable _recording = false; rpl::variable _inField = false;