[poll-create] Added poll option toggle to disable revoting.

This commit is contained in:
23rd
2026-03-16 12:51:17 +03:00
parent 3c3683a41e
commit e613a89d02
5 changed files with 29 additions and 7 deletions
+2
View File
@@ -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";
@@ -1108,6 +1108,16 @@ object_ptr<Ui::RpWidget> 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<Ui::RpWidget> 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<Ui::RpWidget> 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;
+7 -1
View File
@@ -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<const PollData*> poll, bool close) {
const auto convert = [&](const PollAnswer &answer) {
return MTP_pollAnswer(
@@ -289,6 +294,7 @@ MTPPoll PollDataToMTP(not_null<const PollData*> 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(
+7 -5
View File
@@ -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<Flag>;
@@ -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;
@@ -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);