diff --git a/Telegram/SourceFiles/ayu/ui/settings/icon_picker.cpp b/Telegram/SourceFiles/ayu/ui/settings/icon_picker.cpp index 27ca60ba6..9ae900c3d 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/icon_picker.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/icon_picker.cpp @@ -33,18 +33,19 @@ const QVector icons{ const auto rows = static_cast(icons.size()) / 4 + std::min(1, static_cast(icons.size()) % 4); -void drawIcon(QPainter &p, const QImage &icon, int xOffset, int yOffset, bool selected) { +void drawIcon(QPainter &p, const QImage &icon, int xOffset, int yOffset, float strokeOpacity) { xOffset += st::cpPadding; - if (selected) { - p.save(); - p.setPen(QPen(st::iconPreviewStroke, st::cpPenSize)); - p.drawEllipse(xOffset + st::cpSelectedPadding, - yOffset + st::cpSelectedPadding, - st::cpIconSize + st::cpSelectedPadding * 2, - st::cpIconSize + st::cpSelectedPadding * 2); - p.restore(); - } + // stroke + p.save(); + p.setPen(QPen(st::iconPreviewStroke, st::cpPenSize)); + p.setOpacity(strokeOpacity); + p.drawEllipse(xOffset + st::cpSelectedPadding, + yOffset + st::cpSelectedPadding, + st::cpIconSize + st::cpSelectedPadding * 2, + st::cpIconSize + st::cpSelectedPadding * 2); + p.restore(); + // /stroke auto rect = QRect(xOffset + st::cpImagePadding, yOffset + st::cpImagePadding, st::cpIconSize, st::cpIconSize); p.drawImage(rect, icon); @@ -81,11 +82,19 @@ void IconPicker::paintEvent(QPaintEvent *e) { const auto &iconName = icons[idx]; auto icon = AyuAssets::loadPreview(iconName) .scaled(st::cpIconSize, st::cpIconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + + auto opacity = 0.0f; + if (iconName == wasSelected) { + opacity = 1.0f - animation.value(1.0f); + } else if (iconName == AyuAssets::currentAppLogoName()) { + opacity = wasSelected.isEmpty() ? 1.0f : animation.value(1.0f); + } + drawIcon(p, icon, (st::cpIconSize + st::cpSpacingX) * i + offset, row * (st::cpIconSize + st::cpSpacingY), - AyuAssets::currentAppLogoName() == iconName); + opacity); } } } @@ -106,6 +115,17 @@ void IconPicker::mousePressEvent(QMouseEvent *e) { && e->pos().y() <= yOffset + st::cpIconSize) { const auto &iconName = icons[idx]; if (settings->appIcon != iconName) { + wasSelected = settings->appIcon; + animation.start( + [=] + { + update(); + }, + 0.0, + 1.0, + 200, + anim::easeOutCubic); + settings->set_appIcon(iconName); changed = true; break; diff --git a/Telegram/SourceFiles/ayu/ui/settings/icon_picker.h b/Telegram/SourceFiles/ayu/ui/settings/icon_picker.h index 25fbef5ea..ae0bd3df1 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/icon_picker.h +++ b/Telegram/SourceFiles/ayu/ui/settings/icon_picker.h @@ -7,6 +7,7 @@ #pragma once #include "ui/rp_widget.h" +#include "ui/effects/animations.h" class IconPicker : public Ui::RpWidget { @@ -16,4 +17,7 @@ public: protected: void paintEvent(QPaintEvent *e) override; void mousePressEvent(QMouseEvent *e) override; + + Ui::Animations::Simple animation; + QString wasSelected; }; diff --git a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp index 42fd46b7c..431b1f382 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp @@ -1008,7 +1008,7 @@ void SetupRecentStickersLimitSlider(not_null container) { st::autoDownloadLimitSlider, st::settingsScaleLabel, 0, - st::settingsScaleLabel.style.font->width("30%")); + st::settingsScaleLabel.style.font->width("8%%")); container->add(std::move(recentStickersLimitSlider.widget), st::recentStickersLimitPadding); const auto slider = recentStickersLimitSlider.slider; const auto label = recentStickersLimitSlider.label; @@ -1331,7 +1331,6 @@ void SetupAyuGramSettings(not_null container, AddSkip(container); SetupSendConfirmations(container); AddSkip(container); - AddDivider(container); AddDividerText(container, tr::ayu_SettingsWatermark()); }