From e285b22398f21cc3773bb82d03020774bbf0011c Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 22 Apr 2023 22:26:09 +0400 Subject: [PATCH] Add "Send when online" to the send button context menu. --- Telegram/SourceFiles/api/api_common.cpp | 8 ++++++++ Telegram/SourceFiles/api/api_common.h | 3 +++ .../SourceFiles/boxes/create_poll_box.cpp | 6 +++++- Telegram/SourceFiles/boxes/send_files_box.cpp | 10 ++++++++-- Telegram/SourceFiles/boxes/send_files_box.h | 1 + Telegram/SourceFiles/boxes/share_box.cpp | 7 ++++++- Telegram/SourceFiles/boxes/share_box.h | 1 + .../SourceFiles/boxes/sticker_set_box.cpp | 3 ++- .../chat_helpers/field_autocomplete.cpp | 3 ++- .../chat_helpers/gifs_list_widget.cpp | 3 ++- .../chat_helpers/stickers_list_widget.cpp | 3 ++- .../data/data_scheduled_messages.cpp | 2 +- .../data/data_scheduled_messages.h | 2 -- Telegram/SourceFiles/history/history_item.cpp | 2 +- .../history/history_item_helpers.cpp | 4 +--- .../SourceFiles/history/history_widget.cpp | 7 ++++++- Telegram/SourceFiles/history/history_widget.h | 1 + .../history_view_compose_controls.cpp | 3 ++- .../view/history_view_context_menu.cpp | 4 +--- .../view/history_view_schedule_box.cpp | 5 ++--- .../inline_bots/inline_results_inner.cpp | 3 ++- Telegram/SourceFiles/menu/menu_send.cpp | 20 +++++++++++++++---- Telegram/SourceFiles/menu/menu_send.h | 7 +++++-- .../SourceFiles/window/window_peer_menu.cpp | 3 ++- 24 files changed, 80 insertions(+), 31 deletions(-) diff --git a/Telegram/SourceFiles/api/api_common.cpp b/Telegram/SourceFiles/api/api_common.cpp index 2fe4fa802..f4afa97f6 100644 --- a/Telegram/SourceFiles/api/api_common.cpp +++ b/Telegram/SourceFiles/api/api_common.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "api/api_common.h" +#include "base/qt/qt_key_modifiers.h" #include "data/data_thread.h" namespace Api { @@ -20,4 +21,11 @@ SendAction::SendAction( , topicRootId(replyTo) { } +SendOptions DefaultSendWhenOnlineOptions() { + return { + .scheduled = kScheduledUntilOnlineTimestamp, + .silent = base::IsCtrlPressed(), + }; +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_common.h b/Telegram/SourceFiles/api/api_common.h index 34631c8a8..1bdb97ee5 100644 --- a/Telegram/SourceFiles/api/api_common.h +++ b/Telegram/SourceFiles/api/api_common.h @@ -15,6 +15,8 @@ class Thread; namespace Api { +inline constexpr auto kScheduledUntilOnlineTimestamp = TimeId(0x7FFFFFFE); + struct SendOptions { PeerData *sendAs = nullptr; TimeId scheduled = 0; @@ -23,6 +25,7 @@ struct SendOptions { bool removeWebPageId = false; bool hideViaBot = false; }; +[[nodiscard]] SendOptions DefaultSendWhenOnlineOptions(); enum class SendType { Normal, diff --git a/Telegram/SourceFiles/boxes/create_poll_box.cpp b/Telegram/SourceFiles/boxes/create_poll_box.cpp index 8c4cd47a5..775e5b7f5 100644 --- a/Telegram/SourceFiles/boxes/create_poll_box.cpp +++ b/Telegram/SourceFiles/boxes/create_poll_box.cpp @@ -1102,6 +1102,9 @@ object_ptr CreatePollBox::setupContent() { send), Ui::LayerOption::KeepOther); }; + const auto sendWhenOnline = [=] { + send(Api::DefaultSendWhenOnlineOptions()); + }; options->scrollToWidget( ) | rpl::start_with_next([=](not_null widget) { @@ -1130,7 +1133,8 @@ object_ptr CreatePollBox::setupContent() { submit.data(), sendMenuType, sendSilent, - sendScheduled); + sendScheduled, + sendWhenOnline); addButton(tr::lng_cancel(), [=] { closeBox(); }); return result; diff --git a/Telegram/SourceFiles/boxes/send_files_box.cpp b/Telegram/SourceFiles/boxes/send_files_box.cpp index 205d0ba9a..c49ec87ed 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.cpp +++ b/Telegram/SourceFiles/boxes/send_files_box.cpp @@ -508,7 +508,8 @@ void SendFilesBox::refreshButtons() { _send, [=] { return _sendMenuType; }, [=] { sendSilent(); }, - [=] { sendScheduled(); }); + [=] { sendScheduled(); }, + [=] { sendWhenOnline(); }); } addButton(tr::lng_cancel(), [=] { closeBox(); }); _addFile = addLeftButton( @@ -584,7 +585,8 @@ void SendFilesBox::addMenuButton() { _menu.get(), _sendMenuType, [=] { sendSilent(); }, - [=] { sendScheduled(); }); + [=] { sendScheduled(); }, + [=] { sendWhenOnline(); }); } _menu->popup(QCursor::pos()); return true; @@ -1390,4 +1392,8 @@ void SendFilesBox::sendScheduled() { Ui::LayerOption::KeepOther); } +void SendFilesBox::sendWhenOnline() { + send(Api::DefaultSendWhenOnlineOptions()); +} + SendFilesBox::~SendFilesBox() = default; diff --git a/Telegram/SourceFiles/boxes/send_files_box.h b/Telegram/SourceFiles/boxes/send_files_box.h index 22510b9f3..8e93673f0 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.h +++ b/Telegram/SourceFiles/boxes/send_files_box.h @@ -179,6 +179,7 @@ private: void send(Api::SendOptions options, bool ctrlShiftEnter = false); void sendSilent(); void sendScheduled(); + void sendWhenOnline(); void captionResized(); void saveSendWaySettings(); diff --git a/Telegram/SourceFiles/boxes/share_box.cpp b/Telegram/SourceFiles/boxes/share_box.cpp index 124f43e36..c46b76354 100644 --- a/Telegram/SourceFiles/boxes/share_box.cpp +++ b/Telegram/SourceFiles/boxes/share_box.cpp @@ -502,7 +502,8 @@ void ShareBox::showMenu(not_null parent) { _menu.get(), sendMenuType(), [=] { submitSilent(); }, - [=] { submitScheduled(); }); + [=] { submitScheduled(); }, + [=] { submitWhenOnline(); }); const auto success = (result == SendMenu::FillMenuResult::Success); if (_descriptor.forwardOptions.show || success) { _menu->setForcedVerticalOrigin(Ui::PopupMenu::VerticalOrigin::Bottom); @@ -599,6 +600,10 @@ void ShareBox::submitScheduled() { Ui::LayerOption::KeepOther); } +void ShareBox::submitWhenOnline() { + submit(Api::DefaultSendWhenOnlineOptions()); +} + void ShareBox::copyLink() { if (const auto onstack = _descriptor.copyCallback) { onstack(); diff --git a/Telegram/SourceFiles/boxes/share_box.h b/Telegram/SourceFiles/boxes/share_box.h index f61669efc..adaa634c4 100644 --- a/Telegram/SourceFiles/boxes/share_box.h +++ b/Telegram/SourceFiles/boxes/share_box.h @@ -118,6 +118,7 @@ private: void submit(Api::SendOptions options); void submitSilent(); void submitScheduled(); + void submitWhenOnline(); void copyLink(); bool searchByUsername(bool useCache = false); diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index d5b7e717d..0b2748191 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -1023,7 +1023,8 @@ void StickerSetBox::Inner::contextMenuEvent(QContextMenuEvent *e) { _menu.get(), type, SendMenu::DefaultSilentCallback(sendSelected), - SendMenu::DefaultScheduleCallback(this, type, sendSelected)); + SendMenu::DefaultScheduleCallback(this, type, sendSelected), + SendMenu::DefaultWhenOnlineCallback(sendSelected)); const auto controller = _controller; const auto toggleFavedSticker = [=] { diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp index 2156fa805..724b34794 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp @@ -1283,7 +1283,8 @@ void FieldAutocomplete::Inner::contextMenuEvent(QContextMenuEvent *e) { _menu, type, SendMenu::DefaultSilentCallback(send), - SendMenu::DefaultScheduleCallback(this, type, send)); + SendMenu::DefaultScheduleCallback(this, type, send), + SendMenu::DefaultWhenOnlineCallback(send)); if (!_menu->empty()) { _menu->popup(QCursor::pos()); diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp index fae4dd8f6..668dc0231 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp @@ -381,7 +381,8 @@ base::unique_qptr GifsListWidget::fillContextMenu( menu, type, SendMenu::DefaultSilentCallback(send), - SendMenu::DefaultScheduleCallback(this, type, send)); + SendMenu::DefaultScheduleCallback(this, type, send), + SendMenu::DefaultWhenOnlineCallback(send)); if (const auto item = _mosaic.maybeItemAt(_selected)) { const auto document = item->getDocument() diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index d4d299709..55a356ba5 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -1608,7 +1608,8 @@ base::unique_qptr StickersListWidget::fillContextMenu( menu, type, SendMenu::DefaultSilentCallback(send), - SendMenu::DefaultScheduleCallback(this, type, send)); + SendMenu::DefaultScheduleCallback(this, type, send), + SendMenu::DefaultWhenOnlineCallback(send)); const auto window = _controller; const auto toggleFavedSticker = [=] { diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.cpp b/Telegram/SourceFiles/data/data_scheduled_messages.cpp index b8438d123..547648799 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.cpp +++ b/Telegram/SourceFiles/data/data_scheduled_messages.cpp @@ -40,7 +40,7 @@ constexpr auto kRequestTimeLimit = 60 * crl::time(1000); } [[nodiscard]] bool HasScheduledDate(not_null item) { - return (item->date() != ScheduledMessages::kScheduledUntilOnlineTimestamp) + return (item->date() != Api::kScheduledUntilOnlineTimestamp) && (item->date() > base::unixtime::now()); } diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.h b/Telegram/SourceFiles/data/data_scheduled_messages.h index 7d546ad1b..e4abea70a 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.h +++ b/Telegram/SourceFiles/data/data_scheduled_messages.h @@ -53,8 +53,6 @@ public: [[nodiscard]] rpl::producer<> updates(not_null history); [[nodiscard]] Data::MessagesSlice list(not_null history); - static constexpr auto kScheduledUntilOnlineTimestamp = TimeId(0x7FFFFFFE); - private: using OwnedItem = std::unique_ptr; struct List { diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 8779cd41f..489a06a66 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -50,7 +50,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "dialogs/ui/dialogs_message_view.h" #include "data/notify/data_notify_settings.h" #include "data/data_bot_app.h" -#include "data/data_scheduled_messages.h" // kScheduledUntilOnlineTimestamp +#include "data/data_scheduled_messages.h" #include "data/data_changes.h" #include "data/data_session.h" #include "data/data_message_reactions.h" diff --git a/Telegram/SourceFiles/history/history_item_helpers.cpp b/Telegram/SourceFiles/history/history_item_helpers.cpp index cac95deeb..7042cb557 100644 --- a/Telegram/SourceFiles/history/history_item_helpers.cpp +++ b/Telegram/SourceFiles/history/history_item_helpers.cpp @@ -18,7 +18,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_forum_topic.h" #include "data/data_media_types.h" #include "data/data_message_reactions.h" -#include "data/data_scheduled_messages.h" #include "data/data_session.h" #include "data/data_user.h" #include "history/history.h" @@ -230,8 +229,7 @@ QString ItemDateText(not_null item, bool isUntilOnline) { bool IsItemScheduledUntilOnline(not_null item) { return item->isScheduled() - && (item->date() == - Data::ScheduledMessages::kScheduledUntilOnlineTimestamp); + && (item->date() == Api::kScheduledUntilOnlineTimestamp); } ClickHandlerPtr JumpToMessageClickHandler( diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 63fe849e7..12e07fc76 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -305,7 +305,8 @@ HistoryWidget::HistoryWidget( _send.get(), [=] { return sendButtonMenuType(); }, [=] { sendSilent(); }, - [=] { sendScheduled(); }); + [=] { sendScheduled(); }, + [=] { sendWhenOnline(); }); _unblock->addClickHandler([=] { unblockUser(); }); _botStart->addClickHandler([=] { sendBotStartCommand(); }); @@ -3934,6 +3935,10 @@ void HistoryWidget::sendScheduled() { Ui::LayerOption::KeepOther); } +void HistoryWidget::sendWhenOnline() { + send(Api::DefaultSendWhenOnlineOptions()); +} + SendMenu::Type HistoryWidget::sendMenuType() const { return !_peer ? SendMenu::Type::Disabled diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index 12ff41f8e..46d8287b9 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -379,6 +379,7 @@ private: void sendWithModifiers(Qt::KeyboardModifiers modifiers); void sendSilent(); void sendScheduled(); + void sendWhenOnline(); [[nodiscard]] SendMenu::Type sendButtonMenuType() const; void handlePendingHistoryUpdate(); void fullInfoUpdated(); diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index c37ff8827..03cbc93f8 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -2075,7 +2075,8 @@ void ComposeControls::initSendButton() { _send.get(), [=] { return sendButtonMenuType(); }, SendMenu::DefaultSilentCallback(send), - SendMenu::DefaultScheduleCallback(_wrap.get(), sendMenuType(), send)); + SendMenu::DefaultScheduleCallback(_wrap.get(), sendMenuType(), send), + SendMenu::DefaultWhenOnlineCallback(send)); } void ComposeControls::initSendAsButton(not_null peer) { diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 58a0722bb..cc3d8586b 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -52,7 +52,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_channel.h" #include "data/data_file_click_handler.h" #include "data/data_file_origin.h" -#include "data/data_scheduled_messages.h" #include "data/data_message_reactions.h" #include "data/stickers/data_custom_emoji.h" #include "core/file_utilities.h" @@ -555,9 +554,8 @@ bool AddRescheduleAction( ? SendMenu::Type::ScheduledToUser : SendMenu::Type::Scheduled; - using S = Data::ScheduledMessages; const auto itemDate = firstItem->date(); - const auto date = (itemDate == S::kScheduledUntilOnlineTimestamp) + const auto date = (itemDate == Api::kScheduledUntilOnlineTimestamp) ? HistoryView::DefaultScheduleTime() : itemDate + 600; diff --git a/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp b/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp index 39a9a8738..95c7c6270 100644 --- a/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp +++ b/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp @@ -10,7 +10,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_common.h" #include "data/data_peer.h" #include "data/data_user.h" -#include "data/data_scheduled_messages.h" // kScheduledUntilOnlineTimestamp #include "lang/lang_keys.h" #include "base/event_filter.h" #include "base/qt/qt_key_modifiers.h" @@ -98,12 +97,12 @@ void ScheduleBox( descriptor.submit.data(), [=] { return SendMenu::Type::SilentOnly; }, [=] { save(true, descriptor.collect()); }, + nullptr, nullptr); if (type == SendMenu::Type::ScheduledToUser) { const auto sendUntilOnline = box->addTopButton(*style.topButtonStyle); - const auto timestamp - = Data::ScheduledMessages::kScheduledUntilOnlineTimestamp; + const auto timestamp = Api::kScheduledUntilOnlineTimestamp; FillSendUntilOnlineMenu( sendUntilOnline.data(), [=] { save(false, timestamp); }, diff --git a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp index 9085fe619..b0dd9d710 100644 --- a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp @@ -344,7 +344,8 @@ void Inner::contextMenuEvent(QContextMenuEvent *e) { _menu, type, SendMenu::DefaultSilentCallback(send), - SendMenu::DefaultScheduleCallback(this, type, send)); + SendMenu::DefaultScheduleCallback(this, type, send), + SendMenu::DefaultWhenOnlineCallback(send)); const auto item = _mosaic.itemAt(_selected); if (const auto previewDocument = item->getPreviewDocument()) { diff --git a/Telegram/SourceFiles/menu/menu_send.cpp b/Telegram/SourceFiles/menu/menu_send.cpp index 370dd8ff9..2d5ca3194 100644 --- a/Telegram/SourceFiles/menu/menu_send.cpp +++ b/Telegram/SourceFiles/menu/menu_send.cpp @@ -47,11 +47,16 @@ Fn DefaultScheduleCallback( }; } +Fn DefaultWhenOnlineCallback(Fn send) { + return [=] { send(Api::DefaultSendWhenOnlineOptions()); }; +} + FillMenuResult FillSendMenu( not_null menu, Type type, Fn silent, - Fn schedule) { + Fn schedule, + Fn whenOnline) { if (!silent && !schedule) { return FillMenuResult::None; } @@ -75,6 +80,12 @@ FillMenuResult FillSendMenu( schedule, &st::menuIconSchedule); } + if (whenOnline && now == Type::ScheduledToUser) { + menu->addAction( + tr::lng_scheduled_send_until_online(tr::now), + whenOnline, + &st::menuIconWhenOnline); + } return FillMenuResult::Success; } @@ -82,8 +93,9 @@ void SetupMenuAndShortcuts( not_null button, Fn type, Fn silent, - Fn schedule) { - if (!silent && !schedule) { + Fn schedule, + Fn whenOnline) { + if (!silent && !schedule && !whenOnline) { return; } const auto menu = std::make_shared>(); @@ -91,7 +103,7 @@ void SetupMenuAndShortcuts( *menu = base::make_unique_q( button, st::popupMenuWithIcons); - const auto result = FillSendMenu(*menu, type(), silent, schedule); + const auto result = FillSendMenu(*menu, type(), silent, schedule, whenOnline); const auto success = (result == FillMenuResult::Success); if (success) { (*menu)->popup(QCursor::pos()); diff --git a/Telegram/SourceFiles/menu/menu_send.h b/Telegram/SourceFiles/menu/menu_send.h index 2e401e768..0676de49e 100644 --- a/Telegram/SourceFiles/menu/menu_send.h +++ b/Telegram/SourceFiles/menu/menu_send.h @@ -40,18 +40,21 @@ Fn DefaultScheduleCallback( not_null parent, Type type, Fn send); +Fn DefaultWhenOnlineCallback(Fn send); FillMenuResult FillSendMenu( not_null menu, Type type, Fn silent, - Fn schedule); + Fn schedule, + Fn whenOnline); void SetupMenuAndShortcuts( not_null button, Fn type, Fn silent, - Fn schedule); + Fn schedule, + Fn whenOnline); void SetupUnreadMentionsMenu( not_null button, diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 1b73d6e65..6b3f84e81 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -1885,7 +1885,8 @@ QPointer ShowForwardMessagesBox( state->menu.get(), type, SendMenu::DefaultSilentCallback(submit), - SendMenu::DefaultScheduleCallback(state->box, type, submit)); + SendMenu::DefaultScheduleCallback(state->box, type, submit), + SendMenu::DefaultWhenOnlineCallback(submit)); const auto success = (result == SendMenu::FillMenuResult::Success); if (showForwardOptions || success) { state->menu->setForcedVerticalOrigin(