diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index ef1354868..afc87467d 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -594,7 +594,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { const auto stm = &st->messageStyle(false, false); if (clip.y() < _botAbout->rect.y() + _botAbout->rect.height() && clip.y() + clip.height() > _botAbout->rect.y()) { p.setTextPalette(stm->textPalette); - Ui::FillRoundRect(p, _botAbout->rect, stm->msgBg, stm->corners, &stm->msgShadow); + Ui::FillRoundRect(p, _botAbout->rect, stm->msgBg, stm->msgBgCorners, &stm->msgShadow); auto top = _botAbout->rect.top() + st::msgPadding.top(); if (!_history->peer->isRepliesChat()) { diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index d211ed2a9..c691c91f4 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -905,8 +905,6 @@ void Message::paintForwardedInfo( const PaintContext &context) const { if (displayForwardedFrom()) { const auto item = message(); - const auto outbg = hasOutLayout(); - const auto selected = context.selected(); const auto st = context.st; const auto stm = context.messageStyle(); const auto forwarded = item->Get(); @@ -1717,7 +1715,6 @@ void Message::drawInfo( } const auto item = message(); - const auto selected = context.selected(); auto infoW = infoWidth(); if (rtl()) infoRight = width - infoRight + infoW; diff --git a/Telegram/SourceFiles/history/view/media/history_view_document.cpp b/Telegram/SourceFiles/history/view/media/history_view_document.cpp index 3e204f145..4226c72f0 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_document.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_document.cpp @@ -373,8 +373,10 @@ void Document::draw( } p.drawPixmap(rthumb.topLeft(), thumb); if (context.selected()) { - auto overlayCorners = inWebPage ? Ui::SelectedOverlaySmallCorners : Ui::SelectedOverlayLargeCorners; - Ui::FillRoundRect(p, rthumb, p.textPalette().selectOverlay, overlayCorners); + const auto st = context.st; + Ui::FillRoundRect(p, rthumb, st->msgSelectOverlay(), inWebPage + ? st->msgSelectOverlayCornersSmall() + : st->msgSelectOverlayCornersLarge()); } if (radial || (!loaded && !_data->loading()) || _data->waitingForAlbum()) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index 41e8aaa34..f21224a5f 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -306,7 +306,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const { auto paintx = 0, painty = 0, paintw = width(), painth = height(); bool bubble = _parent->hasBubble(); - auto outbg = _parent->hasOutLayout(); + const auto outbg = context.outbg; auto inWebPage = (_parent->media() != this); auto captionw = paintw - st::msgPadding.left() - st::msgPadding.right(); @@ -462,7 +462,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const { } if (context.selected()) { - Ui::FillComplexOverlayRect(p, rthumb, roundRadius, roundCorners); + Ui::FillComplexOverlayRect(p, st, rthumb, roundRadius, roundCorners); } if (radial @@ -752,7 +752,7 @@ TextState Gif::textState(QPoint point, StateRequest request) const { } painth -= st::mediaCaptionSkip; } - auto outbg = _parent->hasOutLayout(); + const auto outbg = _parent->hasOutLayout(); auto inWebPage = (_parent->media() != this); auto isRound = _data->isVideoMessage(); auto usew = paintw, usex = 0; @@ -996,9 +996,9 @@ void Gif::drawGrouped( : highlightOpacity; if (overlayOpacity > 0.) { p.setOpacity(overlayOpacity); - Ui::FillComplexOverlayRect(p, geometry, roundRadius, corners); + Ui::FillComplexOverlayRect(p, st, geometry, roundRadius, corners); if (!context.selected()) { - Ui::FillComplexOverlayRect(p, geometry, roundRadius, corners); + Ui::FillComplexOverlayRect(p, st, geometry, roundRadius, corners); } p.setOpacity(1.); } diff --git a/Telegram/SourceFiles/history/view/media/history_view_location.cpp b/Telegram/SourceFiles/history/view/media/history_view_location.cpp index dcdb2dceb..1cee9f5c3 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_location.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_location.cpp @@ -192,7 +192,7 @@ void Location::draw(Painter &p, const PaintContext &context) const { const auto &pix = thumbnail->pixSingle(paintw, painth, paintw, painth, roundRadius, roundCorners); p.drawPixmap(rthumb.topLeft(), pix); } else { - Ui::FillComplexLocationRect(p, rthumb, roundRadius, roundCorners); + Ui::FillComplexLocationRect(p, st, rthumb, roundRadius, roundCorners); } const auto paintMarker = [&](const style::icon &icon) { icon.paint( @@ -204,7 +204,7 @@ void Location::draw(Painter &p, const PaintContext &context) const { paintMarker(st->historyMapPoint()); paintMarker(st->historyMapPointInner()); if (context.selected()) { - Ui::FillComplexOverlayRect(p, rthumb, roundRadius, roundCorners); + Ui::FillComplexOverlayRect(p, st, rthumb, roundRadius, roundCorners); } if (_parent->media() == this) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp index 99cdf2553..6c5be08aa 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp @@ -109,8 +109,6 @@ void UnwrappedMedia::draw(Painter &p, const PaintContext &context) const { if (width() < st::msgPadding.left() + st::msgPadding.right() + 1) { return; } - bool selected = (context.selection == FullSelection); - const auto rightAligned = _parent->hasOutLayout() && !_parent->delegate()->elementIsChatWide(); const auto inWebPage = (_parent->media() != this); diff --git a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp index 0b95e5b18..225dbc746 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp @@ -284,7 +284,7 @@ void Photo::draw(Painter &p, const PaintContext &context) const { }(); p.drawPixmap(rthumb.topLeft(), pix); if (context.selected()) { - Ui::FillComplexOverlayRect(p, rthumb, roundRadius, roundCorners); + Ui::FillComplexOverlayRect(p, st, rthumb, roundRadius, roundCorners); } } if (radial || (!loaded && !_data->loading())) { @@ -522,9 +522,9 @@ void Photo::drawGrouped( if (overlayOpacity > 0.) { p.setOpacity(overlayOpacity); const auto roundRadius = ImageRoundRadius::Large; - Ui::FillComplexOverlayRect(p, geometry, roundRadius, corners); + Ui::FillComplexOverlayRect(p, st, geometry, roundRadius, corners); if (!context.selected()) { - Ui::FillComplexOverlayRect(p, geometry, roundRadius, corners); + Ui::FillComplexOverlayRect(p, st, geometry, roundRadius, corners); } p.setOpacity(1.); } diff --git a/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp b/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp index b3e486658..a6649b8a6 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp @@ -180,7 +180,7 @@ void ThemeDocument::draw(Painter &p, const PaintContext &context) const { validateThumbnail(); p.drawPixmap(rthumb.topLeft(), _thumbnail); if (context.selected()) { - Ui::FillComplexOverlayRect(p, rthumb, roundRadius, roundCorners); + Ui::FillComplexOverlayRect(p, st, rthumb, roundRadius, roundCorners); } if (_data) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp index 7f51c7eee..8e291f7c0 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp @@ -455,7 +455,6 @@ void WebPage::draw(Painter &p, const PaintContext &context) const { const auto st = context.st; const auto sti = context.imageStyle(); const auto stm = context.messageStyle(); - const auto selected = context.selected(); const auto &barfg = stm->msgReplyBarColor; const auto &semibold = stm->msgServiceFg; @@ -503,8 +502,13 @@ void WebPage::draw(Painter &p, const PaintContext &context) const { pix = blurred->pixBlurredSingle(pixw, pixh, pw, ph, ImageRoundRadius::Small); } p.drawPixmapLeft(padding.left() + paintw - pw, tshift, width(), pix); - if (selected) { - Ui::FillRoundRect(p, style::rtlrect(padding.left() + paintw - pw, tshift, pw, _pixh, width()), p.textPalette().selectOverlay, Ui::SelectedOverlaySmallCorners); + if (context.selected()) { + const auto st = context.st; + Ui::FillRoundRect( + p, + style::rtlrect(padding.left() + paintw - pw, tshift, pw, _pixh, width()), + st->msgSelectOverlay(), + st->msgSelectOverlayCornersSmall()); } paintw -= pw + st::webPagePhotoDelta; } @@ -553,7 +557,9 @@ void WebPage::draw(Painter &p, const PaintContext &context) const { _attach->draw(p, context.translated( -attachLeft, -attachTop - ).withSelection(selected ? FullSelection : TextSelection())); + ).withSelection(context.selected() + ? FullSelection + : TextSelection())); auto pixwidth = _attach->width(); auto pixheight = _attach->height(); diff --git a/Telegram/SourceFiles/ui/cached_round_corners.cpp b/Telegram/SourceFiles/ui/cached_round_corners.cpp index 8e82a41ce..bcd9a9478 100644 --- a/Telegram/SourceFiles/ui/cached_round_corners.cpp +++ b/Telegram/SourceFiles/ui/cached_round_corners.cpp @@ -75,8 +75,6 @@ void CreateMaskCorners() { void CreatePaletteCorners() { PrepareCorners(MenuCorners, st::roundRadiusSmall, st::menuBg); PrepareCorners(BoxCorners, st::boxRadius, st::boxBg); - PrepareCorners(SelectedOverlaySmallCorners, st::roundRadiusSmall, st::msgSelectOverlay); - PrepareCorners(SelectedOverlayLargeCorners, st::historyMessageRadius, st::msgSelectOverlay); PrepareCorners(DateCorners, st::dateRadius, st::msgDateImgBg); PrepareCorners(OverviewVideoCorners, st::overviewVideoStatusRadius, st::msgDateImgBg); PrepareCorners(OverviewVideoSelectedCorners, st::overviewVideoStatusRadius, st::msgDateImgBgSelected); @@ -90,8 +88,6 @@ void CreatePaletteCorners() { PrepareCorners(Doc2Corners, st::roundRadiusSmall, st::msgFile2Bg); PrepareCorners(Doc3Corners, st::roundRadiusSmall, st::msgFile3Bg); PrepareCorners(Doc4Corners, st::roundRadiusSmall, st::msgFile4Bg); - - PrepareCorners(MessageInCorners, st::historyMessageRadius, st::msgInBg, &st::msgInShadow); } } // namespace @@ -113,48 +109,6 @@ void FinishCachedCorners() { PaletteChangedLifetime.destroy(); } -void RectWithCorners(Painter &p, QRect rect, const style::color &bg, CachedRoundCorners index, RectParts corners) { - auto parts = RectPart::Top - | RectPart::NoTopBottom - | RectPart::Bottom - | corners; - FillRoundRect(p, rect, bg, index, nullptr, parts); - if ((corners & RectPart::AllCorners) != RectPart::AllCorners) { - const auto size = Corners[index].p[0].width() / style::DevicePixelRatio(); - if (!(corners & RectPart::TopLeft)) { - p.fillRect(rect.x(), rect.y(), size, size, bg); - } - if (!(corners & RectPart::TopRight)) { - p.fillRect(rect.x() + rect.width() - size, rect.y(), size, size, bg); - } - if (!(corners & RectPart::BottomLeft)) { - p.fillRect(rect.x(), rect.y() + rect.height() - size, size, size, bg); - } - if (!(corners & RectPart::BottomRight)) { - p.fillRect(rect.x() + rect.width() - size, rect.y() + rect.height() - size, size, size, bg); - } - } -} - -void FillComplexOverlayRect(Painter &p, QRect rect, ImageRoundRadius radius, RectParts corners) { - if (radius == ImageRoundRadius::Ellipse) { - PainterHighQualityEnabler hq(p); - p.setPen(Qt::NoPen); - p.setBrush(p.textPalette().selectOverlay); - p.drawEllipse(rect); - } else { - auto overlayCorners = (radius == ImageRoundRadius::Small) - ? SelectedOverlaySmallCorners - : SelectedOverlayLargeCorners; - const auto bg = p.textPalette().selectOverlay; - RectWithCorners(p, rect, bg, overlayCorners, corners); - } -} - -void FillComplexLocationRect(Painter &p, QRect rect, ImageRoundRadius radius, RectParts corners) { - RectWithCorners(p, rect, st::msgInBg, MessageInCorners, corners); -} - void FillRoundRect(Painter &p, int32 x, int32 y, int32 w, int32 h, style::color bg, const CornersPixmaps &corner, const style::color *shadow, RectParts parts) { auto cornerWidth = corner.p[0].width() / style::DevicePixelRatio(); auto cornerHeight = corner.p[0].height() / style::DevicePixelRatio(); diff --git a/Telegram/SourceFiles/ui/cached_round_corners.h b/Telegram/SourceFiles/ui/cached_round_corners.h index a561f199c..17ee285ad 100644 --- a/Telegram/SourceFiles/ui/cached_round_corners.h +++ b/Telegram/SourceFiles/ui/cached_round_corners.h @@ -22,8 +22,6 @@ struct CornersPixmaps { enum CachedRoundCorners : int { BoxCorners, MenuCorners, - SelectedOverlaySmallCorners, - SelectedOverlayLargeCorners, DateCorners, OverviewVideoCorners, OverviewVideoSelectedCorners, @@ -38,14 +36,9 @@ enum CachedRoundCorners : int { Doc3Corners, Doc4Corners, - MessageInCorners, // with shadow - RoundCornersCount }; -void FillComplexOverlayRect(Painter &p, QRect rect, ImageRoundRadius radius, RectParts corners); -void FillComplexLocationRect(Painter &p, QRect rect, ImageRoundRadius radius, RectParts corners); - void FillRoundRect(Painter &p, int32 x, int32 y, int32 w, int32 h, style::color bg, CachedRoundCorners index, const style::color *shadow = nullptr, RectParts parts = RectPart::Full); inline void FillRoundRect(Painter &p, const QRect &rect, style::color bg, CachedRoundCorners index, const style::color *shadow = nullptr, RectParts parts = RectPart::Full) { FillRoundRect(p, rect.x(), rect.y(), rect.width(), rect.height(), bg, index, shadow, parts); diff --git a/Telegram/SourceFiles/ui/chat/chat_style.cpp b/Telegram/SourceFiles/ui/chat/chat_style.cpp index b5e80510d..db9ace7ef 100644 --- a/Telegram/SourceFiles/ui/chat/chat_style.cpp +++ b/Telegram/SourceFiles/ui/chat/chat_style.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/chat/chat_style.h" #include "ui/chat/chat_theme.h" +#include "ui/image/image_prepare.h" // ImageRoundRadius #include "ui/ui_utility.h" #include "styles/style_chat.h" #include "styles/style_dialogs.h" @@ -25,6 +26,49 @@ void EnsureCorners( } } +void RectWithCorners( + Painter &p, + QRect rect, + const style::color &bg, + const CornersPixmaps &corners, + RectParts roundCorners) { + const auto parts = RectPart::Top + | RectPart::NoTopBottom + | RectPart::Bottom + | roundCorners; + FillRoundRect(p, rect, bg, corners, nullptr, parts); + if ((roundCorners & RectPart::AllCorners) != RectPart::AllCorners) { + const auto size = corners.p[0].width() / style::DevicePixelRatio(); + if (!(roundCorners & RectPart::TopLeft)) { + p.fillRect(rect.x(), rect.y(), size, size, bg); + } + if (!(roundCorners & RectPart::TopRight)) { + p.fillRect( + rect.x() + rect.width() - size, + rect.y(), + size, + size, + bg); + } + if (!(roundCorners & RectPart::BottomLeft)) { + p.fillRect( + rect.x(), + rect.y() + rect.height() - size, + size, + size, + bg); + } + if (!(roundCorners & RectPart::BottomRight)) { + p.fillRect( + rect.x() + rect.width() - size, + rect.y() + rect.height() - size, + size, + size, + bg); + } + } +} + } // namespace not_null ChatPaintContext::messageStyle() const { @@ -427,7 +471,7 @@ void ChatStyle::assignPalette(not_null palette) { *static_cast(this) = *palette; style::internal::resetIcons(); for (auto &style : _messageStyles) { - style.corners = {}; + style.msgBgCorners = {}; } for (auto &style : _imageStyles) { style.msgDateImgBgCorners = {}; @@ -437,6 +481,8 @@ void ChatStyle::assignPalette(not_null palette) { _serviceBgCornersNormal = {}; _serviceBgCornersInverted = {}; _msgBotKbOverBgAddCorners = {}; + _msgSelectOverlayCornersSmall = {}; + _msgSelectOverlayCornersLarge = {}; } const CornersPixmaps &ChatStyle::serviceBgCornersNormal() const { @@ -470,7 +516,7 @@ const CornersPixmaps &ChatStyle::serviceBgCornersInverted() const { const MessageStyle &ChatStyle::messageStyle(bool outbg, bool selected) const { auto &result = messageStyleRaw(outbg, selected); EnsureCorners( - result.corners, + result.msgBgCorners, st::historyMessageRadius, result.msgBg, &result.msgShadow); @@ -502,6 +548,22 @@ const CornersPixmaps &ChatStyle::msgBotKbOverBgAddCorners() const { return _msgBotKbOverBgAddCorners; } +const CornersPixmaps &ChatStyle::msgSelectOverlayCornersSmall() const { + EnsureCorners( + _msgSelectOverlayCornersSmall, + st::roundRadiusSmall, + msgSelectOverlay()); + return _msgSelectOverlayCornersSmall; +} + +const CornersPixmaps &ChatStyle::msgSelectOverlayCornersLarge() const { + EnsureCorners( + _msgSelectOverlayCornersLarge, + st::historyMessageRadius, + msgSelectOverlay()); + return _msgSelectOverlayCornersLarge; +} + MessageStyle &ChatStyle::messageStyleRaw(bool outbg, bool selected) const { return _messageStyles[(outbg ? 2 : 0) + (selected ? 1 : 0)]; } @@ -576,4 +638,34 @@ void ChatStyle::make( make(imageSelected().*my, originalSelected); } +void FillComplexOverlayRect( + Painter &p, + not_null st, + QRect rect, + ImageRoundRadius radius, + RectParts roundCorners) { + const auto bg = st->msgSelectOverlay(); + if (radius == ImageRoundRadius::Ellipse) { + PainterHighQualityEnabler hq(p); + p.setPen(Qt::NoPen); + p.setBrush(bg); + p.drawEllipse(rect); + } else { + const auto &corners = (radius == ImageRoundRadius::Small) + ? st->msgSelectOverlayCornersSmall() + : st->msgSelectOverlayCornersLarge(); + RectWithCorners(p, rect, bg, corners, roundCorners); + } +} + +void FillComplexLocationRect( + Painter &p, + not_null st, + QRect rect, + ImageRoundRadius radius, + RectParts roundCorners) { + const auto stm = &st->messageStyle(false, false); + RectWithCorners(p, rect, stm->msgBg, stm->msgBgCorners, roundCorners); +} + } // namespace Ui diff --git a/Telegram/SourceFiles/ui/chat/chat_style.h b/Telegram/SourceFiles/ui/chat/chat_style.h index 3b1948688..59a6fb4cd 100644 --- a/Telegram/SourceFiles/ui/chat/chat_style.h +++ b/Telegram/SourceFiles/ui/chat/chat_style.h @@ -11,6 +11,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/style/style_core_palette.h" #include "layout/layout_selection.h" +enum class ImageRoundRadius; + namespace Ui { class ChatTheme; @@ -18,7 +20,7 @@ class ChatStyle; struct BubblePattern; struct MessageStyle { - CornersPixmaps corners; + CornersPixmaps msgBgCorners; style::color msgBg; style::color msgShadow; style::color msgServiceFg; @@ -143,6 +145,8 @@ public: [[nodiscard]] const MessageImageStyle &imageStyle(bool selected) const; [[nodiscard]] const CornersPixmaps &msgBotKbOverBgAddCorners() const; + [[nodiscard]] const CornersPixmaps &msgSelectOverlayCornersSmall() const; + [[nodiscard]] const CornersPixmaps &msgSelectOverlayCornersLarge() const; [[nodiscard]] const style::TextPalette &historyPsaForwardPalette() const { return _historyPsaForwardPalette; @@ -257,6 +261,8 @@ private: mutable std::array _imageStyles; mutable CornersPixmaps _msgBotKbOverBgAddCorners; + mutable CornersPixmaps _msgSelectOverlayCornersSmall; + mutable CornersPixmaps _msgSelectOverlayCornersLarge; style::TextPalette _historyPsaForwardPalette; style::TextPalette _imgReplyTextPalette; @@ -287,4 +293,17 @@ private: }; +void FillComplexOverlayRect( + Painter &p, + not_null st, + QRect rect, + ImageRoundRadius radius, + RectParts roundCorners); +void FillComplexLocationRect( + Painter &p, + not_null st, + QRect rect, + ImageRoundRadius radius, + RectParts roundCorners); + } // namespace Ui diff --git a/Telegram/SourceFiles/ui/chat/message_bubble.cpp b/Telegram/SourceFiles/ui/chat/message_bubble.cpp index 5766cc747..08c62ce8a 100644 --- a/Telegram/SourceFiles/ui/chat/message_bubble.cpp +++ b/Telegram/SourceFiles/ui/chat/message_bubble.cpp @@ -236,7 +236,7 @@ void PaintSolidBubble(Painter &p, const SimpleBubble &args) { }, [&](const QRect &rect) { p.fillRect(rect, *sh); }, [&](const QRect &rect, RectParts parts) { - Ui::FillRoundRect(p, rect, bg, st.corners, sh, parts); + Ui::FillRoundRect(p, rect, bg, st.msgBgCorners, sh, parts); }, [&](const QPoint &bottomPosition) { tail.paint(p, bottomPosition - tailShift, args.outerWidth); return tail.width();