Edit noforwards in group / channel type.

This commit is contained in:
John Preston 2021-11-19 20:49:17 +04:00
parent 0309eb023e
commit 7d89952541
5 changed files with 77 additions and 53 deletions

View File

@ -1004,6 +1004,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_manage_public_group_title" = "Public"; "lng_manage_public_group_title" = "Public";
"lng_manage_private_peer_title" = "Private"; "lng_manage_private_peer_title" = "Private";
"lng_manage_public_peer_title" = "Public"; "lng_manage_public_peer_title" = "Public";
"lng_manage_peer_no_forwards_title" = "Saving content";
"lng_manage_peer_no_forwards" = "Restrict saving content";
"lng_manage_peer_no_forwards_about" = "Participants won't be able to forward messages from this channel or save media files.";
"lng_manage_discussion_group" = "Discussion"; "lng_manage_discussion_group" = "Discussion";
"lng_manage_discussion_group_add" = "Add a group"; "lng_manage_discussion_group_add" = "Add a group";
@ -1825,7 +1828,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_edit_contact_title" = "Edit contact name"; "lng_edit_contact_title" = "Edit contact name";
"lng_edit_channel_title" = "Edit channel"; "lng_edit_channel_title" = "Edit channel";
"lng_edit_sign_messages" = "Sign messages"; "lng_edit_sign_messages" = "Sign messages";
"lng_edit_allow_forwards" = "Allow saving content";
"lng_edit_group" = "Edit group"; "lng_edit_group" = "Edit group";
"lng_edit_self_title" = "Edit your name"; "lng_edit_self_title" = "Edit your name";
"lng_confirm_contact_data" = "New Contact"; "lng_confirm_contact_data" = "New Contact";

View File

@ -277,7 +277,7 @@ private:
std::optional<QString> description; std::optional<QString> description;
std::optional<bool> hiddenPreHistory; std::optional<bool> hiddenPreHistory;
std::optional<bool> signatures; std::optional<bool> signatures;
std::optional<bool> forwards; std::optional<bool> noForwards;
std::optional<ChannelData*> linkedChat; std::optional<ChannelData*> linkedChat;
}; };
@ -297,7 +297,6 @@ private:
void fillLinkedChatButton(); void fillLinkedChatButton();
//void fillInviteLinkButton(); //void fillInviteLinkButton();
void fillSignaturesButton(); void fillSignaturesButton();
void fillForwardsButton();
void fillHistoryVisibilityButton(); void fillHistoryVisibilityButton();
void fillManageSection(); void fillManageSection();
void fillPendingRequestsButton(); void fillPendingRequestsButton();
@ -345,7 +344,7 @@ private:
std::optional<HistoryVisibility> _historyVisibilitySavedValue; std::optional<HistoryVisibility> _historyVisibilitySavedValue;
std::optional<QString> _usernameSavedValue; std::optional<QString> _usernameSavedValue;
std::optional<bool> _signaturesSavedValue; std::optional<bool> _signaturesSavedValue;
std::optional<bool> _forwardsSavedValue; std::optional<bool> _noForwardsSavedValue;
const not_null<Window::SessionNavigation*> _navigation; const not_null<Window::SessionNavigation*> _navigation;
const not_null<Ui::BoxContent*> _box; const not_null<Ui::BoxContent*> _box;
@ -611,10 +610,11 @@ void Controller::refreshHistoryVisibility() {
void Controller::showEditPeerTypeBox( void Controller::showEditPeerTypeBox(
std::optional<rpl::producer<QString>> error) { std::optional<rpl::producer<QString>> error) {
const auto boxCallback = crl::guard(this, [=]( const auto boxCallback = crl::guard(this, [=](
Privacy checked, QString publicLink) { Privacy checked, QString publicLink, bool noForwards) {
_privacyTypeUpdates.fire(std::move(checked)); _privacyTypeUpdates.fire(std::move(checked));
_privacySavedValue = checked; _privacySavedValue = checked;
_usernameSavedValue = publicLink; _usernameSavedValue = publicLink;
_noForwardsSavedValue = noForwards;
refreshHistoryVisibility(); refreshHistoryVisibility();
}); });
_navigation->parentController()->show( _navigation->parentController()->show(
@ -624,6 +624,7 @@ void Controller::showEditPeerTypeBox(
boxCallback, boxCallback,
_privacySavedValue, _privacySavedValue,
_usernameSavedValue, _usernameSavedValue,
_noForwardsSavedValue,
error), error),
Ui::LayerOption::KeepOther); Ui::LayerOption::KeepOther);
} }
@ -699,6 +700,7 @@ void Controller::fillPrivacyTypeButton() {
&& _peer->asChannel()->hasUsername()) && _peer->asChannel()->hasUsername())
? Privacy::HasUsername ? Privacy::HasUsername
: Privacy::NoUsername; : Privacy::NoUsername;
_noForwardsSavedValue = !_peer->allowsForwarding();
const auto isGroup = (_peer->isChat() || _peer->isMegagroup()); const auto isGroup = (_peer->isChat() || _peer->isMegagroup());
AddButtonWithText( AddButtonWithText(
@ -800,21 +802,6 @@ void Controller::fillSignaturesButton() {
}, _controls.buttonsLayout->lifetime()); }, _controls.buttonsLayout->lifetime());
} }
void Controller::fillForwardsButton() {
Expects(_controls.buttonsLayout != nullptr);
AddButtonWithText(
_controls.buttonsLayout,
tr::lng_edit_allow_forwards(),
rpl::single(QString()),
[=] {}
)->toggleOn(rpl::single(_peer->allowsForwarding())
)->toggledValue(
) | rpl::start_with_next([=](bool toggled) {
_forwardsSavedValue = toggled;
}, _controls.buttonsLayout->lifetime());
}
void Controller::fillHistoryVisibilityButton() { void Controller::fillHistoryVisibilityButton() {
Expects(_controls.buttonsLayout != nullptr); Expects(_controls.buttonsLayout != nullptr);
@ -874,19 +861,16 @@ void Controller::fillManageSection() {
const auto isChannel = (!chat); const auto isChannel = (!chat);
if (!chat && !channel) return; if (!chat && !channel) return;
const auto canEditUsername = [&] { const auto canEditType = [&] {
return isChannel return isChannel
? channel->canEditUsername() ? channel->amCreator()
: chat->canEditUsername(); : chat->amCreator();
}(); }();
const auto canEditSignatures = [&] { const auto canEditSignatures = [&] {
return isChannel return isChannel
? (channel->canEditSignatures() && !channel->isMegagroup()) ? (channel->canEditSignatures() && !channel->isMegagroup())
: false; : false;
}(); }();
const auto canEditForwards = [&] {
return isChannel ? channel->amCreator() : chat->amCreator();
}();
const auto canEditPreHistoryHidden = [&] { const auto canEditPreHistoryHidden = [&] {
return isChannel return isChannel
? channel->canEditPreHistoryHidden() ? channel->canEditPreHistoryHidden()
@ -946,7 +930,7 @@ void Controller::fillManageSection() {
AddSkip(_controls.buttonsLayout, 0); AddSkip(_controls.buttonsLayout, 0);
if (canEditUsername) { if (canEditType) {
fillPrivacyTypeButton(); fillPrivacyTypeButton();
//} else if (canEditInviteLinks) { //} else if (canEditInviteLinks) {
// fillInviteLinkButton(); // fillInviteLinkButton();
@ -960,15 +944,11 @@ void Controller::fillManageSection() {
if (canEditSignatures) { if (canEditSignatures) {
fillSignaturesButton(); fillSignaturesButton();
} }
if (canEditForwards) {
fillForwardsButton();
}
if (canEditPreHistoryHidden if (canEditPreHistoryHidden
|| canEditSignatures || canEditSignatures
|| canEditForwards
//|| canEditInviteLinks //|| canEditInviteLinks
|| canViewOrEditLinkedChat || canViewOrEditLinkedChat
|| canEditUsername) { || canEditType) {
AddSkip( AddSkip(
_controls.buttonsLayout, _controls.buttonsLayout,
st::editPeerTopButtonsLayoutSkip, st::editPeerTopButtonsLayoutSkip,
@ -989,7 +969,7 @@ void Controller::fillManageSection() {
st::infoIconPermissions); st::infoIconPermissions);
} }
if (canEditInviteLinks if (canEditInviteLinks
&& (canEditUsername && (canEditType
|| !_peer->isChannel() || !_peer->isChannel()
|| !_peer->asChannel()->hasUsername())) { || !_peer->asChannel()->hasUsername())) {
auto count = Info::Profile::MigratedOrMeValue( auto count = Info::Profile::MigratedOrMeValue(
@ -1258,10 +1238,10 @@ bool Controller::validateSignatures(Saving &to) const {
} }
bool Controller::validateForwards(Saving &to) const { bool Controller::validateForwards(Saving &to) const {
if (!_forwardsSavedValue.has_value()) { if (!_noForwardsSavedValue.has_value()) {
return true; return true;
} }
to.forwards = _forwardsSavedValue; to.noForwards = _noForwardsSavedValue;
return true; return true;
} }
@ -1537,13 +1517,13 @@ void Controller::saveSignatures() {
} }
void Controller::saveForwards() { void Controller::saveForwards() {
if (!_savingData.forwards if (!_savingData.noForwards
|| *_savingData.forwards == _peer->allowsForwarding()) { || *_savingData.noForwards != _peer->allowsForwarding()) {
return continueSave(); return continueSave();
} }
_api.request(MTPmessages_ToggleNoForwards( _api.request(MTPmessages_ToggleNoForwards(
_peer->input, _peer->input,
MTP_bool(!*_savingData.forwards) MTP_bool(*_savingData.noForwards)
)).done([=](const MTPUpdates &result) { )).done([=](const MTPUpdates &result) {
_peer->session().api().applyUpdates(result); _peer->session().api().applyUpdates(result);
continueSave(); continueSave();

View File

@ -63,13 +63,14 @@ public:
not_null<PeerData*> peer, not_null<PeerData*> peer,
bool useLocationPhrases, bool useLocationPhrases,
std::optional<Privacy> privacySavedValue, std::optional<Privacy> privacySavedValue,
std::optional<QString> usernameSavedValue); std::optional<QString> usernameSavedValue,
std::optional<bool> noForwardsSavedValue);
void createContent(); void createContent();
QString getUsernameInput(); [[nodiscard]] QString getUsernameInput() const;
void setFocusUsername(); void setFocusUsername();
rpl::producer<QString> getTitle() { [[nodiscard]] rpl::producer<QString> getTitle() const {
return !_privacySavedValue return !_privacySavedValue
? tr::lng_create_invite_link_title() ? tr::lng_create_invite_link_title()
: _isGroup : _isGroup
@ -77,14 +78,18 @@ public:
: tr::lng_manage_peer_channel_type(); : tr::lng_manage_peer_channel_type();
} }
bool isAllowSave() { [[nodiscard]] bool isAllowSave() {
return _isAllowSave; return _isAllowSave;
} }
Privacy getPrivacy() { [[nodiscard]] Privacy getPrivacy() const {
return _controls.privacy->value(); return _controls.privacy->value();
} }
[[nodiscard]] bool noForwards() const {
return _controls.noForwards->toggled();
}
void showError(rpl::producer<QString> text) { void showError(rpl::producer<QString> text) {
_controls.usernameInput->showError(); _controls.usernameInput->showError();
showUsernameError(std::move(text)); showUsernameError(std::move(text));
@ -100,6 +105,8 @@ private:
Ui::SlideWrap<Ui::RpWidget> *inviteLinkWrap = nullptr; Ui::SlideWrap<Ui::RpWidget> *inviteLinkWrap = nullptr;
Ui::FlatLabel *inviteLink = nullptr; Ui::FlatLabel *inviteLink = nullptr;
Ui::SettingsButton *noForwards = nullptr;
}; };
Controls _controls; Controls _controls;
@ -133,6 +140,7 @@ private:
MTP::Sender _api; MTP::Sender _api;
std::optional<Privacy> _privacySavedValue; std::optional<Privacy> _privacySavedValue;
std::optional<QString> _usernameSavedValue; std::optional<QString> _usernameSavedValue;
std::optional<bool> _noForwardsSavedValue;
bool _useLocationPhrases = false; bool _useLocationPhrases = false;
bool _isGroup = false; bool _isGroup = false;
@ -153,12 +161,14 @@ Controller::Controller(
not_null<PeerData*> peer, not_null<PeerData*> peer,
bool useLocationPhrases, bool useLocationPhrases,
std::optional<Privacy> privacySavedValue, std::optional<Privacy> privacySavedValue,
std::optional<QString> usernameSavedValue) std::optional<QString> usernameSavedValue,
std::optional<bool> noForwardsSavedValue)
: _peer(peer) : _peer(peer)
, _linkOnly(!privacySavedValue.has_value()) , _linkOnly(!privacySavedValue.has_value())
, _api(&_peer->session().mtp()) , _api(&_peer->session().mtp())
, _privacySavedValue(privacySavedValue) , _privacySavedValue(privacySavedValue)
, _usernameSavedValue(usernameSavedValue) , _usernameSavedValue(usernameSavedValue)
, _noForwardsSavedValue(noForwardsSavedValue)
, _useLocationPhrases(useLocationPhrases) , _useLocationPhrases(useLocationPhrases)
, _isGroup(_peer->isChat() || _peer->isMegagroup()) , _isGroup(_peer->isChat() || _peer->isMegagroup())
, _isAllowSave(!_usernameSavedValue.value_or(QString()).isEmpty()) , _isAllowSave(!_usernameSavedValue.value_or(QString()).isEmpty())
@ -196,6 +206,25 @@ void Controller::createContent() {
AddSkip(_wrap.get()); AddSkip(_wrap.get());
AddDividerText(_wrap.get(), tr::lng_group_invite_manage_about()); AddDividerText(_wrap.get(), tr::lng_group_invite_manage_about());
AddSkip(_wrap.get());
AddSubsectionTitle(_wrap.get(), tr::lng_manage_peer_no_forwards_title());
_controls.noForwards = _wrap->add(EditPeerInfoBox::CreateButton(
_wrap.get(),
tr::lng_manage_peer_no_forwards(),
rpl::single(QString()),
[=] {},
st::manageGroupTopButtonWithText,
nullptr
));
_controls.noForwards->toggleOn(
rpl::single(_noForwardsSavedValue.value_or(false))
)->toggledValue(
) | rpl::start_with_next([=](bool toggled) {
_noForwardsSavedValue = toggled;
}, _wrap->lifetime());
AddSkip(_wrap.get());
AddDividerText(_wrap.get(), tr::lng_manage_peer_no_forwards_about());
if (_linkOnly) { if (_linkOnly) {
_controls.inviteLinkWrap->show(anim::type::instant); _controls.inviteLinkWrap->show(anim::type::instant);
} else { } else {
@ -299,7 +328,7 @@ void Controller::setFocusUsername() {
} }
} }
QString Controller::getUsernameInput() { QString Controller::getUsernameInput() const {
return _controls.usernameInput->getLastText().trimmed(); return _controls.usernameInput->getLastText().trimmed();
} }
@ -575,22 +604,24 @@ EditPeerTypeBox::EditPeerTypeBox(
QWidget*, QWidget*,
not_null<PeerData*> peer, not_null<PeerData*> peer,
bool useLocationPhrases, bool useLocationPhrases,
std::optional<FnMut<void(Privacy, QString)>> savedCallback, std::optional<FnMut<void(Privacy, QString, bool)>> savedCallback,
std::optional<Privacy> privacySaved, std::optional<Privacy> privacySaved,
std::optional<QString> usernameSaved, std::optional<QString> usernameSaved,
std::optional<bool> noForwardsValue,
std::optional<rpl::producer<QString>> usernameError) std::optional<rpl::producer<QString>> usernameError)
: _peer(peer) : _peer(peer)
, _useLocationPhrases(useLocationPhrases) , _useLocationPhrases(useLocationPhrases)
, _savedCallback(std::move(savedCallback)) , _savedCallback(std::move(savedCallback))
, _privacySavedValue(privacySaved) , _privacySavedValue(privacySaved)
, _usernameSavedValue(usernameSaved) , _usernameSavedValue(usernameSaved)
, _noForwardsValue(noForwardsValue)
, _usernameError(usernameError) { , _usernameError(usernameError) {
} }
EditPeerTypeBox::EditPeerTypeBox( EditPeerTypeBox::EditPeerTypeBox(
QWidget*, QWidget*,
not_null<PeerData*> peer) not_null<PeerData*> peer)
: EditPeerTypeBox(nullptr, peer, {}, {}, {}, {}, {}) { : EditPeerTypeBox(nullptr, peer, {}, {}, {}, {}, {}, {}) {
} }
void EditPeerTypeBox::setInnerFocus() { void EditPeerTypeBox::setInnerFocus() {
@ -608,7 +639,8 @@ void EditPeerTypeBox::prepare() {
_peer, _peer,
_useLocationPhrases, _useLocationPhrases,
_privacySavedValue, _privacySavedValue,
_usernameSavedValue); _usernameSavedValue,
_noForwardsValue);
_focusRequests.events( _focusRequests.events(
) | rpl::start_with_next( ) | rpl::start_with_next(
[=] { [=] {
@ -632,10 +664,12 @@ void EditPeerTypeBox::prepare() {
} }
auto local = std::move(*_savedCallback); auto local = std::move(*_savedCallback);
local(v, local(
(v == Privacy::HasUsername) v,
(v == Privacy::HasUsername
? controller->getUsernameInput() ? controller->getUsernameInput()
: QString()); // We don't need username with private type. : QString()),
controller->noForwards()); // We don't need username with private type.
closeBox(); closeBox();
}); });
addButton(tr::lng_cancel(), [=] { closeBox(); }); addButton(tr::lng_cancel(), [=] { closeBox(); });

View File

@ -36,9 +36,10 @@ public:
QWidget*, QWidget*,
not_null<PeerData*> peer, not_null<PeerData*> peer,
bool useLocationPhrases, bool useLocationPhrases,
std::optional<FnMut<void(Privacy, QString)>> savedCallback, std::optional<FnMut<void(Privacy, QString, bool)>> savedCallback,
std::optional<Privacy> privacySaved, std::optional<Privacy> privacySaved,
std::optional<QString> usernameSaved, std::optional<QString> usernameSaved,
std::optional<bool> noForwardsSaved,
std::optional<rpl::producer<QString>> usernameError = {}); std::optional<rpl::producer<QString>> usernameError = {});
// For invite link only. // For invite link only.
@ -53,10 +54,11 @@ protected:
private: private:
not_null<PeerData*> _peer; not_null<PeerData*> _peer;
bool _useLocationPhrases = false; bool _useLocationPhrases = false;
std::optional<FnMut<void(Privacy, QString)>> _savedCallback; std::optional<FnMut<void(Privacy, QString, bool)>> _savedCallback;
std::optional<Privacy> _privacySavedValue; std::optional<Privacy> _privacySavedValue;
std::optional<QString> _usernameSavedValue; std::optional<QString> _usernameSavedValue;
std::optional<bool> _noForwardsValue;
std::optional<rpl::producer<QString>> _usernameError; std::optional<rpl::producer<QString>> _usernameError;
rpl::event_stream<> _focusRequests; rpl::event_stream<> _focusRequests;

View File

@ -467,6 +467,10 @@ bool Instance::moveInPlaylist(
const auto jumpById = [&](FullMsgId id) { const auto jumpById = [&](FullMsgId id) {
return jumpByItem(data->history->owner().message(id)); return jumpByItem(data->history->owner().message(id));
}; };
if (data->order.current() == OrderMode::Shuffle) {
}
const auto newIndex = *data->playlistIndex const auto newIndex = *data->playlistIndex
+ (data->order.current() == OrderMode::Reverse ? -delta : delta); + (data->order.current() == OrderMode::Reverse ? -delta : delta);
const auto useIndex = (!data->playlistSlice const auto useIndex = (!data->playlistSlice
@ -499,6 +503,7 @@ bool Instance::previousAvailable(AudioMsgId::Type type) const {
return false; return false;
} else if (data->repeat.current() == RepeatMode::All) { } else if (data->repeat.current() == RepeatMode::All) {
return true; return true;
} else if (data->order.current() == OrderMode::Shuffle) {
} }
return (data->order.current() == OrderMode::Reverse) return (data->order.current() == OrderMode::Reverse)
? (*data->playlistIndex + 1 < data->playlistSlice->size()) ? (*data->playlistIndex + 1 < data->playlistSlice->size())
@ -513,6 +518,7 @@ bool Instance::nextAvailable(AudioMsgId::Type type) const {
return false; return false;
} else if (data->repeat.current() == RepeatMode::All) { } else if (data->repeat.current() == RepeatMode::All) {
return true; return true;
} else if (data->order.current() == OrderMode::Shuffle) {
} }
return (data->order.current() == OrderMode::Reverse) return (data->order.current() == OrderMode::Reverse)
? (*data->playlistIndex > 0) ? (*data->playlistIndex > 0)