Skip to content

Commit 1ea6bbf

Browse files
committed
Restructure the project. Fix int too large bug. Fix restore last view when jumping into and out of groups. Fix Entering livegroups from outliner.
1 parent 38a17df commit 1ea6bbf

File tree

130 files changed

+103
-58
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

130 files changed

+103
-58
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
__import__("pkg_resources").declare_namespace(__name__)
14+
__version__ = "0.3.0"
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ def fullName(self) -> str:
167167
return ".".join(path)
168168

169169
def _addChild(self, child: Node) -> None:
170-
"""Add child to node. This should only be called from the parser.
170+
"""Add child to node. This should only be called from the nk_parser.
171171
172172
Args:
173173
child: Child node to add.
@@ -207,7 +207,7 @@ def isGizmo(self) -> bool:
207207
return self._class == "gizmo" or self._is_gizmo
208208

209209
def setInput(self, i: int, node: Node) -> None:
210-
"""Add input to node. This should only be called from the parser.
210+
"""Add input to node. This should only be called from the nk_parser.
211211
212212
Args:
213213
i: Input index.
@@ -386,7 +386,7 @@ def _parseNk(file_path: str, gizmos: Optional[dict] = None) -> Node:
386386
387387
Args:
388388
file_path: File path to nuke script.
389-
gizmos: Dict of parser gizmos {gizmo name: Gizmo class}.
389+
gizmos: Dict of nk_parser gizmos {gizmo name: Gizmo class}.
390390
391391
Returns:
392392
Root node of nuke scene description.
@@ -523,7 +523,7 @@ def _parseLiveGroup(live_group: Node, gizmos: Dict[str, Node]) -> None:
523523
524524
Args:
525525
live_group: Live group node to update with parsed nuke file.
526-
gizmos: Dict of parser gizmos {gizmo name: Gizmo class}.
526+
gizmos: Dict of nk_parser gizmos {gizmo name: Gizmo class}.
527527
528528
"""
529529
if not live_group.knob("file"):

parser/setup.py renamed to nk_parser/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,5 @@
3939
"Programming Language :: Python :: 3.12",
4040
"Topic :: Text Processing",
4141
],
42-
description="Nuke script (nk) parser.",
42+
description="Nuke script (nk) nk_parser.",
4343
)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
__version__ = "0.2.0"
15+
__version__ = "0.3.0"
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
import platform
1919
import sys
2020

21-
import nuke_parser.nkview
22-
from nuke_parser.nkview import utils
23-
from nuke_parser.nkview.constants import QT_STYLE
24-
from nuke_parser.nkview.graph_view import NukeNodeGraphWidget
25-
from nuke_parser.nkview.outliner import OutlinerWidget
26-
from nuke_parser.nkview.qt import QtCore, QtGui, QtWebEngineWidgets, QtWidgets
21+
import nkview
22+
from nkview import utils
23+
from nkview.constants import QT_STYLE
24+
from nkview.graph_view import NukeNodeGraphWidget
25+
from nkview.outliner import OutlinerWidget
26+
from nkview.qt import QtCore, QtGui, QtWebEngineWidgets, QtWidgets
2727
from nuke_parser.parser import _parseGizmos
2828

2929

@@ -153,7 +153,7 @@ def run() -> None:
153153
args = _setupCli()
154154
if platform.system() == "Windows":
155155
# Fix app icon on taskbar on Windows.
156-
app_id = f"nuke_parser.nkview.{nuke_parser.nkview.__version__}"
156+
app_id = f"nkview.{nkview.__version__}"
157157
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(app_id)
158158

159159
app = QtWidgets.QApplication(sys.argv)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
from nuke_parser.nkview.icons import qresource
15-
from nuke_parser.nkview.qt import QtGui
14+
from nkview.icons import qresource
15+
from nkview.qt import QtGui
1616

1717
qresource.qInitResources()
1818

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,22 @@
1313
# limitations under the License.
1414
from __future__ import annotations
1515

16+
import platform
1617
import sys
1718
from typing import List, Optional, Union, Tuple
1819

19-
from nuke_parser.nkview.gui_nodes import GroupNode, GuiNode
20-
from nuke_parser.nkview.navbar import NavigationBar
21-
from nuke_parser.nkview.qt import QtCore, QtGui, QtWidgets
22-
from nuke_parser.nkview.utils import qt_cursor
20+
from nkview.gui_nodes import GroupNode, GuiNode
21+
from nkview.navbar import NavigationBar
22+
from nkview.qt import QtCore, QtGui, QtWidgets
23+
from nkview.utils import qt_cursor
2324
from nuke_parser.parser import parseNk, Node
2425

2526
INT_MAX = sys.maxsize // 2
2627
INT_MIN = ~sys.maxsize // 2
28+
if platform.system() == "Windows":
29+
# https://github.com/maxWiklund/nuke_parser/issues/1
30+
INT_MAX = (2**31) - 1 # Maximum value for a signed 32-bit integer
31+
INT_MIN = -(2**31) # Minimum value for a signed 32-bit integer
2732

2833

2934
class _PrivateApi:
@@ -45,6 +50,9 @@ def selectedItems(self) -> List[QtWidgets.QGraphicsItem]:
4550
def guiNodeFromPath(self, path: str) -> Optional[GuiNode]:
4651
return self._node_view._scene_map.get(path)
4752

53+
def clearSelection(self) -> None:
54+
self._node_view.scene().clearSelection()
55+
4856

4957
class _NkGraphView(QtWidgets.QGraphicsView):
5058
"""Private node graph view to to visualize nuke script."""
@@ -165,6 +173,7 @@ def mouseDoubleClickEvent(self, event: QtGui.QMouseEvent) -> None:
165173
if not gui_node or not isinstance(gui_node, GroupNode):
166174
super().mouseDoubleClickEvent(event)
167175
return
176+
168177
self.stepIntoNode(gui_node)
169178

170179
def stepIntoNode(self, gui_node: GroupNode) -> None:
@@ -176,9 +185,18 @@ def stepIntoNode(self, gui_node: GroupNode) -> None:
176185
"""
177186
nk_node = gui_node.nk_node
178187
if nk_node.children() or nk_node.Class() in ("Group", "Root"):
188+
# Store last viewport position to use when exiting the group.
189+
viewport_rect = self.mapToScene(self.viewport().geometry()).boundingRect()
190+
self.scene().groupNode().setViewportRect(viewport_rect)
191+
179192
self.scene().clearSelection()
180193
self.setScene(gui_node.getScene())
181-
self.frameSelected()
194+
195+
rect = gui_node.viewportRect()
196+
if rect:
197+
self.fitInView(rect, QtCore.Qt.KeepAspectRatio)
198+
else:
199+
self.frameSelected()
182200
self.sceneChanged.emit(gui_node)
183201

184202
def frameSelected(self) -> None:
@@ -338,7 +356,7 @@ def privateApi(self) -> _PrivateApi:
338356
return self._private_api
339357

340358
def selectedNodes(self) -> Tuple[Node, ...]:
341-
"""Get selected nodes as parser nodes."""
359+
"""Get selected nodes as nk_parser nodes."""
342360
return tuple(
343361
[
344362
node.nk_node
@@ -347,9 +365,6 @@ def selectedNodes(self) -> Tuple[Node, ...]:
347365
]
348366
)
349367

350-
def clearSelection(self) -> None:
351-
self._view.scene().clearSelection()
352-
353368
def _sceneLoadedCallback(self, root_node: GroupNode) -> None:
354369
"""Scene loaded callback to deal with nav_bar.
355370
@@ -367,9 +382,20 @@ def _changeSceneCallback(self, node: GroupNode) -> None:
367382
node: Node to view children of.
368383
369384
"""
385+
# Store the current viewport position if the user wants to set into the group again.
386+
viewport_rect = self._view.mapToScene(
387+
self._view.viewport().geometry()
388+
).boundingRect()
389+
self._view.scene().groupNode().setViewportRect(viewport_rect)
390+
370391
self._view.setScene(node.getScene())
371392
self._view.scene().clearSelection()
372-
self._view.frameSelected()
393+
394+
rect = node.viewportRect()
395+
if rect:
396+
self._view.fitInView(rect, QtCore.Qt.KeepAspectRatio)
397+
else:
398+
self.frameSelected()
373399

374400
def _selectionChangedCallback(self) -> None:
375401
"""Callback to emit selection change."""
@@ -418,7 +444,10 @@ def navigateToNode(self, path: str) -> None:
418444
if not gui_node:
419445
return
420446

421-
if not (gui_node.nk_node.isGizmo() or gui_node.nk_node.Class() == "Group"):
447+
if not (
448+
gui_node.nk_node.isGizmo()
449+
or gui_node.nk_node.Class() in ("Group", "LiveGroup")
450+
):
422451
return
423452
nodes = []
424453

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
import networkx as nx
2121

22-
from nuke_parser.nkview import constants
23-
from nuke_parser.nkview.qt import QtCore, QtGui, QtWidgets, PYSIDE6
22+
from nkview import constants
23+
from nkview.qt import QtCore, QtGui, QtWidgets, PYSIDE6
2424
from nuke_parser.parser import Node
2525
from nuke_parser.stack import Stack
2626

@@ -569,7 +569,24 @@ class GroupNode(DagNode):
569569
def __init__(self, nk_node: Node, scene_map: Dict[str, DagNode]):
570570
super(GroupNode, self).__init__(nk_node)
571571
scene_map[nk_node.path()] = self
572-
self._scene = NkScene(nk_node, scene_map)
572+
self._scene = NkScene(nk_node, scene_map, self)
573+
self._viewport_rect = None
574+
575+
def viewportRect(self) -> Union[QtCore.QRectF, None]:
576+
"""Returns the viewport rect from the node (The scene area that was last viewed to restore
577+
the view where the user left it).
578+
579+
"""
580+
return self._viewport_rect
581+
582+
def setViewportRect(self, rect: QtCore.QRect) -> None:
583+
"""Set the viewport rect on the node (the visible rectangle of the graphics-view).
584+
585+
Args:
586+
rect: Rect to store.
587+
588+
"""
589+
self._viewport_rect = rect
573590

574591
def getScene(self) -> QtWidgets.QGraphicsScene:
575592
"""Get scene from node."""
@@ -622,8 +639,9 @@ def niceInputName(index: int, Class: str) -> str:
622639
class NkScene(QtWidgets.QGraphicsScene):
623640
"""Scene that performs automatic layout on any node with missing position values."""
624641

625-
def __init__(self, root: Node, scene_map: Dict[str, DagNode]):
642+
def __init__(self, root: Node, scene_map: Dict[str, DagNode], parent: GroupNode):
626643
super().__init__()
644+
self._group_node = parent
627645
node_map = {}
628646
self._autoLayout(list(root.children()))
629647

@@ -663,6 +681,15 @@ def __init__(self, root: Node, scene_map: Dict[str, DagNode]):
663681
line.setPen(pen)
664682
self.addItem(line)
665683

684+
def groupNode(self) -> GroupNode:
685+
"""Get the group node (the parent node of all nodes in the graphics scene).
686+
687+
Returns:
688+
Parent node (GUI node) of all nodes in graphics scene.
689+
690+
"""
691+
return self._group_node
692+
666693
@staticmethod
667694
def _assingLevels(G: nx.DiGraph) -> Dict[int, List[Node]]:
668695
"""Assign levels to nodes in the graph based on their positions

0 commit comments

Comments
 (0)