Skip to content

Commit

Permalink
Move internal config stuff to config class in the gradient map filter
Browse files Browse the repository at this point in the history
  • Loading branch information
deiflou authored and hallarempt committed Dec 17, 2020
1 parent ca3ec29 commit 3bf44a3
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 95 deletions.
27 changes: 5 additions & 22 deletions plugins/filters/gradientmap/KisGradientMapFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
* SPDX-License-Identifier: GPL-2.0-or-later
*/

#include <QDomDocument>

#include <KoColorSpace.h>
#include <KoColor.h>
#include <kis_paint_device.h>
Expand Down Expand Up @@ -259,32 +257,17 @@ void KisGradientMapFilter::processImpl(KisPaintDeviceSP device,
KisFilterConfigurationSP KisGradientMapFilter::factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
{

return new KisGradientMapFilterConfiguration(id().id(), 2, resourcesInterface);
return new KisGradientMapFilterConfiguration(resourcesInterface);
}

KisFilterConfigurationSP KisGradientMapFilter::defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const
{
KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);

auto source = resourcesInterface->source<KoAbstractGradient>(ResourceType::Gradients);
KoAbstractGradientSP gradient = source.fallbackResource();

KoStopGradient stopGradient;
QScopedPointer<QGradient> qGradient(gradient->toQGradient());
stopGradient.fromQGradient(qGradient.data());
QDomDocument doc;
QDomElement elt = doc.createElement("gradient");
stopGradient.toXML(doc, elt);
doc.appendChild(elt);
config->setProperty("gradientXML", doc.toString());

config->setProperty("colorMode", false);
KisDitherWidget::factoryConfiguration(*config, "dither/");

KisGradientMapFilterConfigurationSP config = new KisGradientMapFilterConfiguration(resourcesInterface);
config->setDefaults();
return config;
}

KisConfigWidget* KisGradientMapFilter::createConfigurationWidget(QWidget * parent, const KisPaintDeviceSP dev, bool) const
KisConfigWidget* KisGradientMapFilter::createConfigurationWidget(QWidget * parent, const KisPaintDeviceSP, bool) const
{
return new KisGradientMapFilterConfigWidget(parent, dev);
return new KisGradientMapFilterConfigWidget(parent);
}
67 changes: 35 additions & 32 deletions plugins/filters/gradientmap/KisGradientMapFilterConfigWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,23 @@
#include <KisViewManager.h>
#include <kis_canvas_resource_provider.h>
#include <kis_filter_registry.h>
#include <kis_signals_blocker.h>

#include "KisGradientMapFilterConfigWidget.h"
#include "KisGradientMapFilterConfiguration.h"

KisGradientMapFilterConfigWidget::KisGradientMapFilterConfigWidget(QWidget *parent, KisPaintDeviceSP dev, Qt::WindowFlags f)

KisGradientMapFilterConfigWidget::KisGradientMapFilterConfigWidget(QWidget *parent, Qt::WindowFlags f)
: KisConfigWidget(parent, f)
, m_activeGradient(nullptr)
, m_view(nullptr)
{
Q_UNUSED(dev);

m_ui.setupUi(this);

m_gradientChangedCompressor = new KisSignalCompressor(100, KisSignalCompressor::FIRST_ACTIVE);

m_gradientPopUp = new KoResourcePopupAction(ResourceType::Gradients, 0, m_ui.btnGradientChooser);

m_activeGradient = KoStopGradient::fromQGradient(m_gradientPopUp->currentResource().dynamicCast<KoAbstractGradient>()->toQGradient());
m_ui.gradientEditor->setGradient(m_activeGradient);
m_ui.gradientEditor->setCompactMode(true);
m_ui.gradientEditor->setEnabled(true);
Expand All @@ -53,51 +55,52 @@ void KisGradientMapFilterConfigWidget::setAbstractGradientToEditor()
m_gradientPopUp->currentBackground());
m_activeGradient = KoStopGradient::fromQGradient(bg->gradient());
m_ui.gradientEditor->setGradient(m_activeGradient);

}

KisPropertiesConfigurationSP KisGradientMapFilterConfigWidget::configuration() const
{
KisFilterSP filter = KisFilterRegistry::instance()->get("gradientmap");
KisFilterConfigurationSP cfg = filter->factoryConfiguration(KisGlobalResourcesInterface::instance());
if (m_activeGradient) {
QDomDocument doc;
QDomElement elt = doc.createElement("gradient");
m_activeGradient->toXML(doc, elt);
doc.appendChild(elt);
cfg->setProperty("gradientXML", doc.toString());
KisGradientMapFilterConfiguration *config = new KisGradientMapFilterConfiguration(KisGlobalResourcesInterface::instance());

KoStopGradientSP gradient = m_activeGradient->clone().dynamicCast<KoStopGradient>();
if (gradient && m_view) {
KoCanvasResourcesInterfaceSP canvasResourcesInterface =
m_view->canvasResourceProvider()->resourceManager()->canvasResourcesInterface();
gradient->bakeVariableColors(canvasResourcesInterface);
}
config->setGradient(gradient);

cfg->setProperty("colorMode", m_ui.colorModeComboBox->currentIndex());
m_ui.ditherWidget->configuration(*cfg, "dither/");
config->setColorMode(m_ui.colorModeComboBox->currentIndex());
m_ui.ditherWidget->configuration(*config, "dither/");

return cfg;
return config;
}

void KisGradientMapFilterConfigWidget::setConfiguration(const KisPropertiesConfigurationSP config)
{
Q_ASSERT(config);
QDomDocument doc;
if (config->hasProperty("gradientXML")) {
doc.setContent(config->getString("gradientXML", ""));
KoStopGradient gradient = KoStopGradient::fromXML(doc.firstChildElement());
if (gradient.stops().size() > 0) {
m_activeGradient->setStops(gradient.stops());
m_activeGradient->updateVariableColors(m_ui.gradientEditor->canvasResourcesInterface());
const KisGradientMapFilterConfiguration *filterConfig =
dynamic_cast<const KisGradientMapFilterConfiguration*>(config.data());
Q_ASSERT(filterConfig);

{
KisSignalsBlocker signalsBlocker(this);

m_activeGradient = filterConfig->gradient();
if (m_activeGradient && m_view) {
KoCanvasResourcesInterfaceSP canvasResourcesInterface =
m_view->canvasResourceProvider()->resourceManager()->canvasResourcesInterface();
m_activeGradient->updateVariableColors(canvasResourcesInterface);
}
m_ui.gradientEditor->setGradient(m_activeGradient);
}

m_ui.colorModeComboBox->setCurrentIndex(filterConfig->colorMode());

m_ui.colorModeComboBox->setCurrentIndex(config->getInt("colorMode"));
m_ui.ditherWidget->setConfiguration(*filterConfig, "dither/");
}

const KisFilterConfiguration *filterConfig = dynamic_cast<const KisFilterConfiguration*>(config.data());
KIS_SAFE_ASSERT_RECOVER_RETURN(filterConfig);
m_ui.ditherWidget->setConfiguration(*filterConfig, "dither/");
emit sigConfigurationUpdated();
}

void KisGradientMapFilterConfigWidget::setView(KisViewManager *view)
{
m_ui.gradientEditor->setCanvasResourcesInterface(view->canvasResourceProvider()->resourceManager()->canvasResourcesInterface());
m_gradientPopUp->setCanvasResourcesInterface(view->canvasResourceProvider()->resourceManager()->canvasResourcesInterface());
m_activeGradient->updateVariableColors(m_ui.gradientEditor->canvasResourcesInterface());
m_view = view;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,27 @@

#include "ui_KisGradientMapFilterConfigWidget.h"

class KisViewManager;

class KisGradientMapFilterConfigWidget : public KisConfigWidget
{
Q_OBJECT

public:
KisGradientMapFilterConfigWidget(QWidget *parent, KisPaintDeviceSP dev, Qt::WindowFlags f = Qt::WindowFlags());
KisGradientMapFilterConfigWidget(QWidget *parent, Qt::WindowFlags f = Qt::WindowFlags());
~KisGradientMapFilterConfigWidget() override;

KisPropertiesConfigurationSP configuration() const override;
void setConfiguration(const KisPropertiesConfigurationSP config) override;

void setView(KisViewManager *view) override;

private:
Ui_GradientMapFilterConfigWidget m_ui;
KoResourcePopupAction *m_gradientPopUp;
KisSignalCompressor *m_gradientChangedCompressor;
KoStopGradientSP m_activeGradient;
void setView(KisViewManager *view) override;
KisViewManager *m_view;

private Q_SLOTS:
void setAbstractGradientToEditor();
Expand Down
98 changes: 64 additions & 34 deletions plugins/filters/gradientmap/KisGradientMapFilterConfiguration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,66 @@

#include <KoStopGradient.h>
#include <KoAbstractGradient.h>
#include <KisResourcesInterface.h>
#include <KisDitherWidget.h>

#include "KisGradientMapFilterConfiguration.h"

KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration(const QString & name, qint32 version, KisResourcesInterfaceSP resourcesInterface)
: KisFilterConfiguration(name, version, resourcesInterface)
{
}
KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration(KisResourcesInterfaceSP resourcesInterface)
: KisFilterConfiguration(defaultName(), defaultVersion(), resourcesInterface)
{}

KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration(qint32 version, KisResourcesInterfaceSP resourcesInterface)
: KisFilterConfiguration(defaultName(), version, resourcesInterface)
{}

KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration(const KisGradientMapFilterConfiguration &rhs)
: KisFilterConfiguration(rhs)
{
}
{}

KisFilterConfigurationSP KisGradientMapFilterConfiguration::clone() const
{
return new KisGradientMapFilterConfiguration(*this);
}

KoStopGradientSP KisGradientMapFilterConfiguration::gradientImpl(KisResourcesInterfaceSP resourcesInterface) const
QList<KoResourceSP> KisGradientMapFilterConfiguration::linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const
{
QList<KoResourceSP> resources;

// only the first version of the filter loaded the gradient by name
if (this->version() == 1) {
KoStopGradientSP gradient = this->gradient();
if (gradient) {
resources << gradient;
}
}

resources << KisDitherWidget::prepareLinkedResources(*this, "dither/", globalResourcesInterface);

return resources;
}

QList<KoResourceSP> KisGradientMapFilterConfiguration::embeddedResources(KisResourcesInterfaceSP) const
{
QList<KoResourceSP> resources;

// the second version of the filter embeds the gradient
if (this->version() > 1) {
KoStopGradientSP gradient = this->gradient();

if (gradient) {
resources << gradient;
}
}

return resources;
}

KoStopGradientSP KisGradientMapFilterConfiguration::gradient() const
{
KoStopGradientSP gradient;

if (this->version() == 1) {
auto source = resourcesInterface->source<KoAbstractGradient>(ResourceType::Gradients);
auto source = resourcesInterface()->source<KoAbstractGradient>(ResourceType::Gradients);

KoAbstractGradientSP gradientAb = source.resourceForName(this->getString("gradientName"));
if (!gradientAb) {
Expand Down Expand Up @@ -69,40 +103,36 @@ KoStopGradientSP KisGradientMapFilterConfiguration::gradientImpl(KisResourcesInt
return gradient;
}

KoStopGradientSP KisGradientMapFilterConfiguration::gradient() const
int KisGradientMapFilterConfiguration::colorMode() const
{
return gradientImpl(resourcesInterface());
return getInt("colorMode", defaultColorMode());
}

QList<KoResourceSP> KisGradientMapFilterConfiguration::linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const
void KisGradientMapFilterConfiguration::setGradient(KoStopGradientSP newGradient)
{
QList<KoResourceSP> resources;

// only the first version of the filter loaded the gradient by name
if (this->version() == 1) {
KoStopGradientSP gradient = gradientImpl(globalResourcesInterface);
if (gradient) {
resources << gradient;
}
if (!newGradient) {
setProperty("gradientXML", "");
return;
}

resources << KisDitherWidget::prepareLinkedResources(*this, "dither/", globalResourcesInterface);
QDomDocument document;
QDomElement gradientElement = document.createElement("gradient");
gradientElement.setAttribute("name", newGradient->name());

return resources;
newGradient->toXML(document, gradientElement);

document.appendChild(gradientElement);
setProperty("gradientXML", document.toString());
}

QList<KoResourceSP> KisGradientMapFilterConfiguration::embeddedResources(KisResourcesInterfaceSP globalResourcesInterface) const
void KisGradientMapFilterConfiguration::setColorMode(int newColorMode)
{
QList<KoResourceSP> resources;

// the second version of the filter embeds the gradient
if (this->version() > 1) {
KoStopGradientSP gradient = gradientImpl(globalResourcesInterface);

if (gradient) {
resources << gradient;
}
}
setProperty("colorMode", newColorMode);
}

return resources;
void KisGradientMapFilterConfiguration::setDefaults()
{
setGradient(defaultGradient(resourcesInterface()));
setColorMode(defaultColorMode());
KisDitherWidget::factoryConfiguration(*this, "dither/");
}
49 changes: 44 additions & 5 deletions plugins/filters/gradientmap/KisGradientMapFilterConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,64 @@
#define KIS_GRADIENT_MAP_FILTER_CONFIGURATION_H

#include <kis_filter_configuration.h>
#include <KisGradientConversion.h>
#include <KisResourcesInterface.h>

class KisGradientMapFilterConfiguration;
typedef KisPinnedSharedPtr<KisGradientMapFilterConfiguration> KisGradientMapFilterConfigurationSP;

class KisGradientMapFilterConfiguration : public KisFilterConfiguration
{
public:
KisGradientMapFilterConfiguration(const QString & name, qint32 version, KisResourcesInterfaceSP resourcesInterface);
enum ColorMode {
ColorMode_Blend,
ColorMode_Nearest,
ColorMode_Dither
};

KisGradientMapFilterConfiguration(KisResourcesInterfaceSP resourcesInterface);
KisGradientMapFilterConfiguration(qint32 version, KisResourcesInterfaceSP resourcesInterface);
KisGradientMapFilterConfiguration(const KisGradientMapFilterConfiguration &rhs);

virtual KisFilterConfigurationSP clone() const override;

KoStopGradientSP gradient() const;

QList<KoResourceSP> linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const override;
QList<KoResourceSP> embeddedResources(KisResourcesInterfaceSP globalResourcesInterface) const override;

static inline QString defaultName()
{
return "gradientmap";
}

static constexpr qint32 defaultVersion()
{
return 2;
}

static inline KoStopGradientSP defaultGradient(KisResourcesInterfaceSP resourcesInterface)
{
KoStopGradientSP gradient =
KoStopGradientSP(
KisGradientConversion::toStopGradient(
resourcesInterface->source<KoAbstractGradient>(ResourceType::Gradients).fallbackResource()
)
);
gradient->setName(i18nc("Default gradient name for the gradient generator", "Unnamed"));
gradient->setValid(true);
return gradient;
}

static constexpr int defaultColorMode()
{
return ColorMode_Blend;
}

KoStopGradientSP gradient() const;
int colorMode() const;

private:
KoStopGradientSP gradientImpl(KisResourcesInterfaceSP resourcesInterface) const;
void setGradient(KoStopGradientSP newGradient);
void setColorMode(int newColorMode);
void setDefaults();
};

#endif

0 comments on commit 3bf44a3

Please sign in to comment.