From 4ecd1049b24e0954573a158a9d13d2f230461351 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 9 Apr 2021 17:59:43 +0400 Subject: [PATCH] Allow scheduling voice chats for up to 7 days. --- .../calls/calls_choose_join_as.cpp | 33 +++++++++--- .../view/history_view_schedule_box.cpp | 12 ++--- .../SourceFiles/ui/boxes/choose_date_time.cpp | 51 +++++++++++-------- .../SourceFiles/ui/boxes/choose_date_time.h | 16 ++++-- .../SourceFiles/ui/boxes/edit_invite_link.cpp | 12 ++--- 5 files changed, 78 insertions(+), 46 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls_choose_join_as.cpp b/Telegram/SourceFiles/calls/calls_choose_join_as.cpp index 39a7ef1714..d0caf094e0 100644 --- a/Telegram/SourceFiles/calls/calls_choose_join_as.cpp +++ b/Telegram/SourceFiles/calls/calls_choose_join_as.cpp @@ -134,13 +134,32 @@ void ScheduleGroupCallBox( : tr::lng_group_call_schedule_notified_group)( lt_duration, duration->value()); - auto descriptor = Ui::ChooseDateTimeBox( - box, - tr::lng_group_call_schedule_title(), - tr::lng_schedule_button(), - send, - base::unixtime::now() + kDefaultScheduleDuration, - std::move(description)); + + const auto now = QDateTime::currentDateTime(); + const auto min = [] { + return base::unixtime::serialize( + QDateTime::currentDateTime().addSecs(12)); + }; + const auto max = [] { + return base::unixtime::serialize( + QDateTime(QDate::currentDate().addDays(8))) - 1; + }; + + // At least half an hour later, at zero minutes/seconds. + const auto schedule = QDateTime( + now.date(), + QTime(now.time().hour(), 0) + ).addSecs(60 * 60 * (now.time().minute() < 30 ? 1 : 2)); + + auto descriptor = Ui::ChooseDateTimeBox(box, { + .title = tr::lng_group_call_schedule_title(), + .submit = tr::lng_schedule_button(), + .done = send, + .min = min, + .time = base::unixtime::serialize(schedule), + .max = max, + .description = std::move(description), + }); using namespace rpl::mappers; *duration = rpl::combine( diff --git a/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp b/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp index 5ddfe67c74..593c292a5d 100644 --- a/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp +++ b/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp @@ -76,14 +76,14 @@ void ScheduleBox( box->closeBox(); copy(result); }; - auto descriptor = Ui::ChooseDateTimeBox( - box, - (type == SendMenu::Type::Reminder + auto descriptor = Ui::ChooseDateTimeBox(box, { + .title = (type == SendMenu::Type::Reminder ? tr::lng_remind_title() : tr::lng_schedule_title()), - tr::lng_schedule_button(), - [=](TimeId result) { save(false, result); }, - time); + .submit = tr::lng_schedule_button(), + .done = [=](TimeId result) { save(false, result); }, + .time = time, + }); SendMenu::SetupMenuAndShortcuts( descriptor.submit.data(), diff --git a/Telegram/SourceFiles/ui/boxes/choose_date_time.cpp b/Telegram/SourceFiles/ui/boxes/choose_date_time.cpp index 5448f3eb2f..832eeed623 100644 --- a/Telegram/SourceFiles/ui/boxes/choose_date_time.cpp +++ b/Telegram/SourceFiles/ui/boxes/choose_date_time.cpp @@ -50,11 +50,10 @@ QString DayString(const QDate &date) { QString::number(date.day())); } -QString TimeString(TimeId time) { - const auto parsed = base::unixtime::parse(time).time(); +QString TimeString(QTime time) { return QString("%1:%2" - ).arg(parsed.hour() - ).arg(parsed.minute(), 2, 10, QLatin1Char('0')); + ).arg(time.hour() + ).arg(time.minute(), 2, 10, QLatin1Char('0')); } int ProcessWheelEvent(not_null e) { @@ -569,36 +568,33 @@ void TimeInput::startBorderAnimation() { ChooseDateTimeBoxDescriptor ChooseDateTimeBox( not_null box, - rpl::producer title, - rpl::producer submit, - Fn done, - TimeId time, - rpl::producer description) { + ChooseDateTimeBoxArgs &&args) { struct State { rpl::variable date; not_null day; not_null time; not_null at; }; - box->setTitle(std::move(title)); + box->setTitle(std::move(args.title)); box->setWidth(st::boxWideWidth); const auto content = box->addRow( object_ptr(box, st::scheduleHeight)); - if (description) { + if (args.description) { box->addRow(object_ptr( box, - std::move(description), + std::move(args.description), st::boxLabel)); } + const auto parsed = base::unixtime::parse(args.time); const auto state = box->lifetime().make_state(State{ - .date = base::unixtime::parse(time).date(), + .date = parsed.date(), .day = CreateChild( content, st::scheduleDateField), .time = CreateChild( content, - TimeString(time)), + TimeString(parsed.time())), .at = CreateChild( content, tr::lng_schedule_at(), @@ -611,8 +607,19 @@ ChooseDateTimeBoxDescriptor ChooseDateTimeBox( state->time->setFocusFast(); }, state->day->lifetime()); - const auto minDate = QDate::currentDate(); - const auto maxDate = minDate.addYears(1).addDays(-1); + const auto min = args.min ? args.min : [] { + return base::unixtime::now() + kMinimalSchedule; + }; + const auto max = args.max ? args.max : [] { + return base::unixtime::serialize( + QDateTime::currentDateTime().addYears(1)) - 1; + }; + const auto minDate = [=] { + return base::unixtime::parse(min()).date(); + }; + const auto maxDate = [=] { + return base::unixtime::parse(max()).date(); + }; const auto &dayViewport = state->day->rawTextEdit()->viewport(); base::install_event_filter(dayViewport, [=](not_null event) { @@ -623,7 +630,7 @@ ChooseDateTimeBoxDescriptor ChooseDateTimeBox( return base::EventFilterResult::Continue; } const auto d = state->date.current().addDays(direction); - state->date = std::clamp(d, minDate, maxDate); + state->date = std::clamp(d, minDate(), maxDate()); return base::EventFilterResult::Cancel; } return base::EventFilterResult::Continue; @@ -661,8 +668,8 @@ ChooseDateTimeBoxDescriptor ChooseDateTimeBox( (*calendar)->closeBox(); }; const auto finalize = [=](not_null box) { - box->setMinDate(minDate); - box->setMaxDate(maxDate); + box->setMinDate(minDate()); + box->setMaxDate(maxDate()); }; *calendar = box->getDelegate()->show(Box( state->date.current(), @@ -686,12 +693,12 @@ ChooseDateTimeBoxDescriptor ChooseDateTimeBox( } const auto result = base::unixtime::serialize( QDateTime(state->date.current(), time)); - if (result <= base::unixtime::now() + kMinimalSchedule) { + if (result < min() || result > max()) { return 0; } return result; }; - const auto save = [=] { + const auto save = [=, done = args.done] { if (const auto result = collect()) { done(result); } else { @@ -703,7 +710,7 @@ ChooseDateTimeBoxDescriptor ChooseDateTimeBox( auto result = ChooseDateTimeBoxDescriptor(); box->setFocusCallback([=] { state->time->setFocusFast(); }); - result.submit = box->addButton(std::move(submit), save); + result.submit = box->addButton(std::move(args.submit), save); result.collect = [=] { if (const auto result = collect()) { return result; diff --git a/Telegram/SourceFiles/ui/boxes/choose_date_time.h b/Telegram/SourceFiles/ui/boxes/choose_date_time.h index 6bfb72b7af..24391b48b0 100644 --- a/Telegram/SourceFiles/ui/boxes/choose_date_time.h +++ b/Telegram/SourceFiles/ui/boxes/choose_date_time.h @@ -19,12 +19,18 @@ struct ChooseDateTimeBoxDescriptor { rpl::producer values; }; +struct ChooseDateTimeBoxArgs { + rpl::producer title; + rpl::producer submit; + Fn done; + Fn min; + TimeId time = 0; + Fn max; + rpl::producer description; +}; + ChooseDateTimeBoxDescriptor ChooseDateTimeBox( not_null box, - rpl::producer title, - rpl::producer submit, - Fn done, - TimeId time, - rpl::producer description = nullptr); + ChooseDateTimeBoxArgs &&args); } // namespace Ui diff --git a/Telegram/SourceFiles/ui/boxes/edit_invite_link.cpp b/Telegram/SourceFiles/ui/boxes/edit_invite_link.cpp index 5038a98a87..a9f27fe53e 100644 --- a/Telegram/SourceFiles/ui/boxes/edit_invite_link.cpp +++ b/Telegram/SourceFiles/ui/boxes/edit_invite_link.cpp @@ -201,12 +201,12 @@ void EditInviteLinkBox( : (state->expireValue < 0) ? (now - state->expireValue) : (now + kDay); - ChooseDateTimeBox( - box, - tr::lng_group_invite_expire_after(), - tr::lng_settings_save(), - save, - time); + ChooseDateTimeBox(box, { + .title = tr::lng_group_invite_expire_after(), + .submit = tr::lng_settings_save(), + .done = save, + .time = time, + }); })); }); usageGroup->setChangedCallback([=](int value) {