From 3ce315111f9edc9b24d9fbb12db3b03403f7b718 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 20 Feb 2021 06:30:14 +0300 Subject: [PATCH] Added draft menu to SendFilesBox to open photo editor. --- Telegram/SourceFiles/boxes/send_files_box.cpp | 52 +++++++++++++++++++ Telegram/SourceFiles/boxes/send_files_box.h | 1 + .../ui/chat/attach/attach_album_preview.cpp | 8 +++ .../ui/chat/attach/attach_album_preview.h | 3 ++ .../ui/chat/attach/attach_prepare.cpp | 15 ++++++ .../ui/chat/attach/attach_prepare.h | 3 ++ .../attach/attach_single_media_preview.cpp | 6 +++ .../chat/attach/attach_single_media_preview.h | 3 ++ 8 files changed, 91 insertions(+) diff --git a/Telegram/SourceFiles/boxes/send_files_box.cpp b/Telegram/SourceFiles/boxes/send_files_box.cpp index b5467f542..022a25c8b 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.cpp +++ b/Telegram/SourceFiles/boxes/send_files_box.cpp @@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/tabbed_panel.h" #include "chat_helpers/tabbed_selector.h" #include "confirm_box.h" +#include "editor/photo_editor_layer_widget.h" #include "history/history_drag_area.h" #include "history/view/history_view_schedule_box.h" #include "core/file_utilities.h" @@ -187,6 +188,22 @@ rpl::producer SendFilesBox::Block::itemReplaceRequest() const { } } +rpl::producer SendFilesBox::Block::itemModifyRequest() const { + using namespace rpl::mappers; + + const auto preview = _preview.get(); + const auto from = _from; + if (_isAlbum) { + const auto album = static_cast(preview); + return album->thumbModified() | rpl::map(_1 + from); + } else if (_isSingleMedia) { + const auto media = static_cast(preview); + return media->modifyRequests() | rpl::map_to(from); + } else { + return rpl::never(); + } +} + void SendFilesBox::Block::setSendWay(Ui::SendFilesWay way) { if (!_isAlbum) { return; @@ -601,6 +618,41 @@ void SendFilesBox::pushBlock(int from, int till) { FileDialog::AllOrImagesFilter(), crl::guard(this, callback)); }, widget->lifetime()); + + const auto pp = std::make_shared(); + block.itemModifyRequest( + ) | rpl::start_with_next([=, controller = _controller](int index) { + auto &file = _list.files[index]; + if (file.type != Ui::PreparedFile::Type::Photo) { + return; + } + using Image = Ui::PreparedFileInformation::Image; + const auto image = std::get_if(&file.information->media); + if (!image) { + return; + } + + *pp = QPixmap::fromImage( + image->data, + Qt::ColorOnly); + + auto callback = [=](const Editor::PhotoModifications &mods) { + image->modifications = mods; + Storage::UpdateImageDetails( + _list.files[index], + st::sendMediaPreviewSize); + refreshAllAfterChanges(from); + }; + + controller->showLayer( + std::make_unique( + this, + &controller->window(), + pp, + image->modifications, + std::move(callback)), + Ui::LayerOption::KeepOther); + }, widget->lifetime()); } void SendFilesBox::refreshControls() { diff --git a/Telegram/SourceFiles/boxes/send_files_box.h b/Telegram/SourceFiles/boxes/send_files_box.h index f85cb43b2..6daa25ccf 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.h +++ b/Telegram/SourceFiles/boxes/send_files_box.h @@ -102,6 +102,7 @@ private: [[nodiscard]] rpl::producer itemDeleteRequest() const; [[nodiscard]] rpl::producer itemReplaceRequest() const; + [[nodiscard]] rpl::producer itemModifyRequest() const; void setSendWay(Ui::SendFilesWay way); void applyAlbumOrder(); diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp index b1a26d22a..a4caa28d6 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp +++ b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp @@ -30,6 +30,10 @@ AlbumPreview::AlbumPreview( prepareThumbs(items); updateSize(); updateFileRows(); + + AddPhotoEditorMenu(this, [=] { + _thumbModified.fire(thumbIndex(thumbUnderCursor())); + }); } AlbumPreview::~AlbumPreview() = default; @@ -491,4 +495,8 @@ void AlbumPreview::mouseReleaseEvent(QMouseEvent *e) { } } +rpl::producer AlbumPreview::thumbModified() const { + return _thumbModified.events(); +} + } // namespace Ui diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h index 6918c2ef6..3016db4b7 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h +++ b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h @@ -35,6 +35,8 @@ public: return _thumbChanged.events(); } + rpl::producer thumbModified() const; + protected: void paintEvent(QPaintEvent *e) override; void mousePressEvent(QMouseEvent *e) override; @@ -89,6 +91,7 @@ private: rpl::event_stream _thumbDeleted; rpl::event_stream _thumbChanged; + rpl::event_stream _thumbModified; mutable Animations::Simple _thumbsHeightAnimation; mutable Animations::Simple _shrinkAnimation; diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_prepare.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_prepare.cpp index 4bf0d5c51..1db8ed1a3 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_prepare.cpp +++ b/Telegram/SourceFiles/ui/chat/attach/attach_prepare.cpp @@ -7,6 +7,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "ui/chat/attach/attach_prepare.h" +#include "ui/rp_widget.h" +#include "ui/widgets/popup_menu.h" + #include "ui/chat/attach/attach_send_files_way.h" #include "ui/image/image_prepare.h" #include "ui/ui_utility.h" @@ -273,4 +276,16 @@ QPixmap PrepareSongCoverForThumbnail(QImage image, int size) { &st::songCoverOverlayFg)); } +void AddPhotoEditorMenu(not_null parent, Fn callback) { + const auto menu = std::make_shared>(); + parent->events( + ) | rpl::start_with_next([=](not_null e) { + if (e->type() == QEvent::ContextMenu) { + *menu = base::make_unique_q(parent); + (*menu)->addAction("Photo Editor", callback); + (*menu)->popup(QCursor::pos()); + } + }, parent->lifetime()); +} + } // namespace Ui diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_prepare.h b/Telegram/SourceFiles/ui/chat/attach/attach_prepare.h index 55891753a..11254b0e2 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_prepare.h +++ b/Telegram/SourceFiles/ui/chat/attach/attach_prepare.h @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Ui { +class RpWidget; class SendFilesWay; struct PreparedFileInformation { @@ -137,4 +138,6 @@ struct PreparedGroup { [[nodiscard]] QPixmap PrepareSongCoverForThumbnail(QImage image, int size); +void AddPhotoEditorMenu(not_null parent, Fn callback); + } // namespace Ui diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_single_media_preview.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_single_media_preview.cpp index 36ab993d5..efbd11f56 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_single_media_preview.cpp +++ b/Telegram/SourceFiles/ui/chat/attach/attach_single_media_preview.cpp @@ -76,6 +76,8 @@ SingleMediaPreview::SingleMediaPreview( _deleteMedia->setIconOverride(&st::sendBoxAlbumGroupButtonMediaDelete); preparePreview(preview, animatedPreviewPath); + + Ui::AddPhotoEditorMenu(this, [=] { _modifyRequests.fire({}); }); } SingleMediaPreview::~SingleMediaPreview() = default; @@ -88,6 +90,10 @@ rpl::producer<> SingleMediaPreview::editRequests() const { return _editMedia->clicks() | rpl::to_empty; } +rpl::producer<> SingleMediaPreview::modifyRequests() const { + return _modifyRequests.events(); +} + void SingleMediaPreview::preparePreview( QImage preview, const QString &animatedPreviewPath) { diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_single_media_preview.h b/Telegram/SourceFiles/ui/chat/attach/attach_single_media_preview.h index cd79c74ca..169435dd5 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_single_media_preview.h +++ b/Telegram/SourceFiles/ui/chat/attach/attach_single_media_preview.h @@ -39,6 +39,7 @@ public: [[nodiscard]] rpl::producer<> deleteRequests() const; [[nodiscard]] rpl::producer<> editRequests() const; + [[nodiscard]] rpl::producer<> modifyRequests() const; private: void paintEvent(QPaintEvent *e) override; @@ -65,6 +66,8 @@ private: object_ptr _deleteMedia = { nullptr }; RoundRect _buttonsRect; + rpl::event_stream<> _modifyRequests; + }; } // namespace Ui