104 lines
3.0 KiB
Python
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())
|