CmdForge/scripts/patch_nodegraphqt.py

104 lines
3.0 KiB
Python

#!/usr/bin/env python3
"""Patch NodeGraphQt for PySide6 6.7+ compatibility.
The setSelectionArea() API changed in PySide6 6.7 to require an
ItemSelectionOperation parameter. This script patches the installed
NodeGraphQt package to work with newer PySide6 versions.
Issue: setSelectionArea(path, mode) -> setSelectionArea(path, operation, mode)
Usage:
python scripts/patch_nodegraphqt.py
This can be run after `pip install NodeGraphQt-QuiltiX-fork[pyside6]`
"""
import sys
import site
from pathlib import Path
def find_viewer_file():
"""Find the NodeGraphQt viewer.py file in site-packages."""
# Check common locations
for site_dir in site.getsitepackages() + [site.getusersitepackages()]:
viewer_path = Path(site_dir) / "NodeGraphQt" / "widgets" / "viewer.py"
if viewer_path.exists():
return viewer_path
# Check virtual environment
venv_path = Path(sys.prefix) / "lib"
for python_dir in venv_path.glob("python*"):
viewer_path = python_dir / "site-packages" / "NodeGraphQt" / "widgets" / "viewer.py"
if viewer_path.exists():
return viewer_path
return None
def patch_file(viewer_path: Path) -> bool:
"""Apply the PySide6 compatibility patch."""
content = viewer_path.read_text()
# Check if already patched
if "Qt.ReplaceSelection" in content:
print(f"Already patched: {viewer_path}")
return True
# The old code pattern
old_code = """self.scene().setSelectionArea(
path, QtCore.Qt.IntersectsItemShape
)"""
# The new code with ItemSelectionOperation
new_code = """self.scene().setSelectionArea(
path, QtCore.Qt.ReplaceSelection,
QtCore.Qt.IntersectsItemShape
)"""
if old_code not in content:
print(f"Warning: Could not find code to patch in {viewer_path}")
print("The file may have a different format or already be modified.")
return False
# Apply patch
patched_content = content.replace(old_code, new_code)
# Backup original
backup_path = viewer_path.with_suffix(".py.bak")
if not backup_path.exists():
viewer_path.rename(backup_path)
print(f"Backup created: {backup_path}")
# Write patched file
viewer_path.write_text(patched_content)
print(f"Patched successfully: {viewer_path}")
return True
def main():
print("NodeGraphQt PySide6 Compatibility Patch")
print("=" * 40)
viewer_path = find_viewer_file()
if not viewer_path:
print("Error: Could not find NodeGraphQt installation.")
print("Make sure NodeGraphQt-QuiltiX-fork is installed:")
print(" pip install 'NodeGraphQt-QuiltiX-fork[pyside6]'")
return 1
print(f"Found: {viewer_path}")
if patch_file(viewer_path):
print("\nPatch applied successfully!")
print("The rubber band selection should now work in PySide6 6.7+")
return 0
else:
print("\nPatch failed.")
return 1
if __name__ == "__main__":
sys.exit(main())