Line data Source code
1 : // Copyright (c) 2015-2019 The Bitcoin Core developers
2 : // Distributed under the MIT software license, see the accompanying
3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 :
5 : #include <qt/platformstyle.h>
6 :
7 : #include <QApplication>
8 : #include <QColor>
9 : #include <QImage>
10 : #include <QPalette>
11 :
12 : static const struct {
13 : const char *platformId;
14 : /** Show images on push buttons */
15 : const bool imagesOnButtons;
16 : /** Colorize single-color icons */
17 : const bool colorizeIcons;
18 : /** Extra padding/spacing in transactionview */
19 : const bool useExtraSpacing;
20 : } platform_styles[] = {
21 : {"macosx", false, false, true},
22 : {"windows", true, false, false},
23 : /* Other: linux, unix, ... */
24 : {"other", true, true, false}
25 : };
26 : static const unsigned platform_styles_count = sizeof(platform_styles)/sizeof(*platform_styles);
27 :
28 : namespace {
29 : /* Local functions for colorizing single-color images */
30 :
31 0 : void MakeSingleColorImage(QImage& img, const QColor& colorbase)
32 : {
33 0 : img = img.convertToFormat(QImage::Format_ARGB32);
34 0 : for (int x = img.width(); x--; )
35 : {
36 0 : for (int y = img.height(); y--; )
37 : {
38 0 : const QRgb rgb = img.pixel(x, y);
39 0 : img.setPixel(x, y, qRgba(colorbase.red(), colorbase.green(), colorbase.blue(), qAlpha(rgb)));
40 : }
41 : }
42 0 : }
43 :
44 0 : QIcon ColorizeIcon(const QIcon& ico, const QColor& colorbase)
45 : {
46 0 : QIcon new_ico;
47 0 : for (const QSize& sz : ico.availableSizes())
48 : {
49 0 : QImage img(ico.pixmap(sz).toImage());
50 0 : MakeSingleColorImage(img, colorbase);
51 0 : new_ico.addPixmap(QPixmap::fromImage(img));
52 0 : }
53 : return new_ico;
54 0 : }
55 :
56 0 : QImage ColorizeImage(const QString& filename, const QColor& colorbase)
57 : {
58 0 : QImage img(filename);
59 0 : MakeSingleColorImage(img, colorbase);
60 : return img;
61 0 : }
62 :
63 0 : QIcon ColorizeIcon(const QString& filename, const QColor& colorbase)
64 : {
65 0 : return QIcon(QPixmap::fromImage(ColorizeImage(filename, colorbase)));
66 0 : }
67 :
68 : }
69 :
70 :
71 0 : PlatformStyle::PlatformStyle(const QString &_name, bool _imagesOnButtons, bool _colorizeIcons, bool _useExtraSpacing):
72 0 : name(_name),
73 0 : imagesOnButtons(_imagesOnButtons),
74 0 : colorizeIcons(_colorizeIcons),
75 0 : useExtraSpacing(_useExtraSpacing),
76 0 : singleColor(0,0,0),
77 0 : textColor(0,0,0)
78 0 : {
79 : // Determine icon highlighting color
80 0 : if (colorizeIcons) {
81 0 : const QColor colorHighlightBg(QApplication::palette().color(QPalette::Highlight));
82 0 : const QColor colorHighlightFg(QApplication::palette().color(QPalette::HighlightedText));
83 0 : const QColor colorText(QApplication::palette().color(QPalette::WindowText));
84 0 : const int colorTextLightness = colorText.lightness();
85 0 : QColor colorbase;
86 0 : if (abs(colorHighlightBg.lightness() - colorTextLightness) < abs(colorHighlightFg.lightness() - colorTextLightness))
87 0 : colorbase = colorHighlightBg;
88 : else
89 0 : colorbase = colorHighlightFg;
90 0 : singleColor = colorbase;
91 0 : }
92 : // Determine text color
93 0 : textColor = QColor(QApplication::palette().color(QPalette::WindowText));
94 0 : }
95 :
96 0 : QImage PlatformStyle::SingleColorImage(const QString& filename) const
97 : {
98 0 : if (!colorizeIcons)
99 0 : return QImage(filename);
100 0 : return ColorizeImage(filename, SingleColor());
101 0 : }
102 :
103 0 : QIcon PlatformStyle::SingleColorIcon(const QString& filename) const
104 : {
105 0 : if (!colorizeIcons)
106 0 : return QIcon(filename);
107 0 : return ColorizeIcon(filename, SingleColor());
108 0 : }
109 :
110 0 : QIcon PlatformStyle::SingleColorIcon(const QIcon& icon) const
111 : {
112 0 : if (!colorizeIcons)
113 0 : return icon;
114 0 : return ColorizeIcon(icon, SingleColor());
115 0 : }
116 :
117 0 : QIcon PlatformStyle::TextColorIcon(const QIcon& icon) const
118 : {
119 0 : return ColorizeIcon(icon, TextColor());
120 : }
121 :
122 0 : const PlatformStyle *PlatformStyle::instantiate(const QString &platformId)
123 : {
124 0 : for (unsigned x=0; x<platform_styles_count; ++x)
125 : {
126 0 : if (platformId == platform_styles[x].platformId)
127 : {
128 0 : return new PlatformStyle(
129 0 : platform_styles[x].platformId,
130 0 : platform_styles[x].imagesOnButtons,
131 0 : platform_styles[x].colorizeIcons,
132 0 : platform_styles[x].useExtraSpacing);
133 : }
134 : }
135 0 : return nullptr;
136 0 : }
137 :
|