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.");
846 <<
"KarbonGradientTool"
847 <<
"KarbonCalligraphyTool"
851 <<
"KritaShape/KisToolBrush"
852 <<
"KritaShape/KisToolDyna"
853 <<
"KritaShape/KisToolMultiBrush"
854 <<
"KritaFill/KisToolFill"
855 <<
"KritaFill/KisToolGradient";
858 const bool nodeHasVectorAbilities = node->inherits(
"KisShapeLayer") ||
861 if (nodeHasVectorAbilities) {
904 if ((
selectedNodes().size() > 1 && node->inherits(
"KisLayer")) || node->inherits(
"KisLayer")) {
907 else if (node->inherits(
"KisMask")) {
920 if (node->inherits(
"KisLayer")) {
923 else if (node->inherits(
"KisMask")) {
942 return qMin(255,
int(opacity * 2.55 + 0.5));
948 if (node->
name() == name)
return;
957 if (node->
opacity() == opacity)
return;
1027 if (properties.contains(onionSkinOn)) {
1098 if (!node || !node->
parent()) {
1126 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1127 commandName =
kundo2_i18n(
"Mirror Mask Horizontally");
1130 commandName =
kundo2_i18np(
"Mirror Layer Horizontally",
"Mirror %1 Layers Horizontally", nodes.size());
1140 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1141 commandName =
kundo2_i18n(
"Mirror Mask Vertically");
1144 commandName =
kundo2_i18np(
"Mirror Layer Vertically",
"Mirror %1 Layers Vertically", nodes.size());
1166 if (!activeNode)
return;
1170 if (!siblingsOnly) {
1172 while (nextNode && nextNode->
childCount() > 0) {
1188 if (nextNode && nextNode->
parent()) {
1201 if (!activeNode)
return;
1205 if (!siblingsOnly) {
1223 if (nextNode && nextNode->
parent()) {
1242 Qt::Orientation orientation,
1246 mirrorNodes(nodes, actionName, orientation, selection);
1251 Qt::Orientation orientation,
1262 emitSignals, actionName);
1284 const QString &defaultName,
1291 dialog.setCaption(i18n(
"Export \"%1\"", defaultName));
1292 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1294 QString filename = dialog.filename();
1296 if (filename.isEmpty())
return;
1308 doc->setCurrentImage(dst);
1315 if (!doc->exportDocumentSync(filename, mimefilter.toLatin1())) {
1316 QMessageBox::warning(qApp->activeWindow(),
1317 i18nc(
"@title:window",
"Krita"),
1318 i18n(
"Could not save the layer. %1", doc->errorMessage().toUtf8().data()),
1329 warnKrita <<
"BUG: Save Node As Image was called without any node selected";
1336 m_d->
view->
showFloatingMessage(i18nc(
"warning message when trying to export a transform mask",
"Layer has no pixel data"), QIcon());
1360 dialog.setCaption(i18nc(
"@title:window",
"Export to SVG"));
1361 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1362 dialog.setMimeTypeFilters(
QStringList() <<
"image/svg+xml",
"image/svg+xml");
1363 QString filename = dialog.filename();
1365 if (filename.isEmpty())
return;
1367 QUrl url = QUrl::fromLocalFile(filename);
1369 if (url.isEmpty())
return;
1379 if (!writer.
save(filename, sizeInPt,
true)) {
1380 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not save to svg: %1", filename));
1404 QMessageBox::information(view->mainWindowAsQWidget(),
1405 i18nc(
"@title:window",
"Layer %1 is not editable", parentNode->
name()),
1406 i18n(
"Cannot write alpha channel of "
1407 "the parent layer \"%1\".\n"
1408 "The operation will be cancelled.", parentNode->
name()));
1413 if (writeToLayers) {
1419 copyDevice = parentNode->
original();
1429 const QRect processRect =
1434 QScopedPointer<KisTransaction> transaction;
1436 if (writeToLayers) {
1437 commandsAdapter.beginMacro(
kundo2_i18n(
"Write Alpha into a Layer"));
1445 quint8 *alpha8Ptr = srcIt.
rawData();
1446 quint8 *dstPtr = dstIt.
rawData();
1451 if (writeToLayers) {
1452 commandsAdapter.addExtraCommand(transaction->endAndTake());
1453 commandsAdapter.removeNode(node);
1454 commandsAdapter.endMacro();
1457 QRect saveRect = image->
bounds();
1459 saveDeviceAsImage(dstDevice, parentNode->
name(),
1481 if (nodes.isEmpty() || !active)
return;
1485 for (
auto &node : nodes) {
1494 if (nodes.isEmpty() || !active)
return;
1496 bool isVisible = active->
visible();
1498 for (
auto &node : nodes) {
1507 if (nodes.isEmpty() || !active)
return;
1509 auto layer = qobject_cast<KisPaintLayer*>(active.
data());
1514 bool isAlphaLocked = layer->alphaLocked();
1515 for (
auto &node : nodes) {
1516 auto layer = qobject_cast<KisPaintLayer*>(node.data());
1527 if (nodes.isEmpty() || !active)
return;
1529 auto layer = qobject_cast<KisLayer*>(active.
data());
1534 bool isAlphaDisabled = layer->alphaChannelDisabled();
1535 for (
auto &node : nodes) {
1536 auto layer = qobject_cast<KisLayer*>(node.data());
1563 if (nodes.isEmpty())
return;
1565 KisNodeList::Iterator it = nodes.begin();
1566 while (it != nodes.end()) {
1568 if (!it->data()->parent()) {
1597 Q_ASSERT(shapeController);
1600 Q_ASSERT(dummiesFacade);
1602 const bool copyNode =
false;
1620 const QString &overrideGroupName,
1625 if (!active)
return false;
1630 QString groupName = !overrideGroupName.isEmpty() ? overrideGroupName : image->
nextLayerName(i18nc(
"A group of layers",
"Group"));
1640 if (nodes2.size() == 0)
return false;
1643 active = nodes2.first();
1649 juggler->
addNode(nodes1, parent, aboveThis);
1650 juggler->
moveNode(nodes2, group, 0);
1653 *newLastChild = nodes2.last();
1689 if (!active)
return;
1697 auto incompatibleNode =
1698 std::find_if(nodes.begin(), nodes.end(),
1700 return !newParent->allowAsChild(node);
1703 if (incompatibleNode != nodes.end()) {
1704 const QString message =
1705 newParent->parent() ?
1706 i18n(
"Cannot move layer \"%1\" into new parent \"%2\"",
1707 (*incompatibleNode)->name(),
1708 newParent->name()) :
1709 i18n(
"Cannot move layer \"%1\" into the root layer",
1710 (*incompatibleNode)->name());
1722 if (checkCanMoveLayers(nodes, parent)) {
1724 juggler->
moveNode(nodes, parent, active);
1727 }
else if (parent && parent->parent()) {
1728 KisNodeSP grandParent = parent->parent();
1735 if (checkCanMoveLayers(allSelectedNodes, parent)) {
1737 juggler->
moveNode(allSelectedNodes, grandParent, parent);
1756 if (!nodes.isEmpty()) {
1813 if (!sender()->property(
"node").isNull()) {
1814 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
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