mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-12 21:02:38 -03:00
ce17861dc4
This change is a prerequisite to support changeable appearance on macOS.
137 lines
3.8 KiB
C++
137 lines
3.8 KiB
C++
// Copyright (c) 2015-2019 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <qt/platformstyle.h>
|
|
|
|
#include <QApplication>
|
|
#include <QColor>
|
|
#include <QImage>
|
|
#include <QPalette>
|
|
|
|
static const struct {
|
|
const char *platformId;
|
|
/** Show images on push buttons */
|
|
const bool imagesOnButtons;
|
|
/** Colorize single-color icons */
|
|
const bool colorizeIcons;
|
|
/** Extra padding/spacing in transactionview */
|
|
const bool useExtraSpacing;
|
|
} platform_styles[] = {
|
|
{"macosx", false, true, true},
|
|
{"windows", true, false, false},
|
|
/* Other: linux, unix, ... */
|
|
{"other", true, true, false}
|
|
};
|
|
|
|
namespace {
|
|
/* Local functions for colorizing single-color images */
|
|
|
|
void MakeSingleColorImage(QImage& img, const QColor& colorbase)
|
|
{
|
|
img = img.convertToFormat(QImage::Format_ARGB32);
|
|
for (int x = img.width(); x--; )
|
|
{
|
|
for (int y = img.height(); y--; )
|
|
{
|
|
const QRgb rgb = img.pixel(x, y);
|
|
img.setPixel(x, y, qRgba(colorbase.red(), colorbase.green(), colorbase.blue(), qAlpha(rgb)));
|
|
}
|
|
}
|
|
}
|
|
|
|
QIcon ColorizeIcon(const QIcon& ico, const QColor& colorbase)
|
|
{
|
|
QIcon new_ico;
|
|
for (const QSize& sz : ico.availableSizes())
|
|
{
|
|
QImage img(ico.pixmap(sz).toImage());
|
|
MakeSingleColorImage(img, colorbase);
|
|
new_ico.addPixmap(QPixmap::fromImage(img));
|
|
}
|
|
return new_ico;
|
|
}
|
|
|
|
QImage ColorizeImage(const QString& filename, const QColor& colorbase)
|
|
{
|
|
QImage img(filename);
|
|
MakeSingleColorImage(img, colorbase);
|
|
return img;
|
|
}
|
|
|
|
QIcon ColorizeIcon(const QString& filename, const QColor& colorbase)
|
|
{
|
|
return QIcon(QPixmap::fromImage(ColorizeImage(filename, colorbase)));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
PlatformStyle::PlatformStyle(const QString &_name, bool _imagesOnButtons, bool _colorizeIcons, bool _useExtraSpacing):
|
|
name(_name),
|
|
imagesOnButtons(_imagesOnButtons),
|
|
colorizeIcons(_colorizeIcons),
|
|
useExtraSpacing(_useExtraSpacing)
|
|
{
|
|
}
|
|
|
|
QColor PlatformStyle::TextColor() const
|
|
{
|
|
return QApplication::palette().color(QPalette::WindowText);
|
|
}
|
|
|
|
QColor PlatformStyle::SingleColor() const
|
|
{
|
|
if (colorizeIcons) {
|
|
const QColor colorHighlightBg(QApplication::palette().color(QPalette::Highlight));
|
|
const QColor colorHighlightFg(QApplication::palette().color(QPalette::HighlightedText));
|
|
const QColor colorText(QApplication::palette().color(QPalette::WindowText));
|
|
const int colorTextLightness = colorText.lightness();
|
|
if (abs(colorHighlightBg.lightness() - colorTextLightness) < abs(colorHighlightFg.lightness() - colorTextLightness)) {
|
|
return colorHighlightBg;
|
|
}
|
|
return colorHighlightFg;
|
|
}
|
|
return {0, 0, 0};
|
|
}
|
|
|
|
QImage PlatformStyle::SingleColorImage(const QString& filename) const
|
|
{
|
|
if (!colorizeIcons)
|
|
return QImage(filename);
|
|
return ColorizeImage(filename, SingleColor());
|
|
}
|
|
|
|
QIcon PlatformStyle::SingleColorIcon(const QString& filename) const
|
|
{
|
|
if (!colorizeIcons)
|
|
return QIcon(filename);
|
|
return ColorizeIcon(filename, SingleColor());
|
|
}
|
|
|
|
QIcon PlatformStyle::SingleColorIcon(const QIcon& icon) const
|
|
{
|
|
if (!colorizeIcons)
|
|
return icon;
|
|
return ColorizeIcon(icon, SingleColor());
|
|
}
|
|
|
|
QIcon PlatformStyle::TextColorIcon(const QIcon& icon) const
|
|
{
|
|
return ColorizeIcon(icon, TextColor());
|
|
}
|
|
|
|
const PlatformStyle *PlatformStyle::instantiate(const QString &platformId)
|
|
{
|
|
for (const auto& platform_style : platform_styles) {
|
|
if (platformId == platform_style.platformId) {
|
|
return new PlatformStyle(
|
|
platform_style.platformId,
|
|
platform_style.imagesOnButtons,
|
|
platform_style.colorizeIcons,
|
|
platform_style.useExtraSpacing);
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|