diff --git a/Telegram/SourceFiles/boxes/background_preview_box.cpp b/Telegram/SourceFiles/boxes/background_preview_box.cpp index f94200a29..b9e041b6a 100644 --- a/Telegram/SourceFiles/boxes/background_preview_box.cpp +++ b/Telegram/SourceFiles/boxes/background_preview_box.cpp @@ -594,14 +594,18 @@ QRect BackgroundPreviewBox::radialRect() const { void BackgroundPreviewBox::paintTexts(Painter &p, crl::time ms) { const auto height1 = _text1->height(); const auto height2 = _text2->height(); - const auto context = _controller->defaultChatTheme()->preparePaintContext( + auto context = _controller->defaultChatTheme()->preparePaintContext( _chatStyle.get(), rect(), rect()); p.translate(0, textsTop()); paintDate(p); + + context.outbg = _text1->hasOutLayout(); _text1->draw(p, context); p.translate(0, height1); + + context.outbg = _text2->hasOutLayout(); _text2->draw(p, context); p.translate(0, height2); } diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index 4eebda25e..c257d1291 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -366,7 +366,14 @@ void HistoryMessageReply::paint( auto to = style::rtlrect(x + st::msgReplyBarSkip, y + st::msgReplyPadding.top() + st::msgReplyBarPos.y(), st::msgReplyBarSize.height(), st::msgReplyBarSize.height(), w + 2 * x); auto previewWidth = image->width() / cIntRetinaFactor(); auto previewHeight = image->height() / cIntRetinaFactor(); - auto preview = image->pixSingle(previewWidth, previewHeight, to.width(), to.height(), ImageRoundRadius::Small, RectPart::AllCorners, context.selected() ? &st->msgStickerOverlay() : nullptr); + auto preview = image->pixSingle( + previewWidth, + previewHeight, + to.width(), + to.height(), + ImageRoundRadius::Small, + RectPart::AllCorners, + context.selected() ? &st->msgStickerOverlay() : nullptr); p.drawPixmap(to.x(), to.y(), preview); } } diff --git a/Telegram/SourceFiles/history/view/media/history_view_dice.cpp b/Telegram/SourceFiles/history/view/media/history_view_dice.cpp index 4afa66425..83f67f71e 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_dice.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_dice.cpp @@ -55,7 +55,7 @@ ClickHandlerPtr Dice::link() { return _link; } -void Dice::draw(Painter &p, const QRect &r, bool selected) { +void Dice::draw(Painter &p, const PaintContext &context, const QRect &r) { if (!_start) { if (const auto document = Lookup(_parent, _dice->emoji(), 0)) { _start.emplace(_parent, document); @@ -74,9 +74,9 @@ void Dice::draw(Painter &p, const QRect &r, bool selected) { _drawingEnd = false; } if (_drawingEnd) { - _end->draw(p, r, selected); + _end->draw(p, context, r); } else if (_start) { - _start->draw(p, r, selected); + _start->draw(p, context, r); if (_end && _end->readyToDrawLottie() && _start->atTheEnd()) { _drawingEnd = true; } diff --git a/Telegram/SourceFiles/history/view/media/history_view_dice.h b/Telegram/SourceFiles/history/view/media/history_view_dice.h index f412343b7..d6e77d743 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_dice.h +++ b/Telegram/SourceFiles/history/view/media/history_view_dice.h @@ -22,7 +22,10 @@ public: ~Dice(); QSize size() override; - void draw(Painter &p, const QRect &r, bool selected) override; + void draw( + Painter &p, + const PaintContext &context, + const QRect &r) override; ClickHandlerPtr link() override; diff --git a/Telegram/SourceFiles/history/view/media/history_view_game.cpp b/Telegram/SourceFiles/history/view/media/history_view_game.cpp index eede60429..3a056504d 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_game.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_game.cpp @@ -266,7 +266,7 @@ void Game::draw(Painter &p, const PaintContext &context) const { Ui::FillRoundRect(p, style::rtlrect(gameX, gameY, gameW, gameH, pixwidth), sti->msgDateImgBg, sti->msgDateImgBgCorners); p.setFont(st::msgDateFont); - p.setPen(st::msgDateImgFg); + p.setPen(st->msgDateImgFg()); p.drawTextLeft(gameX + st::msgDateImgPadding.x(), gameY + st::msgDateImgPadding.y(), pixwidth, tr::lng_game_tag(tr::now).toUpper()); p.translate(-attachLeft, -attachTop); diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index 7ad7b1c32..41e8aaa34 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -286,7 +286,6 @@ void Gif::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.selection == FullSelection); const auto autoPaused = _parent->delegate()->elementIsGifPaused(); const auto cornerDownload = downloadInCorner(); const auto canBePlayed = _dataMedia->canBePlayed(); @@ -407,7 +406,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const { if (const auto playback = videoPlayback()) { const auto value = playback->value(); if (value > 0.) { - auto pen = st::historyVideoMessageProgressFg->p; + auto pen = st->historyVideoMessageProgressFg()->p; auto was = p.pen(); pen.setWidth(st::radialLine); pen.setCapStyle(Qt::RoundCap); @@ -456,13 +455,13 @@ void Gif::draw(Painter &p, const PaintContext &context) const { | RectPart::NoTopBottom | (roundTop ? RectPart::Top : RectPart::None) | (roundBottom ? RectPart::Bottom : RectPart::None); - Ui::FillRoundRect(p, rthumb.marginsAdded({ 0, roundTop ? 0 : margin, 0, roundBottom ? 0 : margin }), st::imageBg, roundRadius, parts); + Ui::FillRoundRect(p, rthumb.marginsAdded({ 0, roundTop ? 0 : margin, 0, roundBottom ? 0 : margin }), st->imageBg(), roundRadius, parts); } } } } - if (selected) { + if (context.selected()) { Ui::FillComplexOverlayRect(p, rthumb, roundRadius, roundCorners); } @@ -479,7 +478,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const { const auto innerSize = st::msgFileLayout.thumbSize; auto inner = QRect(rthumb.x() + (rthumb.width() - innerSize) / 2, rthumb.y() + (rthumb.height() - innerSize) / 2, innerSize, innerSize); p.setPen(Qt::NoPen); - if (selected) { + if (context.selected()) { p.setBrush(st->msgDateImgBgSelected()); } else if (isThumbAnimation()) { auto over = _animation->a_thumbOver.value(1.); @@ -501,14 +500,14 @@ void Gif::draw(Painter &p, const PaintContext &context) const { if (streamingMode && !_data->uploading()) { return nullptr; } else if ((loaded || canBePlayed) && (!radial || cornerDownload)) { - return &(selected ? st::historyFileThumbPlaySelected : st::historyFileThumbPlay); + return &sti->historyFileThumbPlay; } else if (radial || _data->loading()) { if (!item->isSending() || _data->uploading()) { - return &(selected ? st::historyFileThumbCancelSelected : st::historyFileThumbCancel); + return &sti->historyFileThumbCancel; } return nullptr; } - return &(selected ? st::historyFileThumbDownloadSelected : st::historyFileThumbDownload); + return &sti->historyFileThumbDownload; }(); if (icon) { icon->paintInCenter(p, inner); @@ -516,9 +515,6 @@ void Gif::draw(Painter &p, const PaintContext &context) const { p.setOpacity(1); if (radial) { QRect rinner(inner.marginsRemoved(QMargins(st::msgFileRadialLine, st::msgFileRadialLine, st::msgFileRadialLine, st::msgFileRadialLine))); - const auto fg = selected - ? st::historyFileThumbRadialFgSelected - : st::historyFileThumbRadialFg; if (streamedForWaiting && !_data->uploading()) { Ui::InfiniteRadialAnimation::Draw( p, @@ -526,14 +522,14 @@ void Gif::draw(Painter &p, const PaintContext &context) const { rinner.topLeft(), rinner.size(), width(), - fg, + sti->historyFileThumbRadialFg, st::msgFileRadialLine); } else if (!cornerDownload) { _animation->radial.draw( p, rinner, st::msgFileRadialLine, - fg); + sti->historyFileThumbRadialFg); } } } @@ -543,7 +539,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const { p.setBrush(sti->msgDateImgBg); PainterHighQualityEnabler hq(p); p.drawEllipse(muteRect); - (selected ? st::historyVideoMessageMuteSelected : st::historyVideoMessageMute).paintInCenter(p, muteRect); + sti->historyVideoMessageMute.paintInCenter(p, muteRect); } if (!isRound) { @@ -561,11 +557,11 @@ void Gif::draw(Painter &p, const PaintContext &context) const { } Ui::FillRoundRect(p, style::rtlrect(statusX - st::msgDateImgPadding.x(), statusY - st::msgDateImgPadding.y(), statusW, statusH, width()), sti->msgServiceBg, sti->msgServiceBgCorners); p.setFont(st::normalFont); - p.setPen(st::msgServiceFg); + p.setPen(st->msgServiceFg()); p.drawTextLeft(statusX, statusY, width(), _statusText, statusW - 2 * st::msgDateImgPadding.x()); if (mediaUnread) { p.setPen(Qt::NoPen); - p.setBrush(st::msgServiceFg); + p.setBrush(st->msgServiceFg()); { PainterHighQualityEnabler hq(p); @@ -591,7 +587,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const { if (rtl()) rectx = width() - rectx - rectw; Ui::FillRoundRect(p, rectx, recty, rectw, recth, sti->msgServiceBg, sti->msgServiceBgCorners); - p.setPen(st::msgServiceFg); + p.setPen(st->msgServiceFg()); rectx += st::msgReplyPadding.left(); rectw = innerw; if (forwarded) { @@ -611,7 +607,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const { } } if (!isRound && !_caption.isEmpty()) { - p.setPen(outbg ? (selected ? st::historyTextOutFgSelected : st::historyTextOutFg) : (selected ? st::historyTextInFgSelected : st::historyTextInFg)); + p.setPen(stm->historyTextFg); _caption.draw(p, st::msgPadding.left(), painty + painth + st::mediaCaptionSkip, captionw, style::al_left, 0, -1, context.selection); } else if (!inWebPage) { auto fullRight = paintx + usex + usew; @@ -695,7 +691,7 @@ void Gif::drawCornerStatus( const auto statusTextTop = statusY + (cornerDownload ? (((statusH - 2 * st::normalFont->height) / 3) - padding.y()) : 0); Ui::FillRoundRect(p, around, sti->msgDateImgBg, sti->msgDateImgBgCorners); p.setFont(st::normalFont); - p.setPen(st::msgDateImgFg); + p.setPen(st->msgDateImgFg()); p.drawTextLeft(statusX + addLeft, statusTextTop, width(), text, statusW - 2 * padding.x()); if (cornerDownload) { const auto downloadTextTop = statusY + st::normalFont->height + (2 * (statusH - 2 * st::normalFont->height) / 3) - padding.y(); diff --git a/Telegram/SourceFiles/history/view/media/history_view_invoice.cpp b/Telegram/SourceFiles/history/view/media/history_view_invoice.cpp index 5a09d0590..3f78fb6cd 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_invoice.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_invoice.cpp @@ -263,7 +263,7 @@ void Invoice::draw(Painter &p, const PaintContext &context) const { Ui::FillRoundRect(p, style::rtlrect(statusX, statusY, statusW, statusH, pixwidth), sti->msgDateImgBg, sti->msgDateImgBgCorners); p.setFont(st::msgDateFont); - p.setPen(st::msgDateImgFg); + p.setPen(st->msgDateImgFg()); _status.drawLeftElided(p, statusX + st::msgDateImgPadding.x(), statusY + st::msgDateImgPadding.y(), available, pixwidth); p.translate(-attachLeft, -attachTop); diff --git a/Telegram/SourceFiles/history/view/media/history_view_large_emoji.cpp b/Telegram/SourceFiles/history/view/media/history_view_large_emoji.cpp index d2e2042dd..941af50ee 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_large_emoji.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_large_emoji.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_item.h" #include "history/history.h" #include "ui/image/image.h" +#include "ui/chat/chat_style.h" #include "data/data_file_origin.h" #include "styles/style_chat.h" @@ -65,7 +66,10 @@ QSize LargeEmoji::size() { return _size; } -void LargeEmoji::draw(Painter &p, const QRect &r, bool selected) { +void LargeEmoji::draw( + Painter &p, + const PaintContext &context, + const QRect &r) { auto &&images = NonEmpty(_images); const auto &padding = st::largeEmojiPadding; auto x = r.x() + (r.width() - _size.width()) / 2 + padding.left(); @@ -76,9 +80,8 @@ void LargeEmoji::draw(Painter &p, const QRect &r, bool selected) { const auto w = size.width(); if (const auto &prepared = image->image) { const auto h = size.height(); - const auto &c = st::msgStickerOverlay; - const auto pixmap = selected - ? prepared->pixColored(c, w, h) + const auto pixmap = context.selected() + ? prepared->pixColored(context.st->msgStickerOverlay(), w, h) : prepared->pix(w, h); p.drawPixmap(x, y, pixmap); } else if (image->load) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_large_emoji.h b/Telegram/SourceFiles/history/view/media/history_view_large_emoji.h index 710945ebf..e89e91386 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_large_emoji.h +++ b/Telegram/SourceFiles/history/view/media/history_view_large_emoji.h @@ -27,7 +27,10 @@ public: const Ui::Text::IsolatedEmoji &emoji); QSize size() override; - void draw(Painter &p, const QRect &r, bool selected) override; + void draw( + Painter &p, + const PaintContext &context, + const QRect &r) override; bool alwaysShowOutTimestamp() override { return true; diff --git a/Telegram/SourceFiles/history/view/media/history_view_location.cpp b/Telegram/SourceFiles/history/view/media/history_view_location.cpp index abbfb06d9..dcdb2dceb 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_location.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_location.cpp @@ -152,6 +152,7 @@ void Location::draw(Painter &p, const PaintContext &context) const { if (width() < st::msgPadding.left() + st::msgPadding.right() + 1) return; auto paintx = 0, painty = 0, paintw = width(), painth = height(); bool bubble = _parent->hasBubble(); + const auto st = context.st; const auto sti = context.imageStyle(); const auto stm = context.messageStyle(); @@ -200,8 +201,8 @@ void Location::draw(Painter &p, const PaintContext &context) const { rthumb.y() + (rthumb.height() / 2) - icon.height(), width()); }; - paintMarker(st::historyMapPoint); - paintMarker(st::historyMapPointInner); + paintMarker(st->historyMapPoint()); + paintMarker(st->historyMapPointInner()); if (context.selected()) { Ui::FillComplexOverlayRect(p, rthumb, roundRadius, roundCorners); } diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp index 960709a9a..b9498e6a8 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp @@ -335,15 +335,14 @@ void GroupedMedia::draw(Painter &p, const PaintContext &context) const { } // date - const auto selected = (selection == FullSelection); if (!_caption.isEmpty()) { const auto captionw = width() - st::msgPadding.left() - st::msgPadding.right(); - const auto outbg = _parent->hasOutLayout(); const auto captiony = height() - groupPadding.bottom() - (isBubbleBottom() ? st::msgPadding.bottom() : 0) - _caption.countHeight(captionw); - p.setPen(outbg ? (selected ? st::historyTextOutFgSelected : st::historyTextOutFg) : (selected ? st::historyTextInFgSelected : st::historyTextInFg)); + const auto stm = context.messageStyle(); + p.setPen(stm->historyTextFg); _caption.draw(p, st::msgPadding.left(), captiony, captionw, style::al_left, 0, -1, selection); } else if (_parent->media() == this) { auto fullRight = width(); 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 e99b436bd..99cdf2553 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp @@ -137,7 +137,7 @@ void UnwrappedMedia::draw(Painter &p, const PaintContext &context) const { height() - st::msgDateImgPadding.y() * 2 - st::msgDateFont->height) : _contentSize.height(); const auto inner = QRect(usex, usey, usew, useh); - _content->draw(p, inner, selected); + _content->draw(p, context, inner); if (!inWebPage) { drawSurrounding(p, inner, context, via, reply, forwarded); @@ -205,7 +205,7 @@ void UnwrappedMedia::drawSurrounding( if (rtl()) rectx = width() - rectx - rectw; Ui::FillRoundRect(p, rectx, recty, rectw, recth, sti->msgServiceBg, sti->msgServiceBgCorners); - p.setPen(st::msgServiceFg); + p.setPen(st->msgServiceFg()); rectx += st::msgReplyPadding.left(); rectw -= st::msgReplyPadding.left() + st::msgReplyPadding.right(); if (forwarded) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.h b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.h index 2d3419040..fabcdddf8 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.h +++ b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.h @@ -23,7 +23,10 @@ public: public: [[nodiscard]] virtual QSize size() = 0; - virtual void draw(Painter &p, const QRect &r, bool selected) = 0; + virtual void draw( + Painter &p, + const PaintContext &context, + const QRect &r) = 0; [[nodiscard]] virtual ClickHandlerPtr link() { return nullptr; diff --git a/Telegram/SourceFiles/history/view/media/history_view_poll.cpp b/Telegram/SourceFiles/history/view/media/history_view_poll.cpp index fb6019b33..786156459 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_poll.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_poll.cpp @@ -723,10 +723,7 @@ void Poll::draw(Painter &p, const PaintContext &context) const { checkSendingAnimation(); _poll->checkResultsReload(_parent->data(), context.now); - const auto outbg = _parent->hasOutLayout(); - const auto selected = (context.selection == FullSelection); - const auto ®ular = selected ? (outbg ? st::msgOutDateFgSelected : st::msgInDateFgSelected) : (outbg ? st::msgOutDateFg : st::msgInDateFg); - + const auto stm = context.messageStyle(); const auto padding = st::msgPadding; auto tshift = st::historyPollQuestionTop; if (!isBubbleTop()) { @@ -734,11 +731,11 @@ void Poll::draw(Painter &p, const PaintContext &context) const { } paintw -= padding.left() + padding.right(); - p.setPen(outbg ? st::webPageTitleOutFg : st::webPageTitleInFg); + p.setPen(stm->webPageTitleFg); _question.drawLeft(p, padding.left(), tshift, paintw, width(), style::al_left, 0, -1, context.selection); tshift += _question.countHeight(paintw) + st::historyPollSubtitleSkip; - p.setPen(regular); + p.setPen(stm->msgDateFg); _subtitle.drawLeftElided(p, padding.left(), tshift, paintw, width()); paintRecentVoters(p, padding.left() + _subtitle.maxWidth(), tshift, context); paintCloseByTimer(p, padding.left() + paintw, tshift, context); @@ -791,10 +788,8 @@ void Poll::paintInlineFooter( int top, int paintw, const PaintContext &context) const { - const auto selected = context.selected(); - const auto outbg = _parent->hasOutLayout(); - const auto ®ular = selected ? (outbg ? st::msgOutDateFgSelected : st::msgInDateFgSelected) : (outbg ? st::msgOutDateFg : st::msgInDateFg); - p.setPen(regular); + const auto stm = context.messageStyle(); + p.setPen(stm->msgDateFg); _totalVotesLabel.drawLeftElided( p, left, @@ -812,11 +807,9 @@ void Poll::paintBottom( int paintw, const PaintContext &context) const { const auto stringtop = top + st::msgPadding.bottom() + st::historyPollBottomButtonTop; - const auto selected = context.selected(); - const auto outbg = _parent->hasOutLayout(); - const auto ®ular = selected ? (outbg ? st::msgOutDateFgSelected : st::msgInDateFgSelected) : (outbg ? st::msgOutDateFg : st::msgInDateFg); + const auto stm = context.messageStyle(); if (showVotersCount()) { - p.setPen(regular); + p.setPen(stm->msgDateFg); _totalVotesLabel.draw(p, left, stringtop, paintw, style::al_top); } else { const auto link = showVotes() @@ -834,11 +827,7 @@ void Poll::paintBottom( p.setOpacity(1.); } p.setFont(st::semiboldFont); - if (!link) { - p.setPen(regular); - } else { - p.setPen(outbg ? (selected ? st::msgFileThumbLinkOutFgSelected : st::msgFileThumbLinkOutFg) : (selected ? st::msgFileThumbLinkInFgSelected : st::msgFileThumbLinkInFg)); - } + p.setPen(link ? stm->msgFileThumbLinkFg : stm->msgDateFg); const auto string = showVotes() ? tr::lng_polls_view_results(tr::now, Ui::Text::Upper) : tr::lng_polls_submit_votes(tr::now, Ui::Text::Upper); @@ -875,11 +864,8 @@ void Poll::paintRecentVoters( + (count - 1) * st::historyPollRecentVoterSkip; auto y = top; const auto size = st::historyPollRecentVoterSize; - const auto outbg = _parent->hasOutLayout(); - const auto selected = (context.selection == FullSelection); - auto pen = (selected - ? (outbg ? st::msgOutBgSelected : st::msgInBgSelected) - : (outbg ? st::msgOutBg : st::msgInBg))->p; + const auto stm = context.messageStyle(); + auto pen = stm->msgBg->p; pen.setWidth(st::lineWidth); auto created = false; @@ -947,22 +933,16 @@ void Poll::paintCloseByTimer( _close->radial.stop(); } const auto time = Ui::FormatDurationText(int(std::ceil(left / 1000.))); - const auto outbg = _parent->hasOutLayout(); - const auto selected = context.selected(); - const auto &icon = selected - ? (outbg - ? st::historyQuizTimerOutSelected - : st::historyQuizTimerInSelected) - : (outbg ? st::historyQuizTimerOut : st::historyQuizTimerIn); + const auto st = context.st; + const auto stm = context.messageStyle(); + const auto &icon = stm->historyQuizTimer; const auto x = right - icon.width(); const auto y = top + (st::normalFont->height - icon.height()) / 2 - st::lineWidth; const auto ®ular = (left < kCriticalCloseDuration) - ? st::boxTextFgError - : selected - ? (outbg ? st::msgOutDateFgSelected : st::msgInDateFgSelected) - : (outbg ? st::msgOutDateFg : st::msgInDateFg); + ? st->boxTextFgError() + : stm->msgDateFg; p.setPen(regular); const auto timeWidth = st::normalFont->width(time); p.drawTextLeft(x - timeWidth, top, width(), time, timeWidth); @@ -1004,12 +984,8 @@ void Poll::paintShowSolution( _showSolutionLink = std::make_shared( crl::guard(this, [=] { showSolution(); })); } - const auto outbg = _parent->hasOutLayout(); - const auto &icon = context.selected() - ? (outbg - ? st::historyQuizExplainOutSelected - : st::historyQuizExplainInSelected) - : (outbg ? st::historyQuizExplainOut : st::historyQuizExplainIn); + const auto stm = context.messageStyle(); + const auto &icon = stm->historyQuizExplain; const auto x = right - icon.width(); const auto y = top + (st::normalFont->height - icon.height()) / 2; if (shown == 1.) { @@ -1034,7 +1010,7 @@ int Poll::paintAnswer( int outerWidth, const PaintContext &context) const { const auto height = countAnswerHeight(answer, width); - const auto outbg = _parent->hasOutLayout(); + const auto stm = context.messageStyle(); const auto aleft = left + st::historyPollAnswerPadding.left(); const auto awidth = width - st::historyPollAnswerPadding.left() @@ -1106,7 +1082,7 @@ int Poll::paintAnswer( } top += st::historyPollAnswerPadding.top(); - p.setPen(outbg ? st::webPageDescriptionOutFg : st::webPageDescriptionInFg); + p.setPen(stm->webPageDescriptionFg); answer.text.drawLeft(p, aleft, top, awidth, outerWidth); return height; @@ -1120,14 +1096,13 @@ void Poll::paintRadio( const PaintContext &context) const { top += st::historyPollAnswerPadding.top(); - const auto outbg = _parent->hasOutLayout(); - const auto selected = context.selected(); const auto st = context.st; + const auto stm = context.messageStyle(); PainterHighQualityEnabler hq(p); const auto &radio = st::historyPollRadio; const auto over = ClickHandler::showAsActive(answer.handler); - const auto ®ular = selected ? (outbg ? st::msgOutDateFgSelected : st::msgInDateFgSelected) : (outbg ? st::msgOutDateFg : st::msgInDateFg); + const auto ®ular = stm->msgDateFg; const auto checkmark = answer.selectedAnimation.value(answer.selected ? 1. : 0.); @@ -1139,11 +1114,7 @@ void Poll::paintRadio( const auto rect = QRectF(left, top, radio.diameter, radio.diameter).marginsRemoved(QMarginsF(radio.thickness / 2., radio.thickness / 2., radio.thickness / 2., radio.thickness / 2.)); if (_sendingAnimation && _sendingAnimation->option == answer.option) { - const auto &active = selected - ? (outbg - ? st::msgOutServiceFgSelected - : st::msgInServiceFgSelected) - : (outbg ? st->msgOutServiceFg() : st->msgInServiceFg()); + const auto &active = stm->msgServiceFg; if (anim::Disabled()) { anim::DrawStaticLoading(p, rect, radio.thickness, active); } else { @@ -1167,13 +1138,13 @@ void Poll::paintRadio( if (checkmark > 0.) { const auto removeFull = (radio.diameter / 2 - radio.thickness); const auto removeNow = removeFull * (1. - checkmark); - const auto color = outbg ? (selected ? st::msgFileThumbLinkOutFgSelected : st::msgFileThumbLinkOutFg) : (selected ? st::msgFileThumbLinkInFgSelected : st::msgFileThumbLinkInFg); + const auto color = stm->msgFileThumbLinkFg; auto pen = color->p; pen.setWidth(radio.thickness); p.setPen(pen); p.setBrush(color); p.drawEllipse(rect.marginsRemoved({ removeNow, removeNow, removeNow, removeNow })); - const auto &icon = outbg ? (selected ? st::historyPollOutChosenSelected : st::historyPollOutChosen) : (selected ? st::historyPollInChosenSelected : st::historyPollInChosen); + const auto &icon = stm->historyPollChosen; icon.paint(p, left + (radio.diameter - icon.width()) / 2, top + (radio.diameter - icon.height()) / 2, width()); } } @@ -1189,13 +1160,13 @@ void Poll::paintPercent( int top, int outerWidth, const PaintContext &context) const { - const auto outbg = _parent->hasOutLayout(); + const auto stm = context.messageStyle(); const auto aleft = left + st::historyPollAnswerPadding.left(); top += st::historyPollAnswerPadding.top(); p.setFont(st::historyPollPercentFont); - p.setPen(outbg ? st::webPageDescriptionOutFg : st::webPageDescriptionInFg); + p.setPen(stm->webPageDescriptionFg); const auto pleft = aleft - percentWidth - st::historyPollPercentSkip; p.drawTextLeft(pleft, top + st::historyPollPercentTop, outerWidth, percent, percentWidth); } @@ -1211,8 +1182,8 @@ void Poll::paintFilling( int height, const PaintContext &context) const { const auto bottom = top + height; - const auto outbg = _parent->hasOutLayout(); - const auto selected = context.selected(); + const auto st = context.st; + const auto stm = context.messageStyle(); const auto aleft = left + st::historyPollAnswerPadding.left(); const auto awidth = width - st::historyPollAnswerPadding.left() @@ -1229,19 +1200,18 @@ void Poll::paintFilling( const auto ftop = bottom - st::historyPollFillingBottom - thickness; if (chosen && !correct) { - p.setBrush(st::boxTextFgError); - } else if (chosen && correct && _poll->quiz() && !outbg) { - p.setBrush(st::boxTextFgGood); + p.setBrush(st->boxTextFgError()); + } else if (chosen && correct && _poll->quiz() && !context.outbg) { + p.setBrush(st->boxTextFgGood()); } else { - const auto bar = outbg ? (selected ? st::msgWaveformOutActiveSelected : st::msgWaveformOutActive) : (selected ? st::msgWaveformInActiveSelected : st::msgWaveformInActive); - p.setBrush(bar); + p.setBrush(stm->msgWaveformActive); } auto barleft = aleft; auto barwidth = size; if (chosen || correct) { const auto &icon = (chosen && !correct) - ? st::historyPollChoiceWrong - : st::historyPollChoiceRight; + ? st->historyPollChoiceWrong() + : st->historyPollChoiceRight(); const auto cleft = aleft - st::historyPollPercentSkip - icon.width(); const auto ctop = ftop - (icon.height() - thickness) / 2; p.drawEllipse(cleft, ctop, icon.width(), icon.height()); diff --git a/Telegram/SourceFiles/history/view/media/history_view_slot_machine.cpp b/Telegram/SourceFiles/history/view/media/history_view_slot_machine.cpp index 0081d90e5..2b8d88c46 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_slot_machine.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_slot_machine.cpp @@ -148,7 +148,10 @@ ClickHandlerPtr SlotMachine::link() { return _link; } -void SlotMachine::draw(Painter &p, const QRect &r, bool selected) { +void SlotMachine::draw( + Painter &p, + const PaintContext &context, + const QRect &r) { resolveStarts(true); resolveEnds(_dice->value()); @@ -194,9 +197,9 @@ void SlotMachine::draw(Painter &p, const QRect &r, bool selected) { for (auto i = 0; i != 4; ++i) { if (switchedToEnd[i]) { - _end[i]->draw(p, r, selected); + _end[i]->draw(p, context, r); } else { - _start[i]->draw(p, r, selected); + _start[i]->draw(p, context, r); if (_end[i] && _end[i]->readyToDrawLottie() && _start[i]->atTheEnd()) { @@ -204,7 +207,7 @@ void SlotMachine::draw(Painter &p, const QRect &r, bool selected) { } } } - _pull->draw(p, r, selected); + _pull->draw(p, context, r); } } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/media/history_view_slot_machine.h b/Telegram/SourceFiles/history/view/media/history_view_slot_machine.h index fad54f1c3..861969a9d 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_slot_machine.h +++ b/Telegram/SourceFiles/history/view/media/history_view_slot_machine.h @@ -22,7 +22,10 @@ public: ~SlotMachine(); QSize size() override; - void draw(Painter &p, const QRect &r, bool selected) override; + void draw( + Painter &p, + const PaintContext &context, + const QRect &r) override; ClickHandlerPtr link() override; diff --git a/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp b/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp index c76c1d284..977c292b8 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_cursor_state.h" #include "history/view/media/history_view_media_common.h" #include "ui/image/image.h" +#include "ui/chat/chat_style.h" #include "ui/effects/path_shift_gradient.h" #include "ui/emoji_config.h" #include "core/application.h" @@ -148,22 +149,28 @@ QSize Sticker::GetAnimatedEmojiSize( return { convert(documentSize.width()), convert(documentSize.height()) }; } -void Sticker::draw(Painter &p, const QRect &r, bool selected) { +void Sticker::draw( + Painter &p, + const PaintContext &context, + const QRect &r) { ensureDataMediaCreated(); if (readyToDrawLottie()) { - paintLottie(p, r, selected); + paintLottie(p, context, r); } else if (!_data->sticker() || (_data->sticker()->animated && _replacements) - || !paintPixmap(p, r, selected)) { - paintPath(p, r, selected); + || !paintPixmap(p, context, r)) { + paintPath(p, context, r); } } -void Sticker::paintLottie(Painter &p, const QRect &r, bool selected) { +void Sticker::paintLottie( + Painter &p, + const PaintContext &context, + const QRect &r) { auto request = Lottie::FrameRequest(); request.box = _size * cIntRetinaFactor(); - if (selected && !_nextLastDiceFrame) { - request.colored = st::msgStickerOverlay->c; + if (context.selected() && !_nextLastDiceFrame) { + request.colored = context.st->msgStickerOverlay()->c; } const auto frame = _lottie ? _lottie->frameInfo(request) @@ -175,8 +182,8 @@ void Sticker::paintLottie(Painter &p, const QRect &r, bool selected) { const auto &image = _lastDiceFrame.isNull() ? frame.image : _lastDiceFrame; - const auto prepared = (!_lastDiceFrame.isNull() && selected) - ? Images::prepareColored(st::msgStickerOverlay->c, image) + const auto prepared = (!_lastDiceFrame.isNull() && context.selected()) + ? Images::prepareColored(context.st->msgStickerOverlay()->c, image) : image; const auto size = prepared.size() / cIntRetinaFactor(); p.drawImage( @@ -216,8 +223,11 @@ void Sticker::paintLottie(Painter &p, const QRect &r, bool selected) { } } -bool Sticker::paintPixmap(Painter &p, const QRect &r, bool selected) { - const auto pixmap = paintedPixmap(selected); +bool Sticker::paintPixmap( + Painter &p, + const PaintContext &context, + const QRect &r) { + const auto pixmap = paintedPixmap(context); if (pixmap.isNull()) { return false; } @@ -229,16 +239,19 @@ bool Sticker::paintPixmap(Painter &p, const QRect &r, bool selected) { return true; } -void Sticker::paintPath(Painter &p, const QRect &r, bool selected) { +void Sticker::paintPath( + Painter &p, + const PaintContext &context, + const QRect &r) { const auto pathGradient = _parent->delegate()->elementPathShiftGradient(); - if (selected) { + if (context.selected()) { pathGradient->overrideColors( - st::msgServiceBgSelected, - st::msgServiceBg); + context.st->msgServiceBgSelected(), + context.st->msgServiceBg()); } else { pathGradient->clearOverridenColors(); } - p.setBrush(selected ? st::msgServiceBgSelected : st::msgServiceBg); + p.setBrush(context.imageStyle()->msgServiceBg); ChatHelpers::PaintStickerThumbnailPath( p, _dataMedia.get(), @@ -246,28 +259,28 @@ void Sticker::paintPath(Painter &p, const QRect &r, bool selected) { pathGradient); } -QPixmap Sticker::paintedPixmap(bool selected) const { +QPixmap Sticker::paintedPixmap(const PaintContext &context) const { const auto w = _size.width(); const auto h = _size.height(); - const auto &c = st::msgStickerOverlay; + const auto &c = context.st->msgStickerOverlay(); const auto good = _dataMedia->goodThumbnail(); if (const auto image = _dataMedia->getStickerLarge()) { - return selected + return context.selected() ? image->pixColored(c, w, h) : image->pix(w, h); // // Inline thumbnails can't have alpha channel. // //} else if (const auto blurred = _data->thumbnailInline()) { - // return selected + // return context.selected() // ? blurred->pixBlurredColored(c, w, h) // : blurred->pixBlurred(w, h); } else if (good) { - return selected + return context.selected() ? good->pixColored(c, w, h) : good->pix(w, h); } else if (const auto thumbnail = _dataMedia->thumbnail()) { - return selected + return context.selected() ? thumbnail->pixBlurredColored(c, w, h) : thumbnail->pixBlurred(w, h); } diff --git a/Telegram/SourceFiles/history/view/media/history_view_sticker.h b/Telegram/SourceFiles/history/view/media/history_view_sticker.h index e2b37fd81..2422e594e 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_sticker.h +++ b/Telegram/SourceFiles/history/view/media/history_view_sticker.h @@ -39,7 +39,10 @@ public: void initSize(); QSize size() override; - void draw(Painter &p, const QRect &r, bool selected) override; + void draw( + Painter &p, + const PaintContext &context, + const QRect &r) override; ClickHandlerPtr link() override { return _link; } @@ -83,10 +86,10 @@ public: private: [[nodiscard]] bool isEmojiSticker() const; - void paintLottie(Painter &p, const QRect &r, bool selected); - bool paintPixmap(Painter &p, const QRect &r, bool selected); - void paintPath(Painter &p, const QRect &r, bool selected); - [[nodiscard]] QPixmap paintedPixmap(bool selected) const; + void paintLottie(Painter &p, const PaintContext &context, const QRect &r); + bool paintPixmap(Painter &p, const PaintContext &context, const QRect &r); + void paintPath(Painter &p, const PaintContext &context, const QRect &r); + [[nodiscard]] QPixmap paintedPixmap(const PaintContext &context) const; void ensureDataMediaCreated() const; void dataMediaCreated() const; 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 5bee093d5..b3e486658 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp @@ -190,7 +190,7 @@ void ThemeDocument::draw(Painter &p, const PaintContext &context) const { auto statusH = st::normalFont->height + 2 * st::msgDateImgPadding.y(); Ui::FillRoundRect(p, style::rtlrect(statusX - st::msgDateImgPadding.x(), statusY - st::msgDateImgPadding.y(), statusW, statusH, width()), sti->msgDateImgBg, sti->msgDateImgBgCorners); p.setFont(st::normalFont); - p.setPen(st::msgDateImgFg); + p.setPen(st->msgDateImgFg()); p.drawTextLeft(statusX, statusY, width(), _statusText, statusW - 2 * st::msgDateImgPadding.x()); if (radial || (!loaded && !_data->loading())) { const auto radialOpacity = (radial && loaded && !_data->uploading()) 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 952460e4d..7f51c7eee 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp @@ -563,9 +563,9 @@ void WebPage::draw(Painter &p, const PaintContext &context) const { && !_data->document) { if (_attach->isReadyForOpen()) { if (_data->siteName == qstr("YouTube")) { - st::youtubeIcon.paint(p, (pixwidth - st::youtubeIcon.width()) / 2, (pixheight - st::youtubeIcon.height()) / 2, width()); + st->youtubeIcon().paint(p, (pixwidth - st::youtubeIcon.width()) / 2, (pixheight - st::youtubeIcon.height()) / 2, width()); } else { - st::videoIcon.paint(p, (pixwidth - st::videoIcon.width()) / 2, (pixheight - st::videoIcon.height()) / 2, width()); + st->videoIcon().paint(p, (pixwidth - st::videoIcon.width()) / 2, (pixheight - st::videoIcon.height()) / 2, width()); } } if (_durationWidth) { @@ -577,7 +577,7 @@ void WebPage::draw(Painter &p, const PaintContext &context) const { Ui::FillRoundRect(p, dateX, dateY, dateW, dateH, sti->msgDateImgBg, sti->msgDateImgBgCorners); p.setFont(st::msgDateFont); - p.setPen(st::msgDateImgFg); + p.setPen(st->msgDateImgFg()); p.drawTextLeft(dateX + st::msgDateImgPadding.x(), dateY + st::msgDateImgPadding.y(), pixwidth, _duration); } } diff --git a/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp b/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp index 5b7a08906..41612afe6 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp +++ b/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp @@ -719,11 +719,12 @@ object_ptr ForwardsPrivacyController::setupAboveWidget( Painter p(widget); const auto theme = _controller->defaultChatTheme().get(); - const auto context = theme->preparePaintContext( + auto context = theme->preparePaintContext( _chatStyle.get(), widget->rect(), widget->rect()); p.translate(0, padding + view->marginBottom()); + context.outbg = view->hasOutLayout(); view->draw(p, context); PaintForwardedTooltip(p, view, *option); diff --git a/Telegram/SourceFiles/support/support_autocomplete.cpp b/Telegram/SourceFiles/support/support_autocomplete.cpp index 61ef97064..f9a4a180d 100644 --- a/Telegram/SourceFiles/support/support_autocomplete.cpp +++ b/Telegram/SourceFiles/support/support_autocomplete.cpp @@ -570,15 +570,17 @@ void ConfirmContactBox::paintEvent(QPaintEvent *e) { p.fillRect(e->rect(), st::boxBg); const auto theme = controller()->defaultChatTheme().get(); - const auto context = theme->preparePaintContext( + auto context = theme->preparePaintContext( _chatStyle.get(), rect(), rect()); p.translate(st::boxPadding.left(), 0); if (_comment) { + context.outbg = _comment->hasOutLayout(); _comment->draw(p, context); p.translate(0, _comment->height()); } + context.outbg = _contact->hasOutLayout(); _contact->draw(p, context); } diff --git a/Telegram/SourceFiles/ui/chat/chat_style.cpp b/Telegram/SourceFiles/ui/chat/chat_style.cpp index b85643ef3..b5e80510d 100644 --- a/Telegram/SourceFiles/ui/chat/chat_style.cpp +++ b/Telegram/SourceFiles/ui/chat/chat_style.cpp @@ -82,6 +82,12 @@ ChatStyle::ChatStyle() { make(_historyFastCommentsIcon, st::historyFastCommentsIcon); make(_historyFastShareIcon, st::historyFastShareIcon); make(_historyGoToOriginalIcon, st::historyGoToOriginalIcon); + make(_historyMapPoint, st::historyMapPoint); + make(_historyMapPointInner, st::historyMapPointInner); + make(_youtubeIcon, st::youtubeIcon); + make(_videoIcon, st::videoIcon); + make(_historyPollChoiceRight, st::historyPollChoiceRight); + make(_historyPollChoiceWrong, st::historyPollChoiceWrong); make( &MessageStyle::msgBg, st::msgInBg, @@ -334,6 +340,24 @@ ChatStyle::ChatStyle() { st::historyAudioInCancelSelected, st::historyAudioOutCancel, st::historyAudioOutCancelSelected); + make( + &MessageStyle::historyQuizTimer, + st::historyQuizTimerIn, + st::historyQuizTimerInSelected, + st::historyQuizTimerOut, + st::historyQuizTimerOutSelected); + make( + &MessageStyle::historyQuizExplain, + st::historyQuizExplainIn, + st::historyQuizExplainInSelected, + st::historyQuizExplainOut, + st::historyQuizExplainOutSelected); + make( + &MessageStyle::historyPollChosen, + st::historyPollInChosen, + st::historyPollInChosenSelected, + st::historyPollOutChosen, + st::historyPollOutChosenSelected); make( &MessageImageStyle::msgDateImgBg, st::msgDateImgBg, diff --git a/Telegram/SourceFiles/ui/chat/chat_style.h b/Telegram/SourceFiles/ui/chat/chat_style.h index c884da6f8..3b1948688 100644 --- a/Telegram/SourceFiles/ui/chat/chat_style.h +++ b/Telegram/SourceFiles/ui/chat/chat_style.h @@ -61,6 +61,9 @@ struct MessageStyle { style::icon historyFileDocument = { Qt::Uninitialized }; style::icon historyAudioDownload = { Qt::Uninitialized }; style::icon historyAudioCancel = { Qt::Uninitialized }; + style::icon historyQuizTimer = { Qt::Uninitialized }; + style::icon historyQuizExplain = { Qt::Uninitialized }; + style::icon historyPollChosen = { Qt::Uninitialized }; }; struct MessageImageStyle { @@ -195,6 +198,24 @@ public: [[nodiscard]] const style::icon &historyGoToOriginalIcon() const { return _historyGoToOriginalIcon; } + [[nodiscard]] const style::icon &historyMapPoint() const { + return _historyMapPoint; + } + [[nodiscard]] const style::icon &historyMapPointInner() const { + return _historyMapPointInner; + } + [[nodiscard]] const style::icon &youtubeIcon() const { + return _youtubeIcon; + } + [[nodiscard]] const style::icon &videoIcon() const { + return _videoIcon; + } + [[nodiscard]] const style::icon &historyPollChoiceRight() const { + return _historyPollChoiceRight; + } + [[nodiscard]] const style::icon &historyPollChoiceWrong() const { + return _historyPollChoiceWrong; + } private: void assignPalette(not_null palette); @@ -255,6 +276,12 @@ private: style::icon _historyFastCommentsIcon = { Qt::Uninitialized }; style::icon _historyFastShareIcon = { Qt::Uninitialized }; style::icon _historyGoToOriginalIcon = { Qt::Uninitialized }; + style::icon _historyMapPoint = { Qt::Uninitialized }; + style::icon _historyMapPointInner = { Qt::Uninitialized }; + style::icon _youtubeIcon = { Qt::Uninitialized }; + style::icon _videoIcon = { Qt::Uninitialized }; + style::icon _historyPollChoiceRight = { Qt::Uninitialized }; + style::icon _historyPollChoiceWrong = { Qt::Uninitialized }; rpl::lifetime _defaultPaletteChangeLifetime;