From 2ce8094932c485187ec1dff2d262559eb7902b80 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 16 Dec 2022 12:36:50 +0400 Subject: [PATCH] Add spoiler toggle to three dot menu in SendFilesBox. --- Telegram/Resources/icons/menu/spoiler.png | Bin 0 -> 572 bytes Telegram/Resources/icons/menu/spoiler@2x.png | Bin 0 -> 988 bytes Telegram/Resources/icons/menu/spoiler@3x.png | Bin 0 -> 1497 bytes Telegram/Resources/langs/lang.strings | 10 +- .../SourceFiles/boxes/edit_caption_box.cpp | 2 +- Telegram/SourceFiles/boxes/send_files_box.cpp | 165 +++++++++++++++--- Telegram/SourceFiles/boxes/send_files_box.h | 17 +- .../attach_abstract_single_media_preview.cpp | 7 +- .../ui/chat/attach/attach_album_preview.cpp | 13 +- .../ui/chat/attach/attach_album_preview.h | 1 + Telegram/SourceFiles/ui/menu_icons.style | 2 + 11 files changed, 173 insertions(+), 44 deletions(-) create mode 100644 Telegram/Resources/icons/menu/spoiler.png create mode 100644 Telegram/Resources/icons/menu/spoiler@2x.png create mode 100644 Telegram/Resources/icons/menu/spoiler@3x.png diff --git a/Telegram/Resources/icons/menu/spoiler.png b/Telegram/Resources/icons/menu/spoiler.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c47bdcab3963276d4e4b35ff6a225508a23cf8 GIT binary patch literal 572 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 6e8a7e5ae..3efc57af7 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2344,17 +2344,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_send_image_empty" = "Could not send an empty file: {name}"; "lng_send_images_selected#one" = "{count} image selected"; "lng_send_images_selected#other" = "{count} images selected"; -"lng_send_photos#one" = "Send {count} photo"; -"lng_send_photos#other" = "Send {count} photos"; -"lng_send_separate_photos" = "Send as separate photos"; -"lng_send_separate_photos_videos" = "Send as separate media"; "lng_send_files_selected#one" = "{count} file selected"; "lng_send_files_selected#other" = "{count} files selected"; -"lng_send_files#one" = "Send {count} file"; -"lng_send_files#other" = "Send {count} files"; "lng_send_grouped" = "Group items"; +"lng_send_compressed_one" = "Compress the image"; "lng_send_compressed" = "Compress images"; "lng_send_media_invalid_files" = "Sorry, no valid files found."; +"lng_send_image" = "Send an image"; +"lng_send_file" = "Send a file"; +"lng_send_video" = "Send a video file"; "lng_forward_choose" = "Choose recipient..."; "lng_forward_cant" = "Sorry, no way to forward here :("; diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.cpp b/Telegram/SourceFiles/boxes/edit_caption_box.cpp index f712506cc..37f4780ca 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_caption_box.cpp @@ -319,7 +319,7 @@ void EditCaptionBox::setupControls() { this, object_ptr( this, - tr::lng_send_compressed(tr::now), + tr::lng_send_compressed_one(tr::now), true, st::defaultBoxCheckbox), st::editMediaCheckboxMargins) diff --git a/Telegram/SourceFiles/boxes/send_files_box.cpp b/Telegram/SourceFiles/boxes/send_files_box.cpp index e47fe9083..3805176c0 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.cpp +++ b/Telegram/SourceFiles/boxes/send_files_box.cpp @@ -35,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/buttons.h" #include "ui/widgets/input_fields.h" #include "ui/widgets/scroll_area.h" +#include "ui/widgets/popup_menu.h" #include "ui/wrap/vertical_layout.h" #include "ui/chat/attach/attach_prepare.h" #include "ui/chat/attach/attach_send_files_way.h" @@ -62,6 +63,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" #include "styles/style_boxes.h" #include "styles/style_chat_helpers.h" +#include "styles/style_info.h" +#include "styles/style_menu_icons.h" #include @@ -227,6 +230,17 @@ void SendFilesBox::Block::setSendWay(Ui::SendFilesWay way) { album->setSendWay(way); } +void SendFilesBox::Block::toggleSpoilers(bool enabled) { + if (_isAlbum) { + const auto album = static_cast(_preview.get()); + album->toggleSpoilers(enabled); + } else if (_isSingleMedia) { + const auto media = static_cast( + _preview.get()); + media->setSpoiler(enabled); + } +} + void SendFilesBox::Block::applyChanges() { if (!_isAlbum) { if (_isSingleMedia) { @@ -297,7 +311,7 @@ SendFilesBox::SendFilesBox( void SendFilesBox::initPreview() { using namespace rpl::mappers; - refreshControls(); + refreshControls(true); updateBoxSize(); @@ -345,19 +359,6 @@ void SendFilesBox::enqueueNextPrepare() { } void SendFilesBox::prepare() { - _send = addButton( - (_sendType == Api::SendType::Normal - ? tr::lng_send_button() - : tr::lng_create_group_next()), - [=] { send({}); }); - if (_sendType == Api::SendType::Normal) { - SendMenu::SetupMenuAndShortcuts( - _send, - [=] { return _sendMenuType; }, - [=] { sendSilent(); }, - [=] { sendScheduled(); }); - } - addButton(tr::lng_cancel(), [=] { closeBox(); }); initSendWay(); setupCaption(); setupSendWayControls(); @@ -371,11 +372,6 @@ void SendFilesBox::prepare() { } }, lifetime()); - _addFile = addLeftButton( - tr::lng_stickers_featured_add(), - base::fn_delayed(st::historyAttach.ripple.hideDuration, this, [=] { - openDialogToAddFileToAlbum(); - })); setupDragArea(); } @@ -457,6 +453,103 @@ void SendFilesBox::openDialogToAddFileToAlbum() { crl::guard(this, callback)); } +void SendFilesBox::refreshButtons() { + clearButtons(); + + _send = addButton( + (_sendType == Api::SendType::Normal + ? tr::lng_send_button() + : tr::lng_create_group_next()), + [=] { send({}); }); + if (_sendType == Api::SendType::Normal) { + SendMenu::SetupMenuAndShortcuts( + _send, + [=] { return _sendMenuType; }, + [=] { sendSilent(); }, + [=] { sendScheduled(); }); + } + addButton(tr::lng_cancel(), [=] { closeBox(); }); + _addFile = addLeftButton( + tr::lng_stickers_featured_add(), + base::fn_delayed(st::historyAttach.ripple.hideDuration, this, [=] { + openDialogToAddFileToAlbum(); + })); + + addMenuButton(); +} + +bool SendFilesBox::hasSendMenu() const { + return (_sendMenuType != SendMenu::Type::Disabled); +} + +bool SendFilesBox::hasSpoilerMenu() const { + const auto allAreVideo = !ranges::any_of(_list.files, [](const auto &f) { + using Type = Ui::PreparedFile::Type; + return (f.type != Type::Video); + }); + const auto allAreMedia = !ranges::any_of(_list.files, [](const auto &f) { + using Type = Ui::PreparedFile::Type; + return (f.type != Type::Photo) && (f.type != Type::Video); + }); + return allAreVideo + || (allAreMedia && _sendWay.current().sendImagesAsPhotos()); +} + +void SendFilesBox::applyBlockChanges() { + for (auto &block : _blocks) { + block.applyChanges(); + } +} + +bool SendFilesBox::allWithSpoilers() { + applyBlockChanges(); + return ranges::all_of(_list.files, &Ui::PreparedFile::spoiler); +} + +void SendFilesBox::toggleSpoilers(bool enabled) { + for (auto &file : _list.files) { + file.spoiler = enabled; + } + for (auto &block : _blocks) { + block.toggleSpoilers(enabled); + } +} + +void SendFilesBox::addMenuButton() { + if (!hasSendMenu() && !hasSpoilerMenu()) { + return; + } + + const auto top = addTopButton(st::infoTopBarMenu); + top->setClickedCallback([=] { + _menu = base::make_unique_q( + top, + st::popupMenuExpandedSeparator); + if (hasSpoilerMenu()) { + const auto spoilered = allWithSpoilers(); + _menu->addAction( + (spoilered + ? tr::lng_context_disable_spoiler(tr::now) + : tr::lng_context_spoiler_effect(tr::now)), + [=] { toggleSpoilers(!spoilered); }, + (spoilered ? &st::menuIconDisable : &st::menuIconSpoiler)); + if (hasSendMenu()) { + _menu->addSeparator(); + } + } + if (hasSendMenu()) { + SendMenu::FillSendMenu( + _menu.get(), + _sendMenuType, + [=] { sendSilent(); }, + [=] { sendScheduled(); }); + } + _menu->popup(QCursor::pos()); + return true; + }); + +} + void SendFilesBox::initSendWay() { _sendWay = [&] { auto result = Core::App().settings().sendFilesWay(); @@ -480,6 +573,9 @@ void SendFilesBox::initSendWay() { for (auto &block : _blocks) { block.setSendWay(value); } + if (!hasSendMenu()) { + refreshButtons(); + } setInnerFocus(); }, lifetime()); } @@ -650,9 +746,12 @@ void SendFilesBox::pushBlock(int from, int till) { }, widget->lifetime()); } -void SendFilesBox::refreshControls() { +void SendFilesBox::refreshControls(bool initial) { + if (initial || !hasSendMenu()) { + refreshButtons(); + } refreshTitleText(); - updateSendWayControlsVisibility(); + updateSendWayControls(); updateCaptionPlaceholder(); } @@ -711,11 +810,14 @@ void SendFilesBox::setupSendWayControls() { st::editMediaHintLabel); } -void SendFilesBox::updateSendWayControlsVisibility() { +void SendFilesBox::updateSendWayControls() { const auto onlyOne = (_sendLimit == SendLimit::One); _groupFiles->setVisible(_list.hasGroupOption(onlyOne)); _sendImagesAsPhotos->setVisible( _list.hasSendImagesAsPhotosOption(onlyOne)); + _sendImagesAsPhotos->setText((_list.files.size() > 1) + ? tr::lng_send_compressed(tr::now) + : tr::lng_send_compressed_one(tr::now)); _hintLabel->setVisible( _controller->session().settings().photoEditorHintShown() @@ -933,20 +1035,27 @@ void SendFilesBox::addFile(Ui::PreparedFile &&file) { } void SendFilesBox::refreshTitleText() { + using Type = Ui::PreparedFile::Type; const auto count = int(_list.files.size()); if (count > 1) { const auto imagesCount = ranges::count( _list.files, - Ui::PreparedFile::Type::Photo, + Type::Photo, &Ui::PreparedFile::type); _titleText = (imagesCount == count) ? tr::lng_send_images_selected(tr::now, lt_count, count) : tr::lng_send_files_selected(tr::now, lt_count, count); - _titleHeight = st::boxTitleHeight; } else { - _titleText = QString(); - _titleHeight = count ? st::boxPhotoPadding.top() : 0; + const auto type = _list.files.empty() + ? Type::None + : _list.files.front().type; + _titleText = (type == Type::Photo) + ? tr::lng_send_image(tr::now) + : (type == Type::Video) + ? tr::lng_send_video(tr::now) + : tr::lng_send_file(tr::now); } + _titleHeight = st::boxTitleHeight; } void SendFilesBox::updateBoxSize() { @@ -1102,9 +1211,7 @@ void SendFilesBox::send( for (auto &item : _list.files) { item.spoiler = false; } - for (auto &block : _blocks) { - block.applyChanges(); - } + applyBlockChanges(); Storage::ApplyModifications(_list); diff --git a/Telegram/SourceFiles/boxes/send_files_box.h b/Telegram/SourceFiles/boxes/send_files_box.h index 480b946a3..63e05fe47 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.h +++ b/Telegram/SourceFiles/boxes/send_files_box.h @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/abstract_box.h" #include "ui/chat/attach/attach_prepare.h" #include "ui/chat/attach/attach_send_files_way.h" +#include "ui/widgets/popup_menu.h" #include "storage/localimageloader.h" #include "storage/storage_media_prepare.h" @@ -36,6 +37,7 @@ class EmojiButton; class AlbumPreview; class VerticalLayout; class FlatLabel; +class PopupMenu; } // namespace Ui namespace Window { @@ -106,6 +108,7 @@ private: [[nodiscard]] rpl::producer itemModifyRequest() const; void setSendWay(Ui::SendFilesWay way); + void toggleSpoilers(bool enabled); void applyChanges(); private: @@ -117,16 +120,24 @@ private: bool _isSingleMedia = false; }; + void initSendWay(); void initPreview(); + [[nodiscard]] bool hasSendMenu() const; + [[nodiscard]] bool hasSpoilerMenu() const; + [[nodiscard]] bool allWithSpoilers(); + void addMenuButton(); + void applyBlockChanges(); + void toggleSpoilers(bool enabled); bool validateLength(const QString &text) const; - void refreshControls(); + void refreshButtons(); + void refreshControls(bool initial = false); void setupSendWayControls(); void setupCaption(); void setupEmojiPanel(); - void updateSendWayControlsVisibility(); + void updateSendWayControls(); void updateEmojiPanelGeometry(); void emojiFilterForGeometry(not_null event); @@ -200,6 +211,8 @@ private: Fn _whenReadySend; bool _preparing = false; + base::unique_qptr _menu; + QPointer _send; QPointer _addFile; diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_abstract_single_media_preview.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_abstract_single_media_preview.cpp index 64cc29718..c905035c1 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_abstract_single_media_preview.cpp +++ b/Telegram/SourceFiles/ui/chat/attach/attach_abstract_single_media_preview.cpp @@ -264,11 +264,12 @@ void AbstractSingleMediaPreview::showContextMenu(QPoint position) { this, st::popupMenuWithIcons); - _menu->addAction(hasSpoiler() + const auto spoilered = hasSpoiler(); + _menu->addAction(spoilered ? tr::lng_context_disable_spoiler(tr::now) : tr::lng_context_spoiler_effect(tr::now), [=] { - setSpoiler(!hasSpoiler()); - }, &st::menuIconCopy); + setSpoiler(!spoilered); + }, spoilered ? &st::menuIconDisable : &st::menuIconSpoiler); if (_menu->empty()) { _menu = nullptr; diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp index 8acd66726..00f7eba62 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp +++ b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp @@ -81,6 +81,12 @@ bool AlbumPreview::canHaveSpoiler(int index) const { return _sendWay.sendImagesAsPhotos(); } +void AlbumPreview::toggleSpoilers(bool enabled) { + for (auto &thumb : _thumbs) { + thumb->setSpoiler(enabled); + } +} + std::vector AlbumPreview::takeOrder() { //Expects(_thumbs.size() == _order.size()); //Expects(_itemsShownDimensions.size() == _order.size()); @@ -582,11 +588,12 @@ void AlbumPreview::showContextMenu( this, st::popupMenuWithIcons); - _menu->addAction(thumb->hasSpoiler() + const auto spoilered = thumb->hasSpoiler(); + _menu->addAction(spoilered ? tr::lng_context_disable_spoiler(tr::now) : tr::lng_context_spoiler_effect(tr::now), [=] { - thumb->setSpoiler(!thumb->hasSpoiler()); - }, &st::menuIconCopy); + thumb->setSpoiler(!spoilered); + }, spoilered ? &st::menuIconDisable : &st::menuIconSpoiler); if (_menu->empty()) { _menu = nullptr; diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h index 4732ad33c..ccb64970e 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h +++ b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h @@ -30,6 +30,7 @@ public: [[nodiscard]] base::flat_set collectSpoileredIndices(); [[nodiscard]] bool canHaveSpoiler(int index) const; + void toggleSpoilers(bool enabled); [[nodiscard]] std::vector takeOrder(); [[nodiscard]] rpl::producer thumbDeleted() const { diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index 6d26f8011..373f59886 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -94,6 +94,8 @@ menuIconStartStreamWith: icon {{ "menu/start_stream_with", menuIconColor }}; menuIconVideoChat: icon {{ "menu/video_chat", menuIconColor }}; menuIconTranslate: icon {{ "menu/translate", menuIconColor }}; menuIconReportAntiSpam: icon {{ "menu/false_positive", menuIconColor }}; +menuIconSpoiler: icon {{ "menu/spoiler", menuIconColor }}; +menuIconDisable: icon {{ "menu/disable", menuIconColor }}; menuIconTTLAny: icon {{ "menu/auto_delete_plain", menuIconColor }}; menuIconTTLAnyTextPosition: point(11px, 22px);