diff --git a/plugins/dockers/layerdocker/NodeDelegate.cpp b/plugins/dockers/layerdocker/NodeDelegate.cpp --- a/plugins/dockers/layerdocker/NodeDelegate.cpp +++ b/plugins/dockers/layerdocker/NodeDelegate.cpp @@ -60,12 +60,17 @@ QColor checkersColor1; QColor checkersColor2; + QHash m_visible; + bool m_recoverVisible = {false}; + QList rightmostProperties(const KisBaseNode::PropertyList &props) const; int numProperties(const QModelIndex &index) const; OptionalProperty findProperty(KisBaseNode::PropertyList &props, const OptionalProperty &refProp) const; OptionalProperty findVisibilityProperty(KisBaseNode::PropertyList &props) const; void toggleProperty(KisBaseNode::PropertyList &props, OptionalProperty prop, bool controlPressed, const QModelIndex &index); + void recordVisibilityStateRecursive(const QModelIndex &root, OptionalProperty clickedProperty, QModelIndex index); + void recoverVisibilityStateRecursive(const QModelIndex &root, OptionalProperty clickedProperty, QModelIndex index); }; NodeDelegate::NodeDelegate(NodeView *view, QObject *parent) @@ -780,7 +785,18 @@ KisBaseNode::PropertyList props = index.data(KisNodeModel::PropertiesRole).value(); OptionalProperty clickedProperty = d->findVisibilityProperty(props); if (!clickedProperty) return false; - d->toggleProperty(props, clickedProperty, mouseEvent->modifiers() == Qt::ControlModifier, index); + + if(mouseEvent->modifiers() == Qt::ShiftModifier) { + if(d->m_recoverVisible) { + d->recoverVisibilityStateRecursive(d->view->rootIndex(), clickedProperty, index); + d->m_recoverVisible = false; + } else { + d->recordVisibilityStateRecursive(d->view->rootIndex(), clickedProperty, index); + d->m_recoverVisible = true; + } + } else { + d->toggleProperty(props, clickedProperty, mouseEvent->modifiers() == Qt::ControlModifier, index); + } return true; } else if (leftButton && decorationClicked) { bool isExpandable = model->hasChildren(index); @@ -1013,3 +1029,48 @@ { KisLayerPropertiesIcons::instance()->updateIcons(); } + +void NodeDelegate::Private::recordVisibilityStateRecursive(const QModelIndex &root, OptionalProperty clickedProperty, QModelIndex index) +{ + int rowCount = view->model()->rowCount(root); + QModelIndex parent = index.parent(); + + for (int i = 0; i < rowCount; i++) { + QModelIndex idx = view->model()->index(i, 0, root); + if(idx != parent){ + KisBaseNode::PropertyList props = idx.data(KisNodeModel::PropertiesRole).value(); + OptionalProperty prop = findVisibilityProperty(props); + m_visible.insert(idx,prop->state); + + // The entire property list has to be altered because model->setData cannot set individual properties + prop = findProperty(props, clickedProperty); + if (!prop) continue; + prop->state = (idx == index)? QVariant(true) : QVariant(false); // always show clicked index + view->model()->setData(idx, QVariant::fromValue(props), KisNodeModel::PropertiesRole); + } + + recordVisibilityStateRecursive(idx,clickedProperty, index); + } +} + +void NodeDelegate::Private::recoverVisibilityStateRecursive(const QModelIndex &root, OptionalProperty clickedProperty, QModelIndex index) +{ + int rowCount = view->model()->rowCount(root); + QModelIndex parent = index.parent(); + + for (int i = 0; i < rowCount; i++) { + QModelIndex idx = view->model()->index(i, 0, root); + if(idx != parent){ + KisBaseNode::PropertyList props = idx.data(KisNodeModel::PropertiesRole).value(); + OptionalProperty prop = findVisibilityProperty(props); + // get state from hash + + // The entire property list has to be altered because model->setData cannot set individual properties + prop = findProperty(props, clickedProperty); + if (!prop) continue; + prop->state = m_visible.take(idx); + view->model()->setData(idx, QVariant::fromValue(props), KisNodeModel::PropertiesRole); + } + recoverVisibilityStateRecursive(idx,clickedProperty, index); + } +}