platformstyle.cpp
1 // Copyright (c) 2015-present 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, true, true}, 22 {"windows", true, false, false}, 23 /* Other: linux, unix, ... */ 24 {"other", true, true, false} 25 }; 26 27 namespace { 28 /* Local functions for colorizing single-color images */ 29 30 void MakeSingleColorImage(QImage& img, const QColor& colorbase) 31 { 32 img = img.convertToFormat(QImage::Format_ARGB32); 33 for (int x = img.width(); x--; ) 34 { 35 for (int y = img.height(); y--; ) 36 { 37 const QRgb rgb = img.pixel(x, y); 38 img.setPixel(x, y, qRgba(colorbase.red(), colorbase.green(), colorbase.blue(), qAlpha(rgb))); 39 } 40 } 41 } 42 43 QIcon ColorizeIcon(const QIcon& ico, const QColor& colorbase) 44 { 45 QIcon new_ico; 46 for (const QSize& sz : ico.availableSizes()) 47 { 48 QImage img(ico.pixmap(sz).toImage()); 49 MakeSingleColorImage(img, colorbase); 50 new_ico.addPixmap(QPixmap::fromImage(img)); 51 } 52 return new_ico; 53 } 54 55 QImage ColorizeImage(const QString& filename, const QColor& colorbase) 56 { 57 QImage img(filename); 58 MakeSingleColorImage(img, colorbase); 59 return img; 60 } 61 62 QIcon ColorizeIcon(const QString& filename, const QColor& colorbase) 63 { 64 return QIcon(QPixmap::fromImage(ColorizeImage(filename, colorbase))); 65 } 66 67 } 68 69 70 PlatformStyle::PlatformStyle(const QString &_name, bool _imagesOnButtons, bool _colorizeIcons, bool _useExtraSpacing): 71 name(_name), 72 imagesOnButtons(_imagesOnButtons), 73 colorizeIcons(_colorizeIcons), 74 useExtraSpacing(_useExtraSpacing) 75 { 76 } 77 78 QColor PlatformStyle::TextColor() const 79 { 80 return QApplication::palette().color(QPalette::WindowText); 81 } 82 83 QColor PlatformStyle::SingleColor() const 84 { 85 if (colorizeIcons) { 86 QColor colorHighlightBg(QApplication::palette().color(QPalette::Highlight)); 87 QColor colorHighlightFg(QApplication::palette().color(QPalette::HighlightedText)); 88 const QColor colorText(QApplication::palette().color(QPalette::WindowText)); 89 const int colorTextLightness = colorText.lightness(); 90 if (abs(colorHighlightBg.lightness() - colorTextLightness) < abs(colorHighlightFg.lightness() - colorTextLightness)) { 91 return colorHighlightBg; 92 } 93 return colorHighlightFg; 94 } 95 return {0, 0, 0}; 96 } 97 98 QImage PlatformStyle::SingleColorImage(const QString& filename) const 99 { 100 if (!colorizeIcons) 101 return QImage(filename); 102 return ColorizeImage(filename, SingleColor()); 103 } 104 105 QIcon PlatformStyle::SingleColorIcon(const QString& filename) const 106 { 107 if (!colorizeIcons) 108 return QIcon(filename); 109 return ColorizeIcon(filename, SingleColor()); 110 } 111 112 QIcon PlatformStyle::SingleColorIcon(const QIcon& icon) const 113 { 114 if (!colorizeIcons) 115 return icon; 116 return ColorizeIcon(icon, SingleColor()); 117 } 118 119 QIcon PlatformStyle::TextColorIcon(const QIcon& icon) const 120 { 121 return ColorizeIcon(icon, TextColor()); 122 } 123 124 const PlatformStyle *PlatformStyle::instantiate(const QString &platformId) 125 { 126 for (const auto& platform_style : platform_styles) { 127 if (platformId == platform_style.platformId) { 128 return new PlatformStyle( 129 platform_style.platformId, 130 platform_style.imagesOnButtons, 131 platform_style.colorizeIcons, 132 platform_style.useExtraSpacing); 133 } 134 } 135 return nullptr; 136 } 137