platformstyle.cpp raw

   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  
 138