From cf6245af42602f69a68921cfb97fb16eb9c6fab0 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 24 Jan 2023 16:25:02 +0300 Subject: [PATCH] Added entry point for userpic emoji builder to userpic button. --- Telegram/CMakeLists.txt | 2 + Telegram/Resources/langs/lang.strings | 1 + .../info_userpic_emoji_builder_menu_item.cpp | 94 +++++++++++++++++++ .../info_userpic_emoji_builder_menu_item.h | 26 +++++ .../info_userpic_emoji_builder_widget.cpp | 22 +++++ .../info_userpic_emoji_builder_widget.h | 6 ++ .../ui/controls/userpic_button.cpp | 34 ++++--- 7 files changed, 174 insertions(+), 11 deletions(-) create mode 100644 Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.cpp create mode 100644 Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index ba6f3de80..ed6bfbef0 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -859,6 +859,8 @@ PRIVATE info/settings/info_settings_widget.h info/userpic/info_userpic_emoji_builder.cpp info/userpic/info_userpic_emoji_builder.h + info/userpic/info_userpic_emoji_builder_menu_item.cpp + info/userpic/info_userpic_emoji_builder_menu_item.h info/userpic/info_userpic_emoji_builder_widget.cpp info/userpic/info_userpic_emoji_builder_widget.h inline_bots/bot_attach_web_view.cpp diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index edb4ba27d..734e52632 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1786,6 +1786,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_attach_camera" = "Camera"; "lng_attach_document" = "Document"; "lng_attach_photo_or_video" = "Photo or video"; +"lng_attach_profile_emoji" = "Use an Emoji"; "lng_media_open_with" = "Open With"; "lng_media_download" = "Download"; diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.cpp new file mode 100644 index 000000000..da5ba09bc --- /dev/null +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.cpp @@ -0,0 +1,94 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "info/userpic/info_userpic_emoji_builder_menu_item.h" + +#include "base/random.h" +#include "base/timer.h" +#include "data/data_document.h" +#include "data/data_session.h" +#include "info/userpic/info_userpic_emoji_builder.h" +#include "info/userpic/info_userpic_emoji_builder_widget.h" +#include "lang/lang_keys.h" +#include "main/main_session.h" +#include "ui/widgets/menu/menu_action.h" +#include "ui/widgets/menu/menu_common.h" +#include "ui/widgets/popup_menu.h" +#include "window/window_session_controller.h" +#include "styles/style_boxes.h" +#include "styles/style_menu_icons.h" + +#include + +namespace UserpicBuilder { + +void AddEmojiBuilderAction( + not_null controller, + not_null menu, + std::vector documents, + Fn &&done) { + { + auto rd = std::random_device(); + ranges::shuffle(documents, std::mt19937(rd())); + } + struct State final { + rpl::variable documentIndex; + rpl::variable colorIndex; + + base::Timer timer; + }; + const auto state = menu->lifetime().make_state(); + auto item = base::make_unique_q( + menu.get(), + menu->st().menu, + Ui::Menu::CreateAction( + menu.get(), + tr::lng_attach_profile_emoji(tr::now), + [=, done = std::move(done)] { + const auto index = state->documentIndex.current(); + const auto id = index < documents.size() + ? documents[index] + : 0; + UserpicBuilder::ShowLayer( + controller, + { id, state->colorIndex.current() }, + base::duplicate(done)); + }), + nullptr, + nullptr); + const auto timerCallback = [=] { + state->documentIndex = state->documentIndex.current() + 1; + if (state->documentIndex.current() >= documents.size()) { + state->documentIndex = 0; + } + state->colorIndex = base::RandomIndex( + std::numeric_limits::max()); + }; + timerCallback(); + state->timer.setCallback(timerCallback); + constexpr auto kTimeout = crl::time(1500); + state->timer.callEach(kTimeout); + const auto icon = UserpicBuilder::CreateEmojiUserpic( + item.get(), + st::restoreUserpicIcon.size, + state->documentIndex.value( + ) | rpl::filter([=](int index) { + return index < documents.size(); + }) | rpl::map([=](int index) { + return controller->session().data().document(documents[index]); + }), + state->colorIndex.value()); + icon->setAttribute(Qt::WA_TransparentForMouseEvents); + icon->move(menu->st().menu.itemIconPosition + + QPoint( + (st::menuIconRemove.width() - icon->width()) / 2, + (st::menuIconRemove.height() - icon->height()) / 2)); + + menu->addAction(std::move(item)); +} + +} // namespace UserpicBuilder diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.h b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.h new file mode 100644 index 000000000..94e79ccd7 --- /dev/null +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.h @@ -0,0 +1,26 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +namespace Window { +class SessionController; +} // namespace Window + +namespace Ui { +class PopupMenu; +} // namespace Ui + +namespace UserpicBuilder { + +void AddEmojiBuilderAction( + not_null controller, + not_null menu, + std::vector documents, + Fn &&done); + +} // namespace UserpicBuilder diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp index c67da4800..21b74cd10 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp @@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/media/history_view_sticker_player.h" #include "info/userpic/info_userpic_bubble_wrap.h" #include "info/userpic/info_userpic_colors_palette_chooser.h" +#include "ui/empty_userpic.h" #include "lang/lang_keys.h" #include "main/main_session.h" #include "settings/settings_common.h" @@ -438,4 +439,25 @@ not_null CreateUserpicBuilder( return container; } +not_null CreateEmojiUserpic( + not_null parent, + const QSize &size, + rpl::producer> document, + rpl::producer colorIndex) { + const auto widget = Ui::CreateChild(parent.get(), size); + std::move( + document + ) | rpl::start_with_next([=](not_null d) { + widget->setDocument(d); + }, widget->lifetime()); + std::move( + colorIndex + ) | rpl::start_with_next([=](int index) { + const auto c = Ui::EmptyUserpic::UserpicColor( + Ui::EmptyUserpic::ColorIndex(index)); + widget->setGradientStops({ { 0, c.color1->c }, { 1, c.color2->c } }); + }, widget->lifetime()); + return widget; +} + } // namespace UserpicBuilder diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h index 9c13b3170..b6df3b4d0 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h @@ -34,4 +34,10 @@ not_null CreateUserpicBuilder( StartData data, BothWayCommunication communication); +[[nodiscard]] not_null CreateEmojiUserpic( + not_null parent, + const QSize &size, + rpl::producer> document, + rpl::producer colorIndex); + } // namespace UserpicBuilder diff --git a/Telegram/SourceFiles/ui/controls/userpic_button.cpp b/Telegram/SourceFiles/ui/controls/userpic_button.cpp index 5e1df4e2b..6ea63b0ae 100644 --- a/Telegram/SourceFiles/ui/controls/userpic_button.cpp +++ b/Telegram/SourceFiles/ui/controls/userpic_button.cpp @@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/painter.h" #include "editor/photo_editor_common.h" #include "editor/photo_editor_layer_widget.h" +#include "info/userpic/info_userpic_emoji_builder_menu_item.h" #include "media/streaming/media_streaming_instance.h" #include "media/streaming/media_streaming_player.h" #include "media/streaming/media_streaming_document.h" @@ -337,20 +338,31 @@ void UserpicButton::choosePhotoLocally() { _menu->addAction(makeResetToOriginalAction()); } } else { - if (!IsCameraAvailable()) { - chooseFile(); - } else { + const auto hasCamera = IsCameraAvailable(); + if (hasCamera || _controller) { _menu->addAction(tr::lng_attach_file(tr::now), [=] { chooseFile(); }, &st::menuIconPhoto); - _menu->addAction(tr::lng_attach_camera(tr::now), [=] { - _window->show(Box( - CameraBox, - _window, - _peer, - _forceForumShape, - callback(ChosenType::Set))); - }, &st::menuIconPhotoSet); + if (hasCamera) { + _menu->addAction(tr::lng_attach_camera(tr::now), [=] { + _window->show(Box( + CameraBox, + _window, + _peer, + _forceForumShape, + callback(ChosenType::Set))); + }, &st::menuIconPhotoSet); + } + if (_controller) { + auto &session = _controller->session(); + UserpicBuilder::AddEmojiBuilderAction( + _controller, + _menu, + session.api().peerPhoto().profileEmojiList(), + callback(ChosenType::Set)); + } + } else { + chooseFile(); } } _menu->popup(QCursor::pos());