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