Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_filter_selector_widget.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2007-2008 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2009 Boudewijn Rempt <boud@valdyas.org>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 *
7 */
8
10
11#include <QHeaderView>
12#include <QTreeView>
13#include <QLabel>
14#include <QScrollArea>
15#include <QLayout>
16#include <QDialogButtonBox>
17#include <QPlainTextEdit>
18#include <QDomDocument>
19#include <QDomElement>
20
21#include "ui_wdgfilterselector.h"
22
23#include <kis_layer.h>
24#include <kis_paint_device.h>
25#include <filter/kis_filter.h>
26#include <kis_config_widget.h>
28#include "kis_default_bounds.h"
29#include <KisKineticScroller.h>
31
32// From krita/ui
35#include "kis_filters_model.h"
36#include "kis_config.h"
37
38#include <kstandardguiitem.h>
39
41public:
43 ~ThumbnailBounds() override {}
44
45 QRect bounds() const override
46 {
47 return QRect(0, 0, 100, 100);
48 }
49private:
50 Q_DISABLE_COPY(ThumbnailBounds)
51};
52
53
68
70 : d(new Private)
71{
72 Q_UNUSED(parent);
73 setObjectName("KisFilterSelectorWidget");
74 d->uiFilterSelector.setupUi(this);
75
76 d->widgetLayout = new QGridLayout(d->uiFilterSelector.centralWidgetHolder);
77 d->widgetLayout->setContentsMargins(0,0,0,0);
78 d->widgetLayout->setHorizontalSpacing(0);
79
80 showFilterGallery(false);
81
82 connect(d->uiFilterSelector.filtersSelector, SIGNAL(clicked(QModelIndex)), SLOT(setFilterIndex(QModelIndex)));
83 connect(d->uiFilterSelector.filtersSelector, SIGNAL(activated(QModelIndex)), SLOT(setFilterIndex(QModelIndex)));
84
85 connect(d->uiFilterSelector.comboBoxPresets, SIGNAL(activated(int)),SLOT(slotBookmarkedFilterConfigurationSelected(int)));
86 connect(d->uiFilterSelector.pushButtonEditPresets, SIGNAL(pressed()), SLOT(editConfigurations()));
87 connect(d->uiFilterSelector.btnXML, SIGNAL(clicked()), this, SLOT(showXMLdialog()));
88
89 KisConfig cfg(true);
90 d->uiFilterSelector.chkRememberPreset->setChecked(cfg.readEntry<bool>("filterdialog/rememberlastpreset", false));
91
92}
93
95{
96 KisConfig cfg(false);
97 cfg.writeEntry<bool>("filterdialog/rememberlastpreset", d->uiFilterSelector.chkRememberPreset->isChecked());
98 delete d->filtersModel;
100 delete d->currentCentralWidget;
101 delete d->widgetLayout;
102 delete d;
103}
104
106{
107 d->view = view;
108}
109
111{
112 if (!_paintDevice) return;
113
114 if (d->filtersModel) delete d->filtersModel;
115
116 d->usedForMask = !showAll;
117 d->paintDevice = _paintDevice;
120 d->filtersModel = new KisFiltersModel(showAll, d->thumb);
121
122 d->uiFilterSelector.filtersSelector->setFilterModel(d->filtersModel);
123 d->uiFilterSelector.filtersSelector->header()->setVisible(false);
124
125 KisConfig cfg(true);
126 QModelIndex idx = d->filtersModel->indexForFilter(cfg.readEntry<QString>("FilterSelector/LastUsedFilter", "levels"));
127
128 if (!idx.isValid()) {
129 idx = d->filtersModel->indexForFilter("levels");
130 }
131
133 d->uiFilterSelector.filtersSelector->activateFilter(idx);
134 }
135
136}
137
139{
140 if (d->showFilterGallery == visible) {
141 return;
142 }
143
144 d->showFilterGallery = visible;
145 update();
146 Q_EMIT sigFilterGalleryToggled(visible);
147 Q_EMIT sigSizeChanged();
148}
149
151{
152 if (currentFilter()->showConfigurationWidget()) {
153 QDialog *xmlDialog = new QDialog(qApp->activeWindow());
154 xmlDialog->setMinimumWidth(500);
155 xmlDialog->setWindowTitle(i18n("Filter configuration XML"));
156 QVBoxLayout *xmllayout = new QVBoxLayout(xmlDialog);
157 QPlainTextEdit *text = new QPlainTextEdit(xmlDialog);
159 text->setPlainText(config->toXML());
160 xmllayout->addWidget(text);
161 QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel, xmlDialog);
162 KGuiItem::assign(buttons->button(QDialogButtonBox::Ok), KStandardGuiItem::ok());
163 KGuiItem::assign(buttons->button(QDialogButtonBox::Cancel), KStandardGuiItem::cancel());
164 connect(buttons, SIGNAL(accepted()), xmlDialog, SLOT(accept()));
165 connect(buttons, SIGNAL(rejected()), xmlDialog, SLOT(reject()));
166 xmllayout->addWidget(buttons);
167 if (xmlDialog->exec()==QDialog::Accepted) {
168 QDomDocument doc;
169 doc.setContent(text->toPlainText());
170 config->fromXML(doc.documentElement());
171 if (config) {
173 }
174 }
175 }
176}
177
182
187
189{
190 Q_ASSERT(f);
191 Q_ASSERT(d->filtersModel);
192 setWindowTitle(f->name());
193 dbgKrita << "setFilter: " << f;
194 d->currentFilter = f;
195 delete d->currentCentralWidget;
196
197 {
198 bool v = d->uiFilterSelector.filtersSelector->blockSignals(true);
199 d->uiFilterSelector.filtersSelector->setCurrentIndex(d->filtersModel->indexForFilter(f->id()));
200 d->uiFilterSelector.filtersSelector->blockSignals(v);
201 }
202
203 KisConfigWidget* widget =
205
206 if (!widget) { // No widget, so display a label instead
207 d->uiFilterSelector.comboBoxPresets->setEnabled(false);
208 d->uiFilterSelector.pushButtonEditPresets->setEnabled(false);
209 d->uiFilterSelector.btnXML->setEnabled(false);
210
212 d->currentCentralWidget = new QLabel(i18n("No configuration options"),
213 d->uiFilterSelector.centralWidgetHolder);
214 d->uiFilterSelector.scrollArea->setMinimumSize(d->currentCentralWidget->sizeHint());
215 qobject_cast<QLabel*>(d->currentCentralWidget)->setAlignment(Qt::AlignCenter);
216 } else {
217 KisFilterConfigurationSP defaultConfiguration =
218 overrideDefaultConfig ?
219 overrideDefaultConfig :
221
222 d->uiFilterSelector.comboBoxPresets->setEnabled(true);
223 d->uiFilterSelector.pushButtonEditPresets->setEnabled(true);
224 d->uiFilterSelector.btnXML->setEnabled(true);
225
227 d->currentCentralWidget = widget;
228 widget->layout()->setContentsMargins(0,0,0,0);
230 d->currentFilterConfigurationWidget->blockSignals(true);
232 d->currentFilterConfigurationWidget->blockSignals(false);
233 d->uiFilterSelector.scrollArea->setContentsMargins(0,0,0,0);
234 d->uiFilterSelector.scrollArea->setMinimumWidth(widget->sizeHint().width() + 18);
235 connect(d->currentFilterConfigurationWidget, SIGNAL(sigConfigurationUpdated()), this, SIGNAL(configurationChanged()));
236 }
237
238 // Change the list of presets
242
243 // Add the widget to the layout
244 d->currentCentralWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
245 d->widgetLayout->addWidget(d->currentCentralWidget, 0 , 0);
246
247 if (d->uiFilterSelector.chkRememberPreset->isChecked()) {
248 int lastBookmarkedFilterConfiguration = KisConfig(true).readEntry<int>("lastBookmarkedFilterConfiguration/" + f->id(), 0);
249 if (d->uiFilterSelector.comboBoxPresets->count() > lastBookmarkedFilterConfiguration) {
250 d->uiFilterSelector.comboBoxPresets->setCurrentIndex(lastBookmarkedFilterConfiguration);
251 slotBookmarkedFilterConfigurationSelected(lastBookmarkedFilterConfiguration);
252 }
253 }
254
255 update();
256}
257
258void KisFilterSelectorWidget::setFilterIndex(const QModelIndex& idx)
259{
260 if (!idx.isValid()) return;
261
262 Q_ASSERT(d->filtersModel);
263 KisFilter* filter = const_cast<KisFilter*>(d->filtersModel->indexToFilter(idx));
264 if (filter) {
265 setFilter(filter, 0);
266 }
267 else {
268 if (d->currentFilter) {
269 bool v = d->uiFilterSelector.filtersSelector->blockSignals(true);
270 QModelIndex idx = d->filtersModel->indexForFilter(d->currentFilter->id());
271 d->uiFilterSelector.filtersSelector->setCurrentIndex(idx);
272 d->uiFilterSelector.filtersSelector->scrollTo(idx);
273 d->uiFilterSelector.filtersSelector->blockSignals(v);
274 }
275 }
276
278 emit(configurationChanged());
279}
280
282 KisConfig cfg(false);
283 cfg.writeEntry<QString>("FilterSelector/LastUsedFilter", d->currentFilter->id());
284}
285
287{
289 QModelIndex modelIndex = d->currentBookmarkedFilterConfigurationsModel->index(index, 0);
292 if (d->currentFilter && index != KisConfig(true).readEntry<int>("lastBookmarkedFilterConfiguration/" + d->currentFilter->id(), 0)) {
293 KisConfig(false).writeEntry<int>("lastBookmarkedFilterConfiguration/" + d->currentFilter->id(), index);
294 }
295 }
296}
297
305
307{
308 d->uiFilterSelector.filtersSelector->setVisible(d->showFilterGallery);
309 if (d->showFilterGallery) {
310 setMinimumWidth(qMax(sizeHint().width(), 700));
311 d->uiFilterSelector.scrollArea->setMinimumHeight(400);
312 setMinimumHeight(d->uiFilterSelector.verticalLayout->sizeHint().height());
313 if (d->currentFilter) {
314 bool v = d->uiFilterSelector.filtersSelector->blockSignals(true);
315 d->uiFilterSelector.filtersSelector->setCurrentIndex(d->filtersModel->indexForFilter(d->currentFilter->id()));
316 d->uiFilterSelector.filtersSelector->blockSignals(v);
317 }
318 }
319 else {
320 if (d->currentCentralWidget) {
321 d->uiFilterSelector.scrollArea->setMinimumHeight(qMin(400, d->currentCentralWidget->sizeHint().height()));
322 }
323 setMinimumSize(d->uiFilterSelector.verticalLayout->sizeHint());
324 }
325}
326
340
341void KisFilterTree::setFilterModel(QAbstractItemModel *model)
342{
343 m_model = model;
344
345}
346
347void KisFilterTree::activateFilter(QModelIndex idx)
348{
350 selectionModel()->select(idx, QItemSelectionModel::SelectCurrent);
351 expand(idx);
352 scrollTo(idx);
353 Q_EMIT activated(idx);
354}
355
357{
358 QWidget::setVisible(visible);
359 if (visible) {
360 update();
361 }
362}
363
qreal v
void expand(ExpansionStrategy &expansionStrategy, KoUpdater *progressUpdater)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisFilterConfigurationSP configuration(const QModelIndex &index) const
virtual void setView(KisViewManager *view)
virtual KisPropertiesConfigurationSP configuration() const =0
virtual void setConfiguration(const KisPropertiesConfigurationSP config)=0
void writeEntry(const QString &name, const T &value)
Definition kis_config.h:779
T readEntry(const QString &name, const T &defaultValue=T())
Definition kis_config.h:789
void setView(KisViewManager *view)
void setPaintDevice(bool showAll, KisPaintDeviceSP)
KisFilterConfigurationSP configuration()
void setFilter(KisFilterSP f, KisFilterConfigurationSP overrideDefaultConfig)
void setVisible(bool visible) override
void sigFilterGalleryToggled(bool visible)
void setFilterIndex(const QModelIndex &)
void setFilterModel(QAbstractItemModel *model)
QAbstractItemModel * m_model
void activateFilter(QModelIndex idx)
void setModel(QAbstractItemModel *model) override
const KisFilter * indexToFilter(const QModelIndex &idx)
QModelIndex indexForFilter(const QString &id)
static KisResourcesInterfaceSP instance()
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
KisPaintDeviceSP createThumbnailDevice(qint32 w, qint32 h, QRect rect=QRect(), QRect outputRect=QRect()) const
QRect bounds() const override
#define dbgKrita
Definition kis_debug.h:45
QString buttons(const T &ev)
virtual KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const
virtual KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const
KisBookmarkedFilterConfigurationsModel * currentBookmarkedFilterConfigurationsModel