diff --git a/Telegram/SourceFiles/intro/intro.style b/Telegram/SourceFiles/intro/intro.style index 59ff6e7d30..c80be0201d 100644 --- a/Telegram/SourceFiles/intro/intro.style +++ b/Telegram/SourceFiles/intro/intro.style @@ -163,9 +163,11 @@ introBackButton: IconButton(defaultIconButton) { } } -introQrTop: -6px; +introQrTop: -18px; introQrPixel: 50px; // large enough introQrMaxSize: 180px; +introQrBackgroundSkip: 12px; +introQrBackgroundRadius: 8px; introQrLabelsWidth: 292px; introQrTitleWidth: 320px; introQrTitle: FlatLabel(defaultFlatLabel) { diff --git a/Telegram/SourceFiles/intro/intro_qr.cpp b/Telegram/SourceFiles/intro/intro_qr.cpp index 67a5481266..6706897726 100644 --- a/Telegram/SourceFiles/intro/intro_qr.cpp +++ b/Telegram/SourceFiles/intro/intro_qr.cpp @@ -33,7 +33,7 @@ namespace details { namespace { [[nodiscard]] QImage TelegramQrExact(const Qr::Data &data, int pixel) { - return Qr::Generate(data, pixel, st::windowFg->c); + return Qr::Generate(data, pixel, Qt::black); } [[nodiscard]] QImage TelegramQr(const Qr::Data &data, int pixel, int max = 0) { @@ -44,7 +44,7 @@ namespace { } const auto qr = TelegramQrExact(data, pixel * style::DevicePixelRatio()); auto result = QImage(qr.size(), QImage::Format_ARGB32_Premultiplied); - result.fill(st::windowBg->c); + result.fill(Qt::white); { auto p = QPainter(&result); p.drawImage(QRect(QPoint(), qr.size()), qr); @@ -52,6 +52,10 @@ namespace { return result; } +[[nodiscard]] QColor QrActiveColor() { + return QColor(0x40, 0xA7, 0xE3); // Default windowBgActive. +} + [[nodiscard]] not_null PrepareQrWidget( not_null parent, rpl::producer codes) { @@ -80,7 +84,8 @@ namespace { const auto state = result->lifetime().make_state( [=] { result->update(); }); state->waiting.start(); - result->resize(st::introQrMaxSize, st::introQrMaxSize); + const auto size = st::introQrMaxSize + 2 * st::introQrBackgroundSkip; + result->resize(size, size); rpl::combine( std::move(qrs), rpl::duplicate(palettes) @@ -107,14 +112,30 @@ namespace { result->paintRequest( ) | rpl::start_with_next([=](QRect clip) { auto p = QPainter(result); - const auto shown = state->qr.isNull() ? 0. : state->shown.value(1.); + const auto has = !state->qr.isNull(); + const auto shown = has ? state->shown.value(1.) : 0.; + const auto usualSize = 41; + const auto pixel = std::clamp( + st::introQrMaxSize / usualSize, + 1, + st::introQrPixel); + const auto size = has + ? (state->qr.size() / cIntRetinaFactor()) + : QSize(usualSize * pixel, usualSize * pixel); + const auto qr = QRect( + (result->width() - size.width()) / 2, + (result->height() - size.height()) / 2, + size.width(), + size.height()); + const auto radius = st::introQrBackgroundRadius; + const auto skip = st::introQrBackgroundSkip; + p.setPen(Qt::NoPen); + p.setBrush(Qt::white); + p.drawRoundedRect( + qr.marginsAdded({ skip, skip, skip, skip }), + radius, + radius); if (!state->qr.isNull()) { - const auto size = state->qr.size() / cIntRetinaFactor(); - const auto qr = QRect( - (result->width() - size.width()) / 2, - (result->height() - size.height()) / 2, - size.width(), - size.height()); if (shown == 1.) { state->previous = QImage(); } else if (!state->previous.isNull()) { @@ -134,7 +155,7 @@ namespace { auto hq = PainterHighQualityEnabler(p); const auto line = st::radialLine; const auto radial = state->waiting.computeState(); - auto pen = st::activeButtonBg->p; + auto pen = QPen(QrActiveColor()); pen.setWidth(line); pen.setCapStyle(Qt::RoundCap); p.setOpacity(radial.shown * (1. - shown)); @@ -422,7 +443,7 @@ QImage TelegramLogoImage() { { auto p = QPainter(&result); auto hq = PainterHighQualityEnabler(p); - p.setBrush(st::activeButtonBg); + p.setBrush(QrActiveColor()); p.setPen(Qt::NoPen); p.drawEllipse(QRect(QPoint(), size)); st::introQrPlane.paintInCenter(p, QRect(QPoint(), size));