Moved adding volume and mute items in group calls to separate place.

This commit is contained in:
23rd 2021-01-19 17:29:57 +03:00
parent 9fed46fb6e
commit ef1a4e4ce3
3 changed files with 115 additions and 97 deletions

View file

@ -788,6 +788,7 @@ groupCallMuteCrossLine: CrossLineAnimation {
groupCallMenuSpeakerArcsSkip: 1px; groupCallMenuSpeakerArcsSkip: 1px;
groupCallMenuVolumeSkip: 5px; groupCallMenuVolumeSkip: 5px;
groupCallMenuVolumeSkipSlider: defaultContinuousSlider;
groupCallSpeakerArcsAnimation: ArcsAnimation { groupCallSpeakerArcsAnimation: ArcsAnimation {
fg: groupCallIconFg; fg: groupCallIconFg;

View file

@ -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,6 +1212,38 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
}); });
if (real->ssrc() != 0) { if (real->ssrc() != 0) {
addMuteActionsToContextMenu(result, user, real);
}
result->addAction(
tr::lng_context_view_profile(tr::now),
showProfile);
result->addAction(
tr::lng_context_send_message(tr::now),
showHistory);
const auto canKick = [&] {
if (static_cast<Row*>(row.get())->state() == Row::State::Invited) {
return false;
} else if (const auto chat = _peer->asChat()) {
return chat->amCreator()
|| (chat->canBanMembers() && !chat->admins.contains(user));
} else if (const auto group = _peer->asMegagroup()) {
return group->canRestrictUser(user);
}
return false;
}();
if (canKick) {
result->addAction(
tr::lng_context_remove_from_group(tr::now),
removeFromGroup);
}
return result;
}
void MembersController::addMuteActionsToContextMenu(
not_null<Ui::PopupMenu*> menu,
not_null<UserData*> user,
not_null<Row*> row) {
const auto muteString = [=] { const auto muteString = [=] {
return (_peer->canManageGroupCall() return (_peer->canManageGroupCall()
? tr::lng_group_call_context_mute ? tr::lng_group_call_context_mute
@ -1237,6 +1273,13 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
}); });
}); });
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(); const auto call = _call.get();
auto otherParticipantStateValue = call auto otherParticipantStateValue = call
? call->otherParticipantStateValue( ? call->otherParticipantStateValue(
@ -1245,18 +1288,15 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
}) })
: rpl::never<Group::ParticipantState>(); : rpl::never<Group::ParticipantState>();
const auto isMuted = (muteState == Row::State::Muted)
|| (muteState == Row::State::MutedByMe);
auto volumeItem = base::make_unique_q<MenuVolumeItem>( auto volumeItem = base::make_unique_q<MenuVolumeItem>(
result, menu,
st::groupCallPopupMenu.menu, st::groupCallPopupMenu.menu,
otherParticipantStateValue, otherParticipantStateValue,
real->volume(), row->volume(),
Group::kMaxVolume, Group::kMaxVolume,
isMuted); isMuted);
auto mutesFromVolume = volumeItem->toggleMuteRequests(); mutesFromVolume = volumeItem->toggleMuteRequests();
volumeItem->toggleMuteRequests( volumeItem->toggleMuteRequests(
) | rpl::start_with_next([=](bool muted) { ) | rpl::start_with_next([=](bool muted) {
@ -1278,55 +1318,31 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
changeVolume(volume, true); changeVolume(volume, true);
}, volumeItem->lifetime()); }, volumeItem->lifetime());
result->addAction(std::move(volumeItem)); menu->addAction(std::move(volumeItem));
};
const auto muteAction = [&]() -> QAction* { const auto muteAction = [&]() -> QAction* {
if (muteState == Row::State::Invited) { if (muteState == Row::State::Invited) {
return nullptr; return nullptr;
} }
auto callback = [=] { auto callback = [=] {
const auto state = real->state(); const auto state = row->state();
const auto muted = (state == Row::State::Muted) const auto muted = (state == Row::State::Muted)
|| (state == Row::State::MutedByMe); || (state == Row::State::MutedByMe);
toggleMute(!muted, false); toggleMute(!muted, false);
}; };
return result->addAction( return menu->addAction(
isMuted ? unmuteString() : muteString(), isMuted ? unmuteString() : muteString(),
std::move(callback)); std::move(callback));
}(); }();
if (muteAction) {
std::move( std::move(
mutesFromVolume mutesFromVolume
) | rpl::filter([=] { ) | rpl::start_with_next([=](bool muted) {
return muteAction != nullptr;
}) | rpl::start_with_next([=](bool muted) {
muteAction->setText(muted ? unmuteString() : muteString()); muteAction->setText(muted ? unmuteString() : muteString());
}, result->lifetime()); }, menu->lifetime());
} }
result->addAction(
tr::lng_context_view_profile(tr::now),
showProfile);
result->addAction(
tr::lng_context_send_message(tr::now),
showHistory);
const auto canKick = [&] {
if (static_cast<Row*>(row.get())->state() == Row::State::Invited) {
return false;
} else if (const auto chat = _peer->asChat()) {
return chat->amCreator()
|| (chat->canBanMembers() && !chat->admins.contains(user));
} else if (const auto group = _peer->asMegagroup()) {
return group->canRestrictUser(user);
}
return false;
}();
if (canKick) {
result->addAction(
tr::lng_context_remove_from_group(tr::now),
removeFromGroup);
}
return result;
} }
std::unique_ptr<Row> MembersController::createSelfRow() { std::unique_ptr<Row> MembersController::createSelfRow() {

View file

@ -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(