15#include <kactionmenu.h>
92 d->actionCollection = ac;
93 d->actionManager = actionManager;
96 d->reapplyAction =
d->actionManager->
createAction(
"filter_apply_again");
98 d->reapplyAction->setEnabled(
false);
100 d->reapplyActionReprompt =
d->actionManager->createAction(
"filter_apply_reprompt");
102 d->reapplyActionReprompt->setEnabled(
false);
112 Q_FOREACH (
const QString &filterName, keys) {
121 Q_ASSERT(
d->actionCollection);
126 if (
d->filters2Action.contains(filter.
data())) {
127 warnKrita <<
"Filter" << filterName <<
" has already been inserted";
132 KActionMenu* actionMenu =
d->filterActionMenus[ category.
id()];
134 actionMenu =
new KActionMenu(category.
name(),
this);
135 d->actionCollection->addAction(category.
id(), actionMenu);
136 d->filterActionMenus[category.
id()] = actionMenu;
143 d->actionManager->addAction(QString(
"krita_filter_%1").arg(filterName), action);
144 d->filters2Action[filter.
data()] = action;
146 actionMenu->addAction(action);
148 d->actionsMapper.setMapping(action, filterName);
149 connect(action, SIGNAL(triggered()), &
d->actionsMapper, SLOT(map()));
154 if (!
d->view)
return;
161 d->reapplyAction->setEnabled(enable);
163 for (QHash<KisFilter*, QAction *>::iterator it =
d->filters2Action.begin();
164 it !=
d->filters2Action.end(); ++it) {
166 bool localEnable = enable;
168 it.value()->setEnabled(localEnable);
174 if (!
d->lastConfiguration)
return;
176 apply(
d->lastConfiguration);
182 if (!
d->lastConfiguration)
return;
189 if (!
d->view->activeNode()->isEditable()) {
190 d->view->showFloatingMessage(i18n(
"Cannot apply filter to locked layer."),
195 if (
d->filterDialog &&
d->filterDialog->isVisible()) {
197 d->filterDialog->setFilter(filter, overrideDefaultConfig);
202 SIGNAL(sigStrokeCancellationRequested()),
204 Qt::UniqueConnection);
207 SIGNAL(sigStrokeEndRequested()),
209 Qt::UniqueConnection);
215 if (!
d->view->blockUntilOperationsFinished(
d->view->image())) {
220 Q_ASSERT(
d->view->activeNode());
224 warnKrita <<
"KisFilterManager::showFilterDialog(): Filtering was requested for illegal active layer!" <<
d->view->activeNode();
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. ",
238 QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok)
239 != QMessageBox::Ok)
return;
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. ",
246 QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok)
247 != QMessageBox::Ok)
return;
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);
255 connect(
d->filterDialog, SIGNAL(finished(
int)),
259 d->filterDialog->setFilter(filter, overrideDefaultConfig);
260 d->filterDialog->setVisible(
true);
264 apply(defaultConfiguration);
276 if (
d->currentStrokeId) {
279 d->currentStrokeId.clear();
280 d->idleBarrierCookie.clear();
285 if (!
d->externalCancelUpdatesStorage) {
293 d->view->canvasResourceProvider()->resourceManager();
297 d->view->activeNode(),
303 d->externalCancelUpdatesStorage.toWeakRef());
305 KConfigGroup group( KSharedConfig::openConfig(),
"filterdialog");
320 image->
addJob(
d->currentStrokeId, data);
323 d->currentlyAppliedConfiguration = filterConfig;
328 Q_ASSERT(
d->currentStrokeId);
330 if (
d->filterAllSelectedFrames) {
340 Q_FOREACH(
const int& frameTime, uniqueFrames) {
345 d->view->image()->endStroke(
d->currentStrokeId);
350 d->currentlyAppliedConfiguration.data());
353 d->lastConfiguration =
d->currentlyAppliedConfiguration;
354 d->reapplyAction->setEnabled(
true);
355 d->reapplyAction->setText(i18n(
"Apply Filter Again: %1", filter->
name()));
357 d->idleBarrierCookie.clear();
358 d->currentlyAppliedConfiguration.clear();
363 Q_ASSERT(
d->currentStrokeId);
366 d->externalCancelUpdatesStorage->shouldIssueCancellationUpdates.ref();
367 d->view->image()->cancelStroke(
d->currentStrokeId);
369 d->currentStrokeId.clear();
370 d->idleBarrierCookie.clear();
371 d->currentlyAppliedConfiguration.clear();
372 d->externalCancelUpdatesStorage.clear();
379 d->filterDialog->reject();
384 return bool(
d->currentStrokeId);
389 return !
d->idleBarrierCookie;
399 return d->filterAllSelectedFrames;
404 if (
d->currentStrokeId &&
d->filterDialog) {
405 d->filterDialog->accept();
411 if (
d->currentStrokeId &&
d->filterDialog) {
412 d->filterDialog->reject();
418 d->filterDialog =
nullptr;
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
A KisActionManager class keeps track of KisActions. These actions are always associated with the GUI....
KisAction * createAction(const QString &name)
void setActivationFlags(ActivationFlags flags)
@ ACTIVE_DEVICE
Activate if the active node has a paint device, i.e. there are pixels to be modified.
void setDefaultShortcut(const QKeySequence &shortcut)
bool isStrokeRunning() const
void setup(KisKActionCollection *ac, KisActionManager *actionManager)
void insertFilter(const QString &name)
void showFilterDialog(const QString &filterId, KisFilterConfigurationSP overrideDefaultConfig=nullptr)
void apply(KisFilterConfigurationSP filterConfig)
KisFilterManager(KisViewManager *parent)
void cancelRunningStroke()
Cancel current running stroke.
~KisFilterManager() override
void reapplyLastFilterReprompt()
void cancelDialog()
Call cancelRunningStroke() and then delete dialog d
bool filterAllSelectedFrames()
QScopedPointer< Private > d
void setFilterAllSelectedFrames(bool filterAllSelectedFrames)
void slotStrokeEndRequested()
void setView(QPointer< KisView >imageView)
void slotStrokeCancelRequested()
void filterDialogHasFinished(int)
Clean up after filter dialog has been accepted / rejected / closed.
static KisFilterRegistry * instance()
IdleBarrierCookie idleBarrierCookie() const
static KisResourcesInterfaceSP instance()
QSet< int > activeLayerSelectedTimes()
bool cancelStroke(KisStrokeId id) override
KisImageAnimationInterface * animationInterface() const
void addJob(KisStrokeId id, KisStrokeJobData *data) override
KisStrokeId startStroke(KisStrokeStrategy *strokeStrategy) override
A container for a set of QAction objects.
const KoColorSpace * colorSpace() const
The KisResourcesSnapshot class takes a snapshot of the various resources like colors and settings use...
The KisSignalMapper class bundles signals from identifiable senders.
void setForceLodModeIfPossible(bool forceLodModeIfPossible)
virtual bool willDegrade(ColorSpaceIndependence independence) const =0
const T value(const QString &id) const
QList< QString > keys() const
KisPinnedSharedPtr< KisFilterConfiguration > KisFilterConfigurationSP
QIcon loadIcon(const QString &name)
QSet< int > fetchUniqueFrameTimes(KisNodeSP node, QSet< int > selectedTimes, bool filterActiveFrameID)
QSet< int > filterTimesForOnlyRasterKeyedTimes(KisNodeSP node, const QSet< int > ×)
bool hasEditablePaintDevice() const
QString menuEntry() const
KisBookmarkedConfigurationManager * bookmarkManager
ColorSpaceIndependence colorSpaceIndependence
bool showConfigurationWidget
virtual KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const
KoID menuCategory() const
void save(const QString &configname, const KisSerializableConfigurationSP)
static const char ConfigLastUsed[]
KisSignalMapper actionsMapper
KisFilterConfigurationSP lastConfiguration
QHash< QString, KActionMenu * > filterActionMenus
KisFilterConfigurationSP currentlyAppliedConfiguration
KisStrokeId currentStrokeId
bool filterAllSelectedFrames
KisKActionCollection * actionCollection
KisDlgFilter * filterDialog
The filter dialog shown to the user.
KisAction * reapplyAction
QHash< KisFilter *, QAction * > filters2Action
KisFilterStrokeStrategy::ExternalCancelUpdatesStorageSP externalCancelUpdatesStorage
KisActionManager * actionManager
KisAction * reapplyActionReprompt
KisFilterStrokeStrategy::IdleBarrierData::IdleBarrierCookie idleBarrierCookie