1 /*
2  * This file is part of the KDE project
3  *
4  * Copyright (c) 2016 Spencer Brown <sbrown655@gmail.com>
5  * Copyright (c) 2020 Deif Lou <ginoba@gmail.com>
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  */
9 
10 #include <QDomDocument>
11 
12 #include <KoStopGradient.h>
13 #include <KoAbstractGradient.h>
14 #include <KisDitherWidget.h>
15 
16 #include "KisGradientMapFilterConfiguration.h"
17 
KisGradientMapFilterConfiguration()18 KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration()
19     : KisFilterConfiguration(defaultName(), defaultVersion())
20 {}
21 
KisGradientMapFilterConfiguration(qint32 version)22 KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration(qint32 version)
23     : KisFilterConfiguration(defaultName(), version)
24 {}
25 
gradient() const26 KoAbstractGradientSP KisGradientMapFilterConfiguration::gradient() const
27 {
28     if (version() == 1) {
29         KoAbstractGradient *resourceGradient = KoResourceServerProvider::instance()->gradientServer()->resourceByName(getString("gradientName"));
30         if (resourceGradient) {
31             KoAbstractGradientSP gradient = KoAbstractGradientSP(resourceGradient->clone());
32             gradient->setValid(true);
33             return gradient;
34         } else {
35             qWarning() << "Could not find gradient" << getString("gradientName");
36         }
37     } else if (version() == 2) {
38         QDomDocument document;
39         if (document.setContent(getString("gradientXML", ""))) {
40             const QDomElement gradientElement = document.firstChildElement();
41             if (!gradientElement.isNull()) {
42                 const QString gradientType = gradientElement.attribute("type");
43                 KoAbstractGradientSP gradient;
44                 if (gradientType == "stop") {
45                     gradient = KoAbstractGradientSP(KoStopGradient::fromXML(gradientElement).clone());
46                 } else if (gradientType == "segment") {
47                     gradient = KoAbstractGradientSP(KoSegmentGradient::fromXML(gradientElement).clone());
48                 }
49                 if (gradient) {
50                     gradient->setName(gradientElement.attribute("name", ""));
51                     gradient->setValid(true);
52                     return gradient;
53                 }
54             }
55         }
56     }
57     return defaultGradient();
58 }
59 
colorMode() const60 int KisGradientMapFilterConfiguration::colorMode() const
61 {
62     return getInt("colorMode", defaultColorMode());
63 }
64 
setGradient(KoAbstractGradientSP newGradient)65 void KisGradientMapFilterConfiguration::setGradient(KoAbstractGradientSP newGradient)
66 {
67     if (!newGradient) {
68         setProperty("gradientXML", "");
69         return;
70     }
71 
72     QDomDocument document;
73     QDomElement gradientElement = document.createElement("gradient");
74     gradientElement.setAttribute("name", newGradient->name());
75 
76     if (dynamic_cast<KoStopGradient*>(newGradient.data())) {
77         KoStopGradient *gradient = dynamic_cast<KoStopGradient*>(newGradient.data());
78         gradient->toXML(document, gradientElement);
79     } else if (dynamic_cast<KoSegmentGradient*>(newGradient.data())) {
80         KoSegmentGradient *gradient = dynamic_cast<KoSegmentGradient*>(newGradient.data());
81         gradient->toXML(document, gradientElement);
82     }
83 
84     document.appendChild(gradientElement);
85     setProperty("gradientXML", document.toString());
86 }
87 
setColorMode(int newColorMode)88 void KisGradientMapFilterConfiguration::setColorMode(int newColorMode)
89 {
90     setProperty("colorMode", newColorMode);
91 }
92 
setDefaults()93 void KisGradientMapFilterConfiguration::setDefaults()
94 {
95     setGradient(defaultGradient());
96     setColorMode(defaultColorMode());
97     KisDitherWidget::factoryConfiguration(*this, "dither/");
98 }
99