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.");
839 <<
"KarbonGradientTool"
840 <<
"KarbonCalligraphyTool"
844 <<
"KritaShape/KisToolBrush"
845 <<
"KritaShape/KisToolDyna"
846 <<
"KritaShape/KisToolMultiBrush"
847 <<
"KritaFill/KisToolFill"
848 <<
"KritaFill/KisToolGradient";
851 const bool nodeHasVectorAbilities = node->inherits(
"KisShapeLayer") ||
854 if (nodeHasVectorAbilities) {
897 if ((
selectedNodes().size() > 1 && node->inherits(
"KisLayer")) || node->inherits(
"KisLayer")) {
900 else if (node->inherits(
"KisMask")) {
913 if (node->inherits(
"KisLayer")) {
916 else if (node->inherits(
"KisMask")) {
935 return qMin(255,
int(opacity * 2.55 + 0.5));
941 if (node->
name() == name)
return;
950 if (node->
opacity() == opacity)
return;
1020 if (properties.contains(onionSkinOn)) {
1091 if (!node || !node->
parent()) {
1119 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1120 commandName =
kundo2_i18n(
"Mirror Mask Horizontally");
1123 commandName =
kundo2_i18np(
"Mirror Layer Horizontally",
"Mirror %1 Layers Horizontally", nodes.size());
1133 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1134 commandName =
kundo2_i18n(
"Mirror Mask Vertically");
1137 commandName =
kundo2_i18np(
"Mirror Layer Vertically",
"Mirror %1 Layers Vertically", nodes.size());
1159 if (!activeNode)
return;
1163 if (!siblingsOnly) {
1165 while (nextNode && nextNode->
childCount() > 0) {
1181 if (nextNode && nextNode->
parent()) {
1194 if (!activeNode)
return;
1198 if (!siblingsOnly) {
1216 if (nextNode && nextNode->
parent()) {
1235 Qt::Orientation orientation,
1239 mirrorNodes(nodes, actionName, orientation, selection);
1244 Qt::Orientation orientation,
1255 emitSignals, actionName);
1277 const QString &defaultName,
1284 dialog.setCaption(i18n(
"Export \"%1\"", defaultName));
1285 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1287 QString filename = dialog.filename();
1289 if (filename.isEmpty())
return;
1301 doc->setCurrentImage(dst);
1308 if (!doc->exportDocumentSync(filename, mimefilter.toLatin1())) {
1309 QMessageBox::warning(qApp->activeWindow(),
1310 i18nc(
"@title:window",
"Krita"),
1311 i18n(
"Could not save the layer. %1", doc->errorMessage().toUtf8().data()),
1322 warnKrita <<
"BUG: Save Node As Image was called without any node selected";
1329 m_d->
view->
showFloatingMessage(i18nc(
"warning message when trying to export a transform mask",
"Layer has no pixel data"), QIcon());
1353 dialog.setCaption(i18nc(
"@title:window",
"Export to SVG"));
1354 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1355 dialog.setMimeTypeFilters(
QStringList() <<
"image/svg+xml",
"image/svg+xml");
1356 QString filename = dialog.filename();
1358 if (filename.isEmpty())
return;
1360 QUrl url = QUrl::fromLocalFile(filename);
1362 if (url.isEmpty())
return;
1372 if (!writer.
save(filename, sizeInPt,
true)) {
1373 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not save to svg: %1", filename));
1397 QMessageBox::information(view->mainWindowAsQWidget(),
1398 i18nc(
"@title:window",
"Layer %1 is not editable", parentNode->
name()),
1399 i18n(
"Cannot write alpha channel of "
1400 "the parent layer \"%1\".\n"
1401 "The operation will be cancelled.", parentNode->
name()));
1406 if (writeToLayers) {
1412 copyDevice = parentNode->
original();
1422 const QRect processRect =
1427 QScopedPointer<KisTransaction> transaction;
1429 if (writeToLayers) {
1430 commandsAdapter.beginMacro(
kundo2_i18n(
"Write Alpha into a Layer"));
1438 quint8 *alpha8Ptr = srcIt.
rawData();
1439 quint8 *dstPtr = dstIt.
rawData();
1444 if (writeToLayers) {
1445 commandsAdapter.addExtraCommand(transaction->endAndTake());
1446 commandsAdapter.removeNode(node);
1447 commandsAdapter.endMacro();
1450 QRect saveRect = image->
bounds();
1452 saveDeviceAsImage(dstDevice, parentNode->
name(),
1474 if (nodes.isEmpty() || !active)
return;
1478 for (
auto &node : nodes) {
1487 if (nodes.isEmpty() || !active)
return;
1489 bool isVisible = active->
visible();
1491 for (
auto &node : nodes) {
1500 if (nodes.isEmpty() || !active)
return;
1502 auto layer = qobject_cast<KisPaintLayer*>(active.
data());
1507 bool isAlphaLocked = layer->alphaLocked();
1508 for (
auto &node : nodes) {
1509 auto layer = qobject_cast<KisPaintLayer*>(node.data());
1520 if (nodes.isEmpty() || !active)
return;
1522 auto layer = qobject_cast<KisLayer*>(active.
data());
1527 bool isAlphaDisabled = layer->alphaChannelDisabled();
1528 for (
auto &node : nodes) {
1529 auto layer = qobject_cast<KisLayer*>(node.data());
1556 if (nodes.isEmpty())
return;
1558 KisNodeList::Iterator it = nodes.begin();
1559 while (it != nodes.end()) {
1561 if (!it->data()->parent()) {
1590 Q_ASSERT(shapeController);
1593 Q_ASSERT(dummiesFacade);
1595 const bool copyNode =
false;
1613 const QString &overrideGroupName,
1618 if (!active)
return false;
1623 QString groupName = !overrideGroupName.isEmpty() ? overrideGroupName : image->
nextLayerName(i18nc(
"A group of layers",
"Group"));
1633 if (nodes2.size() == 0)
return false;
1636 active = nodes2.first();
1642 juggler->
addNode(nodes1, parent, aboveThis);
1643 juggler->
moveNode(nodes2, group, 0);
1646 *newLastChild = nodes2.last();
1682 if (!active)
return;
1690 auto incompatibleNode =
1691 std::find_if(nodes.begin(), nodes.end(),
1693 return !newParent->allowAsChild(node);
1696 if (incompatibleNode != nodes.end()) {
1697 const QString message =
1698 newParent->parent() ?
1699 i18n(
"Cannot move layer \"%1\" into new parent \"%2\"",
1700 (*incompatibleNode)->name(),
1701 newParent->name()) :
1702 i18n(
"Cannot move layer \"%1\" into the root layer",
1703 (*incompatibleNode)->name());
1715 if (checkCanMoveLayers(nodes, parent)) {
1717 juggler->
moveNode(nodes, parent, active);
1720 }
else if (parent && parent->parent()) {
1721 KisNodeSP grandParent = parent->parent();
1728 if (checkCanMoveLayers(allSelectedNodes, parent)) {
1730 juggler->
moveNode(allSelectedNodes, grandParent, parent);
1749 if (!nodes.isEmpty()) {
1806 if (!sender()->property(
"node").isNull()) {
1807 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