https://bugs.kde.org/show_bug.cgi?id=475819
Bug ID: 475819 Summary: Node.setVisible() doesn't refresh like manually clicking the eyeball icon on each layer does Classification: Applications Product: krita Version: 5.2.0 Platform: Manjaro OS: Linux Status: REPORTED Severity: normal Priority: NOR Component: Scripting Assignee: krita-bugs-n...@kde.org Reporter: chirn...@hotmail.com Target Milestone: --- Created attachment 162416 --> https://bugs.kde.org/attachment.cgi?id=162416&action=edit A .kra file with 3 groups of layers. Run the above script on it in Scripter. SUMMARY My plugin has a function where it loops through the layer stack and sets setCollapsed(True) and setVisible(False) on everything, and then uses several buttons to focus a particular group with setCollapsed(False) and setVisible(True). This works pretty well in and of itself, but I've run into an issue where using setVisible() in Python doesn't redraw the canvas when switching layer groups, which means it hangs onto old data. Now, you may be saying "use Document.refreshProjection()," which is what I was doing before. However, this works OK on a 1024x1024 document, is fairly annoying at 2K, and is brain meltingly slow at 4K and above (as in, from "several" to "dozens" of minutes to rebuild depending on resolution and content), so I've stopped using it unless absolutely necessary. Here's what actually does work to force a quick redraw: manually toggling the eye icon on the group off and on, and strangely, adding a deactivated clone layer with no source specified to the bottom of the group. The second of these is what I'm currently doing as I can add the clone layer programmatically and it does redraw the canvas fast enough to be useful, but it's an ugly, ugly hack and adding extra layers eats into the video ram usage. If Node.setVisible() worked like manually clicking on the eye icon, I could potentially switch the group off and on again to redraw the canvas at a reasonable speed. STEPS TO REPRODUCE 1. Open attached .kra file and run below script multiple times. 2. It should toggle through the groups. 3. Going from group G1 to G2 likely won't redraw the canvas properly, and then going from group G2 to G3 will redraw successfully every time because I added a deactivated clone layer there to illustrate the point. 4. Going from G3 back to G1 (group with a clone layer back to a group without one) may or may not work every time. 5. Clicking manually on the eye icon of groups G1 and G2 will also redraw the canvas, but just running the script a few times on the same groups will not do so. Test code: from krita import Krita doc = Krita.instance().activeDocument() root = doc.rootNode() children = root.childNodes() def collapseAndDeactivate(): for child in children: child.setVisible(False) child.setCollapsed(True) def toggleNode(): collapseAndDeactivate() newActive = doc.activeNode() if newActive.name() == "G1": newActive = doc.nodeByName("G2") elif newActive.name() == "G2": newActive = doc.nodeByName("G3") elif newActive.name() == "G3": newActive = doc.nodeByName("G1") else: newActive = doc.nodeByName("G1") newActive.setVisible(True) newActive.setCollapsed(False) doc.setActiveNode(newActive) collapseAndDeactivate() toggleNode() OBSERVED RESULT There's clearly some extra magic going on in the clone layer and visibility button code that I'm not able to access through Python (I tried looking at the C++ source and also got deep into Qt but I'm not seeing anything super relevant, or it seems relevant but doesn't actually work). I don't want to refresh the entire document's projection, I just need whatever's currently visible. EXPECTED RESULT Either Node.setVisible() forces the same canvas refresh that manually clicking the eye icon does or there's a dedicated function that redraws just whatever is currently visible without doing a full Document.refreshProjection(), which isn't really usable past 1-2K. -- You are receiving this mail because: You are watching all bug changes.