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");
412 action = actionManager->
createAction(
"isolate_active_layer");
414 action = actionManager->
createAction(
"isolate_active_group");
418 action = actionManager->
createAction(
"toggle_layer_visibility");
421 action = actionManager->
createAction(
"toggle_layer_lock");
422 connect(action, SIGNAL(triggered()),
this, SLOT(
toggleLock()));
424 action = actionManager->
createAction(
"toggle_layer_inherit_alpha");
427 action = actionManager->
createAction(
"toggle_layer_alpha_lock");
430 action = actionManager->
createAction(
"split_alpha_into_mask");
433 action = actionManager->
createAction(
"split_alpha_write");
437 action = actionManager->
createAction(
"split_alpha_save_merged");
484 if (lockedNode && showWarning) {
485 QString errorMessage;
487 if (nodes.size() <= 1) {
488 errorMessage = i18n(
"Layer is locked");
490 errorMessage = i18n(
"Layer \"%1\" is locked", lockedNode->
name());
509 lockedNode = node->
parent();
514 if (lockedNode && showWarning) {
515 QString errorMessage = i18n(
"Layer \"%1\" is locked", lockedNode->
name());
529 if (parent->allowAsChild(node)) {
530 if (node->inherits(
"KisSelectionMask") && parent->inherits(
"KisLayer")) {
532 KisLayer *l = qobject_cast<KisLayer*>(parent.data());
545 juggler->
moveNode(nodes, parent, aboveThis);
552 juggler->
copyNode(nodes, parent, aboveThis);
559 juggler->
addNode(nodes, parent, aboveThis);
592 if (isolateActiveLayer || isolateActiveGroup) {
604 if (!image || !isolationRoot)
return;
610 if (image->
startIsolatedMode(isolationRoot, isIsolatingLayer, isIsolatingGroup) ==
false) {
659 }
else if (
nodeType ==
"KisGroupLayer") {
661 }
else if (
nodeType ==
"KisAdjustmentLayer") {
663 }
else if (
nodeType ==
"KisGeneratorLayer") {
665 }
else if (
nodeType ==
"KisShapeLayer") {
667 }
else if (
nodeType ==
"KisCloneLayer") {
669 if (nodes.isEmpty()) {
673 }
else if (
nodeType ==
"KisTransparencyMask") {
675 }
else if (
nodeType ==
"KisFilterMask") {
677 }
else if (
nodeType ==
"FastColorOverlayFilterMask") {
679 }
else if (
nodeType ==
"KisColorizeMask") {
681 }
else if (
nodeType ==
"KisTransformMask") {
683 }
else if (
nodeType ==
"KisSelectionMask") {
685 }
else if (
nodeType ==
"KisFileLayer") {
716 if (!activeNode)
return;
722 }
else if (
nodeType ==
"KisSelectionMask" ||
724 nodeType ==
"KisTransparencyMask") {
733 if (
nodeType ==
"KisSelectionMask") {
735 }
else if (
nodeType ==
"KisFilterMask") {
737 }
else if (
nodeType ==
"KisTransparencyMask") {
747 }
else if (
nodeType ==
"KisFileLayer") {
766 if (document->referenceImagesLayer()) {
767 reference->setZIndex(document->referenceImagesLayer()->shapes().size());
775 QString strMessage = fromLayer ? i18nc(
"error dialog from the reference tool",
"Could not create a reference image from the active layer.")
776 : i18nc(
"error dialog from the reference tool",
"Could not create a reference image from the visible canvas.");
847 <<
"KarbonGradientTool"
848 <<
"KarbonCalligraphyTool"
852 <<
"KritaShape/KisToolBrush"
853 <<
"KritaShape/KisToolDyna"
854 <<
"KritaShape/KisToolMultiBrush"
855 <<
"KritaFill/KisToolFill"
856 <<
"KritaFill/KisToolGradient";
859 const bool nodeHasVectorAbilities = node->inherits(
"KisShapeLayer") ||
862 if (nodeHasVectorAbilities) {
905 if ((
selectedNodes().size() > 1 && node->inherits(
"KisLayer")) || node->inherits(
"KisLayer")) {
908 else if (node->inherits(
"KisMask")) {
921 if (node->inherits(
"KisLayer")) {
924 else if (node->inherits(
"KisMask")) {
943 return qMin(255,
int(opacity * 2.55 + 0.5));
949 if (node->
name() == name)
return;
958 if (node->
opacity() == opacity)
return;
1028 if (properties.contains(onionSkinOn)) {
1099 if (!node || !node->
parent()) {
1127 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1128 commandName =
kundo2_i18n(
"Mirror Mask Horizontally");
1131 commandName =
kundo2_i18np(
"Mirror Layer Horizontally",
"Mirror %1 Layers Horizontally", nodes.size());
1141 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1142 commandName =
kundo2_i18n(
"Mirror Mask Vertically");
1145 commandName =
kundo2_i18np(
"Mirror Layer Vertically",
"Mirror %1 Layers Vertically", nodes.size());
1167 if (!activeNode)
return;
1171 if (!siblingsOnly) {
1173 while (nextNode && nextNode->
childCount() > 0) {
1189 if (nextNode && nextNode->
parent()) {
1202 if (!activeNode)
return;
1206 if (!siblingsOnly) {
1224 if (nextNode && nextNode->
parent()) {
1243 Qt::Orientation orientation,
1247 mirrorNodes(nodes, actionName, orientation, selection);
1252 Qt::Orientation orientation,
1263 emitSignals, actionName);
1285 const QString &defaultName,
1292 dialog.setCaption(i18n(
"Export \"%1\"", defaultName));
1293 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1295 QString filename = dialog.filename();
1297 if (filename.isEmpty())
return;
1309 doc->setCurrentImage(dst);
1316 if (!doc->exportDocumentSync(filename, mimefilter.toLatin1())) {
1317 QMessageBox::warning(qApp->activeWindow(),
1318 i18nc(
"@title:window",
"Krita"),
1319 i18n(
"Could not save the layer. %1", doc->errorMessage().toUtf8().data()),
1330 warnKrita <<
"BUG: Save Node As Image was called without any node selected";
1337 m_d->
view->
showFloatingMessage(i18nc(
"warning message when trying to export a transform mask",
"Layer has no pixel data"), QIcon());
1361 dialog.setCaption(i18nc(
"@title:window",
"Export to SVG"));
1362 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1363 dialog.setMimeTypeFilters(
QStringList() <<
"image/svg+xml",
"image/svg+xml");
1364 QString filename = dialog.filename();
1366 if (filename.isEmpty())
return;
1368 QUrl url = QUrl::fromLocalFile(filename);
1370 if (url.isEmpty())
return;
1380 if (!writer.
save(filename, sizeInPt,
true)) {
1381 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not save to svg: %1", filename));
1405 QMessageBox::information(view->mainWindowAsQWidget(),
1406 i18nc(
"@title:window",
"Layer %1 is not editable", parentNode->
name()),
1407 i18n(
"Cannot write alpha channel of "
1408 "the parent layer \"%1\".\n"
1409 "The operation will be cancelled.", parentNode->
name()));
1414 if (writeToLayers) {
1420 copyDevice = parentNode->
original();
1430 const QRect processRect =
1435 QScopedPointer<KisTransaction> transaction;
1437 if (writeToLayers) {
1438 commandsAdapter.beginMacro(
kundo2_i18n(
"Write Alpha into a Layer"));
1446 quint8 *alpha8Ptr = srcIt.
rawData();
1447 quint8 *dstPtr = dstIt.
rawData();
1452 if (writeToLayers) {
1453 commandsAdapter.addExtraCommand(transaction->endAndTake());
1454 commandsAdapter.removeNode(node);
1455 commandsAdapter.endMacro();
1458 QRect saveRect = image->
bounds();
1460 saveDeviceAsImage(dstDevice, parentNode->
name(),
1482 if (nodes.isEmpty() || !active)
return;
1486 for (
auto &node : nodes) {
1495 if (nodes.isEmpty() || !active)
return;
1497 bool isVisible = active->
visible();
1499 for (
auto &node : nodes) {
1508 if (nodes.isEmpty() || !active)
return;
1510 auto layer = qobject_cast<KisPaintLayer*>(active.
data());
1515 bool isAlphaLocked = layer->alphaLocked();
1516 for (
auto &node : nodes) {
1517 auto layer = qobject_cast<KisPaintLayer*>(node.data());
1528 if (nodes.isEmpty() || !active)
return;
1530 auto layer = qobject_cast<KisLayer*>(active.
data());
1535 bool isAlphaDisabled = layer->alphaChannelDisabled();
1536 for (
auto &node : nodes) {
1537 auto layer = qobject_cast<KisLayer*>(node.data());
1564 if (nodes.isEmpty())
return;
1566 KisNodeList::Iterator it = nodes.begin();
1567 while (it != nodes.end()) {
1569 if (!it->data()->parent()) {
1598 Q_ASSERT(shapeController);
1601 Q_ASSERT(dummiesFacade);
1603 const bool copyNode =
false;
1621 const QString &overrideGroupName,
1626 if (!active)
return false;
1631 QString groupName = !overrideGroupName.isEmpty() ? overrideGroupName : image->
nextLayerName(i18nc(
"A group of layers",
"Group"));
1641 if (nodes2.size() == 0)
return false;
1644 active = nodes2.first();
1650 juggler->
addNode(nodes1, parent, aboveThis);
1651 juggler->
moveNode(nodes2, group, 0);
1654 *newLastChild = nodes2.last();
1690 if (!active)
return;
1698 auto incompatibleNode =
1699 std::find_if(nodes.begin(), nodes.end(),
1701 return !newParent->allowAsChild(node);
1704 if (incompatibleNode != nodes.end()) {
1705 const QString message =
1706 newParent->parent() ?
1707 i18n(
"Cannot move layer \"%1\" into new parent \"%2\"",
1708 (*incompatibleNode)->name(),
1709 newParent->name()) :
1710 i18n(
"Cannot move layer \"%1\" into the root layer",
1711 (*incompatibleNode)->name());
1723 if (checkCanMoveLayers(nodes, parent)) {
1725 juggler->
moveNode(nodes, parent, active);
1728 }
else if (parent && parent->parent()) {
1729 KisNodeSP grandParent = parent->parent();
1736 if (checkCanMoveLayers(allSelectedNodes, parent)) {
1738 juggler->
moveNode(allSelectedNodes, grandParent, parent);
1757 if (!nodes.isEmpty()) {
1814 if (!sender()->property(
"node").isNull()) {
1815 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