18#include <klocalizedstring.h>
86 : QAbstractItemModel(parent)
102 Q_ASSERT(
index.isValid());
106 return dummy->
node();
116 return QModelIndex();
122 if (!isolatedRoot)
return true;
130 if (dummy == isolatedRootDummy) {
178 if (!rootDummy)
return;
232 if (!
index.isValid())
return;
251 qWarning() <<
"Dummy node has no node!" << dummy << dummy->
node();
260 progressProxy->disconnect(
this);
303 if (oldDummiesFacade &&
m_d->
image) {
305 oldDummiesFacade->disconnect(
this);
355 QModelIndex parentIndex;
363 beginInsertRows(parentIndex, row, row);
389 QModelIndex parentIndex;
396 if (itemIndex.isValid()) {
399 beginRemoveRows(parentIndex, itemIndex.row(), itemIndex.row());
424 if (!idx.isValid() || indexes->contains(idx))
return;
426 indexes->insert(idx);
428 const int rowCount = idx.model()->rowCount(idx);
429 for (
int i = 0; i < rowCount; i++) {
437 QSet<QModelIndex> indexes;
444 Q_FOREACH (
const QModelIndex &
index, indexes) {
455 QModelIndex itemIndex;
462 if (itemIndex.isValid() && itemIndex.column() != col) {
463 itemIndex = createIndex(itemIndex.row(), col, itemIndex.internalPointer());
472 if (
parent.column() > 0) {
480 if (
parent.column() > 0) {
493 QModelIndex parentIndex;
505 if (row == idx.row()) {
506 if (column == idx.column()) {
510 return createIndex(row, column, idx.internalPointer());
522 case Qt::DisplayRole:
return node->
name();
523 case Qt::DecorationRole:
return node->
icon();
524 case Qt::EditRole:
return node->
name();
526 case Qt::ForegroundRole:
528 !node->
projectionLeaf()->isDroppedNode() ? QVariant() : QVariant(QColor(Qt::gray));
532 baseFont.setStrikeOut(
true);
535 baseFont.setBold(
true);
559 result = i18nc(
"@info:tooltip",
"Disabled: masks on pass-through groups are not supported!");
561 result = i18nc(
"@info:tooltip",
"Disabled: cloning pass-through groups is not supported!");
572 if (node->inherits(
"KisFilterMask") ||
573 node->inherits(
"KisTransparencyMask") ||
574 node->inherits(
"KisTransformMask") ||
575 node->inherits(
"KisSelectionMask")) {
579 const int opacity = round(node->
opacity() * 100.0 / 255);
580 const QString opacityString = QString::number(opacity);
582 QString compositeOpDesc =
"null";
585 compositeOpDesc = node->
compositeOp()->description();
588 if (node->inherits(
"KisAdjustmentLayer")) {
591 else if (node->inherits(
"KisColorizeMask")) {
594 QString infoText =
"";
596 !(opacity == 100 && compositeOpId == defaultOpId)) {
598 if (opacity == 100) {
599 return QString(compositeOpDesc);
601 if (compositeOpId == defaultOpId) {
602 return i18nc(
"%1 is the percent value, % is the percent sign",
"%1%", opacityString);
605 infoText = i18nc(
"%1 is the percent value, % is the percent sign",
"%1% %2", opacityString, compositeOpDesc);
610 if (node->inherits(
"KisFilterMask")) {
613 if (mask->filter()->hasProperty(
"color")) {
614 return mask->filter()->getColor(
"color").toQColor();
620 if (node->inherits(
"KisLayer")) {
623 if (mask && mask->filter()->hasProperty(
"color")) {
624 return mask->filter()->getColor(
"color").toQColor();
664 Qt::ItemFlags
flags = Qt::ItemIsEnabled | Qt::ItemIsEditable;
666 if (
index.column() == 0) {
667 flags |= Qt::ItemIsDragEnabled | Qt::ItemIsSelectable;
669 flags |= Qt::ItemIsDropEnabled;
680 const QMimeData *
mimeData =
static_cast<const QMimeData*
>(
value.value<
void*>());
686 QModelIndex parentIndex;
697 else if (parentIndex.isValid() &&
value.toBool()) {
704 QModelIndex newActiveNode = activatedNode ?
indexFromNode(activatedNode) : QModelIndex();
728 bool shouldUpdate =
true;
729 bool shouldUpdateRecursively =
false;
733 case Qt::DisplayRole:
742 shouldUpdateRecursively =
true;
751 shouldUpdate =
false;
763 if (result && shouldUpdate) {
764 if (shouldUpdateRecursively) {
765 QSet<QModelIndex> indexes;
767 Q_FOREACH (
const QModelIndex &idx, indexes) {
768 Q_EMIT dataChanged(idx.siblingAtColumn(0), idx.siblingAtColumn(
m_d->
dummyColumns));
780 return Qt::CopyAction | Qt::MoveAction;
785 return Qt::MoveAction | Qt::CopyAction;
796 types << QLatin1String(
"application/x-krita-node-internal-pointer");
797 types << QLatin1String(
"application/x-qt-image");
798 types << QLatin1String(
"application/x-color");
799 types << QLatin1String(
"krita/x-colorsetentry");
805 bool hasLockedLayer =
false;
807 Q_FOREACH (
const QModelIndex &idx, indexes) {
810 if (idx.column() != 0) {
827 bool copyNode = (action == Qt::CopyAction);
832 parentDummy =
parent.isValid() ?
858 return QAbstractItemModel::canDropMimeData(
data, action, row, column,
parent);
871 bool copyNode =
false;
883 bool dropEnabled =
true;
884 Q_FOREACH (
const KisNodeSP &node, nodes) {
885 if (!
target->allowAsChild(node) || !
target->isEditable(
false)) {
893 Q_EMIT dataChanged(idx, idx);
895 if (hasChildren(idx)) {
float value(const T *src, size_t ch)
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
const QString COMPOSITE_OVER
const QString COMPOSITE_COPY
const QString COMPOSITE_BEHIND
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
LayerInfoTextStyle layerInfoTextStyle(bool defaultValue=false) const
virtual KisNodeDummy * dummyForNode(KisNodeSP node) const =0
KisNodeSP isolationRootNode() const
void setImage(KisImageSP image)
QImage thumbnail(KisNodeSP node) const
void notifyNodeAdded(KisNodeSP node)
void setIdleTaskManager(KisIdleTasksManager *manager)
void setMaxSize(int maxSize)
void notifyNodeRemoved(KisNodeSP node)
static QMimeData * mimeForLayers(const KisNodeList &nodes, KisImageSP image, bool forceCopy=false)
static KisNodeList loadNodesFast(const QMimeData *data, KisImageSP image, KisShapeController *shapeController, bool ©Node)
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)
virtual int rowCount(QModelIndex parent)=0
virtual KisNodeDummy * dummyFromRow(int row, QModelIndex parent)=0
virtual QModelIndex indexFromDummy(KisNodeDummy *dummy)=0
virtual KisNodeDummy * dummyFromIndex(QModelIndex index)=0
virtual bool indexFromAddedDummy(KisNodeDummy *parentDummy, int index, const QString &newNodeMetaObjectType, QModelIndex &parentIndex, int &row)=0
void setShowGlobalSelectionMask(bool value)
bool showGlobalSelectionMask() const
KisNodeDummy * firstChild() const
KisNodeDummy * lastChild() const
KisNodeDummy * parent() const
KisNodeDummy * nextSibling() const
KisNodeDisplayModeAdapter * nodeDisplayModeAdapter() const
KisNodeInsertionAdapter * nodeInsertionAdapter() const
void colorOverlayMaskProperties(KisNodeSP node)
void nodePropertiesIgnoreSelection(KisNodeSP node)
void setNodeName(KisNodeSP node, const QString &name)
KisNodeSelectionAdapter * nodeSelectionAdapter() const
bool trySetNodeProperties(KisNodeSP node, KisImageSP image, KisBaseNode::PropertyList properties) const
void slotBeginInsertDummy(KisNodeDummy *parent, int index, const QString &metaObjectType)
QStringList mimeTypes() const override
void regenerateItems(KisNodeDummy *dummy)
static bool belongsToIsolatedGroup(KisImageSP image, KisNodeSP node, KisDummiesFacadeBase *dummiesFacade)
Qt::DropActions supportedDropActions() const override
@ FilterMaskPropertiesRole
@ LayerColorOverlayColorRole
@ LayerColorOverlayPropertiesRole
@ ProgressRole
Use to communicate a progress report to the section delegate on an action (a value of -1 or a QVarian...
@ PropertiesRole
A list of properties the part has.
@ AspectRatioRole
The aspect ratio of the section as a floating point value: width divided by height.
@ ActiveRole
Whether the section is the active one.
virtual KisModelIndexConverterBase * createIndexConverter()
void slotBeginRemoveDummy(KisNodeDummy *dummy)
void setShowGlobalSelection(bool value)
friend class KisModelIndexConverter
void setIdleTaskManager(KisIdleTasksManager *idleTasksManager)
void slotDummyChanged(KisNodeDummy *dummy)
KisNodeSP nodeFromIndex(const QModelIndex &index) const
void slotEndInsertDummy(KisNodeDummy *dummy)
bool showGlobalSelection() const
bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override
KisDummiesFacadeBase * dummiesFacade() const
void toggleIsolateActiveNode()
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
void setPreferredThumnalSize(int preferredSize) const
void connectDummy(KisNodeDummy *dummy, bool needConnect)
KisModelIndexConverterBase * indexConverter() const
void slotNodeDisplayModeChanged(bool showRootNode, bool showGlobalSelectionMask)
void progressPercentageChanged(int, const KisNodeSP)
friend class KisModelIndexConverterShowAll
void updateDropEnabled(const QList< KisNodeSP > &nodes, QModelIndex parent=QModelIndex())
void connectDummies(KisNodeDummy *dummy, bool needConnect)
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
void setDummiesFacade(KisDummiesFacadeBase *dummiesFacade, KisImageWSP image, KisShapeController *shapeController, KisSelectionActionsAdapter *selectionActionsAdapter, KisNodeManager *nodeManager)
void resetIndexConverter()
QModelIndex indexFromNode(KisNodeSP node) const
void setDropEnabled(const QMimeData *data)
QModelIndex parent(const QModelIndex &index) const override
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
int columnCount(const QModelIndex &parent=QModelIndex()) const override
void sigBeforeBeginRemoveRows(const QModelIndex &parent, int start, int end)
KisNodeModel(QObject *parent, int clonedColumns=0)
Qt::ItemFlags flags(const QModelIndex &index) const override
QMimeData * mimeData(const QModelIndexList &indexes) const override
void slotLayerThumbnailUpdated(KisNodeSP node)
Qt::DropActions supportedDragActions() const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
void processUpdateQueue()
void slotIsolatedModeChanged()
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
void slotEndRemoveDummy()
QModelIndex sibling(int row, int column, const QModelIndex &idx) const override
void setActiveNode(KisNodeSP node)
void selectOpaqueOnNode(KisNodeSP node, SelectionAction action)
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
void addChangedIndex(const QModelIndex &idx, QSet< QModelIndex > *indexes)
const QString & compositeOpId() const
bool isEditable(bool checkVisibility=true) const
virtual QImage createThumbnail(qint32 w, qint32 h, Qt::AspectRatioMode aspectRatioMode=Qt::IgnoreAspectRatio)
int colorLabelIndex() const
virtual PropertyList sectionModelProperties() const
virtual bool visible(bool recursive=false) const
virtual QIcon icon() const
KisFilterMaskSP colorOverlayMask() const
KisSignalCompressor updateCompressor
QPersistentModelIndex activeNodeIndex
KisShapeController * shapeController
KisNodeDisplayModeAdapter * nodeDisplayModeAdapter
KisNodeManager * nodeManager
KisSignalAutoConnectionsStore nodeDisplayModeAdapterConnections
QSet< quintptr > dropEnabled
QPointer< KisNodeDummy > parentOfRemovedNode
KisNodeInsertionAdapter * nodeInsertionAdapter
QPointer< KisDummiesFacadeBase > dummiesFacade
KisNodeSelectionAdapter * nodeSelectionAdapter
bool needFinishInsertRows
KisLayerThumbnailCache thumbnalCache
QList< KisNodeDummy * > updateQueue
KisSelectionActionsAdapter * selectionActionsAdapter
KisModelIndexConverterBase * indexConverter
bool needFinishRemoveRows
KisProjectionLeafSP projectionLeaf
KisNodeProgressProxy * nodeProgressProxy
KisNodeGraphListener * graphListener