Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_filter_selection_operation.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com>
3 * SPDX-FileCopyrightText: 2013 Sven Langkamp <sven.langkamp@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8
11#include <KisViewManager.h>
14#include <kis_pixel_selection.h>
16#include <kis_image.h>
17#include <kis_transaction.h>
19#include <kis_command_utils.h>
21
23{
24 KisSelectionSP selection = view->selection();
25 if (!selection) return;
26
27 struct FilterSelection : public KisTransactionBasedCommand {
28 FilterSelection(KisImageSP image, KisSelectionSP sel, KisSelectionFilter *filter)
29 : m_image(image), m_sel(sel), m_filter(filter) {}
30 ~FilterSelection() override { delete m_filter;}
31 KisImageSP m_image;
32 KisSelectionSP m_sel;
33 KisSelectionFilter *m_filter;
34
35 KUndo2Command* paint() override {
36 KisPixelSelectionSP mergedSelection = m_sel->pixelSelection();
37 KisTransaction transaction(mergedSelection);
38 QRect processingRect = m_filter->changeRect(mergedSelection->selectedExactRect(), mergedSelection->defaultBounds());
39 m_filter->process(mergedSelection, processingRect);
40 KUndo2Command *savedCommand = transaction.endAndTake();
41 mergedSelection->setDirty(processingRect);
42 if (m_sel->selectedExactRect().isEmpty() || m_sel->pixelSelection()->outline().isEmpty()) {
44 cmd->addCommand(savedCommand);
45 cmd->addCommand(new KisDeselectActiveSelectionCommand(m_sel, m_image));
46 savedCommand = cmd;
47 }
48
49 return savedCommand;
50 }
51 };
52
53 KisProcessingApplicator *ap = beginAction(view, filter->name());
54 ap->applyCommand(new FilterSelection(view->image(), selection, filter),
56 endAction(ap, config.toXML());
57}
KisProcessingApplicator * beginAction(KisViewManager *view, const KUndo2MagicString &actionName)
void endAction(KisProcessingApplicator *applicator, const QString &xmlData)
void setDirty(const QRect &rc)
KisDefaultBoundsBaseSP defaultBounds() const
void applyCommand(KUndo2Command *command, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
virtual QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds)
virtual KUndo2MagicString name()
virtual void process(KisPixelSelectionSP pixelSelection, const QRect &rect)=0
KUndo2Command * endAndTake()
KisSelectionSP selection()
KisImageWSP image() const
Return the image this view is displaying.
void runFilter(KisSelectionFilter *filter, KisViewManager *view, const KisOperationConfiguration &config)
QRect selectedExactRect() const
QVector< QPolygon > outline() const
outline returns the outline of the current selection
void toXML(QDomDocument &, QDomElement &) const override
KisPixelSelectionSP pixelSelection
QRect selectedExactRect() const
Slow, but exact way of determining the rectangle that encloses the selection.