Krita Source Code Documentation
Loading...
Searching...
No Matches
KisFilterOptionWidget.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7
8#include <QWidget>
9#include <QCheckBox>
10#include <QGridLayout>
11
12#include <kis_signals_blocker.h>
13
14#include <kis_config_widget.h>
15#include <filter/kis_filter.h>
18
21
22#include "ui_wdgfilteroption.h"
23
24
25namespace {
26class FilterWidget : public QWidget, public Ui::FilterOpOptions
27{
28public:
29 FilterWidget(QWidget* parent = 0)
30 : QWidget(parent) {
31 setupUi(this);
32 }
33};
34}
35
36
38{
39 Private(lager::cursor<KisFilterOptionData> optionData)
40 : model(optionData)
41 {
42 }
43
44 QGridLayout *layout {0};
45
47
50
52 FilterWidget *page {0};
54};
55
56
57KisFilterOptionWidget::KisFilterOptionWidget(lager::cursor<KisFilterOptionData> optionData)
58 : KisPaintOpOption(i18n("Filter"), KisPaintOpOption::COLOR, true)
59 , m_d(new Private(optionData))
60{
61 setObjectName("KisFilterOption");
62 m_checkable = false;
63 using namespace KisWidgetConnectionUtils;
64
65 m_d->page = new FilterWidget();
67
68 m_d->layout = new QGridLayout(m_d->page->grpFilterOptions);
69
70 // Check which filters support painting
72 QList<KoID> supportedFilters;
73
74 for (auto it = allFilters.begin(); it != allFilters.end(); ++it) {
76 if (f->supportsPainting()) {
77 supportedFilters.push_back(KoID(*it, f->name()));
78 }
79 }
80
81 m_d->page->filtersList->setIDList(supportedFilters);
82
83 m_d->model.LAGER_QT(effectiveFilterState).bind(
86 this,
87 std::placeholders::_1,
88 std::placeholders::_2,
89 false)));
90
92
93 connectControl(m_d->page->checkBoxSmudgeMode, &m_d->model, "smudgeMode");
94
95 m_d->model.optionData.bind(std::bind(&KisFilterOptionWidget::emitSettingChanged, this));
96}
97
101
103{
104 m_d->model.bakedOptionData().write(setting.data());
105}
106
108{
109 KisFilterOptionData data = m_d->model.bakedOptionData();
110 data.read(setting.data());
111 m_d->model.optionData.set(data);
112
113}
114
116{
117 m_d->image = image;
118 m_d->model.LAGER_QT(effectiveFilterState).nudge();
119}
120
122{
123 m_d->paintDevice = node && node->paintDevice() ? node->paintDevice() : nullptr;
124
125 QString filterId;
126 QString filterConfig;
127 std::tie(filterId, filterConfig) = m_d->model.effectiveFilterState();
128 updateFilterState(filterId, filterConfig, true);
129}
130
131void KisFilterOptionWidget::updateFilterState(const QString &filterId, const QString &filterConfig, bool forceResetWidget)
132{
133 if (!m_d->currentFilter ||
134 m_d->currentFilter->id() != filterId) {
135
136 KisSignalsBlocker b(m_d->page->filtersList);
137 m_d->page->filtersList->setCurrent(filterId);
138
139 m_d->currentFilter = KisFilterRegistry::instance()->value(filterId);
140 KIS_SAFE_ASSERT_RECOVER_RETURN(m_d->currentFilter);
141
142 forceResetWidget = true;
143 }
144
145 if (!m_d->paintDevice) {
146 forceResetWidget = true;
147 }
148
149 if (forceResetWidget && m_d->currentFilterConfigWidget) {
150 m_d->currentFilterConfigWidget->hide();
151 m_d->layout->removeWidget(m_d->currentFilterConfigWidget);
152 m_d->layout->invalidate();
153 delete m_d->currentFilterConfigWidget;
154 m_d->currentFilterConfigWidget = nullptr;
155 }
156
157 if (m_d->paintDevice && !m_d->currentFilterConfigWidget) {
158 m_d->currentFilterConfigWidget =
159 m_d->currentFilter->createConfigurationWidget(m_d->page->grpFilterOptions, m_d->paintDevice, true);
160
161 if (m_d->currentFilterConfigWidget) {
162 KisSignalsBlocker b(m_d->currentFilterConfigWidget);
163
164 // TODO: init resources in ctor
165 m_d->currentFilterConfigWidget->setCanvasResourcesInterface(canvasResourcesInterface());
166 m_d->currentFilterConfigWidget->setConfiguration(m_d->currentFilter->defaultConfiguration(resourcesInterface()));
167 m_d->layout->addWidget(m_d->currentFilterConfigWidget);
168 m_d->page->grpFilterOptions->updateGeometry();
169 m_d->currentFilterConfigWidget->show();
170 connect(m_d->currentFilterConfigWidget, SIGNAL(sigConfigurationUpdated()),
171 this, SLOT(slotFilterConfigChangedInGui()));
172 }
173 }
174
175 if (m_d->currentFilterConfigWidget) {
177 m_d->currentFilter->factoryConfiguration(resourcesInterface());
178
179 config->fromXML(filterConfig);
180
181 KisSignalsBlocker b(m_d->currentFilterConfigWidget);
182 m_d->currentFilterConfigWidget->setConfiguration(config);
183 }
184}
185
187{
188 if (m_d->currentFilter && m_d->currentFilter->id() == filterId.id()) return;
189
190 KisFilterSP newFilter = KisFilterRegistry::instance()->value(filterId.id());
192
194 m_d->model.seteffectiveFilterState(std::make_tuple(filterId.id(), filterConfig->toXML()));
195}
196
198{
199 KIS_SAFE_ASSERT_RECOVER_RETURN(m_d->currentFilter);
200
201 QString config;
202
203 if (m_d->currentFilterConfigWidget) {
204 config = m_d->currentFilterConfigWidget->configuration()->toXML();
205 } else {
206 KisFilterConfigurationSP filterConfig = m_d->currentFilter->defaultConfiguration(resourcesInterface());
207 config = filterConfig->toXML();
208 }
209
210 m_d->model.seteffectiveFilterState(std::make_tuple(m_d->currentFilter->id(), config));
211}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void activated(const KoID &)
const QScopedPointer< Private > m_d
void readOptionSetting(const KisPropertiesConfigurationSP setting) override
void slotFilterIdChangedInGui(const KoID &fitlerId)
void updateFilterState(const QString &fitlerId, const QString &filterConfig, bool forceResetWidget=false)
void writeOptionSetting(KisPropertiesConfigurationSP setting) const override
KisFilterOptionWidget(lager::cursor< KisFilterOptionData > optionData)
void setNode(KisNodeWSP node) override
void setImage(KisImageWSP image) override
static KisFilterRegistry * instance()
KisResourcesInterfaceSP resourcesInterface() const
void setConfigurationPage(QWidget *page)
KoCanvasResourcesInterfaceSP canvasResourcesInterface() const
const T value(const QString &id) const
QList< QString > keys() const
Definition KoID.h:30
QString id() const
Definition KoID.cpp:63
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327
constexpr auto unzip_wrapper
Definition KisMpl.h:70
virtual KisPaintDeviceSP paintDevice() const =0
virtual KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const
bool read(const KisPropertiesConfiguration *setting)
Private(lager::cursor< KisFilterOptionData > optionData)