diff --git a/Telegram/Resources/day-blue.tdesktop-theme b/Telegram/Resources/day-blue.tdesktop-theme index d24019eb17..2a413f9dcb 100644 Binary files a/Telegram/Resources/day-blue.tdesktop-theme and b/Telegram/Resources/day-blue.tdesktop-theme differ diff --git a/Telegram/Resources/night-green.tdesktop-theme b/Telegram/Resources/night-green.tdesktop-theme index c7caf91ba5..2a47a1c144 100644 Binary files a/Telegram/Resources/night-green.tdesktop-theme and b/Telegram/Resources/night-green.tdesktop-theme differ diff --git a/Telegram/Resources/night.tdesktop-theme b/Telegram/Resources/night.tdesktop-theme index 37e401c7c5..c9d188ec1e 100644 Binary files a/Telegram/Resources/night.tdesktop-theme and b/Telegram/Resources/night.tdesktop-theme differ diff --git a/Telegram/SourceFiles/window/themes/window_theme_editor.cpp b/Telegram/SourceFiles/window/themes/window_theme_editor.cpp index ea256af1b8..00a2421bf4 100644 --- a/Telegram/SourceFiles/window/themes/window_theme_editor.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme_editor.cpp @@ -334,7 +334,7 @@ Fn Editor::Inner::exportCallback() { } void Editor::Inner::filterRows(const QString &query) { - if (query == ":sort-by-accent-distance") { + if (query == ":sort-for-accent") { sortByAccentDistance(); filterRows(QString()); return; diff --git a/Telegram/SourceFiles/window/themes/window_theme_editor_block.cpp b/Telegram/SourceFiles/window/themes/window_theme_editor_block.cpp index e38b4e0cc1..8c30bd6089 100644 --- a/Telegram/SourceFiles/window/themes/window_theme_editor_block.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme_editor_block.cpp @@ -395,16 +395,22 @@ bool EditorBlock::feedDescription(const QString &name, const QString &descriptio } void EditorBlock::sortByDistance(const QColor &to) { - auto toHue = qreal(); - auto toSaturation = qreal(); - auto toLightness = qreal(); - to.getHsvF(&toHue, &toSaturation, &toLightness); + auto toHue = int(); + auto toSaturation = int(); + auto toLightness = int(); + to.getHsl(&toHue, &toSaturation, &toLightness); ranges::sort(_data, ranges::less(), [&](const Row &row) { - auto fromHue = qreal(); - auto fromSaturation = qreal(); - auto fromLightness = qreal(); - row.value().getHsvF(&fromHue, &fromSaturation, &fromLightness); - return (toSaturation > 0.01) ? std::abs(fromHue - toHue) : 1.; + auto fromHue = int(); + auto fromSaturation = int(); + auto fromLightness = int(); + row.value().getHsl(&fromHue, &fromSaturation, &fromLightness); + if (!row.copyOf().isEmpty() && row.copyOf() != "windowBgActive") { + return 365; + } + const auto a = std::abs(fromHue - toHue); + const auto b = 360 + fromHue - toHue; + const auto c = 360 + toHue - fromHue; + return std::min(a, std::min(b, c)); }); } diff --git a/Telegram/SourceFiles/window/themes/window_themes_embedded.cpp b/Telegram/SourceFiles/window/themes/window_themes_embedded.cpp index b793e588ac..a14e89501a 100644 --- a/Telegram/SourceFiles/window/themes/window_themes_embedded.cpp +++ b/Telegram/SourceFiles/window/themes/window_themes_embedded.cpp @@ -65,7 +65,7 @@ const auto kColorizeIgnoredKeys = base::flat_set{ { qstr("mediaviewFileBlueCornerFg"), } }; -QColor Color(str_const hex) { +QColor qColor(str_const hex) { Expects(hex.size() == 6); const auto component = [](char a, char b) { @@ -87,20 +87,38 @@ QColor Color(str_const hex) { component(hex[4], hex[5])); }; +Colorizer::Color cColor(str_const hex) { + const auto q = qColor(hex); + auto hue = int(); + auto saturation = int(); + auto lightness = int(); + q.getHsl(&hue, &saturation, &lightness); + return Colorizer::Color{ hue, saturation, lightness }; +} + } // namespace Colorizer ColorizerFrom(const EmbeddedScheme &scheme, const QColor &color) { + using Color = Colorizer::Color; + auto result = Colorizer(); result.ignoreKeys = kColorizeIgnoredKeys; - result.hueThreshold = 10; - scheme.accentColor.getHsv( - &result.wasHue, - &result.wasSaturation, - &result.wasValue); - color.getHsv( - &result.nowHue, - &result.nowSaturation, - &result.nowValue); + result.hueThreshold = 15; + scheme.accentColor.getHsl( + &result.was.hue, + &result.was.saturation, + &result.was.lightness); + color.getHsl( + &result.now.hue, + &result.now.saturation, + &result.now.lightness); + switch (scheme.type) { + case EmbeddedType::DayBlue: + //result.keepContrast = base::flat_map{ { + // { qstr("test"), cColor("aaaaaa") }, + //} }; + break; + } return result; } @@ -112,38 +130,41 @@ void Colorize( auto color = QColor(int(r), int(g), int(b)); auto hue = 0; auto saturation = 0; - auto value = 0; - color.getHsv(&hue, &saturation, &value); - const auto changeColor = std::abs(hue - colorizer->wasHue) + auto lightness = 0; + color.getHsl(&hue, &saturation, &lightness); + const auto changeColor = std::abs(hue - colorizer->was.hue) <= colorizer->hueThreshold; - const auto nowHue = hue + (colorizer->nowHue - colorizer->wasHue); - const auto nowSaturation = ((saturation > colorizer->wasSaturation) - && (colorizer->nowSaturation > colorizer->wasSaturation)) - ? (((colorizer->nowSaturation * (255 - colorizer->wasSaturation)) - + ((saturation - colorizer->wasSaturation) - * (255 - colorizer->nowSaturation))) - / (255 - colorizer->wasSaturation)) - : ((saturation != colorizer->wasSaturation) - && (colorizer->wasSaturation != 0)) - ? ((saturation * colorizer->nowSaturation) - / colorizer->wasSaturation) - : colorizer->nowSaturation; - const auto nowValue = (value > colorizer->wasValue) - ? (((colorizer->nowValue * (255 - colorizer->wasValue)) - + ((value - colorizer->wasValue) - * (255 - colorizer->nowValue))) - / (255 - colorizer->wasValue)) - : (value < colorizer->wasValue) - ? ((value * colorizer->nowValue) - / colorizer->wasValue) - : colorizer->nowValue; + if (!changeColor) { + return; + } + const auto nowHue = hue + (colorizer->now.hue - colorizer->was.hue); + const auto nowSaturation = ((saturation > colorizer->was.saturation) + && (colorizer->now.saturation > colorizer->was.saturation)) + ? (((colorizer->now.saturation * (255 - colorizer->was.saturation)) + + ((saturation - colorizer->was.saturation) + * (255 - colorizer->now.saturation))) + / (255 - colorizer->was.saturation)) + : ((saturation != colorizer->was.saturation) + && (colorizer->was.saturation != 0)) + ? ((saturation * colorizer->now.saturation) + / colorizer->was.saturation) + : colorizer->now.saturation; + const auto nowLightness = (lightness > colorizer->was.lightness) + ? (((colorizer->now.lightness * (255 - colorizer->was.lightness)) + + ((lightness - colorizer->was.lightness) + * (255 - colorizer->now.lightness))) + / (255 - colorizer->was.lightness)) + : (lightness < colorizer->was.lightness) + ? ((lightness * colorizer->now.lightness) + / colorizer->was.lightness) + : colorizer->now.lightness; auto nowR = 0; auto nowG = 0; auto nowB = 0; - QColor::fromHsv( - changeColor ? ((nowHue + 360) % 360) : hue, - changeColor ? nowSaturation : saturation, - nowValue + QColor::fromHsl( + ((nowHue + 360) % 360), + nowSaturation, + nowLightness ).getRgb(&nowR, &nowG, &nowB); r = uchar(nowR); g = uchar(nowG); @@ -198,46 +219,46 @@ std::vector EmbeddedThemes() { return { EmbeddedScheme{ EmbeddedType::DayBlue, - Color("7ec4ea"), - Color("d7f0ff"), - Color("ffffff"), - Color("d7f0ff"), - Color("ffffff"), + qColor("7ec4ea"), + qColor("d7f0ff"), + qColor("ffffff"), + qColor("d7f0ff"), + qColor("ffffff"), tr::lng_settings_theme_blue, ":/gui/day-blue.tdesktop-theme", - Color("40a7e3") + qColor("40a7e3") }, EmbeddedScheme{ EmbeddedType::Default, - Color("90ce89"), - Color("eaffdc"), - Color("ffffff"), - Color("eaffdc"), - Color("ffffff"), + qColor("90ce89"), + qColor("eaffdc"), + qColor("ffffff"), + qColor("eaffdc"), + qColor("ffffff"), tr::lng_settings_theme_classic, QString() }, EmbeddedScheme{ EmbeddedType::Night, - Color("485761"), - Color("5ca7d4"), - Color("6b808d"), - Color("6b808d"), - Color("5ca7d4"), + qColor("485761"), + qColor("5ca7d4"), + qColor("6b808d"), + qColor("6b808d"), + qColor("5ca7d4"), tr::lng_settings_theme_midnight, ":/gui/night.tdesktop-theme", - Color("5288c1") + qColor("5288c1") }, EmbeddedScheme{ EmbeddedType::NightGreen, - Color("485761"), - Color("75bfb5"), - Color("6b808d"), - Color("6b808d"), - Color("75bfb5"), + qColor("485761"), + qColor("75bfb5"), + qColor("6b808d"), + qColor("6b808d"), + qColor("75bfb5"), tr::lng_settings_theme_matrix, ":/gui/night-green.tdesktop-theme", - Color("3fc1b0") + qColor("3fc1b0") }, }; } @@ -246,41 +267,41 @@ std::vector DefaultAccentColors(EmbeddedType type) { switch (type) { case EmbeddedType::DayBlue: return { - //Color("3478f5"), - Color("58bfe8"), - Color("58b040"), - Color("da73a2"), - Color("e28830"), - Color("9073e7"), - Color("c14126"), - Color("71829c"), - Color("e3b63e"), + //qColor("3478f5"), + qColor("58bfe8"), + qColor("58b040"), + qColor("da73a2"), + qColor("e28830"), + qColor("9073e7"), + qColor("c14126"), + qColor("71829c"), + qColor("e3b63e"), }; case EmbeddedType::Default: return {}; case EmbeddedType::Night: return { - //Color("3478f5"), - Color("58bfe8"), - Color("58b040"), - Color("da73a2"), - Color("e28830"), - Color("9073e7"), - Color("c14126"), - Color("71829c"), - Color("e3b63e"), + //qColor("3478f5"), + qColor("58bfe8"), + qColor("58b040"), + qColor("da73a2"), + qColor("e28830"), + qColor("9073e7"), + qColor("c14126"), + qColor("71829c"), + qColor("e3b63e"), }; case EmbeddedType::NightGreen: return { - Color("3478f5"), - //Color("58bfe8"), - Color("58b040"), - Color("da73a2"), - Color("e28830"), - Color("9073e7"), - Color("c14126"), - Color("71829c"), - Color("e3b63e"), + qColor("3478f5"), + //qColor("58bfe8"), + qColor("58b040"), + qColor("da73a2"), + qColor("e28830"), + qColor("9073e7"), + qColor("c14126"), + qColor("71829c"), + qColor("e3b63e"), }; } Unexpected("Type in Window::Theme::AccentColors."); diff --git a/Telegram/SourceFiles/window/themes/window_themes_embedded.h b/Telegram/SourceFiles/window/themes/window_themes_embedded.h index b0d7d5a428..0bb2de2f4f 100644 --- a/Telegram/SourceFiles/window/themes/window_themes_embedded.h +++ b/Telegram/SourceFiles/window/themes/window_themes_embedded.h @@ -48,14 +48,16 @@ private: }; struct Colorizer { - int wasHue = 0; - int wasSaturation = 0; - int wasValue = 0; - int nowHue = 0; - int nowSaturation = 0; - int nowValue = 0; + struct Color { + int hue = 0; + int saturation = 0; + int lightness = 0; + }; int hueThreshold = 0; + Color was; + Color now; base::flat_set ignoreKeys; + base::flat_map keepContrast; }; [[nodiscard]] Colorizer ColorizerFrom(