diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 3057d06dea..cc934b5221 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -6855,6 +6855,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_polls_create_show_who_voted_about" = "Display voter name on each option."; "lng_polls_create_allow_multiple_answers" = "Allow Multiple Answers"; "lng_polls_create_allow_multiple_answers_about" = "Voters can select more than one option."; +"lng_polls_create_allow_revoting" = "Allow Revoting"; +"lng_polls_create_allow_revoting_about" = "Voters can change their vote."; "lng_polls_create_shuffle_options" = "Shuffle Options"; "lng_polls_create_shuffle_options_about" = "Answers appear in random order for each voter."; "lng_polls_create_set_correct_answer" = "Set Correct Answer"; diff --git a/Telegram/SourceFiles/boxes/create_poll_box.cpp b/Telegram/SourceFiles/boxes/create_poll_box.cpp index f4522cad68..cce95c1f0f 100644 --- a/Telegram/SourceFiles/boxes/create_poll_box.cpp +++ b/Telegram/SourceFiles/boxes/create_poll_box.cpp @@ -1108,6 +1108,16 @@ object_ptr CreatePollBox::setupContent() { | rpl::then(state->multipleForceOff.events()), st::detailedSettingsButtonStyle) : nullptr; + const auto revoting = AddPollToggleButton( + container, + tr::lng_polls_create_allow_revoting(), + tr::lng_polls_create_allow_revoting_about(), + { + .icon = &st::pollBoxFilledPollRevoteIcon, + .background = &st::settingsIconBg6, + }, + rpl::single(!(_chosen & PollData::Flag::RevotingDisabled)), + st::detailedSettingsButtonStyle); const auto shuffle = AddPollToggleButton( container, tr::lng_polls_create_shuffle_options(), @@ -1150,6 +1160,7 @@ object_ptr CreatePollBox::setupContent() { }, solution->lifetime()); quiz->setToggleLocked(_disabled & PollData::Flag::Quiz); + revoting->setToggleLocked(_disabled & PollData::Flag::RevotingDisabled); shuffle->setToggleLocked(_disabled & PollData::Flag::ShuffleAnswers); if (multiple) { multiple->setToggleLocked((_disabled & PollData::Flag::MultiChoice) @@ -1224,6 +1235,7 @@ object_ptr CreatePollBox::setupContent() { result.setFlags(Flag(0) | (publicVotes ? Flag::PublicVotes : Flag(0)) | (multiChoice ? Flag::MultiChoice : Flag(0)) + | (!revoting->toggled() ? Flag::RevotingDisabled : Flag(0)) | (shuffle->toggled() ? Flag::ShuffleAnswers : Flag(0)) | (quiz->toggled() ? Flag::Quiz : Flag(0))); return result; diff --git a/Telegram/SourceFiles/data/data_poll.cpp b/Telegram/SourceFiles/data/data_poll.cpp index b2b10d7db3..18fb9c1e51 100644 --- a/Telegram/SourceFiles/data/data_poll.cpp +++ b/Telegram/SourceFiles/data/data_poll.cpp @@ -77,7 +77,8 @@ bool PollData::applyChanges(const MTPDpoll &poll) { | (poll.is_public_voters() ? Flag::PublicVotes : Flag(0)) | (poll.is_multiple_choice() ? Flag::MultiChoice : Flag(0)) | (poll.is_quiz() ? Flag::Quiz : Flag(0)) - | (poll.is_shuffle_answers() ? Flag::ShuffleAnswers : Flag(0)); + | (poll.is_shuffle_answers() ? Flag::ShuffleAnswers : Flag(0)) + | (poll.is_revoting_disabled() ? Flag::RevotingDisabled : Flag(0)); const auto newCloseDate = poll.vclose_date().value_or_empty(); const auto newClosePeriod = poll.vclose_period().value_or_empty(); auto newAnswers = ranges::views::all( @@ -265,6 +266,10 @@ bool PollData::shuffleAnswers() const { return (_flags & Flag::ShuffleAnswers); } +bool PollData::revotingDisabled() const { + return (_flags & Flag::RevotingDisabled); +} + MTPPoll PollDataToMTP(not_null poll, bool close) { const auto convert = [&](const PollAnswer &answer) { return MTP_pollAnswer( @@ -289,6 +294,7 @@ MTPPoll PollDataToMTP(not_null poll, bool close) { | (poll->publicVotes() ? Flag::f_public_voters : Flag(0)) | (poll->quiz() ? Flag::f_quiz : Flag(0)) | (poll->shuffleAnswers() ? Flag::f_shuffle_answers : Flag(0)) + | (poll->revotingDisabled() ? Flag::f_revoting_disabled : Flag(0)) | (poll->closePeriod > 0 ? Flag::f_close_period : Flag(0)) | (poll->closeDate > 0 ? Flag::f_close_date : Flag(0)); return MTP_poll( diff --git a/Telegram/SourceFiles/data/data_poll.h b/Telegram/SourceFiles/data/data_poll.h index 73e46282ff..23638e54e4 100644 --- a/Telegram/SourceFiles/data/data_poll.h +++ b/Telegram/SourceFiles/data/data_poll.h @@ -39,11 +39,12 @@ struct PollData { [[nodiscard]] Main::Session &session() const; enum class Flag { - Closed = 0x01, - PublicVotes = 0x02, - MultiChoice = 0x04, - Quiz = 0x08, - ShuffleAnswers = 0x10, + Closed = 0x01, + PublicVotes = 0x02, + MultiChoice = 0x04, + Quiz = 0x08, + ShuffleAnswers = 0x10, + RevotingDisabled = 0x20, }; friend inline constexpr bool is_flag_type(Flag) { return true; }; using Flags = base::flags; @@ -65,6 +66,7 @@ struct PollData { [[nodiscard]] bool multiChoice() const; [[nodiscard]] bool quiz() const; [[nodiscard]] bool shuffleAnswers() const; + [[nodiscard]] bool revotingDisabled() const; PollId id = 0; TextWithEntities question; diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index ec5f24344e..7753baee20 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -1519,7 +1519,7 @@ void AddPollActions( return; } const auto itemId = item->fullId(); - if (poll->voted() && !poll->quiz()) { + if (poll->voted() && !poll->quiz() && !poll->revotingDisabled()) { menu->addAction(tr::lng_polls_retract(tr::now), [=] { poll->session().api().polls().sendVotes(itemId, {}); }, &st::menuIconRetractVote);