1 /*
2  * This file is part of KQuickCharts
3  * SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
4  * SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
5  * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
6  *
7  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
8  */
9 
10 #include "ColorGradientSource.h"
11 
12 #include <QVariant>
13 
14 #include <QDebug>
15 
ColorGradientSource(QObject * parent)16 ColorGradientSource::ColorGradientSource(QObject *parent)
17     : ChartDataSource(parent)
18 {
19 }
20 
itemCount() const21 int ColorGradientSource::itemCount() const
22 {
23     return m_itemCount;
24 }
25 
item(int index) const26 QVariant ColorGradientSource::item(int index) const
27 {
28     if (index < 0 || index >= m_colors.size()) {
29         return QVariant{};
30     }
31 
32     return m_colors.at(index);
33 }
34 
minimum() const35 QVariant ColorGradientSource::minimum() const
36 {
37     return QVariant{};
38 }
39 
maximum() const40 QVariant ColorGradientSource::maximum() const
41 {
42     return QVariant{};
43 }
44 
baseColor() const45 QColor ColorGradientSource::baseColor() const
46 {
47     return m_baseColor;
48 }
49 
setBaseColor(const QColor & newBaseColor)50 void ColorGradientSource::setBaseColor(const QColor &newBaseColor)
51 {
52     if (newBaseColor == m_baseColor) {
53         return;
54     }
55 
56     m_baseColor = newBaseColor;
57     regenerateColors();
58     Q_EMIT baseColorChanged();
59 }
60 
setItemCount(int newItemCount)61 void ColorGradientSource::setItemCount(int newItemCount)
62 {
63     if (newItemCount == m_itemCount) {
64         return;
65     }
66 
67     m_itemCount = newItemCount;
68     regenerateColors();
69     Q_EMIT itemCountChanged();
70 }
71 
colors() const72 QVariantList ColorGradientSource::colors() const
73 {
74     QVariantList colorsVariant;
75     colorsVariant.reserve(m_colors.count());
76     for (const QColor &color : qAsConst(m_colors)) {
77         colorsVariant.append(color);
78     }
79     return colorsVariant;
80 }
81 
regenerateColors()82 void ColorGradientSource::regenerateColors()
83 {
84     if (!m_baseColor.isValid() || m_itemCount <= 0) {
85         return;
86     }
87 
88     m_colors.clear();
89 
90     for (int i = 0; i < m_itemCount; ++i) {
91         auto newHue = m_baseColor.hsvHueF() + i * (1.0 / m_itemCount);
92         newHue = newHue - int(newHue);
93         m_colors.append(QColor::fromHsvF(newHue, m_baseColor.saturationF(), m_baseColor.valueF(), m_baseColor.alphaF()));
94     }
95 
96     Q_EMIT dataChanged();
97 }
98