diff --git a/Telegram/Resources/icons/dialogs/inaccessible_userpic.png b/Telegram/Resources/icons/dialogs/inaccessible_userpic.png new file mode 100644 index 000000000..0ea974ff2 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/inaccessible_userpic.png differ diff --git a/Telegram/Resources/icons/dialogs/inaccessible_userpic@2x.png b/Telegram/Resources/icons/dialogs/inaccessible_userpic@2x.png new file mode 100644 index 000000000..38fa1308a Binary files /dev/null and b/Telegram/Resources/icons/dialogs/inaccessible_userpic@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/inaccessible_userpic@3x.png b/Telegram/Resources/icons/dialogs/inaccessible_userpic@3x.png new file mode 100644 index 000000000..454ad3951 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/inaccessible_userpic@3x.png differ diff --git a/Telegram/Resources/icons/info/inaccessible_userpic.png b/Telegram/Resources/icons/info/inaccessible_userpic.png new file mode 100644 index 000000000..426fa1ee5 Binary files /dev/null and b/Telegram/Resources/icons/info/inaccessible_userpic.png differ diff --git a/Telegram/Resources/icons/info/inaccessible_userpic@2x.png b/Telegram/Resources/icons/info/inaccessible_userpic@2x.png new file mode 100644 index 000000000..aabebd344 Binary files /dev/null and b/Telegram/Resources/icons/info/inaccessible_userpic@2x.png differ diff --git a/Telegram/Resources/icons/info/inaccessible_userpic@3x.png b/Telegram/Resources/icons/info/inaccessible_userpic@3x.png new file mode 100644 index 000000000..1b943895d Binary files /dev/null and b/Telegram/Resources/icons/info/inaccessible_userpic@3x.png differ diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 8b005e31e..41f466499 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -248,9 +248,12 @@ void PeerData::updateNameDelayed( not_null<Ui::EmptyUserpic*> PeerData::ensureEmptyUserpic() const { if (!_userpicEmpty) { + const auto user = asUser(); _userpicEmpty = std::make_unique<Ui::EmptyUserpic>( Data::PeerUserpicColor(id), - name()); + user && user->isInaccessible() + ? Ui::EmptyUserpic::InaccessibleName() + : name()); } return _userpicEmpty.get(); } diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index 510962dc6..e9b035424 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -319,6 +319,7 @@ dialogsForumIconOver: icon {{ "dialogs/dialogs_forum", dialogsChatIconFgOver, po dialogsForumIconActive: icon {{ "dialogs/dialogs_forum", dialogsChatIconFgActive, point(1px, 4px) }}; dialogsArchiveUserpic: icon {{ "archive_userpic", historyPeerUserpicFg }}; dialogsRepliesUserpic: icon {{ "replies_userpic", historyPeerUserpicFg }}; +dialogsInaccessibleUserpic: icon {{ "dialogs/inaccessible_userpic", historyPeerUserpicFg }}; dialogsSendStateSkip: 20px; dialogsSendingIcon: icon {{ "dialogs/dialogs_sending", dialogsSendingIconFg, point(8px, 4px) }}; diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index 6520f37e5..a9abd8126 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -326,6 +326,8 @@ infoTopicCover: InfoProfileCover(infoProfileMegagroupCover) { statusTop: 38px; } +infoProfileInaccessibleUserpic: icon {{ "info/inaccessible_userpic", historyPeerUserpicFg }}; + infoVerifiedCheckPosition: point(4px, 2px); infoVerifiedCheck: icon { { "profile_verified_star", profileVerifiedCheckBg }, diff --git a/Telegram/SourceFiles/ui/empty_userpic.cpp b/Telegram/SourceFiles/ui/empty_userpic.cpp index e7190c8db..b5b90fd34 100644 --- a/Telegram/SourceFiles/ui/empty_userpic.cpp +++ b/Telegram/SourceFiles/ui/empty_userpic.cpp @@ -23,7 +23,13 @@ namespace { [[nodiscard]] bool IsExternal(const QString &name) { return !name.isEmpty() && (name.front() == QChar(0)) - && QStringView(name).mid(1) == qstr("external"); + && QStringView(name).mid(1) == u"external"_q; +} + +[[nodiscard]] bool IsInaccessible(const QString &name) { + return !name.isEmpty() + && (name.front() == QChar(0)) + && QStringView(name).mid(1) == u"inaccessible"_q; } void PaintSavedMessagesInner( @@ -161,6 +167,33 @@ void PaintExternalMessagesInner( fg); } +void PaintInaccessibleAccountInner( + QPainter &p, + int x, + int y, + int size, + const style::color &fg) { + if (size > st::defaultDialogRow.photoSize) { + PaintIconInner( + p, + x, + y, + size, + st::infoProfilePhotoInnerSize, + st::infoProfileInaccessibleUserpic, + fg); + } else { + PaintIconInner( + p, + x, + y, + size, + st::defaultDialogRow.photoSize, + st::dialogsInaccessibleUserpic, + fg); + } +} + template <typename Callback> [[nodiscard]] QPixmap Generate(int size, Callback callback) { auto result = QImage( @@ -186,6 +219,10 @@ QString EmptyUserpic::ExternalName() { return QChar(0) + u"external"_q; } +QString EmptyUserpic::InaccessibleName() { + return QChar(0) + u"inaccessible"_q; +} + template <typename Callback> void EmptyUserpic::paint( QPainter &p, @@ -207,6 +244,8 @@ void EmptyUserpic::paint( if (IsExternal(_string)) { PaintExternalMessagesInner(p, x, y, size, st::historyPeerUserpicFg); + } else if (IsInaccessible(_string)) { + PaintInaccessibleAccountInner(p, x, y, size, st::historyPeerUserpicFg); } else { p.setFont(font); p.setBrush(Qt::NoBrush); @@ -410,7 +449,7 @@ QPixmap EmptyUserpic::generate(int size) { } void EmptyUserpic::fillString(const QString &name) { - if (IsExternal(name)) { + if (IsExternal(name) || IsInaccessible(name)) { _string = name; return; } diff --git a/Telegram/SourceFiles/ui/empty_userpic.h b/Telegram/SourceFiles/ui/empty_userpic.h index c990a4e44..e657e6a59 100644 --- a/Telegram/SourceFiles/ui/empty_userpic.h +++ b/Telegram/SourceFiles/ui/empty_userpic.h @@ -12,6 +12,7 @@ namespace Ui { class EmptyUserpic { public: [[nodiscard]] static QString ExternalName(); + [[nodiscard]] static QString InaccessibleName(); EmptyUserpic(const style::color &color, const QString &name);