mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-07 23:53:58 +02:00
Moved adding volume and mute items in group calls to separate place.
This commit is contained in:
parent
9fed46fb6e
commit
ef1a4e4ce3
3 changed files with 115 additions and 97 deletions
|
@ -788,6 +788,7 @@ groupCallMuteCrossLine: CrossLineAnimation {
|
||||||
|
|
||||||
groupCallMenuSpeakerArcsSkip: 1px;
|
groupCallMenuSpeakerArcsSkip: 1px;
|
||||||
groupCallMenuVolumeSkip: 5px;
|
groupCallMenuVolumeSkip: 5px;
|
||||||
|
groupCallMenuVolumeSkipSlider: defaultContinuousSlider;
|
||||||
|
|
||||||
groupCallSpeakerArcsAnimation: ArcsAnimation {
|
groupCallSpeakerArcsAnimation: ArcsAnimation {
|
||||||
fg: groupCallIconFg;
|
fg: groupCallIconFg;
|
||||||
|
|
|
@ -258,6 +258,10 @@ private:
|
||||||
[[nodiscard]] base::unique_qptr<Ui::PopupMenu> createRowContextMenu(
|
[[nodiscard]] base::unique_qptr<Ui::PopupMenu> createRowContextMenu(
|
||||||
QWidget *parent,
|
QWidget *parent,
|
||||||
not_null<PeerListRow*> row);
|
not_null<PeerListRow*> row);
|
||||||
|
void addMuteActionsToContextMenu(
|
||||||
|
not_null<Ui::PopupMenu*> menu,
|
||||||
|
not_null<UserData*> user,
|
||||||
|
not_null<Row*> row);
|
||||||
void setupListChangeViewers(not_null<GroupCall*> call);
|
void setupListChangeViewers(not_null<GroupCall*> call);
|
||||||
void subscribeToChanges(not_null<Data::GroupCall*> real);
|
void subscribeToChanges(not_null<Data::GroupCall*> real);
|
||||||
void updateRow(
|
void updateRow(
|
||||||
|
@ -1208,100 +1212,7 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
|
||||||
});
|
});
|
||||||
|
|
||||||
if (real->ssrc() != 0) {
|
if (real->ssrc() != 0) {
|
||||||
const auto muteString = [=] {
|
addMuteActionsToContextMenu(result, user, real);
|
||||||
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<Group::ParticipantState>();
|
|
||||||
|
|
||||||
const auto isMuted = (muteState == Row::State::Muted)
|
|
||||||
|| (muteState == Row::State::MutedByMe);
|
|
||||||
|
|
||||||
auto volumeItem = base::make_unique_q<MenuVolumeItem>(
|
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result->addAction(
|
result->addAction(
|
||||||
|
@ -1329,6 +1240,111 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MembersController::addMuteActionsToContextMenu(
|
||||||
|
not_null<Ui::PopupMenu*> menu,
|
||||||
|
not_null<UserData*> user,
|
||||||
|
not_null<Row*> 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<bool>();
|
||||||
|
|
||||||
|
if (!isMuted) {
|
||||||
|
const auto call = _call.get();
|
||||||
|
auto otherParticipantStateValue = call
|
||||||
|
? call->otherParticipantStateValue(
|
||||||
|
) | rpl::filter([=](const Group::ParticipantState &data) {
|
||||||
|
return data.user == user;
|
||||||
|
})
|
||||||
|
: rpl::never<Group::ParticipantState>();
|
||||||
|
|
||||||
|
auto volumeItem = base::make_unique_q<MenuVolumeItem>(
|
||||||
|
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<Row> MembersController::createSelfRow() {
|
std::unique_ptr<Row> MembersController::createSelfRow() {
|
||||||
const auto self = _peer->session().user();
|
const auto self = _peer->session().user();
|
||||||
auto result = std::make_unique<Row>(this, self);
|
auto result = std::make_unique<Row>(this, self);
|
||||||
|
|
|
@ -12,7 +12,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "ui/effects/cross_line.h"
|
#include "ui/effects/cross_line.h"
|
||||||
#include "ui/widgets/continuous_sliders.h"
|
#include "ui/widgets/continuous_sliders.h"
|
||||||
#include "styles/style_calls.h"
|
#include "styles/style_calls.h"
|
||||||
#include "styles/style_media_player.h"
|
|
||||||
|
|
||||||
#include "ui/paint/arcs.h"
|
#include "ui/paint/arcs.h"
|
||||||
|
|
||||||
|
@ -41,7 +40,7 @@ MenuVolumeItem::MenuVolumeItem(
|
||||||
, _localMuted(muted)
|
, _localMuted(muted)
|
||||||
, _slider(base::make_unique_q<Ui::MediaSlider>(
|
, _slider(base::make_unique_q<Ui::MediaSlider>(
|
||||||
this,
|
this,
|
||||||
st::mediaPlayerPanelPlayback))
|
st::groupCallMenuVolumeSkipSlider))
|
||||||
, _dummyAction(new QAction(parent))
|
, _dummyAction(new QAction(parent))
|
||||||
, _st(st)
|
, _st(st)
|
||||||
, _stCross(st::groupCallMuteCrossLine)
|
, _stCross(st::groupCallMuteCrossLine)
|
||||||
|
@ -88,7 +87,9 @@ MenuVolumeItem::MenuVolumeItem(
|
||||||
muteProgress);
|
muteProgress);
|
||||||
p.setPen(mutePen);
|
p.setPen(mutePen);
|
||||||
p.setFont(_st.itemStyle.font);
|
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);
|
p.drawText(_volumeRect, u"%1%"_q.arg(volume), style::al_center);
|
||||||
|
|
||||||
_crossLineMute->paint(
|
_crossLineMute->paint(
|
||||||
|
|
Loading…
Add table
Reference in a new issue