From ef1a4e4ce361be127edb00650f9e8598d344dd5c Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 19 Jan 2021 17:29:57 +0300 Subject: [PATCH] Moved adding volume and mute items in group calls to separate place. --- Telegram/SourceFiles/calls/calls.style | 1 + .../SourceFiles/calls/calls_group_members.cpp | 204 ++++++++++-------- .../SourceFiles/calls/calls_volume_item.cpp | 7 +- 3 files changed, 115 insertions(+), 97 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls.style b/Telegram/SourceFiles/calls/calls.style index 8f60171797..5487702e0e 100644 --- a/Telegram/SourceFiles/calls/calls.style +++ b/Telegram/SourceFiles/calls/calls.style @@ -788,6 +788,7 @@ groupCallMuteCrossLine: CrossLineAnimation { groupCallMenuSpeakerArcsSkip: 1px; groupCallMenuVolumeSkip: 5px; +groupCallMenuVolumeSkipSlider: defaultContinuousSlider; groupCallSpeakerArcsAnimation: ArcsAnimation { fg: groupCallIconFg; diff --git a/Telegram/SourceFiles/calls/calls_group_members.cpp b/Telegram/SourceFiles/calls/calls_group_members.cpp index 40660df1e0..b8e396ad4c 100644 --- a/Telegram/SourceFiles/calls/calls_group_members.cpp +++ b/Telegram/SourceFiles/calls/calls_group_members.cpp @@ -258,6 +258,10 @@ private: [[nodiscard]] base::unique_qptr createRowContextMenu( QWidget *parent, not_null row); + void addMuteActionsToContextMenu( + not_null menu, + not_null user, + not_null row); void setupListChangeViewers(not_null call); void subscribeToChanges(not_null real); void updateRow( @@ -1208,100 +1212,7 @@ base::unique_qptr MembersController::createRowContextMenu( }); if (real->ssrc() != 0) { - const auto muteString = [=] { - return (_peer->canManageGroupCall() - ? tr::lng_group_call_context_mute - : tr::lng_group_call_context_mute_for_me)(tr::now); - }; - - const auto unmuteString = [=] { - return (_peer->canManageGroupCall() - ? tr::lng_group_call_context_unmute - : tr::lng_group_call_context_unmute_for_me)(tr::now); - }; - - const auto toggleMute = crl::guard(this, [=](bool mute, bool local) { - _toggleMuteRequests.fire(Group::MuteRequest{ - .user = user, - .mute = mute, - .locallyOnly = local, - }); - }); - const auto changeVolume = crl::guard(this, [=]( - int volume, - bool local) { - _changeVolumeRequests.fire(Group::VolumeRequest{ - .user = user, - .volume = std::clamp(volume, 1, Group::kMaxVolume), - .locallyOnly = local, - }); - }); - - const auto call = _call.get(); - auto otherParticipantStateValue = call - ? call->otherParticipantStateValue( - ) | rpl::filter([=](const Group::ParticipantState &data) { - return data.user == user; - }) - : rpl::never(); - - const auto isMuted = (muteState == Row::State::Muted) - || (muteState == Row::State::MutedByMe); - - auto volumeItem = base::make_unique_q( - result, - st::groupCallPopupMenu.menu, - otherParticipantStateValue, - real->volume(), - Group::kMaxVolume, - isMuted); - - auto mutesFromVolume = volumeItem->toggleMuteRequests(); - - volumeItem->toggleMuteRequests( - ) | rpl::start_with_next([=](bool muted) { - toggleMute(muted, false); - }, volumeItem->lifetime()); - - volumeItem->toggleMuteLocallyRequests( - ) | rpl::start_with_next([=](bool muted) { - toggleMute(muted, true); - }, volumeItem->lifetime()); - - volumeItem->changeVolumeRequests( - ) | rpl::start_with_next([=](int volume) { - changeVolume(volume, false); - }, volumeItem->lifetime()); - - volumeItem->changeVolumeLocallyRequests( - ) | rpl::start_with_next([=](int volume) { - changeVolume(volume, true); - }, volumeItem->lifetime()); - - result->addAction(std::move(volumeItem)); - - const auto muteAction = [&]() -> QAction* { - if (muteState == Row::State::Invited) { - return nullptr; - } - auto callback = [=] { - const auto state = real->state(); - const auto muted = (state == Row::State::Muted) - || (state == Row::State::MutedByMe); - toggleMute(!muted, false); - }; - return result->addAction( - isMuted ? unmuteString() : muteString(), - std::move(callback)); - }(); - - std::move( - mutesFromVolume - ) | rpl::filter([=] { - return muteAction != nullptr; - }) | rpl::start_with_next([=](bool muted) { - muteAction->setText(muted ? unmuteString() : muteString()); - }, result->lifetime()); + addMuteActionsToContextMenu(result, user, real); } result->addAction( @@ -1329,6 +1240,111 @@ base::unique_qptr MembersController::createRowContextMenu( return result; } +void MembersController::addMuteActionsToContextMenu( + not_null menu, + not_null user, + not_null row) { + const auto muteString = [=] { + return (_peer->canManageGroupCall() + ? tr::lng_group_call_context_mute + : tr::lng_group_call_context_mute_for_me)(tr::now); + }; + + const auto unmuteString = [=] { + return (_peer->canManageGroupCall() + ? tr::lng_group_call_context_unmute + : tr::lng_group_call_context_unmute_for_me)(tr::now); + }; + + const auto toggleMute = crl::guard(this, [=](bool mute, bool local) { + _toggleMuteRequests.fire(Group::MuteRequest{ + .user = user, + .mute = mute, + .locallyOnly = local, + }); + }); + const auto changeVolume = crl::guard(this, [=]( + int volume, + bool local) { + _changeVolumeRequests.fire(Group::VolumeRequest{ + .user = user, + .volume = std::clamp(volume, 1, Group::kMaxVolume), + .locallyOnly = local, + }); + }); + + const auto muteState = row->state(); + const auto isMuted = (muteState == Row::State::Muted) + || (muteState == Row::State::MutedByMe); + + auto mutesFromVolume = rpl::never(); + + if (!isMuted) { + const auto call = _call.get(); + auto otherParticipantStateValue = call + ? call->otherParticipantStateValue( + ) | rpl::filter([=](const Group::ParticipantState &data) { + return data.user == user; + }) + : rpl::never(); + + auto volumeItem = base::make_unique_q( + menu, + st::groupCallPopupMenu.menu, + otherParticipantStateValue, + row->volume(), + Group::kMaxVolume, + isMuted); + + mutesFromVolume = volumeItem->toggleMuteRequests(); + + volumeItem->toggleMuteRequests( + ) | rpl::start_with_next([=](bool muted) { + toggleMute(muted, false); + }, volumeItem->lifetime()); + + volumeItem->toggleMuteLocallyRequests( + ) | rpl::start_with_next([=](bool muted) { + toggleMute(muted, true); + }, volumeItem->lifetime()); + + volumeItem->changeVolumeRequests( + ) | rpl::start_with_next([=](int volume) { + changeVolume(volume, false); + }, volumeItem->lifetime()); + + volumeItem->changeVolumeLocallyRequests( + ) | rpl::start_with_next([=](int volume) { + changeVolume(volume, true); + }, volumeItem->lifetime()); + + menu->addAction(std::move(volumeItem)); + }; + + const auto muteAction = [&]() -> QAction* { + if (muteState == Row::State::Invited) { + return nullptr; + } + auto callback = [=] { + const auto state = row->state(); + const auto muted = (state == Row::State::Muted) + || (state == Row::State::MutedByMe); + toggleMute(!muted, false); + }; + return menu->addAction( + isMuted ? unmuteString() : muteString(), + std::move(callback)); + }(); + + if (muteAction) { + std::move( + mutesFromVolume + ) | rpl::start_with_next([=](bool muted) { + muteAction->setText(muted ? unmuteString() : muteString()); + }, menu->lifetime()); + } +} + std::unique_ptr MembersController::createSelfRow() { const auto self = _peer->session().user(); auto result = std::make_unique(this, self); diff --git a/Telegram/SourceFiles/calls/calls_volume_item.cpp b/Telegram/SourceFiles/calls/calls_volume_item.cpp index 95ed0afda3..5ccd893738 100644 --- a/Telegram/SourceFiles/calls/calls_volume_item.cpp +++ b/Telegram/SourceFiles/calls/calls_volume_item.cpp @@ -12,7 +12,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/cross_line.h" #include "ui/widgets/continuous_sliders.h" #include "styles/style_calls.h" -#include "styles/style_media_player.h" #include "ui/paint/arcs.h" @@ -41,7 +40,7 @@ MenuVolumeItem::MenuVolumeItem( , _localMuted(muted) , _slider(base::make_unique_q( this, - st::mediaPlayerPanelPlayback)) + st::groupCallMenuVolumeSkipSlider)) , _dummyAction(new QAction(parent)) , _st(st) , _stCross(st::groupCallMuteCrossLine) @@ -88,7 +87,9 @@ MenuVolumeItem::MenuVolumeItem( muteProgress); p.setPen(mutePen); p.setFont(_st.itemStyle.font); - const auto volume = std::round(_slider->value() * kMaxVolumePercent); + const auto volume = _localMuted + ? 0 + : std::round(_slider->value() * kMaxVolumePercent); p.drawText(_volumeRect, u"%1%"_q.arg(volume), style::al_center); _crossLineMute->paint(