9#include <QStandardPaths>
12#include <QApplication>
16#include <QKeySequence>
125 const QString &defaultName,
210 Q_ASSERT(shapeController);
211 shapeController->disconnect(SIGNAL(sigActivateNode(
KisNodeSP)),
this);
220 Q_ASSERT(shapeController);
253#define NEW_LAYER_ACTION(id, layerType) \
255 action = actionManager->createAction(id); \
256 m_d->nodeCreationSignalMapper.setMapping(action, layerType); \
257 connect(action, SIGNAL(triggered()), \
258 &m_d->nodeCreationSignalMapper, SLOT(map())); \
261#define CONVERT_NODE_ACTION_2(id, layerType, exclude) \
263 action = actionManager->createAction(id); \
264 action->setExcludedNodeTypes(QStringList(exclude)); \
265 actionManager->addAction(id, action); \
266 m_d->nodeConversionSignalMapper.setMapping(action, layerType); \
267 connect(action, SIGNAL(triggered()), \
268 &m_d->nodeConversionSignalMapper, SLOT(map())); \
271#define CONVERT_NODE_ACTION(id, layerType) \
272 CONVERT_NODE_ACTION_2(id, layerType, layerType)
282 connect(action, SIGNAL(triggered()),
this, SLOT(
mirrorNodeX()));
285 connect(action, SIGNAL(triggered()),
this, SLOT(
mirrorNodeY()));
287 action = actionManager->
createAction(
"mirrorAllNodesX");
290 action = actionManager->
createAction(
"mirrorAllNodesY");
293 action = actionManager->
createAction(
"activateNextLayer");
296 action = actionManager->
createAction(
"activateNextSiblingLayer");
299 action = actionManager->
createAction(
"activatePreviousLayer");
302 action = actionManager->
createAction(
"activatePreviousSiblingLayer");
305 action = actionManager->
createAction(
"switchToPreviouslyActiveNode");
308 action = actionManager->
createAction(
"save_node_as_image");
311 action = actionManager->
createAction(
"save_vector_node_to_svg");
318 action = actionManager->
createAction(
"copy_layer_clipboard");
321 action = actionManager->
createAction(
"cut_layer_clipboard");
324 action = actionManager->
createAction(
"paste_layer_from_clipboard");
327 action = actionManager->
createAction(
"create_quick_group");
330 action = actionManager->
createAction(
"create_quick_clipping_group");
334 connect(action, SIGNAL(triggered()),
this, SLOT(
quickUngroup()));
336 action = actionManager->
createAction(
"select_all_layers");
337 connect(action, SIGNAL(triggered()),
this, SLOT(
selectAllNodes()));
339 action = actionManager->
createAction(
"select_visible_layers");
342 action = actionManager->
createAction(
"select_locked_layers");
345 action = actionManager->
createAction(
"select_invisible_layers");
348 action = actionManager->
createAction(
"select_unlocked_layers");
351 action = actionManager->
createAction(
"new_from_visible");
354 action = actionManager->
createAction(
"create_reference_image_from_active_layer");
357 action = actionManager->
createAction(
"create_reference_image_from_visible_canvas");
360 action = actionManager->
createAction(
"pin_to_timeline");
361 action->setCheckable(
true);
384 NEW_LAYER_ACTION(
"add_new_fast_color_overlay_mask",
"FastColorOverlayFilterMask");
410 action = actionManager->
createAction(
"isolate_active_layer");
412 action = actionManager->
createAction(
"isolate_active_group");
416 action = actionManager->
createAction(
"toggle_layer_visibility");
419 action = actionManager->
createAction(
"toggle_layer_lock");
420 connect(action, SIGNAL(triggered()),
this, SLOT(
toggleLock()));
422 action = actionManager->
createAction(
"toggle_layer_inherit_alpha");
425 action = actionManager->
createAction(
"toggle_layer_alpha_lock");
428 action = actionManager->
createAction(
"split_alpha_into_mask");
431 action = actionManager->
createAction(
"split_alpha_write");
435 action = actionManager->
createAction(
"split_alpha_save_merged");
482 if (lockedNode && showWarning) {
483 QString errorMessage;
485 if (nodes.size() <= 1) {
486 errorMessage = i18n(
"Layer is locked");
488 errorMessage = i18n(
"Layer \"%1\" is locked", lockedNode->
name());
507 lockedNode = node->
parent();
512 if (lockedNode && showWarning) {
513 QString errorMessage = i18n(
"Layer \"%1\" is locked", lockedNode->
name());
527 if (parent->allowAsChild(node)) {
528 if (node->inherits(
"KisSelectionMask") && parent->inherits(
"KisLayer")) {
530 KisLayer *l = qobject_cast<KisLayer*>(parent.data());
543 juggler->
moveNode(nodes, parent, aboveThis);
550 juggler->
copyNode(nodes, parent, aboveThis);
557 juggler->
addNode(nodes, parent, aboveThis);
590 if (isolateActiveLayer || isolateActiveGroup) {
602 if (!image || !isolationRoot)
return;
608 if (image->
startIsolatedMode(isolationRoot, isIsolatingLayer, isIsolatingGroup) ==
false) {
657 }
else if (
nodeType ==
"KisGroupLayer") {
659 }
else if (
nodeType ==
"KisAdjustmentLayer") {
661 }
else if (
nodeType ==
"KisGeneratorLayer") {
663 }
else if (
nodeType ==
"KisShapeLayer") {
665 }
else if (
nodeType ==
"KisCloneLayer") {
667 if (nodes.isEmpty()) {
671 }
else if (
nodeType ==
"KisTransparencyMask") {
673 }
else if (
nodeType ==
"KisFilterMask") {
675 }
else if (
nodeType ==
"FastColorOverlayFilterMask") {
677 }
else if (
nodeType ==
"KisColorizeMask") {
679 }
else if (
nodeType ==
"KisTransformMask") {
681 }
else if (
nodeType ==
"KisSelectionMask") {
683 }
else if (
nodeType ==
"KisFileLayer") {
714 if (!activeNode)
return;
720 }
else if (
nodeType ==
"KisSelectionMask" ||
722 nodeType ==
"KisTransparencyMask") {
731 if (
nodeType ==
"KisSelectionMask") {
733 }
else if (
nodeType ==
"KisFilterMask") {
735 }
else if (
nodeType ==
"KisTransparencyMask") {
745 }
else if (
nodeType ==
"KisFileLayer") {
764 if (document->referenceImagesLayer()) {
765 reference->setZIndex(document->referenceImagesLayer()->shapes().size());
773 QString strMessage = fromLayer ? i18nc(
"error dialog from the reference tool",
"Could not create a reference image from the active layer.")
774 : i18nc(
"error dialog from the reference tool",
"Could not create a reference image from the visible canvas.");
845 <<
"KarbonGradientTool"
846 <<
"KarbonCalligraphyTool"
850 <<
"KritaShape/KisToolBrush"
851 <<
"KritaShape/KisToolDyna"
852 <<
"KritaShape/KisToolMultiBrush"
853 <<
"KritaFill/KisToolFill"
854 <<
"KritaFill/KisToolGradient";
857 const bool nodeHasVectorAbilities = node->inherits(
"KisShapeLayer") ||
860 if (nodeHasVectorAbilities) {
903 if ((
selectedNodes().size() > 1 && node->inherits(
"KisLayer")) || node->inherits(
"KisLayer")) {
906 else if (node->inherits(
"KisMask")) {
919 if (node->inherits(
"KisLayer")) {
922 else if (node->inherits(
"KisMask")) {
941 return qMin(255,
int(opacity * 2.55 + 0.5));
947 if (node->
name() == name)
return;
956 if (node->
opacity() == opacity)
return;
1026 if (properties.contains(onionSkinOn)) {
1097 if (!node || !node->
parent()) {
1125 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1126 commandName =
kundo2_i18n(
"Mirror Mask Horizontally");
1129 commandName =
kundo2_i18np(
"Mirror Layer Horizontally",
"Mirror %1 Layers Horizontally", nodes.size());
1139 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1140 commandName =
kundo2_i18n(
"Mirror Mask Vertically");
1143 commandName =
kundo2_i18np(
"Mirror Layer Vertically",
"Mirror %1 Layers Vertically", nodes.size());
1165 if (!activeNode)
return;
1169 if (!siblingsOnly) {
1171 while (nextNode && nextNode->
childCount() > 0) {
1187 if (nextNode && nextNode->
parent()) {
1200 if (!activeNode)
return;
1204 if (!siblingsOnly) {
1222 if (nextNode && nextNode->
parent()) {
1241 Qt::Orientation orientation,
1245 mirrorNodes(nodes, actionName, orientation, selection);
1250 Qt::Orientation orientation,
1261 emitSignals, actionName);
1283 const QString &defaultName,
1290 dialog.setCaption(i18n(
"Export \"%1\"", defaultName));
1291 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1293 QString filename = dialog.filename();
1295 if (filename.isEmpty())
return;
1307 doc->setCurrentImage(dst);
1314 if (!doc->exportDocumentSync(filename, mimefilter.toLatin1())) {
1315 QMessageBox::warning(qApp->activeWindow(),
1316 i18nc(
"@title:window",
"Krita"),
1317 i18n(
"Could not save the layer. %1", doc->errorMessage().toUtf8().data()),
1328 warnKrita <<
"BUG: Save Node As Image was called without any node selected";
1335 m_d->
view->
showFloatingMessage(i18nc(
"warning message when trying to export a transform mask",
"Layer has no pixel data"), QIcon());
1359 dialog.setCaption(i18nc(
"@title:window",
"Export to SVG"));
1360 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1361 dialog.setMimeTypeFilters(
QStringList() <<
"image/svg+xml",
"image/svg+xml");
1362 QString filename = dialog.filename();
1364 if (filename.isEmpty())
return;
1366 QUrl url = QUrl::fromLocalFile(filename);
1368 if (url.isEmpty())
return;
1378 if (!writer.
save(filename, sizeInPt,
true)) {
1379 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not save to svg: %1", filename));
1403 QMessageBox::information(view->mainWindowAsQWidget(),
1404 i18nc(
"@title:window",
"Layer %1 is not editable", parentNode->
name()),
1405 i18n(
"Cannot write alpha channel of "
1406 "the parent layer \"%1\".\n"
1407 "The operation will be cancelled.", parentNode->
name()));
1412 if (writeToLayers) {
1418 copyDevice = parentNode->
original();
1428 const QRect processRect =
1433 QScopedPointer<KisTransaction> transaction;
1435 if (writeToLayers) {
1436 commandsAdapter.beginMacro(
kundo2_i18n(
"Write Alpha into a Layer"));
1444 quint8 *alpha8Ptr = srcIt.
rawData();
1445 quint8 *dstPtr = dstIt.
rawData();
1450 if (writeToLayers) {
1451 commandsAdapter.addExtraCommand(transaction->endAndTake());
1452 commandsAdapter.removeNode(node);
1453 commandsAdapter.endMacro();
1456 QRect saveRect = image->
bounds();
1458 saveDeviceAsImage(dstDevice, parentNode->
name(),
1480 if (nodes.isEmpty() || !active)
return;
1484 for (
auto &node : nodes) {
1493 if (nodes.isEmpty() || !active)
return;
1495 bool isVisible = active->
visible();
1497 for (
auto &node : nodes) {
1506 if (nodes.isEmpty() || !active)
return;
1508 auto layer = qobject_cast<KisPaintLayer*>(active.
data());
1513 bool isAlphaLocked = layer->alphaLocked();
1514 for (
auto &node : nodes) {
1515 auto layer = qobject_cast<KisPaintLayer*>(node.data());
1526 if (nodes.isEmpty() || !active)
return;
1528 auto layer = qobject_cast<KisLayer*>(active.
data());
1533 bool isAlphaDisabled = layer->alphaChannelDisabled();
1534 for (
auto &node : nodes) {
1535 auto layer = qobject_cast<KisLayer*>(node.data());
1562 if (nodes.isEmpty())
return;
1564 KisNodeList::Iterator it = nodes.begin();
1565 while (it != nodes.end()) {
1567 if (!it->data()->parent()) {
1596 Q_ASSERT(shapeController);
1599 Q_ASSERT(dummiesFacade);
1601 const bool copyNode =
false;
1619 const QString &overrideGroupName,
1624 if (!active)
return false;
1629 QString groupName = !overrideGroupName.isEmpty() ? overrideGroupName : image->
nextLayerName(i18nc(
"A group of layers",
"Group"));
1639 if (nodes2.size() == 0)
return false;
1642 active = nodes2.first();
1648 juggler->
addNode(nodes1, parent, aboveThis);
1649 juggler->
moveNode(nodes2, group, 0);
1652 *newLastChild = nodes2.last();
1688 if (!active)
return;
1696 auto incompatibleNode =
1697 std::find_if(nodes.begin(), nodes.end(),
1699 return !newParent->allowAsChild(node);
1702 if (incompatibleNode != nodes.end()) {
1703 const QString message =
1704 newParent->parent() ?
1705 i18n(
"Cannot move layer \"%1\" into new parent \"%2\"",
1706 (*incompatibleNode)->name(),
1707 newParent->name()) :
1708 i18n(
"Cannot move layer \"%1\" into the root layer",
1709 (*incompatibleNode)->name());
1721 if (checkCanMoveLayers(nodes, parent)) {
1723 juggler->
moveNode(nodes, parent, active);
1726 }
else if (parent && parent->parent()) {
1727 KisNodeSP grandParent = parent->parent();
1734 if (checkCanMoveLayers(allSelectedNodes, parent)) {
1736 juggler->
moveNode(allSelectedNodes, grandParent, parent);
1755 if (!nodes.isEmpty()) {
1812 if (!sender()->property(
"node").isNull()) {
1813 QString name = sender()->property(
"node").toString();
float value(const T *src, size_t ch)
QList< QString > QStringList
const quint8 OPACITY_OPAQUE_U8
char nodeType(const KoPathPoint *point)
A KisActionManager class keeps track of KisActions. These actions are always associated with the GUI....
KisAction * createAction(const QString &name)
KisAction * actionByName(const QString &name) const
void setActivationFlags(ActivationFlags flags)
@ ACTIVE_SHAPE_LAYER
Activate if the current node is a vector layer.
KisImageWSP currentImage() const
KisCoordinatesConverter * coordinatesConverter
void setCurrentShapeManagerOwnerShape(KoShape *source) override
sets the group shape that is supposed to be "entered"
void addCommand(KUndo2Command *command) override
KisAbstractCanvasWidget * canvasWidget
KoShapeManager * globalShapeManager() const
void setLayers(KisNodeList nodes, KisImageSP image, bool forceCopy=false)
static KisClipboard * instance()
const QMimeData * layersMimeData() const
virtual QRect bounds() const =0
KoShapeLayer * shapeForNode(KisNodeSP layer) const
virtual KisNodeDummy * dummyForNode(KisNodeSP node) const =0
void setLastActivatedNode(KisNodeSP node)
KisNodeSP lastActivatedNode() const
bool isIsolatingLayer() const
bool startIsolatedMode(KisNodeSP node, bool isolateLayer, bool isolateGroup)
KisGroupLayerSP rootLayer() const
void sigRequestNodeReselection(KisNodeSP activeNode, const KisNodeList &selectedNodes)
const KoColorSpace * colorSpace() const
QString nextLayerName(const QString &baseName="") const
KisPaintDeviceSP projection() const
void initialRefreshGraph()
bool isIsolatingGroup() const
QRect bounds() const override
void setResolution(double xres, double yres)
static QStringList supportedMimeTypes(Direction direction)
A container for a set of QAction objects.
QAction * action(int index) const
KisNodeSP addShapeLayer(KisNodeSP activeNode)
KisNodeSP addGeneratorLayer(KisNodeSP activeNode)
void setView(QPointer< KisView >view)
KisNodeSP addFileLayer(KisNodeSP activeNode)
void activateLayer(KisLayerSP layer)
KisPaintDeviceSP activeDevice()
void setup(KisActionManager *actionManager)
void convertLayerToFileLayer(KisNodeSP source)
KisLayerSP addPaintLayer(KisNodeSP activeNode)
KisNodeSP addGroupLayer(KisNodeSP activeNode)
KisNodeSP addCloneLayer(KisNodeList nodes)
void convertNodeToPaintLayer(KisNodeSP source)
KisNodeSP addAdjustmentLayer(KisNodeSP activeNode)
static const KoID inheritAlpha
static const KoID onionSkins
static const KoID alphaLocked
static void setNodePropertyAutoUndo(KisNodeSP node, const KoID &id, const QVariant &value, KisImageSP image)
static KisBaseNode::Property getProperty(const KoID &id, bool state)
static const KoID visible
KisNodeSP createTransformMask(KisNodeSP activeNode)
void setup(KisKActionCollection *actionCollection, KisActionManager *actionManager)
void activateMask(KisMaskSP mask)
KisNodeSP createSelectionMask(KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool convertActiveNode)
KisPaintDeviceSP activeDevice()
KisNodeSP createColorizeMask(KisNodeSP activeNode)
void setView(QPointer< KisView >view)
KisNodeSP createFastColorOverlayMask(KisNodeSP activeNode)
KisNodeSP createTransparencyMask(KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool convertActiveNode)
KisNodeSP createFilterMask(KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool quiet, bool convertActiveNode)
QString createMaskNameCommon(KisNodeSP targetNode, const QString &nodeType, const QString &desiredName)
static bool insertMimeLayers(const QMimeData *data, KisImageSP image, KisShapeController *shapeController, KisNodeDummy *parentDummy, KisNodeDummy *aboveThisDummy, bool copyNode, KisNodeInsertionAdapter *nodeInsertionAdapter, bool changeOffset=false, QPointF offset=QPointF(), KisProcessingApplicator *applicator=nullptr)
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
void moveNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
void setNodeName(KisNodeSP node, const QString &name)
void setOpacity(KisNodeSP node, qint32 opacity)
void setCompositeOp(KisNodeSP node, const KoCompositeOp *compositeOp)
void beginMacro(const KUndo2MagicString ¯oName)
KisNodeDummy * lastChild() const
void removeNode(const KisNodeList &nodes)
void raiseNode(const KisNodeList &nodes)
void addNode(const KisNodeList &nodes, KisNodeSP dstParent, KisNodeSP dstAbove)
void duplicateNode(const KisNodeList &nodes)
void copyNode(const KisNodeList &nodes, KisNodeSP dstParent, KisNodeSP dstAbove)
void lowerNode(const KisNodeList &nodes)
void moveNode(KisNodeSP node, KisNodeSP parent, KisNodeSP above)
void activateNextNode(bool siblingsOnly=false)
void toggleIsolateActiveNode()
static bool isNodeHidden(KisNodeSP node, bool isGlobalSelectionHidden)
void selectLayersImpl(const KoProperties &props, const KoProperties &invertedProps)
void setIsolateActiveGroupMode(bool checked)
void activatePreviousSiblingNode()
KisNodeDisplayModeAdapter * nodeDisplayModeAdapter() const
void createReferenceImageFromVisible()
KisNodeInsertionAdapter * nodeInsertionAdapter() const
void setView(QPointer< KisView >imageView)
bool canMoveLayer(KisNodeSP node, bool showWarning=true)
void copyNodesDirect(KisNodeList nodes, KisNodeSP parent, KisNodeSP aboveThis)
void colorOverlayMaskProperties(KisNodeSP node)
void nodeOpacityChanged(qreal opacity)
void sigUiNeedChangeActiveNode(KisNodeSP node)
void slotPinToTimeline(bool value)
void slotSplitAlphaWrite()
void setNodeOpacity(KisNodeSP node, qint32 opacity)
void slotUiActivateNode()
slotUiActivateNode inspects the sender to see which node needs to be activated.
void changeCloneSource()
pop up a window for changing the source of the selected Clone Layers
void toggleInheritAlpha()
void moveNodesDirect(KisNodeList nodes, KisNodeSP parent, KisNodeSP aboveThis)
void switchToPreviouslyActiveNode()
void setIsolateActiveLayerMode(bool checked)
void setup(KisKActionCollection *collection, KisActionManager *actionManager)
void handleExternalIsolationChange()
KisNodeSP activeNode()
Convenience function to get the active layer or mask.
KisNodeList selectedNodes()
void nodePropertiesIgnoreSelection(KisNodeSP node)
void selectInvisibleNodes()
void slotImageRequestNodeReselection(KisNodeSP activeNode, const KisNodeList &selectedNodes)
void mirrorNodes(KisNodeList nodes, const KUndo2MagicString &commandName, Qt::Orientation orientation, KisSelectionSP selection)
void sigUiNeedChangeSelectedNodes(const QList< KisNodeSP > &nodes)
void activatePreviousNode(bool siblingsOnly=false)
const KoColorSpace * activeColorSpace()
void setNodeCompositeOp(KisNodeSP node, const KoCompositeOp *compositeOp)
void changeIsolationRoot(KisNodeSP isolationRoot)
void addNodesDirect(KisNodeList nodes, KisNodeSP parent, KisNodeSP aboveThis)
KisPaintDeviceSP activePaintDevice()
Get the paint device the user wants to paint on now.
void setNodeName(KisNodeSP node, const QString &name)
qint32 convertOpacityToInt(qreal opacity)
void mirrorNode(KisNodeSP node, const KUndo2MagicString &commandName, Qt::Orientation orientation, KisSelectionSP selection)
void duplicateActiveNode()
bool createQuickGroupImpl(KisNodeJugglerCompressed *juggler, const QString &overrideGroupName, KisNodeSP *newGroup, KisNodeSP *newLastChild)
void slotSetSelectedNodes(const KisNodeList &nodes)
slotSetSelectedNodes set the list of nodes selected in the layerbox. Selected nodes are not necessari...
void pasteLayersFromClipboard(bool changeOffset=false, QPointF offset=QPointF(), KisProcessingApplicator *applicator=nullptr)
void selectUnlockedNodes()
void cutLayersToClipboard()
bool canModifyLayers(KisNodeList nodes, bool showWarning=true)
KisNodeSelectionAdapter * nodeSelectionAdapter() const
void slotSplitAlphaSaveMerged()
bool trySetNodeProperties(KisNodeSP node, KisImageSP image, KisBaseNode::PropertyList properties) const
KisNodeSP createNode(const QString &nodeType, bool quiet=false, KisPaintDeviceSP copyFrom=0)
bool canModifyLayer(KisNodeSP node, bool showWarning=true)
void slotNonUiActivatedNode(KisNodeSP node)
void nodeProperties(KisNodeSP node)
void sigNodeActivated(KisNodeSP node)
emitted whenever a node is selected.
void createReferenceImage(bool fromLayer)
KisNodeManager(KisViewManager *view)
void moveNodeAt(KisNodeSP node, KisNodeSP parent, int index)
~KisNodeManager() override
void activateNextSiblingNode()
void slotSplitAlphaIntoMask()
void createQuickClippingGroup()
void removeSingleNode(KisNodeSP node)
void createReferenceImageFromLayer()
void reinitializeIsolationActionGroup()
void slotSomethingActivatedNodeImpl(KisNodeSP node)
KisLayerSP createPaintLayer()
bool canMoveLayers(KisNodeList nodes, bool showWarning=true)
void nodeCompositeOpChanged(const KoCompositeOp *op)
void removeSelectedNodes(KisNodeList selectedNodes)
void changeIsolationMode(bool isolateActiveLayer, bool isolateActiveGroup)
void convertNode(const QString &nodeType)
void selectVisibleNodes()
void slotUiActivatedNode(KisNodeSP node)
void saveVectorLayerAsImage()
void copyLayersToClipboard()
static void setNodePropertiesAutoUndo(KisNodeSP node, KisImageSP image, PropertyList proplist)
virtual const KoColorSpace * compositionSourceColorSpace() const
QRect exactBounds() const
const KoColorSpace * colorSpace() const
KoColor defaultPixel() const
QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
KisDefaultBoundsBaseSP defaultBounds() const
void makeCloneFrom(KisPaintDeviceSP src, const QRect &rect)
static KisPart * instance()
void applyVisitor(KisProcessingVisitorSP visitor, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
void applyVisitorAllFrames(KisProcessingVisitorSP visitor, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
static KisReferenceImage * fromQImage(const KisCoordinatesConverter &converter, const QImage &img)
static KUndo2Command * addReferenceImages(KisDocument *document, QList< KoShape * > referenceImages)
ALWAYS_INLINE quint8 * rawData()
The KisSignalMapper class bundles signals from identifiable senders.
bool blockUntilOperationsFinished(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
KisDocument * document() const
KisActionManager * actionManager() const
KisCanvas2 * canvasBase() const
Return the canvas base class.
KisSelectionSP selection()
KisLayerSP activeLayer()
Convenience method to get at the active layer.
void blockUntilOperationsFinishedForced(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
virtual KisKActionCollection * actionCollection() const
KisSelectionManager * selectionManager()
QWidget * mainWindowAsQWidget() const
KisImageWSP image() const
Return the image this view is displaying.
void showFloatingMessage(const QString &message, const QIcon &icon, int timeout=4500, KisFloatingMessage::Priority priority=KisFloatingMessage::Medium, int alignment=Qt::AlignCenter|Qt::TextWordWrap)
shows a floating message in the top right corner of the canvas
virtual quint32 pixelSize() const =0
virtual void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels) const =0
void setProperty(const QString &name, const QVariant &value)
void deselectAll()
clear the selections list
void setActiveLayer(KoShapeLayer *layer)
void select(KoShape *shape)
QList< KoShape * > shapes() const
static bool compareShapeZIndex(KoShape *s1, KoShape *s2)
Implements exporting shapes to SVG.
bool save(QIODevice &outputDevice, const QSizeF &pageSize)
Writes svg to specified output device.
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_RETURN(cond)
KisDocument * createDocument(QList< KisNodeSP > nodes, KisImageSP srcImage, const QRect &copiedBounds)
#define CONVERT_NODE_ACTION_2(id, layerType, exclude)
#define CONVERT_NODE_ACTION(id, layerType)
#define NEW_LAYER_ACTION(id, layerType)
QList< KisNodeSP > KisNodeList
KUndo2MagicString kundo2_i18n(const char *text)
KUndo2MagicString kundo2_noi18n(const QString &text)
KUndo2MagicString kundo2_i18np(const char *sing, const char *plur, const A1 &a1)
void splitAlphaToMask(KisImageSP image, KisNodeSP node, const QString &maskName)
void sortMergeableNodes(KisNodeSP root, KisNodeList &inputNodes, KisNodeList &outputNodes)
KisNodeSP findNodeByName(KisNodeSP root, const QString &name)
KisNodeList findNodesWithProps(KisNodeSP root, const KoProperties &props, bool excludeRoot)
void newLayerFromVisible(KisImageSP image, KisNodeSP putAfter, MergeFlags flags)
void filterMergeableNodes(KisNodeList &nodes, bool allowMasks)
bool checkIsChildOf(KisNodeSP node, const KisNodeList &parents)
bool compareListsUnordered(const QList< T > &a, const QList< T > &b)
void setPinnedToTimeline(bool pinned)
virtual KisPaintDeviceSP projection() const =0
bool isEditable(bool checkVisibility=true) const
bool isPinnedToTimeline() const
virtual QRect exactBounds() const
virtual KisPaintDeviceSP original() const =0
virtual KisPaintDeviceSP paintDevice() const =0
virtual bool isFakeNode() const
virtual bool visible(bool recursive=false) const
bool hasEditablePaintDevice() const
KisPaintDeviceSP projection() const override
void disableAlphaChannel(bool disable)
virtual KisSelectionMaskSP selectionMask() const
const KoColorSpace * colorSpace() const override
returns the image's colorSpace or null, if there is no image
KisFilterMaskSP colorOverlayMask() const
KisLayerSP parentLayer() const
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
void mergeTransparencyMaskAsAlpha(bool writeToLayers)
QScopedPointer< KisNodeSelectionAdapter > nodeSelectionAdapter
bool activateNodeImpl(KisNodeSP node)
void saveDeviceAsImage(KisPaintDeviceSP device, const QString &defaultName, const QRect &bounds, qreal xRes, qreal yRes, quint8 opacity)
KisNodeCommandsAdapter commandsAdapter
KisSynchronizedConnection< KisNodeSP, KisNodeList > activateNodeConnection
KisLayerManager layerManager
bool lastRequestedIsolatedModeStatus
KisMaskManager maskManager
KisNodeWSP previouslyActiveNode
QScopedPointer< KisNodeInsertionAdapter > nodeInsertionAdapter
KisSignalMapper nodeCreationSignalMapper
QPointer< KisNodeJugglerCompressed > nodeJuggler
KisNodeJugglerCompressed * lazyGetJuggler(const KUndo2MagicString &actionName)
Private(KisNodeManager *_q, KisViewManager *v)
QPointer< KisView > imageView
KisSignalMapper nodeConversionSignalMapper
KisAction * pinToTimeline
QScopedPointer< KisNodeDisplayModeAdapter > nodeDisplayModeAdapter
KisNodeList selectedNodes
KisNodeSP prevSibling() const
KisNodeSP firstChild() const
QList< KisNodeSP > childNodes(const QStringList &nodeTypes, const KoProperties &properties) const
quint32 childCount() const
KisNodeSP lastChild() const
KisNodeSP nextSibling() const
KisNodeGraphListener * graphListener
KisPaintDeviceSP paintDevice
void setActive(bool active)
bool hasShapeSelection() const