diff --git a/Telegram/Resources/icons/ayu/contacts_mutual.png b/Telegram/Resources/icons/ayu/contacts_mutual.png new file mode 100644 index 0000000000..80b7e35657 Binary files /dev/null and b/Telegram/Resources/icons/ayu/contacts_mutual.png differ diff --git a/Telegram/Resources/icons/ayu/contacts_mutual@2x.png b/Telegram/Resources/icons/ayu/contacts_mutual@2x.png new file mode 100644 index 0000000000..956ade0c44 Binary files /dev/null and b/Telegram/Resources/icons/ayu/contacts_mutual@2x.png differ diff --git a/Telegram/Resources/icons/ayu/contacts_mutual@3x.png b/Telegram/Resources/icons/ayu/contacts_mutual@3x.png new file mode 100644 index 0000000000..6c2a90e250 Binary files /dev/null and b/Telegram/Resources/icons/ayu/contacts_mutual@3x.png differ diff --git a/Telegram/SourceFiles/ayu/ui/ayu_icons.style b/Telegram/SourceFiles/ayu/ui/ayu_icons.style index 4cd21b4c6a..4dd62b67cf 100644 --- a/Telegram/SourceFiles/ayu/ui/ayu_icons.style +++ b/Telegram/SourceFiles/ayu/ui/ayu_icons.style @@ -18,6 +18,8 @@ ayuSReadMenuIcon: icon {{ "ayu/sread", menuIconColor }}; ayuStreamerModeMenuIcon: icon {{ "ayu/streamer", menuIconColor }}; ayuToBeginningMenuIcon: icon {{ "ayu/to_beginning", menuIconColor }}; ayuRepeatMenuIcon: icon {{ "ayu/repeat", menuIconColor }}; +ayuContactsMutualIcon: icon {{ "ayu/contacts_mutual", contactsStatusFg }}; +ayuContactsMutualIconOver: icon {{ "ayu/contacts_mutual", contactsStatusFgOver }}; messageFieldAttachIcon: icon {{ "ayu/message_field/attach", menuIconColor }}; messageFieldCommandsIcon: icon {{ "ayu/message_field/commands", menuIconColor }}; diff --git a/Telegram/SourceFiles/boxes/peer_list_controllers.cpp b/Telegram/SourceFiles/boxes/peer_list_controllers.cpp index a83af75867..1555c79c02 100644 --- a/Telegram/SourceFiles/boxes/peer_list_controllers.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_controllers.cpp @@ -51,6 +51,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller.h" // showAddContact() #include "base/unixtime.h" #include "styles/style_boxes.h" +#include "styles/style_ayu_icons.h" #include "styles/style_profile.h" #include "styles/style_dialogs.h" #include "styles/style_chat_helpers.h" @@ -61,6 +62,57 @@ namespace { constexpr auto kSortByOnlineThrottle = 3 * crl::time(1000); constexpr auto kSearchPerPage = 50; +class ContactsMutualRow final : public PeerListRow { +public: + using PeerListRow::PeerListRow; + +protected: + QSize rightActionSize() const override { + return isMutualContact() + ? QSize(st::ayuContactsMutualIcon.width(), st::ayuContactsMutualIcon.height()) + : QSize(); + } + + QMargins rightActionMargins() const override { + const auto size = rightActionSize(); + if (size.isEmpty()) { + return QMargins(); + } + const auto right = st::contactsWithStories.item.photoPosition.x(); + return QMargins( + right, + (st::contactsWithStories.item.height - size.height()) / 2, + right, + 0); + } + + bool rightActionDisabled() const override { + return true; + } + + void rightActionPaint( + Painter &p, + int x, + int y, + int outerWidth, + bool selected, + bool actionSelected) override { + if (!isMutualContact()) { + return; + } + (selected + ? st::ayuContactsMutualIconOver + : st::ayuContactsMutualIcon).paint(p, x, y, outerWidth); + } + +private: + [[nodiscard]] bool isMutualContact() const { + const auto user = peer()->asUser(); + return user && (user->flags() & UserDataFlag::MutualContact); + } + +}; + } // namespace object_ptr PrepareContactsBox( @@ -78,7 +130,7 @@ object_ptr PrepareContactsBox( std::unique_ptr createRow( not_null user) override { return !user->isSelf() - ? ContactsBoxController::createRow(user) + ? std::make_unique(user) : nullptr; }