9#include <QStandardPaths>
12#include <QApplication>
16#include <QKeySequence>
125 const QString &defaultName,
207 Q_ASSERT(shapeController);
208 shapeController->disconnect(SIGNAL(sigActivateNode(
KisNodeSP)),
this);
217 Q_ASSERT(shapeController);
250#define NEW_LAYER_ACTION(id, layerType) \
252 action = actionManager->createAction(id); \
253 m_d->nodeCreationSignalMapper.setMapping(action, layerType); \
254 connect(action, SIGNAL(triggered()), \
255 &m_d->nodeCreationSignalMapper, SLOT(map())); \
258#define CONVERT_NODE_ACTION_2(id, layerType, exclude) \
260 action = actionManager->createAction(id); \
261 action->setExcludedNodeTypes(QStringList(exclude)); \
262 actionManager->addAction(id, action); \
263 m_d->nodeConversionSignalMapper.setMapping(action, layerType); \
264 connect(action, SIGNAL(triggered()), \
265 &m_d->nodeConversionSignalMapper, SLOT(map())); \
268#define CONVERT_NODE_ACTION(id, layerType) \
269 CONVERT_NODE_ACTION_2(id, layerType, layerType)
284 action = actionManager->
createAction(
"mirrorAllNodesX");
287 action = actionManager->
createAction(
"mirrorAllNodesY");
290 action = actionManager->
createAction(
"activateNextLayer");
293 action = actionManager->
createAction(
"activateNextSiblingLayer");
296 action = actionManager->
createAction(
"activatePreviousLayer");
299 action = actionManager->
createAction(
"activatePreviousSiblingLayer");
302 action = actionManager->
createAction(
"switchToPreviouslyActiveNode");
305 action = actionManager->
createAction(
"save_node_as_image");
308 action = actionManager->
createAction(
"save_vector_node_to_svg");
315 action = actionManager->
createAction(
"copy_layer_clipboard");
318 action = actionManager->
createAction(
"cut_layer_clipboard");
321 action = actionManager->
createAction(
"paste_layer_from_clipboard");
324 action = actionManager->
createAction(
"create_quick_group");
327 action = actionManager->
createAction(
"create_quick_clipping_group");
333 action = actionManager->
createAction(
"select_all_layers");
336 action = actionManager->
createAction(
"select_visible_layers");
339 action = actionManager->
createAction(
"select_locked_layers");
342 action = actionManager->
createAction(
"select_invisible_layers");
345 action = actionManager->
createAction(
"select_unlocked_layers");
348 action = actionManager->
createAction(
"new_from_visible");
351 action = actionManager->
createAction(
"create_reference_image_from_active_layer");
354 action = actionManager->
createAction(
"create_reference_image_from_visible_canvas");
357 action = actionManager->
createAction(
"pin_to_timeline");
358 action->setCheckable(
true);
381 NEW_LAYER_ACTION(
"add_new_fast_color_overlay_mask",
"FastColorOverlayFilterMask");
409 action = actionManager->
createAction(
"isolate_active_layer");
411 action = actionManager->
createAction(
"isolate_active_group");
415 action = actionManager->
createAction(
"toggle_layer_visibility");
418 action = actionManager->
createAction(
"toggle_layer_lock");
421 action = actionManager->
createAction(
"toggle_layer_inherit_alpha");
424 action = actionManager->
createAction(
"toggle_layer_alpha_lock");
427 action = actionManager->
createAction(
"split_alpha_into_mask");
430 action = actionManager->
createAction(
"split_alpha_write");
434 action = actionManager->
createAction(
"split_alpha_save_merged");
481 if (lockedNode && showWarning) {
482 QString errorMessage;
484 if (nodes.size() <= 1) {
485 errorMessage = i18n(
"Layer is locked");
487 errorMessage = i18n(
"Layer \"%1\" is locked", lockedNode->
name());
506 lockedNode = node->
parent();
511 if (lockedNode && showWarning) {
512 QString errorMessage = i18n(
"Layer \"%1\" is locked", lockedNode->
name());
526 if (parent->allowAsChild(node)) {
527 if (node->inherits(
"KisSelectionMask") && parent->inherits(
"KisLayer")) {
529 KisLayer *l = qobject_cast<KisLayer*>(parent.data());
542 juggler->
moveNode(nodes, parent, aboveThis);
549 juggler->
copyNode(nodes, parent, aboveThis);
556 juggler->
addNode(nodes, parent, aboveThis);
589 if (isolateActiveLayer || isolateActiveGroup) {
601 if (!image || !isolationRoot)
return;
607 if (image->
startIsolatedMode(isolationRoot, isIsolatingLayer, isIsolatingGroup) ==
false) {
656 }
else if (
nodeType ==
"KisGroupLayer") {
658 }
else if (
nodeType ==
"KisAdjustmentLayer") {
660 }
else if (
nodeType ==
"KisGeneratorLayer") {
662 }
else if (
nodeType ==
"KisShapeLayer") {
664 }
else if (
nodeType ==
"KisCloneLayer") {
666 if (nodes.isEmpty()) {
670 }
else if (
nodeType ==
"KisTransparencyMask") {
672 }
else if (
nodeType ==
"KisFilterMask") {
674 }
else if (
nodeType ==
"FastColorOverlayFilterMask") {
676 }
else if (
nodeType ==
"KisColorizeMask") {
678 }
else if (
nodeType ==
"KisTransformMask") {
680 }
else if (
nodeType ==
"KisSelectionMask") {
682 }
else if (
nodeType ==
"KisFileLayer") {
713 if (!activeNode)
return;
719 }
else if (
nodeType ==
"KisSelectionMask" ||
721 nodeType ==
"KisTransparencyMask") {
730 if (
nodeType ==
"KisSelectionMask") {
732 }
else if (
nodeType ==
"KisFilterMask") {
734 }
else if (
nodeType ==
"KisTransparencyMask") {
744 }
else if (
nodeType ==
"KisFileLayer") {
763 if (document->referenceImagesLayer()) {
764 reference->setZIndex(document->referenceImagesLayer()->shapes().size());
772 QString strMessage = fromLayer ? i18nc(
"error dialog from the reference tool",
"Could not create a reference image from the active layer.")
773 : i18nc(
"error dialog from the reference tool",
"Could not create a reference image from the visible canvas.");
843 <<
"KarbonGradientTool"
844 <<
"KarbonCalligraphyTool"
848 <<
"KritaShape/KisToolBrush"
849 <<
"KritaShape/KisToolDyna"
850 <<
"KritaShape/KisToolMultiBrush"
851 <<
"KritaFill/KisToolFill"
852 <<
"KritaFill/KisToolGradient";
855 const bool nodeHasVectorAbilities = node->inherits(
"KisShapeLayer") ||
858 if (nodeHasVectorAbilities) {
901 if ((
selectedNodes().size() > 1 && node->inherits(
"KisLayer")) || node->inherits(
"KisLayer")) {
904 else if (node->inherits(
"KisMask")) {
917 if (node->inherits(
"KisLayer")) {
920 else if (node->inherits(
"KisMask")) {
939 return qMin(255,
int(opacity * 2.55 + 0.5));
945 if (node->
name() == name)
return;
954 if (node->
opacity() == opacity)
return;
1024 if (properties.contains(onionSkinOn)) {
1095 if (!node || !node->
parent()) {
1123 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1124 commandName =
kundo2_i18n(
"Mirror Mask Horizontally");
1127 commandName =
kundo2_i18np(
"Mirror Layer Horizontally",
"Mirror %1 Layers Horizontally", nodes.size());
1137 if (nodes.size() == 1 && nodes[0]->inherits(
"KisMask")) {
1138 commandName =
kundo2_i18n(
"Mirror Mask Vertically");
1141 commandName =
kundo2_i18np(
"Mirror Layer Vertically",
"Mirror %1 Layers Vertically", nodes.size());
1163 if (!activeNode)
return;
1167 if (!siblingsOnly) {
1169 while (nextNode && nextNode->
childCount() > 0) {
1185 if (nextNode && nextNode->
parent()) {
1198 if (!activeNode)
return;
1202 if (!siblingsOnly) {
1220 if (nextNode && nextNode->
parent()) {
1239 Qt::Orientation orientation,
1243 mirrorNodes(nodes, actionName, orientation, selection);
1248 Qt::Orientation orientation,
1259 emitSignals, actionName);
1281 const QString &defaultName,
1288 dialog.setCaption(i18n(
"Export \"%1\"", defaultName));
1289 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1291 QString filename = dialog.filename();
1293 if (filename.isEmpty())
return;
1305 doc->setCurrentImage(dst);
1312 if (!doc->exportDocumentSync(filename, mimefilter.toLatin1())) {
1313 QMessageBox::warning(qApp->activeWindow(),
1314 i18nc(
"@title:window",
"Krita"),
1315 i18n(
"Could not save the layer. %1", doc->errorMessage().toUtf8().data()),
1326 warnKrita <<
"BUG: Save Node As Image was called without any node selected";
1333 m_d->
view->
showFloatingMessage(i18nc(
"warning message when trying to export a transform mask",
"Layer has no pixel data"), QIcon());
1357 dialog.setCaption(i18nc(
"@title:window",
"Export to SVG"));
1358 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1359 dialog.setMimeTypeFilters(
QStringList() <<
"image/svg+xml",
"image/svg+xml");
1360 QString filename = dialog.filename();
1362 if (filename.isEmpty())
return;
1364 QUrl url = QUrl::fromLocalFile(filename);
1366 if (url.isEmpty())
return;
1376 if (!writer.
save(filename, sizeInPt,
true)) {
1377 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"), i18n(
"Could not save to svg: %1", filename));
1401 QMessageBox::information(view->mainWindowAsQWidget(),
1402 i18nc(
"@title:window",
"Layer %1 is not editable", parentNode->
name()),
1403 i18n(
"Cannot write alpha channel of "
1404 "the parent layer \"%1\".\n"
1405 "The operation will be cancelled.", parentNode->
name()));
1410 if (writeToLayers) {
1416 copyDevice = parentNode->
original();
1426 const QRect processRect =
1431 QScopedPointer<KisTransaction> transaction;
1433 if (writeToLayers) {
1434 commandsAdapter.beginMacro(
kundo2_i18n(
"Write Alpha into a Layer"));
1442 quint8 *alpha8Ptr = srcIt.
rawData();
1443 quint8 *dstPtr = dstIt.
rawData();
1448 if (writeToLayers) {
1449 commandsAdapter.addExtraCommand(transaction->endAndTake());
1450 commandsAdapter.removeNode(node);
1451 commandsAdapter.endMacro();
1454 QRect saveRect = image->
bounds();
1456 saveDeviceAsImage(dstDevice, parentNode->
name(),
1478 if (nodes.isEmpty() || !active)
return;
1482 for (
auto &node : nodes) {
1491 if (nodes.isEmpty() || !active)
return;
1493 bool isVisible = active->
visible();
1495 for (
auto &node : nodes) {
1504 if (nodes.isEmpty() || !active)
return;
1506 auto layer = qobject_cast<KisPaintLayer*>(active.
data());
1511 bool isAlphaLocked = layer->alphaLocked();
1512 for (
auto &node : nodes) {
1513 auto layer = qobject_cast<KisPaintLayer*>(node.data());
1524 if (nodes.isEmpty() || !active)
return;
1526 auto layer = qobject_cast<KisLayer*>(active.
data());
1531 bool isAlphaDisabled = layer->alphaChannelDisabled();
1532 for (
auto &node : nodes) {
1533 auto layer = qobject_cast<KisLayer*>(node.data());
1560 if (nodes.isEmpty())
return;
1562 KisNodeList::Iterator it = nodes.begin();
1563 while (it != nodes.end()) {
1565 if (!it->data()->parent()) {
1594 Q_ASSERT(shapeController);
1597 Q_ASSERT(dummiesFacade);
1599 const bool copyNode =
false;
1617 const QString &overrideGroupName,
1622 if (!active)
return false;
1627 QString groupName = !overrideGroupName.isEmpty() ? overrideGroupName : image->
nextLayerName(i18nc(
"A group of layers",
"Group"));
1637 if (nodes2.size() == 0)
return false;
1640 active = nodes2.first();
1646 juggler->
addNode(nodes1, parent, aboveThis);
1647 juggler->
moveNode(nodes2, group, 0);
1650 *newLastChild = nodes2.last();
1686 if (!active)
return;
1694 auto incompatibleNode =
1695 std::find_if(nodes.begin(), nodes.end(),
1697 return !newParent->allowAsChild(node);
1700 if (incompatibleNode != nodes.end()) {
1701 const QString message =
1702 newParent->parent() ?
1703 i18n(
"Cannot move layer \"%1\" into new parent \"%2\"",
1704 (*incompatibleNode)->name(),
1705 newParent->name()) :
1706 i18n(
"Cannot move layer \"%1\" into the root layer",
1707 (*incompatibleNode)->name());
1719 if (checkCanMoveLayers(nodes, parent)) {
1721 juggler->
moveNode(nodes, parent, active);
1724 }
else if (parent && parent->parent()) {
1725 KisNodeSP grandParent = parent->parent();
1732 if (checkCanMoveLayers(allSelectedNodes, parent)) {
1734 juggler->
moveNode(allSelectedNodes, grandParent, parent);
1753 if (!nodes.isEmpty()) {
1810 if (!sender()->property(
"node").isNull()) {
1811 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)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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 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