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

#include <kis_shape_controller.h>

+ Inheritance diagram for KisShapeController:

Classes

struct  Private
 

Signals

void currentLayerChanged (const KoShapeLayer *)
 
void selectionChanged ()
 
void selectionContentChanged ()
 
- Signals inherited from KisDummiesFacadeBase
void sigActivateNode (KisNodeSP node)
 
void sigBeginInsertDummy (KisNodeDummy *parent, int index, const QString &metaObjectType)
 
void sigBeginRemoveDummy (KisNodeDummy *dummy)
 
void sigDummyChanged (KisNodeDummy *dummy)
 
void sigEndInsertDummy (KisNodeDummy *dummy)
 
void sigEndRemoveDummy ()
 

Public Member Functions

KoShapeContainercreateParentForShapes (const QList< KoShape * > shapes, bool forceNewLayer, KUndo2Command *parentCommand) override
 
QRectF documentRectInPixels () const override
 
int dummiesCount () const override
 
KisNodeDummydummyForNode (KisNodeSP layer) const override
 
bool hasDummyForNode (KisNodeSP node) const override
 
 KisShapeController (KisNameServer *nameServer, KUndo2Stack *undoStack, QObject *parent=0)
 
qreal pixelsPerInch () const override
 
KisNodeDummyrootDummy () const override
 
void setImage (KisImageWSP image)
 
virtual void setImage (KisImageWSP image, KisNodeSP activeNode)
 
void setImage (KisImageWSP image, KisNodeSP activeNode) override
 
void setInitialShapeForCanvas (KisCanvas2 *canvas)
 
KoShapeLayershapeForNode (KisNodeSP layer) const
 
 ~KisShapeController () override
 
- Public Member Functions inherited from KisDummiesFacadeBase
 KisDummiesFacadeBase (QObject *parent=0)
 
KisNodeSP lastActivatedNode () const
 
void setImage (KisImageWSP image)
 
 ~KisDummiesFacadeBase () override
 
- Public Member Functions inherited from KoShapeControllerBase
QRectF documentRect () const
 
 KoShapeControllerBase ()
 
virtual KoDocumentResourceManagerresourceManager () const
 
virtual ~KoShapeControllerBase ()
 

Private Slots

void slotUpdateDocumentResolution ()
 
void slotUpdateDocumentSize ()
 

Private Member Functions

void addNodeImpl (KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis) override
 
void removeNodeImpl (KisNodeSP node) override
 

Private Attributes

Private *const m_d
 

Additional Inherited Members

- Protected Member Functions inherited from KisDummiesFacadeBase
KisImageWSP image () const
 

Detailed Description

KisShapeController keeps track of new layers, shapes, masks and selections – everything that needs to be wrapped as a shape for the tools to work on.

Definition at line 28 of file kis_shape_controller.h.

Constructor & Destructor Documentation

◆ KisShapeController()

KisShapeController::KisShapeController ( KisNameServer * nameServer,
KUndo2Stack * undoStack,
QObject * parent = 0 )

Definition at line 60 of file kis_shape_controller.cpp.

61 : KisDummiesFacadeBase(parent)
62 , m_d(new Private())
63{
64 m_d->nameServer = nameServer;
65 resourceManager()->setUndoStack(undoStack);
66}
KisDummiesFacadeBase(QObject *parent=0)
void setUndoStack(KUndo2Stack *undoStack)
virtual KoDocumentResourceManager * resourceManager() const

References m_d, KisShapeController::Private::nameServer, KoShapeControllerBase::resourceManager(), and KoDocumentResourceManager::setUndoStack().

◆ ~KisShapeController()

KisShapeController::~KisShapeController ( )
override

Member Function Documentation

◆ addNodeImpl()

void KisShapeController::addNodeImpl ( KisNodeSP node,
KisNodeSP parent,
KisNodeSP aboveThis )
overrideprivatevirtual

Forward signals for global shape manager

See also
comment in the constructor of KisCanvas2

Implements KisDummiesFacadeBase.

Definition at line 98 of file kis_shape_controller.cpp.

99{
100 KisNodeShape *newShape =
101 m_d->shapesGraph.addNode(node, parent, aboveThis);
102 // XXX: what are we going to do with this shape?
103 Q_UNUSED(newShape);
104
105 KisShapeLayer *shapeLayer = dynamic_cast<KisShapeLayer*>(node.data());
106 if (shapeLayer) {
111 connect(shapeLayer, SIGNAL(selectionChanged()),
112 SIGNAL(selectionChanged()));
113 connect(shapeLayer->shapeManager(), SIGNAL(selectionContentChanged()),
114 SIGNAL(selectionContentChanged()));
115 connect(shapeLayer, SIGNAL(currentLayerChanged(const KoShapeLayer*)),
116 SIGNAL(currentLayerChanged(const KoShapeLayer*)));
117 }
118}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisNodeShape * addNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
void currentLayerChanged(const KoShapeLayer *)
void selectionContentChanged()
KoShapeManager * shapeManager() const

References KisNodeShapesGraph::addNode(), connect(), currentLayerChanged(), KisSharedPtr< T >::data(), m_d, selectionChanged(), selectionContentChanged(), KisShapeLayer::shapeManager(), and KisShapeController::Private::shapesGraph.

◆ createParentForShapes()

KoShapeContainer * KisShapeController::createParentForShapes ( const QList< KoShape * > shapes,
bool forceNewLayer,
KUndo2Command * parentCommand )
overridevirtual

When shapes are dropped to the canvas, the document should decide, where to which parent to put them. In some cases the document should even create a special layer for the new shapes.

Returns
the proposed parent for shapes
Parameters
parentCommandthe command, which should be executed before the proposed parent will be added to the document (if new layer should be created)

Reimplemented from KoShapeControllerBase.

Definition at line 153 of file kis_shape_controller.cpp.

154{
155 KoShapeContainer *resultParent = 0;
156 KisCommandUtils::CompositeCommand *resultCommand =
157 new KisCommandUtils::CompositeCommand(parentCommand);
158
159 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(!shapes.isEmpty(), resultParent);
160 Q_FOREACH (KoShape *shape, shapes) {
162 }
163
165 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(canvas, resultParent);
166
167 const bool baseBelongsToSelection = belongsToShapeSelection(shapes.first());
168 bool allSameBelongsToShapeSelection = true;
169
170 Q_FOREACH (KoShape *shape, shapes) {
171 allSameBelongsToShapeSelection &= belongsToShapeSelection(shape) == baseBelongsToSelection;
172 }
173
174 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(!baseBelongsToSelection || allSameBelongsToShapeSelection, resultParent);
175
176 if (baseBelongsToSelection && allSameBelongsToShapeSelection) {
177 KisSelectionSP selection = canvas->viewManager()->selection();
178 if (selection) {
179 KisSelectionComponent* shapeSelectionComponent = selection->shapeSelection();
180
181 if (!shapeSelectionComponent) {
182 shapeSelectionComponent = new KisShapeSelection(this, selection);
183 resultCommand->addCommand(selection->convertToVectorSelection(shapeSelectionComponent));
184 }
185
186 KisShapeSelection * shapeSelection = static_cast<KisShapeSelection*>(shapeSelectionComponent);
187 resultParent = shapeSelection;
188 }
189 } else {
190 KisShapeLayer *shapeLayer =
191 dynamic_cast<KisShapeLayer*>(
193
194 if (!shapeLayer || forceNewLayer) {
195 shapeLayer = new KisShapeLayer(this, image(),
196 i18n("Vector Layer %1", m_d->nameServer->number()),
198
199 resultCommand->addCommand(
201 shapeLayer,
202 image()->rootLayer(),
203 image()->rootLayer()->childCount()));
204 }
205
206 resultParent = shapeLayer;
207 }
208
209 return resultParent;
210}
const quint8 OPACITY_OPAQUE_U8
KisSelectedShapesProxy selectedShapesProxy
KisViewManager * viewManager() const
The command for adding a layer.
KoSelection * selection() override
KisSelectionSP selection()
virtual KoCanvasBase * canvas() const
KoShapeLayer * activeLayer() const
KoShapeContainer * parent() const
Definition KoShape.cpp:1039
KoCanvasController * activeCanvasController() const
static KoToolManager * instance()
Return the toolmanager singleton.
#define KIS_SAFE_ASSERT_RECOVER_BREAK(cond)
Definition kis_assert.h:127
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
static bool belongsToShapeSelection(KoShape *shape)
KUndo2Command * convertToVectorSelection(KisSelectionComponent *shapeSelection)
converts shape selection into the vector state
KisSelectionComponent * shapeSelection

References KoToolManager::activeCanvasController(), KoSelection::activeLayer(), KisCommandUtils::CompositeCommand::addCommand(), belongsToShapeSelection(), KoCanvasController::canvas(), KisSelection::convertToVectorSelection(), KisDummiesFacadeBase::image(), KoToolManager::instance(), KIS_SAFE_ASSERT_RECOVER_BREAK, KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, m_d, KisShapeController::Private::nameServer, KisNameServer::number(), OPACITY_OPAQUE_U8, KoShape::parent(), KisCanvas2::selectedShapesProxy, KisViewManager::selection(), KisSelectedShapesProxy::selection(), KisSelection::shapeSelection, and KisCanvas2::viewManager().

◆ currentLayerChanged

void KisShapeController::currentLayerChanged ( const KoShapeLayer * )
signal

◆ documentRectInPixels()

QRectF KisShapeController::documentRectInPixels ( ) const
overridevirtual

The size of the document measured in rasterized pixels. This information is needed for loading SVG documents that use 'px' as the default unit.

Implements KoShapeControllerBase.

Definition at line 212 of file kis_shape_controller.cpp.

213{
214 KisImageSP image = this->image();
215 return image ? image->bounds() : QRect(0, 0, 666, 777);
216}
QRect bounds() const override

References KisImage::bounds(), and KisDummiesFacadeBase::image().

◆ dummiesCount()

int KisShapeController::dummiesCount ( ) const
overridevirtual

◆ dummyForNode()

KisNodeDummy * KisShapeController::dummyForNode ( KisNodeSP layer) const
overridevirtual

Implements KisDummiesFacadeBase.

Definition at line 135 of file kis_shape_controller.cpp.

136{
137 return m_d->shapesGraph.nodeToDummy(node);
138}
KisNodeDummy * nodeToDummy(KisNodeSP node)

References m_d, KisNodeShapesGraph::nodeToDummy(), and KisShapeController::Private::shapesGraph.

◆ hasDummyForNode()

bool KisShapeController::hasDummyForNode ( KisNodeSP node) const
overridevirtual

Implements KisDummiesFacadeBase.

Definition at line 130 of file kis_shape_controller.cpp.

131{
132 return m_d->shapesGraph.containsNode(node);
133}
bool containsNode(KisNodeSP node) const

References KisNodeShapesGraph::containsNode(), m_d, and KisShapeController::Private::shapesGraph.

◆ pixelsPerInch()

qreal KisShapeController::pixelsPerInch ( ) const
overridevirtual

Resolution of the rasterized representation of the document. Used to load SVG documents correctly.

Implements KoShapeControllerBase.

Definition at line 218 of file kis_shape_controller.cpp.

219{
220 KisImageSP image = this->image();
221 return image ? image->xRes() * 72.0 : 72.0;
222}
double xRes() const

References KisDummiesFacadeBase::image(), and KisImage::xRes().

◆ removeNodeImpl()

void KisShapeController::removeNodeImpl ( KisNodeSP node)
overrideprivatevirtual

Implements KisDummiesFacadeBase.

Definition at line 120 of file kis_shape_controller.cpp.

121{
122 KisShapeLayer *shapeLayer = dynamic_cast<KisShapeLayer*>(node.data());
123 if (shapeLayer) {
124 shapeLayer->disconnect(this);
125 }
126
128}

References KisSharedPtr< T >::data(), m_d, KisNodeShapesGraph::removeNode(), and KisShapeController::Private::shapesGraph.

◆ rootDummy()

KisNodeDummy * KisShapeController::rootDummy ( ) const
overridevirtual

Return the root dummy of the graph. Since the call to KisDummiesFacadeBase::setImage() causes and asynchronous update of the dummies graph, it may cause rootDummy() to be null at some moments, which is a valid state.

Implements KisDummiesFacadeBase.

Definition at line 140 of file kis_shape_controller.cpp.

141{
142 return m_d->shapesGraph.rootDummy();
143}

References m_d, KisNodeShapesGraph::rootDummy(), and KisShapeController::Private::shapesGraph.

◆ selectionChanged

void KisShapeController::selectionChanged ( )
signal

These three signals are forwarded from the local shape manager of KisShapeLayer. This is done because we switch KoShapeManager and therefore KoSelection in KisCanvas2, so we need to connect local managers to the UI as well.

See also
comment in the constructor of KisCanvas2

◆ selectionContentChanged

void KisShapeController::selectionContentChanged ( )
signal

◆ setImage() [1/3]

void KisDummiesFacadeBase::setImage ( KisImageWSP image)

Definition at line 34 of file kis_dummies_facade_base.cpp.

61{
62 setImage(image, nullptr);
63}
void setImage(KisImageWSP image, KisNodeSP activeNode) override

◆ setImage() [2/3]

void KisDummiesFacadeBase::setImage ( KisImageWSP image,
KisNodeSP activeNode )
virtual

Reimplemented from KisDummiesFacadeBase.

Definition at line 35 of file kis_dummies_facade_base.cpp.

66{
67 if (m_d->image) {
68 Q_EMIT sigActivateNode(0);
69 m_d->lastActivatedNode = 0;
70 m_d->image->disconnect(this);
71 m_d->image->disconnect(&m_d->nodeChangedConnection);
72 m_d->image->disconnect(&m_d->activateNodeConnection);
73
74 KisNodeList nodesToRemove;
75
76 {
77 QMutexLocker l(&m_d->pendingNodeSetLock);
78 std::swap(nodesToRemove, m_d->pendingNodeSet);
79 m_d->pendingNodeSet.clear();
80 }
81
82 for (auto it = std::make_reverse_iterator(nodesToRemove.end());
83 it != std::make_reverse_iterator(nodesToRemove.begin());
84 ++it) {
85
86 m_d->removeNodeConnection.start(*it);
87 }
88 }
89
90 m_d->image = image;
91
92 if (image) {
94
95 connect(image, SIGNAL(sigNodeAddedAsync(KisNodeSP, KisNodeAdditionFlags)),
96 SLOT(slotNodeAdded(KisNodeSP, KisNodeAdditionFlags)), Qt::DirectConnection);
97 connect(image, SIGNAL(sigRemoveNodeAsync(KisNodeSP)),
98 SLOT(slotRemoveNode(KisNodeSP)), Qt::DirectConnection);
99 connect(image, SIGNAL(sigLayersChangedAsync()),
100 SLOT(slotLayersChanged()), Qt::DirectConnection);
101
102 m_d->nodeChangedConnection.connectInputSignal(image, &KisImage::sigNodeChanged);
103 m_d->activateNodeConnection.connectInputSignal(image, &KisImage::sigNodeAddedAsync);
104
105 if (!activeNode) {
106 activeNode = findFirstLayer(image->root());
107 }
108
109 m_d->activateNodeConnection.start(activeNode, KisNodeAdditionFlag::None);
110 }
111}
void slotRemoveNode(KisNodeSP node)
static KisNodeSP findFirstLayer(KisNodeSP root)
void sigActivateNode(KisNodeSP node)
void slotNodeAdded(KisNodeSP node, KisNodeAdditionFlags flags)
void sigNodeChanged(KisNodeSP node)
void sigNodeAddedAsync(KisNodeSP node, KisNodeAdditionFlags flags)

◆ setImage() [3/3]

void KisShapeController::setImage ( KisImageWSP image,
KisNodeSP activeNode )
overridevirtual

Reimplemented from KisDummiesFacadeBase.

Definition at line 241 of file kis_shape_controller.cpp.

242{
244
245 if (image) {
246 m_d->imageConnections.addConnection(image, SIGNAL(sigResolutionChanged(double, double)), this, SLOT(slotUpdateDocumentResolution()));
247 m_d->imageConnections.addConnection(image, SIGNAL(sigSizeChanged(QPointF, QPointF)), this, SLOT(slotUpdateDocumentSize()));
248 }
249
251
254}
void setImage(KisImageWSP image)
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
KisSignalAutoConnectionsStore imageConnections

References KisSignalAutoConnectionsStore::addConnection(), KisSignalAutoConnectionsStore::clear(), KisDummiesFacadeBase::image(), KisShapeController::Private::imageConnections, m_d, KisDummiesFacadeBase::setImage(), slotUpdateDocumentResolution(), and slotUpdateDocumentSize().

◆ setInitialShapeForCanvas()

void KisShapeController::setInitialShapeForCanvas ( KisCanvas2 * canvas)

Definition at line 224 of file kis_shape_controller.cpp.

225{
226 if (!image()) return;
227
228 KisNodeSP rootNode = image()->root();
229
230 if (m_d->shapesGraph.containsNode(rootNode)) {
231 Q_ASSERT(canvas);
232 Q_ASSERT(canvas->shapeManager());
233 KoSelection *selection = canvas->shapeManager()->selection();
234 if (selection && m_d->shapesGraph.nodeToShape(rootNode)) {
235 selection->select(m_d->shapesGraph.nodeToShape(rootNode));
236 KoToolManager::instance()->switchToolRequested(KoToolManager::instance()->preferredToolForSelection(selection->selectedShapes()));
237 }
238 }
239}
KoShapeManager shapeManager
KisNodeShape * nodeToShape(KisNodeSP node)
void select(KoShape *shape)
const QList< KoShape * > selectedShapes() const
KoSelection * selection
void switchToolRequested(const QString &id)

References KisNodeShapesGraph::containsNode(), KisDummiesFacadeBase::image(), KoToolManager::instance(), m_d, KisNodeShapesGraph::nodeToShape(), KisNodeFacade::root, KoSelection::select(), KoSelection::selectedShapes(), KoShapeManager::selection, KisCanvas2::shapeManager, KisShapeController::Private::shapesGraph, and KoToolManager::switchToolRequested().

◆ shapeForNode()

KoShapeLayer * KisShapeController::shapeForNode ( KisNodeSP layer) const

Definition at line 256 of file kis_shape_controller.cpp.

257{
258 if (node) {
259 return m_d->shapesGraph.nodeToShape(node);
260 }
261 return 0;
262}

References m_d, KisNodeShapesGraph::nodeToShape(), and KisShapeController::Private::shapesGraph.

◆ slotUpdateDocumentResolution

void KisShapeController::slotUpdateDocumentResolution ( )
privateslot

◆ slotUpdateDocumentSize

Member Data Documentation

◆ m_d

Private* const KisShapeController::m_d
private

Definition at line 86 of file kis_shape_controller.h.


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