diff --git a/Telegram/Resources/icons/dialogs/dialogs_mention.png b/Telegram/Resources/icons/dialogs/dialogs_mention.png new file mode 100644 index 000000000..3b2937241 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_mention.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_mention@2x.png b/Telegram/Resources/icons/dialogs/dialogs_mention@2x.png new file mode 100644 index 000000000..6f11148a8 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_mention@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_mention@3x.png b/Telegram/Resources/icons/dialogs/dialogs_mention@3x.png new file mode 100644 index 000000000..dc1ea2e71 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_mention@3x.png differ diff --git a/Telegram/Resources/icons/history_unread_mention.png b/Telegram/Resources/icons/history_unread_mention.png index 1ecd0546b..7f717b1c3 100644 Binary files a/Telegram/Resources/icons/history_unread_mention.png and b/Telegram/Resources/icons/history_unread_mention.png differ diff --git a/Telegram/Resources/icons/history_unread_mention@2x.png b/Telegram/Resources/icons/history_unread_mention@2x.png index e9d105ee2..02555b8e4 100644 Binary files a/Telegram/Resources/icons/history_unread_mention@2x.png and b/Telegram/Resources/icons/history_unread_mention@2x.png differ diff --git a/Telegram/Resources/icons/history_unread_mention@3x.png b/Telegram/Resources/icons/history_unread_mention@3x.png index c376e844a..198089ac0 100644 Binary files a/Telegram/Resources/icons/history_unread_mention@3x.png and b/Telegram/Resources/icons/history_unread_mention@3x.png differ diff --git a/Telegram/SourceFiles/boxes/stickers_box.cpp b/Telegram/SourceFiles/boxes/stickers_box.cpp index 9f4adb3c8..af4177140 100644 --- a/Telegram/SourceFiles/boxes/stickers_box.cpp +++ b/Telegram/SourceFiles/boxes/stickers_box.cpp @@ -333,19 +333,18 @@ void StickersBox::CounterWidget::setCounter(int counter) { auto dummy = QImage(1, 1, QImage::Format_ARGB32_Premultiplied); Painter p(&dummy); - auto newWidth = 0; - Dialogs::Ui::paintUnreadCount(p, _text, 0, 0, _st, &newWidth); + const auto badge = Dialogs::Ui::PaintUnreadBadge(p, _text, 0, 0, _st); - resize(newWidth, st::stickersFeaturedBadgeSize); + resize(badge.width(), st::stickersFeaturedBadgeSize); } void StickersBox::CounterWidget::paintEvent(QPaintEvent *e) { Painter p(this); if (!_text.isEmpty()) { - auto unreadRight = rtl() ? 0 : width(); - auto unreadTop = 0; - Dialogs::Ui::paintUnreadCount(p, _text, unreadRight, unreadTop, _st); + const auto unreadRight = rtl() ? 0 : width(); + const auto unreadTop = 0; + Dialogs::Ui::PaintUnreadBadge(p, _text, unreadRight, unreadTop, _st); } } diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index cc5322673..087c04fee 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -302,3 +302,7 @@ dialogsMiniPreviewRadius: 2px; dialogsMiniPreviewSkip: 2px; dialogsMiniPreviewRight: 3px; dialogsMiniPlay: icon{{ "dialogs/dialogs_mini_play", videoPlayIconFg }}; + +dialogsUnreadMention: icon{{ "dialogs/dialogs_mention", dialogsUnreadFg }}; +dialogsUnreadMentionOver: icon{{ "dialogs/dialogs_mention", dialogsUnreadFgOver }}; +dialogsUnreadMentionActive: icon{{ "dialogs/dialogs_mention", dialogsUnreadFgActive }}; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index 1fc221c04..7eaf3aa08 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -85,37 +85,61 @@ void PaintNarrowCounter( bool displayUnreadMark, bool displayMentionBadge, int unreadCount, + bool selected, bool active, bool unreadMuted, bool mentionMuted) { auto skipBeforeMention = 0; if (displayUnreadCounter || displayUnreadMark) { - auto counter = (unreadCount > 0) + const auto counter = (unreadCount > 0) ? QString::number(unreadCount) : QString(); const auto allowDigits = displayMentionBadge ? 1 : 3; - auto unreadRight = st::dialogsPadding.x() + st::dialogsPhotoSize; - auto unreadTop = st::dialogsPadding.y() + st::dialogsPhotoSize - st::dialogsUnreadHeight; - auto unreadWidth = 0; + const auto unreadRight = st::dialogsPadding.x() + + st::dialogsPhotoSize; + const auto unreadTop = st::dialogsPadding.y() + + st::dialogsPhotoSize + - st::dialogsUnreadHeight; UnreadBadgeStyle st; st.active = active; + st.selected = selected; st.muted = unreadMuted; - paintUnreadCount(p, counter, unreadRight, unreadTop, st, &unreadWidth, allowDigits); - skipBeforeMention += unreadWidth + st.padding; + const auto badge = PaintUnreadBadge( + p, + counter, + unreadRight, + unreadTop, + st, + allowDigits); + skipBeforeMention += badge.width() + st.padding; } if (displayMentionBadge) { - auto counter = qsl("@"); - auto unreadRight = st::dialogsPadding.x() + st::dialogsPhotoSize - skipBeforeMention; - auto unreadTop = st::dialogsPadding.y() + st::dialogsPhotoSize - st::dialogsUnreadHeight; - auto unreadWidth = 0; + const auto counter = QString(); + const auto unreadRight = st::dialogsPadding.x() + + st::dialogsPhotoSize + - skipBeforeMention; + const auto unreadTop = st::dialogsPadding.y() + + st::dialogsPhotoSize + - st::dialogsUnreadHeight; UnreadBadgeStyle st; st.active = active; + st.selected = selected; st.muted = mentionMuted; st.padding = 0; st.textTop = 0; - paintUnreadCount(p, counter, unreadRight, unreadTop, st, &unreadWidth); + const auto badge = PaintUnreadBadge( + p, + counter, + unreadRight, + unreadTop, + st); + (st.active + ? st::dialogsUnreadMentionActive + : st.selected + ? st::dialogsUnreadMentionOver + : st::dialogsUnreadMention).paintInCenter(p, badge); } } @@ -136,40 +160,74 @@ int PaintWideCounter( const auto initial = availableWidth; auto hadOneBadge = false; if (displayUnreadCounter || displayUnreadMark) { - auto counter = (unreadCount > 0) + const auto counter = (unreadCount > 0) ? QString::number(unreadCount) : QString(); - auto unreadRight = fullWidth - st::dialogsPadding.x(); - auto unreadTop = texttop + st::dialogsTextFont->ascent - st::dialogsUnreadFont->ascent - (st::dialogsUnreadHeight - st::dialogsUnreadFont->height) / 2; - auto unreadWidth = 0; + const auto unreadRight = fullWidth + - st::dialogsPadding.x(); + const auto unreadTop = texttop + + st::dialogsTextFont->ascent + - st::dialogsUnreadFont->ascent + - (st::dialogsUnreadHeight - st::dialogsUnreadFont->height) / 2; UnreadBadgeStyle st; st.active = active; + st.selected = selected; st.muted = unreadMuted; - paintUnreadCount(p, counter, unreadRight, unreadTop, st, &unreadWidth); - availableWidth -= unreadWidth + st.padding; + const auto badge = PaintUnreadBadge( + p, + counter, + unreadRight, + unreadTop, + st); + availableWidth -= badge.width() + st.padding; hadOneBadge = true; } else if (displayPinnedIcon) { - auto &icon = (active ? st::dialogsPinnedIconActive : (selected ? st::dialogsPinnedIconOver : st::dialogsPinnedIcon)); - icon.paint(p, fullWidth - st::dialogsPadding.x() - icon.width(), texttop, fullWidth); + const auto &icon = active + ? st::dialogsPinnedIconActive + : selected + ? st::dialogsPinnedIconOver + : st::dialogsPinnedIcon; + icon.paint( + p, + fullWidth - st::dialogsPadding.x() - icon.width(), + texttop, + fullWidth); availableWidth -= icon.width() + st::dialogsUnreadPadding; hadOneBadge = true; } if (displayMentionBadge) { - auto counter = qsl("@"); - auto unreadRight = fullWidth - st::dialogsPadding.x() - (initial - availableWidth); - auto unreadTop = texttop + st::dialogsTextFont->ascent - st::dialogsUnreadFont->ascent - (st::dialogsUnreadHeight - st::dialogsUnreadFont->height) / 2; - auto unreadWidth = 0; + const auto counter = QString(); + const auto unreadRight = fullWidth + - st::dialogsPadding.x() + - (initial - availableWidth); + const auto unreadTop = texttop + + st::dialogsTextFont->ascent + - st::dialogsUnreadFont->ascent + - (st::dialogsUnreadHeight - st::dialogsUnreadFont->height) / 2; UnreadBadgeStyle st; st.active = active; + st.selected = selected; st.muted = mentionMuted; st.padding = 0; st.textTop = 0; - paintUnreadCount(p, counter, unreadRight, unreadTop, st, &unreadWidth); - availableWidth -= unreadWidth + st.padding + (hadOneBadge ? st::dialogsUnreadPadding : 0); + const auto badge = PaintUnreadBadge( + p, + counter, + unreadRight, + unreadTop, + st); + (st.active + ? st::dialogsUnreadMentionActive + : st.selected + ? st::dialogsUnreadMentionOver + : st::dialogsUnreadMention).paintInCenter(p, badge); + availableWidth -= badge.width() + + st.padding + + (hadOneBadge ? st::dialogsUnreadPadding : 0); } return availableWidth; } @@ -572,35 +630,7 @@ QImage colorizeCircleHalf(UnreadBadgeSizeData *data, int size, int half, int xof return result; } -} // namepsace - -const style::icon *ChatTypeIcon( - not_null peer, - bool active, - bool selected) { - if (peer->isChat() || peer->isMegagroup()) { - return &(active - ? st::dialogsChatIconActive - : (selected ? st::dialogsChatIconOver : st::dialogsChatIcon)); - } else if (peer->isChannel()) { - return &(active - ? st::dialogsChannelIconActive - : (selected - ? st::dialogsChannelIconOver - : st::dialogsChannelIcon)); - } else if (const auto user = peer->asUser()) { - if (ShowUserBotIcon(user)) { - return &(active - ? st::dialogsBotIconActive - : (selected - ? st::dialogsBotIconOver - : st::dialogsBotIcon)); - } - } - return nullptr; -} - -void paintUnreadBadge(Painter &p, const QRect &rect, const UnreadBadgeStyle &st) { +void PaintUnreadBadge(Painter &p, const QRect &rect, const UnreadBadgeStyle &st) { Assert(rect.height() == st.size); int index = (st.muted ? 0x03 : 0x00) + (st.active ? 0x02 : (st.selected ? 0x01 : 0x00)); @@ -634,46 +664,77 @@ void paintUnreadBadge(Painter &p, const QRect &rect, const UnreadBadgeStyle &st) p.drawPixmap(rect.x() + sizehalf + bar, rect.y(), badgeData->right[index]); } +} // namepsace + +const style::icon *ChatTypeIcon( + not_null peer, + bool active, + bool selected) { + if (peer->isChat() || peer->isMegagroup()) { + return &(active + ? st::dialogsChatIconActive + : (selected ? st::dialogsChatIconOver : st::dialogsChatIcon)); + } else if (peer->isChannel()) { + return &(active + ? st::dialogsChannelIconActive + : (selected + ? st::dialogsChannelIconOver + : st::dialogsChannelIcon)); + } else if (const auto user = peer->asUser()) { + if (ShowUserBotIcon(user)) { + return &(active + ? st::dialogsBotIconActive + : (selected + ? st::dialogsBotIconOver + : st::dialogsBotIcon)); + } + } + return nullptr; +} + UnreadBadgeStyle::UnreadBadgeStyle() : size(st::dialogsUnreadHeight) , padding(st::dialogsUnreadPadding) , font(st::dialogsUnreadFont) { } -void paintUnreadCount( +QRect PaintUnreadBadge( Painter &p, const QString &unreadCount, int x, int y, const UnreadBadgeStyle &st, - int *outUnreadWidth, int allowDigits) { const auto text = (allowDigits > 0) && (unreadCount.size() > allowDigits + 1) ? qsl("..") + unreadCount.mid(unreadCount.size() - allowDigits) : unreadCount; - int unreadWidth = st.font->width(text); - int unreadRectWidth = unreadWidth + 2 * st.padding; - int unreadRectHeight = st.size; - accumulate_max(unreadRectWidth, unreadRectHeight); + const auto unreadRectHeight = st.size; + const auto unreadWidth = st.font->width(text); + const auto unreadRectWidth = std::max( + unreadWidth + 2 * st.padding, + unreadRectHeight); - int unreadRectLeft = x; - if ((st.align & Qt::AlignHorizontal_Mask) & style::al_center) { - unreadRectLeft = (x - unreadRectWidth) / 2; - } else if ((st.align & Qt::AlignHorizontal_Mask) & style::al_right) { - unreadRectLeft = x - unreadRectWidth; - } - int unreadRectTop = y; - if (outUnreadWidth) { - *outUnreadWidth = unreadRectWidth; - } + const auto unreadRectLeft = ((st.align & Qt::AlignHorizontal_Mask) & style::al_center) + ? (x - unreadRectWidth) / 2 + : ((st.align & Qt::AlignHorizontal_Mask) & style::al_right) + ? (x - unreadRectWidth) + : x; + const auto unreadRectTop = y; - paintUnreadBadge(p, QRect(unreadRectLeft, unreadRectTop, unreadRectWidth, unreadRectHeight), st); + const auto badge = QRect(unreadRectLeft, unreadRectTop, unreadRectWidth, unreadRectHeight); + PaintUnreadBadge(p, badge, st); - auto textTop = st.textTop ? st.textTop : (unreadRectHeight - st.font->height) / 2; + const auto textTop = st.textTop ? st.textTop : (unreadRectHeight - st.font->height) / 2; p.setFont(st.font); - p.setPen(st.active ? st::dialogsUnreadFgActive : (st.selected ? st::dialogsUnreadFgOver : st::dialogsUnreadFg)); + p.setPen(st.active + ? st::dialogsUnreadFgActive + : st.selected + ? st::dialogsUnreadFgOver + : st::dialogsUnreadFg); p.drawText(unreadRectLeft + (unreadRectWidth - unreadWidth) / 2, unreadRectTop + textTop + st.font->ascent, text); + + return badge; } void RowPainter::paint( @@ -807,6 +868,7 @@ void RowPainter::paint( displayUnreadMark, displayMentionBadge, unreadCount, + selected, active, unreadMuted, mentionMuted); @@ -925,6 +987,7 @@ void RowPainter::paint( displayUnreadMark, displayMentionBadge, unreadCount, + selected, active, unreadMuted, mentionMuted); @@ -1018,13 +1081,12 @@ void PaintCollapsedRow( const auto unreadRight = fullWidth - st::dialogsPadding.x(); UnreadBadgeStyle st; st.muted = true; - paintUnreadCount( + PaintUnreadBadge( p, QString::number(unread), unreadRight, unreadTop, - st, - nullptr); + st); } } diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.h b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.h index 46a118329..8f4841e7e 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.h @@ -83,13 +83,12 @@ struct UnreadBadgeStyle { UnreadBadgeSize sizeId = UnreadBadgeInDialogs; style::font font; }; -void paintUnreadCount( +QRect PaintUnreadBadge( Painter &p, const QString &t, int x, int y, const UnreadBadgeStyle &st, - int *outUnreadWidth = nullptr, int allowDigits = 0); void clearUnreadBadgesCache(); diff --git a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_pinned_chats_item.mm b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_pinned_chats_item.mm index 6b9d7a5dc..f8fe0c7ee 100644 --- a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_pinned_chats_item.mm +++ b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_pinned_chats_item.mm @@ -114,13 +114,12 @@ QImage UnreadBadge(not_null peer) { result.fill(Qt::transparent); Painter p(&result); - Dialogs::Ui::paintUnreadCount( + Dialogs::Ui::PaintUnreadBadge( p, unread, result.width(), result.height() - unreadSt.size, unreadSt, - nullptr, 2); return result; } diff --git a/Telegram/SourceFiles/ui/special_buttons.cpp b/Telegram/SourceFiles/ui/special_buttons.cpp index 03d016e18..69e48594b 100644 --- a/Telegram/SourceFiles/ui/special_buttons.cpp +++ b/Telegram/SourceFiles/ui/special_buttons.cpp @@ -102,7 +102,7 @@ void HistoryDownButton::paintEvent(QPaintEvent *e) { st.font = st::historyToDownBadgeFont; st.size = st::historyToDownBadgeSize; st.sizeId = Dialogs::Ui::UnreadBadgeInHistoryToDown; - Dialogs::Ui::paintUnreadCount(p, unreadString, width(), 0, st, nullptr, 4); + Dialogs::Ui::PaintUnreadBadge(p, unreadString, width(), 0, st, 4); } } diff --git a/Telegram/SourceFiles/ui/unread_badge.cpp b/Telegram/SourceFiles/ui/unread_badge.cpp index 167351b99..bc82d4a50 100644 --- a/Telegram/SourceFiles/ui/unread_badge.cpp +++ b/Telegram/SourceFiles/ui/unread_badge.cpp @@ -40,7 +40,7 @@ void UnreadBadge::paintEvent(QPaintEvent *e) { unreadSt.muted = !_active; auto unreadRight = width(); auto unreadTop = 0; - Dialogs::Ui::paintUnreadCount( + Dialogs::Ui::PaintUnreadBadge( p, _text, unreadRight, diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index f30802fb3..4a9c8bd98 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -293,19 +293,19 @@ void MainMenu::AccountButton::paintEvent(QPaintEvent *e) { const auto string = (_unreadBadge > 99) ? "99+" : QString::number(_unreadBadge); - auto unreadWidth = 0; const auto skip = _st.itemPadding.right() - st::mainMenu.itemToggleShift; const auto unreadRight = width() - skip; const auto unreadTop = (height() - _unreadSt.size) / 2; - Dialogs::Ui::paintUnreadCount( + const auto badge = Dialogs::Ui::PaintUnreadBadge( p, string, unreadRight, unreadTop, - _unreadSt, - &unreadWidth); - available -= unreadWidth + skip + st::mainMenu.itemStyle.font->spacew; + _unreadSt); + available -= badge.width() + + skip + + st::mainMenu.itemStyle.font->spacew; } else { available -= _st.itemPadding.right(); }