Added volume slider to settings box for rtmp live stream.

This commit is contained in:
23rd 2025-01-27 18:33:47 +03:00
parent 8d7abb1b8a
commit be18be4a86
5 changed files with 73 additions and 10 deletions

View file

@ -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 }};

View file

@ -1431,10 +1431,12 @@ void Members::Controller::addMuteActionsToContextMenu(
auto volumeItem = base::make_unique_q<MenuVolumeItem>(
menu->menu(),
st::groupCallPopupVolumeMenu,
st::groupCallMenuVolumeSlider,
otherParticipantStateValue,
_call->rtmp() ? _call->rtmpVolume() : row->volume(),
Group::kMaxVolume,
muted);
muted,
st::groupCallMenuVolumePadding);
mutesFromVolume = volumeItem->toggleMuteRequests();

View file

@ -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<MenuVolumeItem>(
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<Ui::SettingsButton>(

View file

@ -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<RpWidget*> parent,
const style::Menu &st,
const style::MediaSlider &stSlider,
rpl::producer<Group::ParticipantState> 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<Ui::MediaSlider>(
this,
st::groupCallMenuVolumeSlider))
, _slider(base::make_unique_q<Ui::MediaSlider>(this, stSlider))
, _dummyAction(new QAction(parent))
, _st(st)
, _stCross(st::groupCallMuteCrossLine)
, _padding(padding)
, _crossLineMute(std::make_unique<Ui::CrossLineAnimation>(_stCross, true))
, _arcs(std::make_unique<Ui::Paint::ArcsAnimation>(
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<bool> MenuVolumeItem::toggleMuteRequests() const {

View file

@ -31,10 +31,12 @@ public:
MenuVolumeItem(
not_null<RpWidget*> parent,
const style::Menu &st,
const style::MediaSlider &stSlider,
rpl::producer<Group::ParticipantState> participantState,
int startVolume,
int maxVolume,
bool muted);
bool muted,
const QMargins &padding);
not_null<QAction*> action() const override;
bool isEnabled() const override;
@ -71,6 +73,7 @@ private:
const not_null<QAction*> _dummyAction;
const style::Menu &_st;
const style::CrossLineAnimation &_stCross;
const QMargins &_padding;
const std::unique_ptr<Ui::CrossLineAnimation> _crossLineMute;
Ui::Animations::Simple _crossLineAnimation;