setActiveNode does not change active node

If you realy like to edit current node and selected nodes following script can be used. Have fun.

from krita import Krita

from PyQt5.QtCore import Qt, QModelIndex, QItemSelectionModel
from PyQt5.QtWidgets import QTreeView


def get_layer_model():
    app = Krita.instance()
    kis_layer_box = next((d for d in app.dockers() if d.objectName() == 'KisLayerBox'), None)
    view = kis_layer_box.findChild(QTreeView, 'listLayers')
    return view.model(), view.selectionModel()


def node_to_index(node, model):
    path = list()
    while node and (node.index() >= 0):
        path.insert(0, node.index())
        node = node.parentNode()

    index = QModelIndex()    
    for i in path:
        last_row = model.rowCount(index) - 1
        index = model.index(last_row - i, 0, index)
    return index


def index_to_node(index, document):
    if not index.isValid():
        raise RuntimeError('Invalid index')
    model = index.model()
    path = list()
    while index.isValid():
        last_row = model.rowCount(index.parent()) - 1
        path.insert(0, last_row - index.row())
        index = index.parent()
        
    node = None
    children = document.topLevelNodes()
    for i in path:
        node = children[i]
        children = node.childNodes()
    return node

# testing:
# following script will change target_node to be current node,
# also selection is kept and extended to current node.
#
# before running: 
# create new document, and add some nodes and node groups
# add one node named target_node

app = Krita.instance()
doc = app.activeDocument()

target_node = doc.nodeByName('target_node')
model, s_model = get_layer_model()
index = node_to_index(target_node, model)

s_model.setCurrentIndex(index, QItemSelectionModel.Select)  # or QItemSelectionModel.SelectCurrent

/AkiR

2 Likes