Krita Source Code Documentation
Loading...
Searching...
No Matches
KisFilterManager Class Reference

#include <kis_filter_manager.h>

+ Inheritance diagram for KisFilterManager:

Classes

struct  Private
 

Public Member Functions

void apply (KisFilterConfigurationSP filterConfig)
 
void cancelDialog ()
 Call cancelRunningStroke() and then delete dialog d
 
void cancelRunningStroke ()
 Cancel current running stroke.
 
bool filterAllSelectedFrames ()
 
void finish ()
 
bool isIdle () const
 
bool isStrokeRunning () const
 
 KisFilterManager (KisViewManager *parent)
 
void setFilterAllSelectedFrames (bool filterAllSelectedFrames)
 
void setup (KisKActionCollection *ac, KisActionManager *actionManager)
 
void setView (QPointer< KisView >imageView)
 
void updateGUI ()
 
 ~KisFilterManager () override
 

Private Slots

void filterDialogHasFinished (int)
 Clean up after filter dialog has been accepted / rejected / closed.
 
void insertFilter (const QString &name)
 
void reapplyLastFilter ()
 
void reapplyLastFilterReprompt ()
 
void showFilterDialog (const QString &filterId, KisFilterConfigurationSP overrideDefaultConfig=nullptr)
 
void slotStrokeCancelRequested ()
 
void slotStrokeEndRequested ()
 

Private Attributes

QScopedPointer< Privated
 

Detailed Description

Create all the filter actions for the specified view and implement re-apply filter

Definition at line 23 of file kis_filter_manager.h.

Constructor & Destructor Documentation

◆ KisFilterManager()

KisFilterManager::KisFilterManager ( KisViewManager * parent)

Definition at line 74 of file kis_filter_manager.cc.

75 : d(new Private)
76{
77 d->view = view;
78}
QScopedPointer< Private > d

References d.

◆ ~KisFilterManager()

KisFilterManager::~KisFilterManager ( )
override

Definition at line 80 of file kis_filter_manager.cc.

81{
82}

Member Function Documentation

◆ apply()

void KisFilterManager::apply ( KisFilterConfigurationSP filterConfig)

Definition at line 269 of file kis_filter_manager.cc.

270{
271 KisFilterConfigurationSP filterConfig = _filterConfig->cloneWithResourcesSnapshot();
272
273 KisFilterSP filter = KisFilterRegistry::instance()->value(filterConfig->name());
274 KisImageWSP image = d->view->image();
275
276 if (d->currentStrokeId) {
277 image->cancelStroke(d->currentStrokeId);
278
279 d->currentStrokeId.clear();
280 d->idleBarrierCookie.clear();
281 } else {
282 image->waitForDone();
283 }
284
285 if (!d->externalCancelUpdatesStorage) {
286 // Lazily initialize the cancel updates storage, just in case
287 // if the stroke has been cancelled in the meantime.
288
289 d->externalCancelUpdatesStorage.reset(new KisFilterStrokeStrategy::ExternalCancelUpdatesStorage());
290 }
291
292 KoCanvasResourceProvider *resourceManager =
293 d->view->canvasResourceProvider()->resourceManager();
294
295 KisResourcesSnapshotSP resources =
296 new KisResourcesSnapshot(image,
297 d->view->activeNode(),
298 resourceManager);
299
301 KisFilterConfigurationSP(filterConfig),
302 resources,
303 d->externalCancelUpdatesStorage.toWeakRef());
304 {
305 KConfigGroup group( KSharedConfig::openConfig(), "filterdialog");
306 strategy->setForceLodModeIfPossible(group.readEntry("forceLodMode", true));
307 }
308
309 d->currentStrokeId =
310 image->startStroke(strategy);
311
312 // Apply filter preview to active, visible frame only.
313 KisImageConfig imgConf(true);
314 image->addJob(d->currentStrokeId, new KisFilterStrokeStrategy::FilterJobData());
315
316 {
319 d->idleBarrierCookie = data->idleBarrierCookie();
320 image->addJob(d->currentStrokeId, data);
321 }
322
323 d->currentlyAppliedConfiguration = filterConfig;
324}
static KisFilterRegistry * instance()
void waitForDone()
bool cancelStroke(KisStrokeId id) override
void addJob(KisStrokeId id, KisStrokeJobData *data) override
KisStrokeId startStroke(KisStrokeStrategy *strokeStrategy) override
The KisResourcesSnapshot class takes a snapshot of the various resources like colors and settings use...
void setForceLodModeIfPossible(bool forceLodModeIfPossible)
const T value(const QString &id) const
KisPinnedSharedPtr< KisFilterConfiguration > KisFilterConfigurationSP
Definition kis_types.h:275

References KisImage::addJob(), KisImage::cancelStroke(), d, KisFilterStrokeStrategy::IdleBarrierData::idleBarrierCookie(), KisFilterRegistry::instance(), KisStrokeStrategy::setForceLodModeIfPossible(), KisImage::startStroke(), KoGenericRegistry< T >::value(), and KisImage::waitForDone().

◆ cancelDialog()

void KisFilterManager::cancelDialog ( )

Call cancelRunningStroke() and then delete dialog d

Definition at line 375 of file kis_filter_manager.cc.

376{
378
379 d->filterDialog->reject();
380}
void cancelRunningStroke()
Cancel current running stroke.

References cancelRunningStroke(), and d.

◆ cancelRunningStroke()

void KisFilterManager::cancelRunningStroke ( )

Cancel current running stroke.

Definition at line 361 of file kis_filter_manager.cc.

362{
363 Q_ASSERT(d->currentStrokeId);
364
365 // we should to notify the stroke that it should do the updates itself.
366 d->externalCancelUpdatesStorage->shouldIssueCancellationUpdates.ref();
367 d->view->image()->cancelStroke(d->currentStrokeId);
368
369 d->currentStrokeId.clear();
370 d->idleBarrierCookie.clear();
371 d->currentlyAppliedConfiguration.clear();
372 d->externalCancelUpdatesStorage.clear();
373}

References d.

◆ filterAllSelectedFrames()

bool KisFilterManager::filterAllSelectedFrames ( )

Definition at line 397 of file kis_filter_manager.cc.

398{
399 return d->filterAllSelectedFrames;
400}

References d.

◆ filterDialogHasFinished

void KisFilterManager::filterDialogHasFinished ( int )
privateslot

Clean up after filter dialog has been accepted / rejected / closed.

Definition at line 415 of file kis_filter_manager.cc.

416{
417 // as far as we are concerned, filterDialog has been deleted
418 d->filterDialog = nullptr;
419}

References d.

◆ finish()

void KisFilterManager::finish ( )

Definition at line 326 of file kis_filter_manager.cc.

327{
328 Q_ASSERT(d->currentStrokeId);
329
330 if (d->filterAllSelectedFrames) { // Apply filter to the other selected frames...
331 KisImageSP image = d->view->image();
332 KisPaintDeviceSP paintDevice = d->view->activeNode()->paintDevice();
333 KisNodeSP node = d->view->activeNode();
334
335 // Filter selected times to only those with keyframes...
336 QSet<int> selectedTimes = image->animationInterface()->activeLayerSelectedTimes();
337 selectedTimes = KisLayerUtils::filterTimesForOnlyRasterKeyedTimes(node, selectedTimes);
338 QSet<int> uniqueFrames = KisLayerUtils::fetchUniqueFrameTimes(node, selectedTimes, true);
339
340 Q_FOREACH(const int& frameTime, uniqueFrames) {
341 image->addJob(d->currentStrokeId, new KisFilterStrokeStrategy::FilterJobData(frameTime));
342 }
343 }
344
345 d->view->image()->endStroke(d->currentStrokeId);
346
347 KisFilterSP filter = KisFilterRegistry::instance()->value(d->currentlyAppliedConfiguration->name());
348 if (filter->bookmarkManager()) {
350 d->currentlyAppliedConfiguration.data());
351 }
352
353 d->lastConfiguration = d->currentlyAppliedConfiguration;
354 d->reapplyAction->setEnabled(true);
355 d->reapplyAction->setText(i18n("Apply Filter Again: %1", filter->name()));
356
357 d->idleBarrierCookie.clear();
358 d->currentlyAppliedConfiguration.clear();
359}
KisImageAnimationInterface * animationInterface() const
QSet< int > fetchUniqueFrameTimes(KisNodeSP node, QSet< int > selectedTimes, bool filterActiveFrameID)
QSet< int > filterTimesForOnlyRasterKeyedTimes(KisNodeSP node, const QSet< int > &times)
KisBookmarkedConfigurationManager * bookmarkManager
void save(const QString &configname, const KisSerializableConfigurationSP)

References KisImageAnimationInterface::activeLayerSelectedTimes(), KisImage::addJob(), KisImage::animationInterface(), KisBaseProcessor::bookmarkManager, KisBookmarkedConfigurationManager::ConfigLastUsed, d, KisLayerUtils::fetchUniqueFrameTimes(), KisLayerUtils::filterTimesForOnlyRasterKeyedTimes(), KisFilterRegistry::instance(), KisBaseProcessor::name(), KisBookmarkedConfigurationManager::save(), and KoGenericRegistry< T >::value().

◆ insertFilter

void KisFilterManager::insertFilter ( const QString & name)
privateslot

Definition at line 119 of file kis_filter_manager.cc.

120{
121 Q_ASSERT(d->actionCollection);
122
123 KisFilterSP filter = KisFilterRegistry::instance()->value(filterName);
124 Q_ASSERT(filter);
125
126 if (d->filters2Action.contains(filter.data())) {
127 warnKrita << "Filter" << filterName << " has already been inserted";
128 return;
129 }
130
131 KoID category = filter->menuCategory();
132 KActionMenu* actionMenu = d->filterActionMenus[ category.id()];
133 if (!actionMenu) {
134 actionMenu = new KActionMenu(category.name(), this);
135 d->actionCollection->addAction(category.id(), actionMenu);
136 d->filterActionMenus[category.id()] = actionMenu;
137 }
138
139 KisAction *action = new KisAction(filter->menuEntry(), this);
140 action->setDefaultShortcut(filter->shortcut());
142
143 d->actionManager->addAction(QString("krita_filter_%1").arg(filterName), action);
144 d->filters2Action[filter.data()] = action;
145
146 actionMenu->addAction(action);
147
148 d->actionsMapper.setMapping(action, filterName);
149 connect(action, SIGNAL(triggered()), &d->actionsMapper, SLOT(map()));
150}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void setActivationFlags(ActivationFlags flags)
@ ACTIVE_DEVICE
Activate if the active node has a paint device, i.e. there are pixels to be modified.
Definition kis_action.h:47
void setDefaultShortcut(const QKeySequence &shortcut)
Definition KoID.h:30
QString name() const
Definition KoID.cpp:68
QString id() const
Definition KoID.cpp:63
#define warnKrita
Definition kis_debug.h:87
QString menuEntry() const

References KisAction::ACTIVE_DEVICE, connect(), d, KisSharedPtr< T >::data(), KoID::id(), KisFilterRegistry::instance(), KisBaseProcessor::menuCategory(), KisBaseProcessor::menuEntry(), KoID::name(), KisAction::setActivationFlags(), KisAction::setDefaultShortcut(), KisBaseProcessor::shortcut, KoGenericRegistry< T >::value(), and warnKrita.

◆ isIdle()

bool KisFilterManager::isIdle ( ) const

Definition at line 387 of file kis_filter_manager.cc.

388{
389 return !d->idleBarrierCookie;
390}

References d.

◆ isStrokeRunning()

bool KisFilterManager::isStrokeRunning ( ) const

Definition at line 382 of file kis_filter_manager.cc.

383{
384 return bool(d->currentStrokeId);
385}

References d.

◆ reapplyLastFilter

void KisFilterManager::reapplyLastFilter ( )
privateslot

Definition at line 172 of file kis_filter_manager.cc.

173{
174 if (!d->lastConfiguration) return;
175
176 apply(d->lastConfiguration);
177 finish();
178}
void apply(KisFilterConfigurationSP filterConfig)

References apply(), d, and finish().

◆ reapplyLastFilterReprompt

void KisFilterManager::reapplyLastFilterReprompt ( )
privateslot

Definition at line 180 of file kis_filter_manager.cc.

181{
182 if (!d->lastConfiguration) return;
183
184 showFilterDialog(d->lastConfiguration->name(), d->lastConfiguration);
185}
void showFilterDialog(const QString &filterId, KisFilterConfigurationSP overrideDefaultConfig=nullptr)

References d, and showFilterDialog().

◆ setFilterAllSelectedFrames()

void KisFilterManager::setFilterAllSelectedFrames ( bool filterAllSelectedFrames)

Definition at line 392 of file kis_filter_manager.cc.

393{
394 d->filterAllSelectedFrames = filterAllSelectedFrames;
395}

References d, and filterAllSelectedFrames().

◆ setup()

void KisFilterManager::setup ( KisKActionCollection * ac,
KisActionManager * actionManager )

Definition at line 90 of file kis_filter_manager.cc.

91{
92 d->actionCollection = ac;
93 d->actionManager = actionManager;
94
95 // Setup reapply action
96 d->reapplyAction = d->actionManager->createAction("filter_apply_again");
98 d->reapplyAction->setEnabled(false);
99
100 d->reapplyActionReprompt = d->actionManager->createAction("filter_apply_reprompt");
101 d->reapplyActionReprompt->setActivationFlags(KisAction::ACTIVE_DEVICE);
102 d->reapplyActionReprompt->setEnabled(false);
103
104 connect(d->reapplyAction, SIGNAL(triggered()), SLOT(reapplyLastFilter()));
105 connect(d->reapplyActionReprompt, SIGNAL(triggered()), SLOT(reapplyLastFilterReprompt()));
106
107 connect(&d->actionsMapper, SIGNAL(mapped(QString)), SLOT(showFilterDialog(QString)));
108
109 // Setup list of filters
111 keys.sort();
112 Q_FOREACH (const QString &filterName, keys) {
113 insertFilter(filterName);
114 }
115
116 connect(KisFilterRegistry::instance(), SIGNAL(filterAdded(QString)), SLOT(insertFilter(QString)));
117}
KisAction * createAction(const QString &name)
void insertFilter(const QString &name)
QList< QString > keys() const

References KisAction::ACTIVE_DEVICE, connect(), KisActionManager::createAction(), d, insertFilter(), KisFilterRegistry::instance(), KoGenericRegistry< T >::keys(), reapplyLastFilter(), reapplyLastFilterReprompt(), KisAction::setActivationFlags(), and showFilterDialog().

◆ setView()

void KisFilterManager::setView ( QPointer< KisView > imageView)

Definition at line 84 of file kis_filter_manager.cc.

85{
86 Q_UNUSED(imageView);
87}

◆ showFilterDialog

void KisFilterManager::showFilterDialog ( const QString & filterId,
KisFilterConfigurationSP overrideDefaultConfig = nullptr )
privateslot

The UI should show only after every running stroke is finished, so a virtual barrier is added here.

Definition at line 187 of file kis_filter_manager.cc.

188{
189 if (!d->view->activeNode()->isEditable()) {
190 d->view->showFloatingMessage(i18n("Cannot apply filter to locked layer."),
191 KisIconUtils::loadIcon("object-locked"));
192 return;
193 }
194
195 if (d->filterDialog && d->filterDialog->isVisible()) {
196 KisFilterSP filter = KisFilterRegistry::instance()->value(filterId);
197 d->filterDialog->setFilter(filter, overrideDefaultConfig);
198 return;
199 }
200
201 connect(d->view->image(),
202 SIGNAL(sigStrokeCancellationRequested()),
204 Qt::UniqueConnection);
205
206 connect(d->view->image(),
207 SIGNAL(sigStrokeEndRequested()),
209 Qt::UniqueConnection);
210
215 if (!d->view->blockUntilOperationsFinished(d->view->image())) {
216 return;
217 }
218
219 Q_ASSERT(d->view);
220 Q_ASSERT(d->view->activeNode());
221
222 KisPaintDeviceSP dev = d->view->activeNode()->paintDevice();
223 if (!dev) {
224 warnKrita << "KisFilterManager::showFilterDialog(): Filtering was requested for illegal active layer!" << d->view->activeNode();
225 return;
226 }
227
228 KisFilterSP filter = KisFilterRegistry::instance()->value(filterId);
229
230 if (dev->colorSpace()->willDegrade(filter->colorSpaceIndependence())) {
231 // Warning bells!
232 if (filter->colorSpaceIndependence() == TO_LAB16) {
233 if (QMessageBox::warning(d->view->mainWindow(),
234 i18nc("@title:window", "Krita"),
235 i18n("The %1 filter will convert your %2 data to 16-bit L*a*b* and vice versa. ",
236 filter->name(),
237 dev->colorSpace()->name()),
238 QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok)
239 != QMessageBox::Ok) return;
240
241 } else if (filter->colorSpaceIndependence() == TO_RGBA16) {
242 if (QMessageBox::warning(d->view->mainWindow(),
243 i18nc("@title:window", "Krita"),
244 i18n("The %1 filter will convert your %2 data to 16-bit RGBA and vice versa. ",
245 filter->name() , dev->colorSpace()->name()),
246 QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok)
247 != QMessageBox::Ok) return;
248 }
249 }
250
251 if (filter->showConfigurationWidget()) {
252 if (!d->filterDialog) {
253 d->filterDialog = new KisDlgFilter(d->view , d->view->activeNode(), this, d->view->mainWindow());
254 d->filterDialog->setAttribute(Qt::WA_DeleteOnClose); // make sure that the dialog is deleted when calling `done()`
255 connect(d->filterDialog, SIGNAL(finished(int)),
256 this, SLOT(filterDialogHasFinished(int)));
257 }
258
259 d->filterDialog->setFilter(filter, overrideDefaultConfig);
260 d->filterDialog->setVisible(true);
261 } else {
262 KisFilterConfigurationSP defaultConfiguration =
263 overrideDefaultConfig ? overrideDefaultConfig : filter->defaultConfiguration(KisGlobalResourcesInterface::instance());
264 apply(defaultConfiguration);
265 finish();
266 }
267}
@ TO_RGBA16
@ TO_LAB16
void filterDialogHasFinished(int)
Clean up after filter dialog has been accepted / rejected / closed.
static KisResourcesInterfaceSP instance()
const KoColorSpace * colorSpace() const
virtual bool willDegrade(ColorSpaceIndependence independence) const =0
QIcon loadIcon(const QString &name)
ColorSpaceIndependence colorSpaceIndependence
virtual KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const

References apply(), KisPaintDevice::colorSpace(), KisBaseProcessor::colorSpaceIndependence, connect(), d, KisBaseProcessor::defaultConfiguration(), filterDialogHasFinished(), finish(), KisFilterRegistry::instance(), KisGlobalResourcesInterface::instance(), KisIconUtils::loadIcon(), KisBaseProcessor::name(), KoColorSpace::name, KisBaseProcessor::showConfigurationWidget, slotStrokeCancelRequested(), slotStrokeEndRequested(), TO_LAB16, TO_RGBA16, KoGenericRegistry< T >::value(), warnKrita, and KoColorSpace::willDegrade().

◆ slotStrokeCancelRequested

void KisFilterManager::slotStrokeCancelRequested ( )
privateslot

Definition at line 409 of file kis_filter_manager.cc.

410{
411 if (d->currentStrokeId && d->filterDialog) {
412 d->filterDialog->reject();
413 }
414}

References d.

◆ slotStrokeEndRequested

void KisFilterManager::slotStrokeEndRequested ( )
privateslot

Definition at line 402 of file kis_filter_manager.cc.

403{
404 if (d->currentStrokeId && d->filterDialog) {
405 d->filterDialog->accept();
406 }
407}

References d.

◆ updateGUI()

void KisFilterManager::updateGUI ( )

Definition at line 152 of file kis_filter_manager.cc.

153{
154 if (!d->view) return;
155
156 bool enable = false;
157
158 KisNodeSP activeNode = d->view->activeNode();
159 enable = activeNode && activeNode->hasEditablePaintDevice();
160
161 d->reapplyAction->setEnabled(enable);
162
163 for (QHash<KisFilter*, QAction *>::iterator it = d->filters2Action.begin();
164 it != d->filters2Action.end(); ++it) {
165
166 bool localEnable = enable;
167
168 it.value()->setEnabled(localEnable);
169 }
170}
bool hasEditablePaintDevice() const

References d, and KisBaseNode::hasEditablePaintDevice().

Member Data Documentation

◆ d

QScopedPointer<Private> KisFilterManager::d
private

Definition at line 65 of file kis_filter_manager.h.


The documentation for this class was generated from the following files: