diff --git a/Telegram/Resources/icons/dialogs/dialogs_mute.png b/Telegram/Resources/icons/dialogs/dialogs_mute.png new file mode 100644 index 0000000000..3b37e1172d Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_mute.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_mute@2x.png b/Telegram/Resources/icons/dialogs/dialogs_mute@2x.png new file mode 100644 index 0000000000..96681eb66f Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_mute@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_mute@3x.png b/Telegram/Resources/icons/dialogs/dialogs_mute@3x.png new file mode 100644 index 0000000000..a246b7e6a5 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_mute@3x.png differ diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index dd5350b054..bb5d7963b6 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -603,6 +603,13 @@ dialogsUnreadPollMuted: ThreeStateIcon { active: icon{{ "dialogs/dialogs_chatlist_poll-18x18", dialogsUnreadBgMutedActive }}; } +dialogsMuteIcon: ThreeStateIcon { + icon: icon{{ "dialogs/dialogs_mute", dialogsUnreadBgMuted }}; + over: icon{{ "dialogs/dialogs_mute", dialogsUnreadBgMutedOver }}; + active: icon{{ "dialogs/dialogs_mute", dialogsUnreadBgMutedActive }}; +} +dialogsMuteIconSkip: 4px; + downloadBarHeight: 46px; downloadArrow: icon{{ "fast_to_original", menuIconFg }}; downloadArrowOver: icon{{ "fast_to_original", menuIconFgOver }}; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index 38688943e5..83c975146b 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "dialogs/ui/dialogs_layout.h" +#include "base/options.h" #include "base/unixtime.h" #include "core/ui_integration.h" #include "data/data_channel.h" @@ -51,8 +52,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_window.h" namespace Dialogs::Ui { + +const char kOptionDialogsMuteIcon[] = "dialogs-mute-icon"; + namespace { +base::options::toggle DialogsMuteIcon({ + .id = kOptionDialogsMuteIcon, + .name = "Mute icon in dialogs", + .description = "Show a small mute icon next to the chat name " + "for muted chats.", +}); + const auto kPsaBadgePrefix = "cloud_lng_badge_psa_"; [[nodiscard]] bool ShowUserBotIcon(not_null user) { @@ -796,8 +807,24 @@ void PaintRow( context.width, text); } else if (from) { + auto badgeWidth = 0; if ((history || sublist) && !context.search) { + const auto widthBefore = rectForName.width(); paintPeerBadge(rowName.maxWidth()); + badgeWidth = widthBefore - rectForName.width(); + } + const auto drawMuteIcon = DialogsMuteIcon.value() + && thread + && thread->muted(); + if (drawMuteIcon) { + const auto &muteIcon = ThreeStateIcon( + st::dialogsMuteIcon, + context.active, + context.selected); + rectForName.setWidth( + rectForName.width() + - muteIcon.width() + - st::dialogsMuteIconSkip); } p.setPen(context.active ? st::dialogsNameFgActive @@ -809,6 +836,22 @@ void PaintRow( .availableWidth = rectForName.width(), .elisionLines = 1, }); + if (drawMuteIcon) { + const auto &muteIcon = ThreeStateIcon( + st::dialogsMuteIcon, + context.active, + context.selected); + const auto nameW = std::min( + rowName.maxWidth(), + rectForName.width()); + const auto muteLeft = rectForName.left() + + nameW + + badgeWidth + + st::dialogsMuteIconSkip; + const auto muteTop = rectForName.top() + + (st::semiboldFont->height - muteIcon.height()) / 2; + muteIcon.paint(p, muteLeft, muteTop, context.width); + } } else if (hiddenSenderInfo) { p.setPen(context.active ? st::dialogsNameFgActive diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.h b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.h index e8542902e0..d5a36aeae7 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.h @@ -76,6 +76,8 @@ struct PaintContext { bool displayUnreadInfo = false; }; +extern const char kOptionDialogsMuteIcon[]; + [[nodiscard]] const style::icon *ChatTypeIcon( not_null peer, const PaintContext &context); diff --git a/Telegram/SourceFiles/settings/settings_experimental.cpp b/Telegram/SourceFiles/settings/settings_experimental.cpp index 3bbddecc62..57747c20d5 100644 --- a/Telegram/SourceFiles/settings/settings_experimental.cpp +++ b/Telegram/SourceFiles/settings/settings_experimental.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/sandbox.h" #include "chat_helpers/tabbed_panel.h" #include "dialogs/dialogs_widget.h" +#include "dialogs/ui/dialogs_layout.h" #include "history/history_item_components.h" #include "info/profile/info_profile_actions.h" #include "lang/lang_keys.h" @@ -204,6 +205,7 @@ void SetupExperimental( addToggle(ChatHelpers::kOptionTabbedPanelShowOnClick); addToggle(Dialogs::kOptionForumHideChatsList); + addToggle(Dialogs::Ui::kOptionDialogsMuteIcon); addToggle(Core::kOptionFractionalScalingEnabled); addToggle(Core::kOptionHighDpiDownscale); addToggle(Window::kOptionViewProfileInChatsListContextMenu);