Added entry point for userpic emoji builder to userpic button.

This commit is contained in:
23rd 2023-01-24 16:25:02 +03:00 committed by John Preston
parent e0aabe3acf
commit cf6245af42
7 changed files with 174 additions and 11 deletions

View File

@ -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

View File

@ -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";

View File

@ -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 <random>
namespace UserpicBuilder {
void AddEmojiBuilderAction(
not_null<Window::SessionController*> controller,
not_null<Ui::PopupMenu*> menu,
std::vector<DocumentId> documents,
Fn<void(QImage &&image)> &&done) {
{
auto rd = std::random_device();
ranges::shuffle(documents, std::mt19937(rd()));
}
struct State final {
rpl::variable<int> documentIndex;
rpl::variable<int> colorIndex;
base::Timer timer;
};
const auto state = menu->lifetime().make_state<State>();
auto item = base::make_unique_q<Ui::Menu::Action>(
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<int>::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

View File

@ -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<Window::SessionController*> controller,
not_null<Ui::PopupMenu*> menu,
std::vector<DocumentId> documents,
Fn<void(QImage &&image)> &&done);
} // namespace UserpicBuilder

View File

@ -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<Ui::VerticalLayout*> CreateUserpicBuilder(
return container;
}
not_null<Ui::RpWidget*> CreateEmojiUserpic(
not_null<Ui::RpWidget*> parent,
const QSize &size,
rpl::producer<not_null<DocumentData*>> document,
rpl::producer<int> colorIndex) {
const auto widget = Ui::CreateChild<EmojiUserpic>(parent.get(), size);
std::move(
document
) | rpl::start_with_next([=](not_null<DocumentData*> 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

View File

@ -34,4 +34,10 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
StartData data,
BothWayCommunication communication);
[[nodiscard]] not_null<Ui::RpWidget*> CreateEmojiUserpic(
not_null<Ui::RpWidget*> parent,
const QSize &size,
rpl::producer<not_null<DocumentData*>> document,
rpl::producer<int> colorIndex);
} // namespace UserpicBuilder

View File

@ -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());