eec7757445
Introduce a PlatformStyle to handle platform-specific customization of the UI. This replaces 'scicon', as well as #ifdefs to determine whether to place icons on buttons. The selected PlatformStyle defaults to the platform that the application was compiled on, but can be overridden from the command line with `-uiplatform=<x>`. Also fixes the warning from #6328.
147 lines
4.2 KiB
C++
147 lines
4.2 KiB
C++
// Copyright (c) 2015 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 "platformstyle.h"
|
|
|
|
#include "guiconstants.h"
|
|
|
|
#include <QApplication>
|
|
#include <QColor>
|
|
#include <QIcon>
|
|
#include <QImage>
|
|
#include <QPalette>
|
|
#include <QPixmap>
|
|
|
|
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, false, true},
|
|
{"windows", true, false, false},
|
|
/* Other: linux, unix, ... */
|
|
{"other", true, true, false}
|
|
};
|
|
static const unsigned platform_styles_count = sizeof(platform_styles)/sizeof(*platform_styles);
|
|
|
|
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;
|
|
QSize sz;
|
|
Q_FOREACH(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),
|
|
singleColor(0,0,0),
|
|
textColor(0,0,0)
|
|
{
|
|
// Determine icon highlighting color
|
|
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();
|
|
QColor colorbase;
|
|
if (abs(colorHighlightBg.lightness() - colorTextLightness) < abs(colorHighlightFg.lightness() - colorTextLightness))
|
|
colorbase = colorHighlightBg;
|
|
else
|
|
colorbase = colorHighlightFg;
|
|
singleColor = colorbase;
|
|
}
|
|
// Determine text color
|
|
textColor = QColor(QApplication::palette().color(QPalette::WindowText));
|
|
}
|
|
|
|
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 QString& filename) const
|
|
{
|
|
return ColorizeIcon(filename, TextColor());
|
|
}
|
|
|
|
QIcon PlatformStyle::TextColorIcon(const QIcon& icon) const
|
|
{
|
|
return ColorizeIcon(icon, TextColor());
|
|
}
|
|
|
|
const PlatformStyle *PlatformStyle::instantiate(const QString &platformId)
|
|
{
|
|
for (unsigned x=0; x<platform_styles_count; ++x)
|
|
{
|
|
if (platformId == platform_styles[x].platformId)
|
|
{
|
|
return new PlatformStyle(
|
|
platform_styles[x].platformId,
|
|
platform_styles[x].imagesOnButtons,
|
|
platform_styles[x].colorizeIcons,
|
|
platform_styles[x].useExtraSpacing);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|