1 // Copyright (c) 2015-2017 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.
5 #include <qt/platformstyle.h>
7 #include <qt/guiconstants.h>
9 #include <QApplication>
15 const char *platformId
;
16 /** Show images on push buttons */
17 const bool imagesOnButtons
;
18 /** Colorize single-color icons */
19 const bool colorizeIcons
;
20 /** Extra padding/spacing in transactionview */
21 const bool useExtraSpacing
;
22 } platform_styles
[] = {
23 {"macosx", false, false, true},
24 {"windows", true, false, false},
25 /* Other: linux, unix, ... */
26 {"other", true, true, false}
28 static const unsigned platform_styles_count
= sizeof(platform_styles
)/sizeof(*platform_styles
);
31 /* Local functions for colorizing single-color images */
33 void MakeSingleColorImage(QImage
& img
, const QColor
& colorbase
)
35 img
= img
.convertToFormat(QImage::Format_ARGB32
);
36 for (int x
= img
.width(); x
--; )
38 for (int y
= img
.height(); y
--; )
40 const QRgb rgb
= img
.pixel(x
, y
);
41 img
.setPixel(x
, y
, qRgba(colorbase
.red(), colorbase
.green(), colorbase
.blue(), qAlpha(rgb
)));
46 QIcon
ColorizeIcon(const QIcon
& ico
, const QColor
& colorbase
)
49 for (const QSize sz
: ico
.availableSizes())
51 QImage
img(ico
.pixmap(sz
).toImage());
52 MakeSingleColorImage(img
, colorbase
);
53 new_ico
.addPixmap(QPixmap::fromImage(img
));
58 QImage
ColorizeImage(const QString
& filename
, const QColor
& colorbase
)
61 MakeSingleColorImage(img
, colorbase
);
65 QIcon
ColorizeIcon(const QString
& filename
, const QColor
& colorbase
)
67 return QIcon(QPixmap::fromImage(ColorizeImage(filename
, colorbase
)));
73 PlatformStyle::PlatformStyle(const QString
&_name
, bool _imagesOnButtons
, bool _colorizeIcons
, bool _useExtraSpacing
):
75 imagesOnButtons(_imagesOnButtons
),
76 colorizeIcons(_colorizeIcons
),
77 useExtraSpacing(_useExtraSpacing
),
81 // Determine icon highlighting color
83 const QColor
colorHighlightBg(QApplication::palette().color(QPalette::Highlight
));
84 const QColor
colorHighlightFg(QApplication::palette().color(QPalette::HighlightedText
));
85 const QColor
colorText(QApplication::palette().color(QPalette::WindowText
));
86 const int colorTextLightness
= colorText
.lightness();
88 if (abs(colorHighlightBg
.lightness() - colorTextLightness
) < abs(colorHighlightFg
.lightness() - colorTextLightness
))
89 colorbase
= colorHighlightBg
;
91 colorbase
= colorHighlightFg
;
92 singleColor
= colorbase
;
94 // Determine text color
95 textColor
= QColor(QApplication::palette().color(QPalette::WindowText
));
98 QImage
PlatformStyle::SingleColorImage(const QString
& filename
) const
101 return QImage(filename
);
102 return ColorizeImage(filename
, SingleColor());
105 QIcon
PlatformStyle::SingleColorIcon(const QString
& filename
) const
108 return QIcon(filename
);
109 return ColorizeIcon(filename
, SingleColor());
112 QIcon
PlatformStyle::SingleColorIcon(const QIcon
& icon
) const
116 return ColorizeIcon(icon
, SingleColor());
119 QIcon
PlatformStyle::TextColorIcon(const QString
& filename
) const
121 return ColorizeIcon(filename
, TextColor());
124 QIcon
PlatformStyle::TextColorIcon(const QIcon
& icon
) const
126 return ColorizeIcon(icon
, TextColor());
129 const PlatformStyle
*PlatformStyle::instantiate(const QString
&platformId
)
131 for (unsigned x
=0; x
<platform_styles_count
; ++x
)
133 if (platformId
== platform_styles
[x
].platformId
)
135 return new PlatformStyle(
136 platform_styles
[x
].platformId
,
137 platform_styles
[x
].imagesOnButtons
,
138 platform_styles
[x
].colorizeIcons
,
139 platform_styles
[x
].useExtraSpacing
);