From 205479fcccca7ef463d1da290d821b340544ec9f Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 20 Feb 2024 14:33:46 +0400 Subject: [PATCH] Layout chatbots editing section. --- Telegram/CMakeLists.txt | 2 + Telegram/Resources/animations/robot.tgs | Bin 0 -> 30782 bytes Telegram/Resources/langs/lang.strings | 18 ++ .../Resources/qrc/telegram/animations.qrc | 1 + .../boxes/peers/edit_linked_chat_box.cpp | 10 +- .../boxes/peers/edit_peer_color_box.cpp | 34 +-- .../SourceFiles/core/local_url_handlers.cpp | 17 +- .../history/history_inner_widget.cpp | 13 ++ .../settings/business/settings_chatbots.cpp | 201 ++++++++++++++++++ .../settings/business/settings_chatbots.h | 16 ++ .../settings_cloud_password_manage.cpp | 10 +- Telegram/SourceFiles/settings/settings.style | 16 +- .../settings/settings_business.cpp | 14 +- .../SourceFiles/settings/settings_common.cpp | 56 ++--- .../SourceFiles/settings/settings_common.h | 17 +- Telegram/SourceFiles/ui/vertical_list.cpp | 12 +- Telegram/SourceFiles/ui/vertical_list.h | 8 +- 17 files changed, 367 insertions(+), 78 deletions(-) create mode 100644 Telegram/Resources/animations/robot.tgs create mode 100644 Telegram/SourceFiles/settings/business/settings_chatbots.cpp create mode 100644 Telegram/SourceFiles/settings/business/settings_chatbots.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index fbfbb55f2..0afd120d0 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1277,6 +1277,8 @@ PRIVATE profile/profile_block_widget.h profile/profile_cover_drop_area.cpp profile/profile_cover_drop_area.h + settings/business/settings_chatbots.cpp + settings/business/settings_chatbots.h settings/cloud_password/settings_cloud_password_common.cpp settings/cloud_password/settings_cloud_password_common.h settings/cloud_password/settings_cloud_password_email.cpp diff --git a/Telegram/Resources/animations/robot.tgs b/Telegram/Resources/animations/robot.tgs new file mode 100644 index 0000000000000000000000000000000000000000..0076344f4c799f30199f553d5402e5f8b8c1daf8 GIT binary patch literal 30782 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 8bded7e02..19ff138a1 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2172,6 +2172,24 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_business_subtitle_chatbots" = "Chatbots"; "lng_business_about_chatbots" = "Add any third party chatbots that will process customer interactions."; +"lng_chatbots_title" = "Chatbots"; +"lng_chatbots_about" = "Add a bot to your account to help you automatically process and respond to the messages you receive. {link}"; +"lng_chatbots_about_link" = "Learn more..."; +"lng_chatbots_placeholder" = "Enter bot URL or username"; +"lng_chatbots_add_about" = "Enter the link to the Telegram bot that you want to automatically process your chats."; +"lng_chatbots_access_title" = "Chats accessible for the bot"; +"lng_chatbots_all_except" = "All 1-to-1 Chats Except..."; +"lng_chatbots_selected" = "Only Selected Chats"; +"lng_chatbots_excluded_title" = "Excluded chats"; +"lng_chatbots_exclude_button" = "Exclude Chats"; +"lng_chatbots_included_title" = "Included chats"; +"lng_chatbots_include_button" = "Select Chats"; +"lng_chatbots_exclude_about" = "Select chats or entire chat categories which the bot will not have access to."; +"lng_chatbots_permissions_title" = "Bot permissions"; +"lng_chatbots_reply" = "Reply to Messages"; +"lng_chatbots_reply_about" = "The bot will be able to view all new incoming messages, but not the messages that had been sent before you added the bot."; +"lng_chatbots_remove" = "Remove Bot"; + "lng_boost_channel_button" = "Boost Channel"; "lng_boost_group_button" = "Boost Group"; "lng_boost_again_button" = "Boost Again"; diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc index a129237ca..ede8feb2d 100644 --- a/Telegram/Resources/qrc/telegram/animations.qrc +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -14,5 +14,6 @@ ../../animations/voice_ttl_idle.tgs ../../animations/voice_ttl_start.tgs ../../animations/palette.tgs + ../../animations/robot.tgs diff --git a/Telegram/SourceFiles/boxes/peers/edit_linked_chat_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_linked_chat_box.cpp index 1f24ecd76..f8a7ea6e8 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_linked_chat_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_linked_chat_box.cpp @@ -260,11 +260,11 @@ void Controller::choose(not_null chat) { const auto init = [=](not_null box) { auto above = object_ptr(box); - Settings::AddDividerTextWithLottie( - above, - box->showFinishes(), - About(channel, chat), - u"discussion"_q); + Settings::AddDividerTextWithLottie(above, { + .lottie = u"discussion"_q, + .showFinished = box->showFinishes(), + .about = About(channel, chat), + }); if (!chat) { Assert(channel->isBroadcast()); diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_color_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_color_box.cpp index 8fccba41a..3f01fe269 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_color_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_color_box.cpp @@ -1223,35 +1223,15 @@ void EditPeerColorBox( state->index = peer->colorIndex(); state->emojiId = peer->backgroundEmojiId(); state->statusId = peer->emojiStatusId(); - if (group) { - const auto divider = Ui::CreateChild( - box.get()); - const auto verticalLayout = box->verticalLayout()->add( - object_ptr(box.get())); - - auto icon = CreateLottieIcon( - verticalLayout, - { - .name = u"palette"_q, - .sizeOverride = Size(st::settingsCloudPasswordIconSize), - }, - st::peerAppearanceIconPadding); - box->setShowFinishedCallback([animate = std::move(icon.animate)] { - animate(anim::repeat::once); + Settings::AddDividerTextWithLottie(box->verticalLayout(), { + .lottie = u"palette"_q, + .lottieSize = st::settingsCloudPasswordIconSize, + .lottieMargins = st::peerAppearanceIconPadding, + .showFinished = box->showFinishes(), + .about = tr::lng_boost_group_about(Ui::Text::WithEntities), + .aboutMargins = st::peerAppearanceCoverLabelMargin, }); - verticalLayout->add(std::move(icon.widget)); - verticalLayout->add( - object_ptr( - verticalLayout, - tr::lng_boost_group_about(), - st::peerAppearanceCoverLabel), - st::peerAppearanceCoverLabelMargin); - - verticalLayout->geometryValue( - ) | rpl::start_with_next([=](const QRect &r) { - divider->setGeometry(r); - }, divider->lifetime()); } else { box->addRow(object_ptr( box, diff --git a/Telegram/SourceFiles/core/local_url_handlers.cpp b/Telegram/SourceFiles/core/local_url_handlers.cpp index fbb9bb533..82c115774 100644 --- a/Telegram/SourceFiles/core/local_url_handlers.cpp +++ b/Telegram/SourceFiles/core/local_url_handlers.cpp @@ -669,6 +669,17 @@ bool ShowSearchTagsPromo( return true; } +bool ShowAboutBusinessChatbots( + Window::SessionController *controller, + const Match &match, + const QVariant &context) { + if (!controller) { + return false; + } + controller->showToast(u"Cool feature, yeah.."_q); AssertIsDebug(); + return true; +} + void ExportTestChatTheme( not_null controller, not_null theme) { @@ -1036,7 +1047,11 @@ const std::vector &InternalUrlHandlers() { { u"about_tags"_q, ShowSearchTagsPromo - } + }, + { + u"about_business_chatbots"_q, + ShowAboutBusinessChatbots + }, }; return Result; } diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index b85703cf0..0943e3ac1 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "history/history_inner_widget.h" +#include "chat_helpers/stickers_emoji_pack.h" #include "core/file_utilities.h" #include "core/click_handler_types.h" #include "history/history_item_helpers.h" @@ -32,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/message_sending_animation_controller.h" #include "ui/effects/reaction_fly_animation.h" #include "ui/text/text_options.h" +#include "ui/text/text_isolated_emoji.h" #include "ui/boxes/report_box.h" #include "ui/layers/generic_box.h" #include "ui/controls/delete_message_context_action.h" @@ -2239,6 +2241,17 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { } }; + if (const auto item = _dragStateItem) { + const auto emojiStickers = &session->emojiStickersPack(); + if (const auto view = item->mainView()) { + if (const auto isolated = view->isolatedEmoji()) { + if (const auto sticker = emojiStickers->stickerForEmoji(isolated)) { + addDocumentActions(sticker.document, item); + } + } + } + } + const auto asGroup = !Element::Moused() || (Element::Moused() != Element::Hovered()) || (Element::Moused()->pointState( diff --git a/Telegram/SourceFiles/settings/business/settings_chatbots.cpp b/Telegram/SourceFiles/settings/business/settings_chatbots.cpp new file mode 100644 index 000000000..34969c7d9 --- /dev/null +++ b/Telegram/SourceFiles/settings/business/settings_chatbots.cpp @@ -0,0 +1,201 @@ +/* +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 "settings/business/settings_chatbots.h" + +#include "lang/lang_keys.h" +#include "settings/settings_common_session.h" +#include "ui/text/text_utilities.h" +#include "ui/widgets/fields/input_field.h" +#include "ui/widgets/checkbox.h" +#include "ui/wrap/slide_wrap.h" +#include "ui/wrap/vertical_layout.h" +#include "ui/vertical_list.h" +#include "styles/style_layers.h" +#include "styles/style_settings.h" + +namespace Settings { +namespace { + +constexpr auto kAllExcept = 0; +constexpr auto kSelectedOnly = 1; + +class Chatbots : public Section { +public: + Chatbots( + QWidget *parent, + not_null controller); + + [[nodiscard]] rpl::producer title() override; + + rpl::producer<> showFinishes() const { + return _showFinished.events(); + } + + const Ui::RoundRect *bottomSkipRounding() const { + return &_bottomSkipRounding; + } + +private: + void setupContent(not_null controller); + + void showFinished() override { + _showFinished.fire({}); + } + + rpl::event_stream<> _showFinished; + Ui::RoundRect _bottomSkipRounding; + +}; + +Chatbots::Chatbots( + QWidget *parent, + not_null controller) +: Section(parent) +, _bottomSkipRounding(st::boxRadius, st::boxDividerBg) { + setupContent(controller); +} + +rpl::producer Chatbots::title() { + return tr::lng_chatbots_title(); +} + +void Chatbots::setupContent( + not_null controller) { + using namespace rpl::mappers; + + const auto content = Ui::CreateChild(this); + + struct State { + rpl::variable onlySelected = false; + rpl::variable replyAllowed = true; + }; + const auto state = content->lifetime().make_state(); + + AddDividerTextWithLottie(content, { + .lottie = u"robot"_q, + .lottieSize = st::settingsCloudPasswordIconSize, + .lottieMargins = st::peerAppearanceIconPadding, + .showFinished = showFinishes(), + .about = tr::lng_chatbots_about( + lt_link, + tr::lng_chatbots_about_link( + ) | Ui::Text::ToLink(u"internal:about_business_chatbots"_q), + Ui::Text::WithEntities), + .aboutMargins = st::peerAppearanceCoverLabelMargin, + }); + + const auto username = content->add( + object_ptr( + content, + st::settingsChatbotsUsername, + tr::lng_chatbots_placeholder()), + st::settingsChatbotsUsernameMargins); + + Ui::AddDividerText( + content, + tr::lng_chatbots_add_about(), + st::peerAppearanceDividerTextMargin); + Ui::AddSkip(content); + Ui::AddSubsectionTitle(content, tr::lng_chatbots_access_title()); + + const auto group = std::make_shared( + state->onlySelected.current() ? kSelectedOnly : kAllExcept); + const auto everyone = content->add( + object_ptr( + content, + group, + kAllExcept, + tr::lng_chatbots_all_except(tr::now), + st::settingsChatbotsAccess), + st::settingsChatbotsAccessMargins); + const auto selected = content->add( + object_ptr( + content, + group, + kSelectedOnly, + tr::lng_chatbots_selected(tr::now), + st::settingsChatbotsAccess), + st::settingsChatbotsAccessMargins); + + Ui::AddSkip(content, st::settingsChatbotsAccessSkip); + Ui::AddDivider(content); + + const auto excludeWrap = content->add( + object_ptr>( + content, + object_ptr(content)) + )->setDuration(0); + const auto excludeInner = excludeWrap->entity(); + + Ui::AddSkip(excludeInner); + Ui::AddSubsectionTitle(excludeInner, tr::lng_chatbots_excluded_title()); + const auto excludeAdd = AddButtonWithIcon( + excludeInner, + tr::lng_chatbots_exclude_button(), + st::settingsChatbotsAdd, + { &st::settingsIconRemove, IconType::Round, &st::windowBgActive }); + + excludeWrap->toggleOn(state->onlySelected.value() | rpl::map(!_1)); + excludeWrap->finishAnimating(); + + const auto includeWrap = content->add( + object_ptr>( + content, + object_ptr(content)) + )->setDuration(0); + const auto includeInner = includeWrap->entity(); + + Ui::AddSkip(includeInner); + Ui::AddSubsectionTitle(includeInner, tr::lng_chatbots_included_title()); + const auto includeAdd = AddButtonWithIcon( + includeInner, + tr::lng_chatbots_include_button(), + st::settingsChatbotsAdd, + { &st::settingsIconAdd, IconType::Round, &st::windowBgActive }); + + includeWrap->toggleOn(state->onlySelected.value()); + includeWrap->finishAnimating(); + + group->setChangedCallback([=](int value) { + state->onlySelected = (value == kSelectedOnly); + }); + + Ui::AddSkip(content, st::settingsChatbotsAccessSkip); + Ui::AddDividerText( + content, + tr::lng_chatbots_exclude_about(), + st::peerAppearanceDividerTextMargin); + + Ui::AddSkip(content); + Ui::AddSubsectionTitle(content, tr::lng_chatbots_permissions_title()); + content->add(object_ptr( + content, + tr::lng_chatbots_reply(), + st::settingsButtonNoIcon + ))->toggleOn(state->replyAllowed.value())->toggledChanges( + ) | rpl::start_with_next([=](bool value) { + state->replyAllowed = value; + }, content->lifetime()); + Ui::AddSkip(content); + + Ui::AddDividerText( + content, + tr::lng_chatbots_reply_about(), + st::settingsChatbotsBottomTextMargin, + RectPart::Top); + + Ui::ResizeFitChild(this, content); +} + +} // namespace + +Type ChatbotsId() { + return Chatbots::Id(); +} + +} // namespace Settings diff --git a/Telegram/SourceFiles/settings/business/settings_chatbots.h b/Telegram/SourceFiles/settings/business/settings_chatbots.h new file mode 100644 index 000000000..06fab806c --- /dev/null +++ b/Telegram/SourceFiles/settings/business/settings_chatbots.h @@ -0,0 +1,16 @@ +/* +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 + +#include "settings/settings_type.h" + +namespace Settings { + +[[nodiscard]] Type ChatbotsId(); + +} // namespace Settings diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp index d2f8f9569..2d273895e 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp @@ -121,12 +121,12 @@ void Manage::setupContent() { showOther(type); }; - AddDividerTextWithLottie( - content, - showFinishes(), - tr::lng_settings_cloud_password_manage_about1( + AddDividerTextWithLottie(content, { + .lottie = u"cloud_password/intro"_q, + .showFinished = showFinishes(), + .about = tr::lng_settings_cloud_password_manage_about1( TextWithEntities::Simple), - u"cloud_password/intro"_q); + }); Ui::AddSkip(content); AddButtonWithIcon( diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index eb6bcb360..f4eebf4ff 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -589,9 +589,19 @@ peerAppearanceButton: SettingsButton(settingsButtonLight) { padding: margins(60px, 8px, 22px, 8px); iconLeft: 20px; } -peerAppearanceCoverLabel: FlatLabel(boxDividerLabel) { - align: align(top); -} peerAppearanceCoverLabelMargin: margins(22px, 0px, 22px, 17px); peerAppearanceIconPadding: margins(0px, 15px, 0px, 5px); peerAppearanceDividerTextMargin: margins(22px, 8px, 22px, 11px); + +settingsChatbotsUsername: InputField(defaultMultiSelectSearchField) { +} +settingsChatbotsAccess: Checkbox(defaultCheckbox) { + textPosition: point(18px, 2px); +} +settingsChatbotsUsernameMargins: margins(20px, 8px, 20px, 8px); +settingsChatbotsAccessMargins: margins(22px, 5px, 22px, 9px); +settingsChatbotsAccessSkip: 4px; +settingsChatbotsBottomTextMargin: margins(22px, 8px, 22px, 3px); +settingsChatbotsAdd: SettingsButton(settingsButton) { + iconLeft: 22px; +} diff --git a/Telegram/SourceFiles/settings/settings_business.cpp b/Telegram/SourceFiles/settings/settings_business.cpp index 23a4d8914..fd56adb41 100644 --- a/Telegram/SourceFiles/settings/settings_business.cpp +++ b/Telegram/SourceFiles/settings/settings_business.cpp @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "info/settings/info_settings_widget.h" // SectionCustomTopBarData. #include "lang/lang_keys.h" #include "main/main_session.h" +#include "settings/business/settings_chatbots.h" #include "settings/settings_common_session.h" #include "settings/settings_premium.h" #include "ui/effects/gradient.h" @@ -287,6 +288,7 @@ public: void setStepDataReference(std::any &data) override; [[nodiscard]] rpl::producer<> sectionShowBack() override final; + [[nodiscard]] rpl::producer sectionShowOther() override; private: void setupContent(); @@ -299,9 +301,10 @@ private: rpl::variable _backToggles; rpl::variable _wrap; Fn _setPaused; - std::shared_ptr _radioGroup; + rpl::event_stream _showOther; + rpl::event_stream<> _showBack; rpl::event_stream<> _showFinished; rpl::variable _buttonText; @@ -330,6 +333,10 @@ rpl::producer<> Business::sectionShowBack() { return _showBack.events(); } +rpl::producer Business::sectionShowOther() { + return _showOther.events(); +} + void Business::setStepDataReference(std::any &data) { using namespace Info::Settings; const auto my = std::any_cast(&data); @@ -347,6 +354,11 @@ void Business::setupContent() { Ui::AddSkip(content, st::settingsFromFileTop); AddBusinessSummary(content, _controller, [=](BusinessFeature feature) { + switch (feature) { + case BusinessFeature::Chatbots: + _showOther.fire(Settings::ChatbotsId()); + break; + } }); Ui::ResizeFitChild(this, content); diff --git a/Telegram/SourceFiles/settings/settings_common.cpp b/Telegram/SourceFiles/settings/settings_common.cpp index f9de195fc..7e4ac4180 100644 --- a/Telegram/SourceFiles/settings/settings_common.cpp +++ b/Telegram/SourceFiles/settings/settings_common.cpp @@ -170,39 +170,43 @@ not_null AddButtonWithLabel( } void AddDividerTextWithLottie( - not_null parent, - rpl::producer<> showFinished, - rpl::producer text, - const QString &lottie) { - const auto divider = Ui::CreateChild(parent.get()); - const auto verticalLayout = parent->add( - object_ptr(parent.get())); - + not_null container, + DividerWithLottieDescriptor &&descriptor) { + const auto divider = Ui::CreateChild( + container.get()); + const auto verticalLayout = container->add( + object_ptr(container.get())); + const auto size = descriptor.lottieSize.value_or( + st::settingsFilterIconSize); auto icon = CreateLottieIcon( verticalLayout, { - .name = lottie, - .sizeOverride = { - st::settingsFilterIconSize, - st::settingsFilterIconSize, - }, + .name = descriptor.lottie, + .sizeOverride = { size, size }, }, - st::settingsFilterIconPadding); - std::move( - showFinished - ) | rpl::start_with_next([animate = std::move(icon.animate)] { - animate(anim::repeat::once); - }, verticalLayout->lifetime()); + descriptor.lottieMargins.value_or(st::settingsFilterIconPadding)); + if (descriptor.showFinished) { + const auto repeat = descriptor.lottieRepeat.value_or( + anim::repeat::once); + std::move( + descriptor.showFinished + ) | rpl::start_with_next([animate = std::move(icon.animate), repeat] { + animate(repeat); + }, verticalLayout->lifetime()); + } verticalLayout->add(std::move(icon.widget)); - verticalLayout->add( - object_ptr>( - verticalLayout, - object_ptr( + if (descriptor.about) { + verticalLayout->add( + object_ptr>( verticalLayout, - std::move(text), - st::settingsFilterDividerLabel)), - st::settingsFilterDividerLabelPadding); + object_ptr( + verticalLayout, + std::move(descriptor.about), + st::settingsFilterDividerLabel)), + descriptor.aboutMargins.value_or( + st::settingsFilterDividerLabelPadding)); + } verticalLayout->geometryValue( ) | rpl::start_with_next([=](const QRect &r) { diff --git a/Telegram/SourceFiles/settings/settings_common.h b/Telegram/SourceFiles/settings/settings_common.h index 838edcc64..00ecf2fe2 100644 --- a/Telegram/SourceFiles/settings/settings_common.h +++ b/Telegram/SourceFiles/settings/settings_common.h @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "ui/text/text_variant.h" #include "ui/rp_widget.h" #include "ui/round_rect.h" #include "base/object_ptr.h" @@ -151,11 +152,19 @@ void CreateRightLabel( rpl::producer label, const style::SettingsButton &st, rpl::producer buttonText); + +struct DividerWithLottieDescriptor { + QString lottie; + std::optional lottieRepeat; + std::optional lottieSize; + std::optional lottieMargins; + rpl::producer<> showFinished; + rpl::producer about; + std::optional aboutMargins; +}; void AddDividerTextWithLottie( - not_null parent, - rpl::producer<> showFinished, - rpl::producer text, - const QString &lottie); + not_null container, + DividerWithLottieDescriptor &&descriptor); struct LottieIcon { object_ptr widget; diff --git a/Telegram/SourceFiles/ui/vertical_list.cpp b/Telegram/SourceFiles/ui/vertical_list.cpp index b1acce232..11347aa61 100644 --- a/Telegram/SourceFiles/ui/vertical_list.cpp +++ b/Telegram/SourceFiles/ui/vertical_list.cpp @@ -31,24 +31,28 @@ void AddDivider(not_null container) { void AddDividerText( not_null container, rpl::producer text, - const style::margins &margins) { + const style::margins &margins, + RectParts parts) { AddDividerText( container, std::move(text) | Ui::Text::ToWithEntities(), - margins); + margins, + parts); } void AddDividerText( not_null container, rpl::producer text, - const style::margins &margins) { + const style::margins &margins, + RectParts parts) { container->add(object_ptr( container, object_ptr( container, std::move(text), st::boxDividerLabel), - margins)); + margins, + parts)); } not_null AddSubsectionTitle( diff --git a/Telegram/SourceFiles/ui/vertical_list.h b/Telegram/SourceFiles/ui/vertical_list.h index 87deef178..7ab743bd3 100644 --- a/Telegram/SourceFiles/ui/vertical_list.h +++ b/Telegram/SourceFiles/ui/vertical_list.h @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "ui/rect_part.h" + namespace style { struct FlatLabel; } // namespace style @@ -26,11 +28,13 @@ void AddDivider(not_null container); void AddDividerText( not_null container, rpl::producer text, - const style::margins &margins = st::defaultBoxDividerLabelPadding); + const style::margins &margins = st::defaultBoxDividerLabelPadding, + RectParts parts = RectPart::Top | RectPart::Bottom); void AddDividerText( not_null container, rpl::producer text, - const style::margins &margins = st::defaultBoxDividerLabelPadding); + const style::margins &margins = st::defaultBoxDividerLabelPadding, + RectParts parts = RectPart::Top | RectPart::Bottom); not_null AddSubsectionTitle( not_null container, rpl::producer text,