File indexing completed on 2024-05-12 16:01:36

0001 /*
0002  *  SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_node_view_color_scheme.h"
0008 
0009 #include <QTreeView>
0010 #include <QStyle>
0011 
0012 #include <kis_painting_tweaks.h>
0013 #include <QApplication>
0014 
0015 #include <QGlobalStatic>
0016 #include <kis_config.h>
0017 Q_GLOBAL_STATIC(KisNodeViewColorScheme, s_instance)
0018 
0019 struct KisNodeViewColorScheme::Private
0020 {
0021     Private() {
0022         if (colorLabels.isEmpty()) {
0023             colorLabels << Qt::transparent;
0024             colorLabels << QColor(91,173,220);
0025             colorLabels << QColor(151,202,63);
0026             colorLabels << QColor(247,229,61);
0027             colorLabels << QColor(255,170,63);
0028             colorLabels << QColor(177,102,63);
0029             colorLabels << QColor(238,50,51);
0030             colorLabels << QColor(191,106,209);
0031             colorLabels << QColor(118,119,114);
0032 
0033             const QColor noLabelSetColor = qApp->palette().color(QPalette::Highlight);
0034             for (auto it = colorLabels.begin(); it != colorLabels.end(); ++it) {
0035                 KisPaintingTweaks::dragColor(&(*it), noLabelSetColor, 0.35);
0036             }
0037         }
0038     }
0039 
0040     static QVector<QColor> colorLabels;
0041 };
0042 
0043 QVector<QColor> KisNodeViewColorScheme::Private::colorLabels;
0044 
0045 
0046 KisNodeViewColorScheme::KisNodeViewColorScheme()
0047     : m_d(new Private)
0048 {
0049 }
0050 
0051 KisNodeViewColorScheme::~KisNodeViewColorScheme()
0052 {
0053 }
0054 
0055 KisNodeViewColorScheme* KisNodeViewColorScheme::instance()
0056 {
0057     return s_instance;
0058 }
0059 
0060 QColor KisNodeViewColorScheme::gridColor(const QStyleOptionViewItem &option, QTreeView *view) const
0061 {
0062     const int gridHint = view->style()->styleHint(QStyle::SH_Table_GridLineColor, &option, view);
0063     const QColor gridColor = static_cast<QRgb>(gridHint);
0064     return gridColor;
0065 }
0066 
0067 int KisNodeViewColorScheme::visibilitySize() const
0068 {
0069     return 16;
0070 }
0071 
0072 int KisNodeViewColorScheme::visibilityMargin() const
0073 {
0074     return 2;
0075 }
0076 
0077 
0078 int KisNodeViewColorScheme::thumbnailSize() const
0079 {
0080     KisConfig cfg(true);
0081     return cfg.layerThumbnailSize(false);
0082 }
0083 
0084 int KisNodeViewColorScheme::thumbnailMargin() const
0085 {
0086     return 3;
0087 }
0088 
0089 int KisNodeViewColorScheme::decorationSize() const
0090 {
0091     return 12;
0092 }
0093 
0094 int KisNodeViewColorScheme::decorationMargin() const
0095 {
0096     return 1;
0097 }
0098 
0099 
0100 int KisNodeViewColorScheme::textMargin() const
0101 {
0102     return 2;
0103 }
0104 
0105 
0106 int KisNodeViewColorScheme::iconSize() const
0107 {
0108     return 16;
0109 }
0110 
0111 int KisNodeViewColorScheme::iconMargin() const
0112 {
0113     return 1;
0114 }
0115 
0116 int KisNodeViewColorScheme::border() const
0117 {
0118     return 1;
0119 }
0120 
0121 int KisNodeViewColorScheme::rowHeight() const
0122 {
0123     return border() + 2 * thumbnailMargin() + thumbnailSize();
0124 }
0125 
0126 int KisNodeViewColorScheme::visibilityColumnWidth() const
0127 {
0128     return border() +
0129         2 * visibilityMargin() + visibilitySize() +
0130         border();
0131 }
0132 
0133 int KisNodeViewColorScheme::indentation() const
0134 {
0135     KisConfig cfg(true);
0136     int percentage = cfg.layerTreeIndentation();
0137     int absoluteMax = 2 * thumbnailMargin() + thumbnailSize() + border();
0138 
0139     return qMax(8, percentage*absoluteMax/100);
0140 }
0141 
0142 QRect KisNodeViewColorScheme::relVisibilityRect() const
0143 {
0144     return QRect(0, 0,
0145                  visibilitySize() + 2 * visibilityMargin() + 2 * border(),
0146                  visibilitySize() + 2 * visibilityMargin() + 1 * border());
0147 }
0148 
0149 QRect KisNodeViewColorScheme::relThumbnailRect() const
0150 {
0151     return QRect(0, 0,
0152                  thumbnailSize() + 2 * thumbnailMargin() + 2 * border(),
0153                  thumbnailSize() + 2 * thumbnailMargin() + 1 * border());
0154 }
0155 
0156 QRect KisNodeViewColorScheme::relDecorationRect() const
0157 {
0158     return QRect(0, 0,
0159                  decorationSize() + 2 * decorationMargin() + 2 * border(),
0160                  decorationSize() + 2 * decorationMargin() + 1 * border());
0161 }
0162 
0163 QRect KisNodeViewColorScheme::relExpandButtonRect() const
0164 {
0165     const int newY = rowHeight() - decorationMargin() - decorationSize();
0166     QRect rc = relDecorationRect();
0167     rc.moveTop(newY);
0168     return rc;
0169 }
0170 
0171 QColor KisNodeViewColorScheme::colorFromLabelIndex(int index) const
0172 {
0173     /**
0174      * We should ensure that the index of the overflowing range
0175      * will never be zero again.
0176      */
0177     if (index >= m_d->colorLabels.size()) {
0178         index = 1 + index % (m_d->colorLabels.size() - 1);
0179     } else {
0180         index = index % m_d->colorLabels.size();
0181     }
0182 
0183     return m_d->colorLabels[index];
0184 }
0185 
0186 QVector<QColor> KisNodeViewColorScheme::allColorLabels() const
0187 {
0188     return m_d->colorLabels;
0189 }