From be18be4a862b0666230877da77411728ede4747b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 27 Jan 2025 18:33:47 +0300 Subject: [PATCH] Added volume slider to settings box for rtmp live stream. --- Telegram/SourceFiles/calls/calls.style | 13 ++++++ .../calls/group/calls_group_members.cpp | 4 +- .../calls/group/calls_group_settings.cpp | 45 +++++++++++++++++++ .../calls/group/calls_volume_item.cpp | 16 +++---- .../calls/group/calls_volume_item.h | 5 ++- 5 files changed, 73 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls.style b/Telegram/SourceFiles/calls/calls.style index 7e22913e3..a28a18169 100644 --- a/Telegram/SourceFiles/calls/calls.style +++ b/Telegram/SourceFiles/calls/calls.style @@ -1441,6 +1441,19 @@ groupCallScheduleTimeField: InputField(groupCallScheduleDateField) { placeholderFont: font(14px); } +groupCallVolumeSettings: Menu(groupCallPopupVolumeMenu) { + widthMin: 210px; + itemBg: groupCallMembersBg; + itemBgOver: groupCallMembersBgOver; +} +groupCallVolumeSettingsPadding: margins(24px, 8px, 24px, 6px); +groupCallVolumeSettingsSlider: MediaSlider(groupCallMenuVolumeSlider) { + activeFg: groupCallMenuBg; + inactiveFg: groupCallMenuBg; + activeFgOver: groupCallMenuBg; + inactiveFgOver: groupCallMenuBg; +} + // groupCallCalendarPreviousDisabled: icon {{ "calendar_down-flip_vertical", groupCallMemberNotJoinedStatus }}; groupCallCalendarNextDisabled: icon {{ "calendar_down", groupCallMemberNotJoinedStatus }}; diff --git a/Telegram/SourceFiles/calls/group/calls_group_members.cpp b/Telegram/SourceFiles/calls/group/calls_group_members.cpp index 2853340a5..928c3b1f5 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_members.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_members.cpp @@ -1431,10 +1431,12 @@ void Members::Controller::addMuteActionsToContextMenu( auto volumeItem = base::make_unique_q( menu->menu(), st::groupCallPopupVolumeMenu, + st::groupCallMenuVolumeSlider, otherParticipantStateValue, _call->rtmp() ? _call->rtmpVolume() : row->volume(), Group::kMaxVolume, - muted); + muted, + st::groupCallMenuVolumePadding); mutesFromVolume = volumeItem->toggleMuteRequests(); diff --git a/Telegram/SourceFiles/calls/group/calls_group_settings.cpp b/Telegram/SourceFiles/calls/group/calls_group_settings.cpp index 269339355..7ae977bfd 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_settings.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_settings.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "calls/group/calls_group_menu.h" // LeaveBox. #include "calls/group/calls_group_common.h" #include "calls/group/calls_choose_join_as.h" +#include "calls/group/calls_volume_item.h" #include "calls/calls_instance.h" #include "ui/widgets/level_meter.h" #include "ui/widgets/continuous_sliders.h" @@ -713,6 +714,50 @@ void SettingsBox( addDivider(); Ui::AddSkip(layout); } + if (rtmp) { + const auto volumeItem = layout->add( + object_ptr( + layout, + st::groupCallVolumeSettings, + st::groupCallVolumeSettingsSlider, + call->otherParticipantStateValue( + ) | rpl::filter([=](const Group::ParticipantState &data) { + return data.peer == peer; + }), + call->rtmpVolume(), + Group::kMaxVolume, + false, + st::groupCallVolumeSettingsPadding)); + + const auto toggleMute = crl::guard(layout, [=](bool m, bool local) { + if (call) { + call->toggleMute({ + .peer = peer, + .mute = m, + .locallyOnly = local, + }); + } + }); + const auto changeVolume = crl::guard(layout, [=](int v, bool local) { + if (call) { + call->changeVolume({ + .peer = peer, + .volume = std::clamp(v, 1, Group::kMaxVolume), + .locallyOnly = local, + }); + } + }); + + volumeItem->toggleMuteLocallyRequests( + ) | rpl::start_with_next([=](bool muted) { + toggleMute(muted, true); + }, volumeItem->lifetime()); + + volumeItem->changeVolumeLocallyRequests( + ) | rpl::start_with_next([=](int volume) { + changeVolume(volume, true); + }, volumeItem->lifetime()); + } if (peer->canManageGroupCall()) { layout->add(object_ptr( diff --git a/Telegram/SourceFiles/calls/group/calls_volume_item.cpp b/Telegram/SourceFiles/calls/group/calls_volume_item.cpp index d34a51060..69529b9f6 100644 --- a/Telegram/SourceFiles/calls/group/calls_volume_item.cpp +++ b/Telegram/SourceFiles/calls/group/calls_volume_item.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/animation_value.h" #include "ui/effects/cross_line.h" #include "ui/widgets/continuous_sliders.h" +#include "ui/rect.h" #include "styles/style_calls.h" #include "ui/paint/arcs.h" @@ -41,20 +42,21 @@ constexpr auto kVolumeStickedValues MenuVolumeItem::MenuVolumeItem( not_null parent, const style::Menu &st, + const style::MediaSlider &stSlider, rpl::producer participantState, int startVolume, int maxVolume, - bool muted) + bool muted, + const QMargins &padding) : Ui::Menu::ItemBase(parent, st) , _maxVolume(maxVolume) , _cloudMuted(muted) , _localMuted(muted) -, _slider(base::make_unique_q( - this, - st::groupCallMenuVolumeSlider)) +, _slider(base::make_unique_q(this, stSlider)) , _dummyAction(new QAction(parent)) , _st(st) , _stCross(st::groupCallMuteCrossLine) +, _padding(padding) , _crossLineMute(std::make_unique(_stCross, true)) , _arcs(std::make_unique( st::groupCallSpeakerArcsAnimation, @@ -71,7 +73,7 @@ MenuVolumeItem::MenuVolumeItem( sizeValue( ) | rpl::start_with_next([=](const QSize &size) { const auto geometry = QRect(QPoint(), size); - _itemRect = geometry - st::groupCallMenuVolumePadding; + _itemRect = geometry - _padding; _speakerRect = QRect(_itemRect.topLeft(), _stCross.icon.size()); _arcPosition = _speakerRect.center() + QPoint(0, st::groupCallMenuSpeakerArcsSkip); @@ -280,9 +282,7 @@ bool MenuVolumeItem::isEnabled() const { } int MenuVolumeItem::contentHeight() const { - return st::groupCallMenuVolumePadding.top() - + st::groupCallMenuVolumePadding.bottom() - + _stCross.icon.height(); + return rect::m::sum::v(_padding) + _stCross.icon.height(); } rpl::producer MenuVolumeItem::toggleMuteRequests() const { diff --git a/Telegram/SourceFiles/calls/group/calls_volume_item.h b/Telegram/SourceFiles/calls/group/calls_volume_item.h index 86eadd1f9..af2d38d40 100644 --- a/Telegram/SourceFiles/calls/group/calls_volume_item.h +++ b/Telegram/SourceFiles/calls/group/calls_volume_item.h @@ -31,10 +31,12 @@ public: MenuVolumeItem( not_null parent, const style::Menu &st, + const style::MediaSlider &stSlider, rpl::producer participantState, int startVolume, int maxVolume, - bool muted); + bool muted, + const QMargins &padding); not_null action() const override; bool isEnabled() const override; @@ -71,6 +73,7 @@ private: const not_null _dummyAction; const style::Menu &_st; const style::CrossLineAnimation &_stCross; + const QMargins &_padding; const std::unique_ptr _crossLineMute; Ui::Animations::Simple _crossLineAnimation;