Use dot in monochrome tray icon on Windows.

This commit is contained in:
John Preston 2023-11-05 00:03:44 +04:00
parent 150432e4d1
commit b8c76cac61
3 changed files with 64 additions and 35 deletions

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="plane" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M1.3311718,6.36592184 C5.3576954,4.67244493 8.04267511,3.5560013 9.38611094,3.01659096 C13.2218932,1.47646481 14.0189359,1.2089284 14.5384372,1.2 C14.6526967,1.19815119 14.9081723,1.22548649 15.0736587,1.35511219 C15.2133922,1.4645656 15.2518384,1.61242159 15.2702362,1.71619544 C15.288634,1.81996929 15.3115436,2.05636876 15.2933322,2.24108442 C15.0854698,4.34939964 14.1860526,9.46572464 13.7284802,11.8270738 C13.5348641,12.8262491 13.1536281,13.1612675 12.7845475,13.1940535 C11.9824498,13.265305 11.3733733,12.6823476 10.5965026,12.190753 C9.3808532,11.4215044 8.69408865,10.9426448 7.51409044,10.1920004 C6.15039834,9.32450079 7.03442319,8.84770795 7.81158733,8.06849502 C8.01497489,7.86457129 11.5490353,4.7615061 11.6174372,4.48000946 C11.625992,4.44480359 11.6339313,4.31357282 11.5531696,4.24427815 C11.472408,4.17498349 11.3532107,4.19867957 11.2671947,4.21752527 C11.1452695,4.24423848 9.20325394,5.48334063 5.44114787,7.93483171 C4.88991321,8.30022994 4.39062196,8.47826423 3.94327414,8.46893456 C3.45010907,8.45864936 2.50145729,8.19975808 1.79623221,7.97846422 C0.931244952,7.70703829 0.243770289,7.56353344 0.303633888,7.10256824 C0.334814555,6.86246904 0.677327192,6.61692024 1.3311718,6.36592184 Z" id="Path-3" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -28,6 +28,7 @@
<file alias="icons/settings/dino.svg">../../icons/settings/dino.svg</file>
<file alias="icons/settings/star.svg">../../icons/settings/star.svg</file>
<file alias="icons/settings/starmini.svg">../../icons/settings/starmini.svg</file>
<file alias="icons/tray/monochrome.svg">../../icons/tray_monochrome.svg</file>
<file alias="topic_icons/blue.svg">../../art/topic_icons/blue.svg</file>
<file alias="topic_icons/yellow.svg">../../art/topic_icons/yellow.svg</file>
<file alias="topic_icons/violet.svg">../../art/topic_icons/violet.svg</file>

View file

@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "core/application.h"
#include "main/main_session.h"
#include "storage/localstorage.h"
#include "ui/painter.h"
#include "ui/ui_utility.h"
#include "ui/widgets/popup_menu.h"
#include "window/window_controller.h"
@ -23,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include <qpa/qplatformtheme.h>
#include <private/qguiapplication_p.h>
#include <private/qhighdpiscaling_p.h>
#include <QSvgRenderer>
namespace Platform {
@ -61,6 +63,49 @@ constexpr auto kTooltipDelay = crl::time(10000);
return (value == 0);
}
[[nodiscard]] QImage MonochromeIconFor(int size, bool darkMode) {
Expects(size > 0);
static const auto Content = [&] {
auto f = QFile(u":/gui/icons/tray/monochrome.svg"_q);
f.open(QIODevice::ReadOnly);
return f.readAll();
}();
static auto Mask = QImage();
static auto Size = 0;
if (Mask.isNull() || Size != size) {
Size = size;
Mask = QImage(size, size, QImage::Format_ARGB32_Premultiplied);
Mask.fill(Qt::transparent);
auto p = QPainter(&Mask);
QSvgRenderer(Content).render(&p, QRectF(0, 0, size, size));
}
static auto Colored = QImage();
static auto ColoredDark = QImage();
auto &use = darkMode ? ColoredDark : Colored;
if (use.size() != Mask.size()) {
const auto color = darkMode ? 255 : 0;
const auto alpha = darkMode ? 255 : 228;
use = style::colorizeImage(Mask, { color, color, color, alpha });
}
return use;
}
[[nodiscard]] QImage MonochromeWithDot(QImage image, style::color color) {
auto p = QPainter(&image);
auto hq = PainterHighQualityEnabler(p);
const auto xm = image.width() / 16.;
const auto ym = image.height() / 16.;
p.setBrush(color);
p.setPen(Qt::NoPen);
p.drawEllipse(QRectF( // cx=3.9, cy=12.7, r=2.2
1.7 * xm,
10.5 * ym,
4.4 * xm,
4.4 * ym));
return image;
}
[[nodiscard]] QImage ImageIconWithCounter(
Window::CounterLayerArgs &&args,
bool supportMode,
@ -83,42 +128,16 @@ constexpr auto kTooltipDelay = crl::time(10000);
auto result = [&] {
if (const auto it = scaled.find(args.size); it != scaled.end()) {
return it->second;
} else {
if (monochrome && darkMode) {
const auto withColor = [&](QColor color) -> std::pair<QImage, int> {
if (args.size <= 16) {
return { st::macTrayIcon.instance(color, 100 / cIntRetinaFactor()), 3 };
} else if (args.size <= 32) {
return { st::macTrayIcon.instance(color, 200 / cIntRetinaFactor()), 6 };
} else {
return { st::macTrayIcon.instance(color, 300 / cIntRetinaFactor()), 9 };
}
};
const auto result = *darkMode
? withColor({ 255, 255, 255 })
: withColor({ 0, 0, 0, 228 });
auto &image = scaled.emplace(
args.size,
result.first.copy(
QRect(
QPoint(result.second, result.second),
result.first.size()
- QSize(result.second * 2, result.second * 2)
)
).scaledToWidth(args.size, Qt::SmoothTransformation)
).first->second;
image.setDevicePixelRatio(1);
return image;
} else {
return scaled.emplace(
args.size,
(smallIcon
? Window::LogoNoMargin()
: Window::Logo()
).scaledToWidth(args.size, Qt::SmoothTransformation)
).first->second;
}
} else if (monochrome && darkMode) {
return MonochromeIconFor(args.size, *darkMode);
}
return scaled.emplace(
args.size,
(smallIcon
? Window::LogoNoMargin()
: Window::Logo()
).scaledToWidth(args.size, Qt::SmoothTransformation)
).first->second;
}();
if ((!monochrome || !darkMode) && supportMode) {
Window::ConvertIconToBlack(result);
@ -126,6 +145,9 @@ constexpr auto kTooltipDelay = crl::time(10000);
if (!args.count) {
return result;
} else if (smallIcon) {
if (monochrome && darkMode) {
return MonochromeWithDot(std::move(result), args.bg);
}
return Window::WithSmallCounter(std::move(result), std::move(args));
}
QPainter p(&result);