diff --git a/Telegram/Resources/icons/calls/volume/speaker_small.png b/Telegram/Resources/icons/calls/volume/speaker_small.png new file mode 100644 index 0000000000..c2ae4490bf Binary files /dev/null and b/Telegram/Resources/icons/calls/volume/speaker_small.png differ diff --git a/Telegram/Resources/icons/calls/volume/speaker_small@2x.png b/Telegram/Resources/icons/calls/volume/speaker_small@2x.png new file mode 100644 index 0000000000..83ec9546b5 Binary files /dev/null and b/Telegram/Resources/icons/calls/volume/speaker_small@2x.png differ diff --git a/Telegram/Resources/icons/calls/volume/speaker_small@3x.png b/Telegram/Resources/icons/calls/volume/speaker_small@3x.png new file mode 100644 index 0000000000..6dc605d24a Binary files /dev/null and b/Telegram/Resources/icons/calls/volume/speaker_small@3x.png differ diff --git a/Telegram/SourceFiles/calls/calls.style b/Telegram/SourceFiles/calls/calls.style index b1616807b0..446780c1bd 100644 --- a/Telegram/SourceFiles/calls/calls.style +++ b/Telegram/SourceFiles/calls/calls.style @@ -809,6 +809,16 @@ groupCallSpeakerArcsAnimation: ArcsAnimation { startWidth: 0px; } +groupCallStatusSpeakerIcon: icon {{ "calls/volume/speaker_small", groupCallIconFg }}; +groupCallStatusSpeakerArcsSkip: 3px; +groupCallStatusSpeakerArcsAnimation: ArcsAnimation(groupCallSpeakerArcsAnimation) { + deltaAngle: 68; + space: 3px; + deltaHeight: 5px; + deltaWidth: 4px; + startHeight: 1px; +} + callTopBarMuteCrossLine: CrossLineAnimation { fg: callBarFg; icon: icon {{ "calls/call_record_active", callBarFg }}; diff --git a/Telegram/SourceFiles/calls/calls_group_members.cpp b/Telegram/SourceFiles/calls/calls_group_members.cpp index 540f8d08e4..a1ffe11519 100644 --- a/Telegram/SourceFiles/calls/calls_group_members.cpp +++ b/Telegram/SourceFiles/calls/calls_group_members.cpp @@ -49,8 +49,9 @@ constexpr auto kWideScale = 5; constexpr auto kSpeakerThreshold = { Group::kDefaultVolume * 0.1f / Group::kMaxVolume, - Group::kDefaultVolume * 0.5f / Group::kMaxVolume, - Group::kDefaultVolume * 1.5f / Group::kMaxVolume }; + Group::kDefaultVolume * 0.9f / Group::kMaxVolume }; + +constexpr auto kArcsStrokeRatio = 0.8; auto RowBlobs() -> std::array { return { { @@ -188,9 +189,9 @@ private: struct StatusIcon { StatusIcon(float volume) - : speaker(st::groupCallMuteCrossLine.icon) + : speaker(st::groupCallStatusSpeakerIcon) , arcs(std::make_unique( - st::groupCallSpeakerArcsAnimation, + st::groupCallStatusSpeakerArcsAnimation, kSpeakerThreshold, volume, Ui::Paint::ArcsAnimation::HorizontalDirection::Right)) { @@ -398,6 +399,7 @@ void Row::setSpeaking(bool speaking) { } else if (!_statusIcon) { _statusIcon = std::make_unique( (float)_volume / Group::kMaxVolume); + _statusIcon->arcs->setStrokeRatio(kArcsStrokeRatio); _statusIcon->arcsWidth = _statusIcon->arcs->finishedWidth(); const auto wasArcsWidth = _statusIcon->lifetime.make_state(0); @@ -599,9 +601,7 @@ int Row::statusIconWidth() const { return 0; } return _speaking - ? (_statusIcon->speaker.width() / 2 - + _statusIcon->arcsWidth - + st::groupCallMenuVolumeSkip) + ? (_statusIcon->speaker.width() + _statusIcon->arcsWidth) : 0; } @@ -632,8 +632,10 @@ void Row::paintStatusIcon( st.statusPosition + QPoint(0, (font->height - statusIconHeight()) / 2), _statusIcon->speaker.size()); - const auto arcPosition = speakerRect.center() - + QPoint(0, st::groupCallMenuSpeakerArcsSkip); + const auto arcPosition = speakerRect.topLeft() + + QPoint( + speakerRect.width() - st::groupCallStatusSpeakerArcsSkip, + speakerRect.height() / 2); const auto volume = std::round(_volume / 100.); _statusIcon->speaker.paint(