diff --git a/src/apps/ocioview/README.md b/src/apps/ocioview/README.md index e62eb4516..a62465307 100644 --- a/src/apps/ocioview/README.md +++ b/src/apps/ocioview/README.md @@ -41,10 +41,10 @@ Dependencies * PyOpenColorIO * [OpenImageIO (Python bindings)](https://github.com/OpenImageIO/oiio) -* [Imath (Python bindings)](https://github.com/AcademySoftwareFoundation/Imath) * ``pip install -r requirements.txt`` * [numpy](https://pypi.org/project/numpy/) * [Pygments](https://pypi.org/project/Pygments/) * [PyOpenGL](https://pypi.org/project/PyOpenGL/) - * [PySide2](https://pypi.org/project/PySide2/) + * [PySide6](https://pypi.org/project/PySide6/) * [QtAwesome](https://pypi.org/project/QtAwesome/) + * [imageio](https://pypi.org/project/imageio/) diff --git a/src/apps/ocioview/main.py b/src/apps/ocioview/main.py index 85f657cab..609ef73d8 100644 --- a/src/apps/ocioview/main.py +++ b/src/apps/ocioview/main.py @@ -7,7 +7,7 @@ from pathlib import Path import PyOpenColorIO as ocio -from PySide2 import QtCore, QtWidgets, QtOpenGL +from PySide6 import QtCore, QtGui, QtWidgets, QtOpenGL import ocioview.log_handlers # Import to initialize logging from ocioview.main_window import OCIOView @@ -30,12 +30,11 @@ def excepthook(exc_type, exc_value, exc_tb): sys.excepthook = excepthook # OpenGL core profile needed on macOS to access programmatic pipeline - gl_format = QtOpenGL.QGLFormat() - gl_format.setProfile(QtOpenGL.QGLFormat.CoreProfile) - gl_format.setSampleBuffers(True) + gl_format = QtGui.QSurfaceFormat() + gl_format.setProfile(QtGui.QSurfaceFormat.CoreProfile) gl_format.setSwapInterval(1) gl_format.setVersion(4, 0) - QtOpenGL.QGLFormat.setDefaultFormat(gl_format) + QtGui.QSurfaceFormat.setDefaultFormat(gl_format) # Create app app = QtWidgets.QApplication(sys.argv) diff --git a/src/apps/ocioview/ocioview/config_dock.py b/src/apps/ocioview/ocioview/config_dock.py index a47774fc1..33660b112 100644 --- a/src/apps/ocioview/ocioview/config_dock.py +++ b/src/apps/ocioview/ocioview/config_dock.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from .items import ( ColorSpaceEdit, diff --git a/src/apps/ocioview/ocioview/constants.py b/src/apps/ocioview/ocioview/constants.py index a580e126f..18b7f0909 100644 --- a/src/apps/ocioview/ocioview/constants.py +++ b/src/apps/ocioview/ocioview/constants.py @@ -3,7 +3,7 @@ from pathlib import Path -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui # Root application directory diff --git a/src/apps/ocioview/ocioview/inspect/code_inspector.py b/src/apps/ocioview/ocioview/inspect/code_inspector.py index b812cbcb6..3fa1e81e3 100644 --- a/src/apps/ocioview/ocioview/inspect/code_inspector.py +++ b/src/apps/ocioview/ocioview/inspect/code_inspector.py @@ -6,7 +6,7 @@ import PyOpenColorIO as ocio from pygments.formatters import HtmlFormatter -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..message_router import MessageRouter from ..utils import get_glyph_icon, processor_to_shader_html @@ -40,9 +40,9 @@ def __init__(self, parent: Optional[QtCore.QObject] = None): html_css = HtmlFormatter(style="material").get_style_defs() # Update line number colors to match palette - html_css = html_css.replace("#263238", palette.color(palette.Base).name()) + html_css = html_css.replace("#263238", palette.color(palette.ColorRole.Base).name()) html_css = html_css.replace( - "#37474F", palette.color(palette.Text).darker(150).name() + "#37474F", palette.color(palette.ColorRole.Text).darker(150).name() ) # Widgets diff --git a/src/apps/ocioview/ocioview/inspect/curve_inspector.py b/src/apps/ocioview/ocioview/inspect/curve_inspector.py index 6e5a078d6..9a483a1cc 100644 --- a/src/apps/ocioview/ocioview/inspect/curve_inspector.py +++ b/src/apps/ocioview/ocioview/inspect/curve_inspector.py @@ -8,7 +8,7 @@ import numpy as np import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import R_COLOR, G_COLOR, B_COLOR, GRAY_COLOR from ..message_router import MessageRouter @@ -526,7 +526,7 @@ def drawForeground(self, painter: QtGui.QPainter, rect: QtCore.QRectF) -> None: if color_name == GRAY_COLOR.name(): palette = self.palette() - painter.setPen(palette.color(palette.Text)) + painter.setPen(palette.color(palette.ColorRole.Text)) else: painter.setPen(QtGui.QColor(color_name)) @@ -635,7 +635,7 @@ def _on_cpu_processor_ready(self, cpu_proc: ocio.CPUProcessor) -> None: r_samples, b_samples, atol=self.EPSILON ): palette = self.palette() - color_name = palette.color(palette.Text).name() + color_name = palette.color(palette.ColorRole.Text).name() self._samples[color_name] = np.stack((self._x_lin, r_samples), axis=-1) diff --git a/src/apps/ocioview/ocioview/inspect/log_inspector.py b/src/apps/ocioview/ocioview/inspect/log_inspector.py index ac026899e..b2cf9fa63 100644 --- a/src/apps/ocioview/ocioview/inspect/log_inspector.py +++ b/src/apps/ocioview/ocioview/inspect/log_inspector.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..log_handlers import set_logging_level from ..message_router import MessageRouter diff --git a/src/apps/ocioview/ocioview/inspect_dock.py b/src/apps/ocioview/ocioview/inspect_dock.py index b68b36cd1..39c352cb1 100644 --- a/src/apps/ocioview/ocioview/inspect_dock.py +++ b/src/apps/ocioview/ocioview/inspect_dock.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from .inspect.curve_inspector import CurveInspector from .inspect import LogInspector, CodeInspector diff --git a/src/apps/ocioview/ocioview/items/active_display_view_edit.py b/src/apps/ocioview/ocioview/items/active_display_view_edit.py index 5d76b0b12..593a40d44 100644 --- a/src/apps/ocioview/ocioview/items/active_display_view_edit.py +++ b/src/apps/ocioview/ocioview/items/active_display_view_edit.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..widgets import ItemModelListWidget from ..utils import get_glyph_icon diff --git a/src/apps/ocioview/ocioview/items/active_display_view_model.py b/src/apps/ocioview/ocioview/items/active_display_view_model.py index 297a8e575..63f1d5fd3 100644 --- a/src/apps/ocioview/ocioview/items/active_display_view_model.py +++ b/src/apps/ocioview/ocioview/items/active_display_view_model.py @@ -5,7 +5,7 @@ from typing import Any, Callable, Optional, Type import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from ..undo import ConfigSnapshotUndoCommand @@ -87,7 +87,7 @@ def get_item_names(self) -> list[str]: def _get_undo_command_type( self, column_desc: ColumnDesc - ) -> Type[QtWidgets.QUndoCommand]: + ) -> Type[QtGui.QUndoCommand]: if column_desc == self.ACTIVE: # Changing check state of the ACTIVE column has side effects related to # display/view order, so a config snapshot is needed to revert the change. diff --git a/src/apps/ocioview/ocioview/items/color_space_edit.py b/src/apps/ocioview/ocioview/items/color_space_edit.py index 5c3c9b2fa..4e5d659a3 100644 --- a/src/apps/ocioview/ocioview/items/color_space_edit.py +++ b/src/apps/ocioview/ocioview/items/color_space_edit.py @@ -4,7 +4,7 @@ from functools import partial from typing import Optional -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets import PyOpenColorIO as ocio from ..config_cache import ConfigCache diff --git a/src/apps/ocioview/ocioview/items/color_space_model.py b/src/apps/ocioview/ocioview/items/color_space_model.py index 80f34ee74..3b6c12d2c 100644 --- a/src/apps/ocioview/ocioview/items/color_space_model.py +++ b/src/apps/ocioview/ocioview/items/color_space_model.py @@ -5,7 +5,7 @@ from typing import Any, Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from ..ref_space_manager import ReferenceSpaceManager diff --git a/src/apps/ocioview/ocioview/items/config_item_edit.py b/src/apps/ocioview/ocioview/items/config_item_edit.py index 93aca0dc1..a49fbdc65 100644 --- a/src/apps/ocioview/ocioview/items/config_item_edit.py +++ b/src/apps/ocioview/ocioview/items/config_item_edit.py @@ -4,7 +4,7 @@ from functools import partial from typing import Optional -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import MARGIN_WIDTH from ..transform_manager import TransformManager @@ -47,7 +47,7 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None): if self.__has_transforms__: self.__has_tabs__ = True - no_tf_color = palette.color(palette.Disabled, palette.Text) + no_tf_color = palette.color(palette.ColorGroup.Disabled, palette.ColorRole.Text) self._from_ref_icon = get_glyph_icon("mdi6.layers-plus") self._no_from_ref_icon = get_glyph_icon( "mdi6.layers-plus", color=no_tf_color diff --git a/src/apps/ocioview/ocioview/items/config_item_model.py b/src/apps/ocioview/ocioview/items/config_item_model.py index e06ac024c..15a11c9e1 100644 --- a/src/apps/ocioview/ocioview/items/config_item_model.py +++ b/src/apps/ocioview/ocioview/items/config_item_model.py @@ -6,7 +6,7 @@ from typing import Any, Optional, Type, Union import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..config_cache import ConfigCache from ..transform_manager import TransformManager, TransformAgent @@ -587,7 +587,7 @@ def _get_item_and_column( def _get_undo_command_type( self, column_desc: ColumnDesc - ) -> Type[QtWidgets.QUndoCommand]: + ) -> Type[QtGui.QUndoCommand]: """ Support overriding the undo command type used to track data changes, per column. diff --git a/src/apps/ocioview/ocioview/items/config_properties_edit.py b/src/apps/ocioview/ocioview/items/config_properties_edit.py index 37b695a8c..58dddba8d 100644 --- a/src/apps/ocioview/ocioview/items/config_properties_edit.py +++ b/src/apps/ocioview/ocioview/items/config_properties_edit.py @@ -5,7 +5,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtWidgets +from PySide6 import QtWidgets from ..constants import RGB from ..widgets import ( diff --git a/src/apps/ocioview/ocioview/items/config_properties_model.py b/src/apps/ocioview/ocioview/items/config_properties_model.py index 895650802..247a7fb42 100644 --- a/src/apps/ocioview/ocioview/items/config_properties_model.py +++ b/src/apps/ocioview/ocioview/items/config_properties_model.py @@ -5,7 +5,7 @@ from pathlib import Path from typing import Any, Optional -from PySide2 import QtCore +from PySide6 import QtCore import PyOpenColorIO as ocio from .config_item_model import ColumnDesc, BaseConfigItemModel diff --git a/src/apps/ocioview/ocioview/items/delegates.py b/src/apps/ocioview/ocioview/items/delegates.py index d11428b7f..75499e651 100644 --- a/src/apps/ocioview/ocioview/items/delegates.py +++ b/src/apps/ocioview/ocioview/items/delegates.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..config_cache import ConfigCache from ..widgets import CallbackComboBox @@ -34,7 +34,6 @@ def createEditor( editor = CallbackComboBox( get_items=ConfigCache.get_color_space_names, editable=True, parent=parent ) - editor.setAutoCompletion(True) editor.completer().setCompletionMode(QtWidgets.QCompleter.PopupCompletion) return editor @@ -119,7 +118,6 @@ def createEditor( raise NotImplementedError widget = CallbackComboBox(get_items=get_items, editable=True, parent=parent) - widget.setAutoCompletion(True) widget.completer().setCompletionMode(QtWidgets.QCompleter.PopupCompletion) return widget diff --git a/src/apps/ocioview/ocioview/items/display_model.py b/src/apps/ocioview/ocioview/items/display_model.py index a12f08ff2..1f8c78213 100644 --- a/src/apps/ocioview/ocioview/items/display_model.py +++ b/src/apps/ocioview/ocioview/items/display_model.py @@ -5,7 +5,7 @@ from typing import Any, Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..config_cache import ConfigCache from ..utils import next_name diff --git a/src/apps/ocioview/ocioview/items/display_view_edit.py b/src/apps/ocioview/ocioview/items/display_view_edit.py index 0c5497a7f..059da4655 100644 --- a/src/apps/ocioview/ocioview/items/display_view_edit.py +++ b/src/apps/ocioview/ocioview/items/display_view_edit.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..utils import get_glyph_icon from .active_display_view_edit import ActiveDisplayViewEdit diff --git a/src/apps/ocioview/ocioview/items/file_rule_edit.py b/src/apps/ocioview/ocioview/items/file_rule_edit.py index ce8641bf0..0dd1b8a2f 100644 --- a/src/apps/ocioview/ocioview/items/file_rule_edit.py +++ b/src/apps/ocioview/ocioview/items/file_rule_edit.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..config_cache import ConfigCache from ..utils import get_glyph_icon diff --git a/src/apps/ocioview/ocioview/items/file_rule_model.py b/src/apps/ocioview/ocioview/items/file_rule_model.py index 0be470cd4..d73c76f5a 100644 --- a/src/apps/ocioview/ocioview/items/file_rule_model.py +++ b/src/apps/ocioview/ocioview/items/file_rule_model.py @@ -6,7 +6,7 @@ from typing import Any, Optional, Union import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from ..undo import ConfigSnapshotUndoCommand diff --git a/src/apps/ocioview/ocioview/items/look_edit.py b/src/apps/ocioview/ocioview/items/look_edit.py index 0ae3e9015..630051c9c 100644 --- a/src/apps/ocioview/ocioview/items/look_edit.py +++ b/src/apps/ocioview/ocioview/items/look_edit.py @@ -5,7 +5,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtWidgets +from PySide6 import QtWidgets from ..config_cache import ConfigCache from ..widgets import CallbackComboBox, TextEdit diff --git a/src/apps/ocioview/ocioview/items/look_model.py b/src/apps/ocioview/ocioview/items/look_model.py index ef4944692..d7d1a309e 100644 --- a/src/apps/ocioview/ocioview/items/look_model.py +++ b/src/apps/ocioview/ocioview/items/look_model.py @@ -5,7 +5,7 @@ from typing import Any, Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from ..ref_space_manager import ReferenceSpaceManager diff --git a/src/apps/ocioview/ocioview/items/named_transform_edit.py b/src/apps/ocioview/ocioview/items/named_transform_edit.py index 7364f0ef9..d2a7bc77a 100644 --- a/src/apps/ocioview/ocioview/items/named_transform_edit.py +++ b/src/apps/ocioview/ocioview/items/named_transform_edit.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtWidgets +from PySide6 import QtWidgets from ..config_cache import ConfigCache from ..utils import get_glyph_icon diff --git a/src/apps/ocioview/ocioview/items/named_transform_model.py b/src/apps/ocioview/ocioview/items/named_transform_model.py index 656af6b11..2dc02acad 100644 --- a/src/apps/ocioview/ocioview/items/named_transform_model.py +++ b/src/apps/ocioview/ocioview/items/named_transform_model.py @@ -5,7 +5,7 @@ from typing import Any, Optional, Union import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from ..utils import get_glyph_icon diff --git a/src/apps/ocioview/ocioview/items/role_edit.py b/src/apps/ocioview/ocioview/items/role_edit.py index af9138266..f527ceef1 100644 --- a/src/apps/ocioview/ocioview/items/role_edit.py +++ b/src/apps/ocioview/ocioview/items/role_edit.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtGui, QtWidgets +from PySide6 import QtGui, QtWidgets from ..widgets import ItemModelTableWidget from .delegates import RoleDelegate diff --git a/src/apps/ocioview/ocioview/items/role_model.py b/src/apps/ocioview/ocioview/items/role_model.py index 6650c0c0b..fb5f78bbf 100644 --- a/src/apps/ocioview/ocioview/items/role_model.py +++ b/src/apps/ocioview/ocioview/items/role_model.py @@ -5,7 +5,7 @@ from typing import Any import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..config_cache import ConfigCache from .config_item_model import ColumnDesc, BaseConfigItemModel diff --git a/src/apps/ocioview/ocioview/items/rule_edit.py b/src/apps/ocioview/ocioview/items/rule_edit.py index caef94723..cb60da1e8 100644 --- a/src/apps/ocioview/ocioview/items/rule_edit.py +++ b/src/apps/ocioview/ocioview/items/rule_edit.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..utils import get_glyph_icon from .file_rule_edit import FileRuleEdit diff --git a/src/apps/ocioview/ocioview/items/shared_view_edit.py b/src/apps/ocioview/ocioview/items/shared_view_edit.py index 527fffc5c..db474e531 100644 --- a/src/apps/ocioview/ocioview/items/shared_view_edit.py +++ b/src/apps/ocioview/ocioview/items/shared_view_edit.py @@ -5,7 +5,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtWidgets +from PySide6 import QtWidgets from ..config_cache import ConfigCache from ..widgets import CallbackComboBox, LineEdit diff --git a/src/apps/ocioview/ocioview/items/shared_view_model.py b/src/apps/ocioview/ocioview/items/shared_view_model.py index b89f981fd..776912778 100644 --- a/src/apps/ocioview/ocioview/items/shared_view_model.py +++ b/src/apps/ocioview/ocioview/items/shared_view_model.py @@ -6,7 +6,7 @@ from typing import Any, Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from .config_item_model import ColumnDesc, BaseConfigItemModel diff --git a/src/apps/ocioview/ocioview/items/view_edit.py b/src/apps/ocioview/ocioview/items/view_edit.py index 349d401da..1172dbe75 100644 --- a/src/apps/ocioview/ocioview/items/view_edit.py +++ b/src/apps/ocioview/ocioview/items/view_edit.py @@ -5,7 +5,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..config_cache import ConfigCache from ..transform_manager import TransformManager diff --git a/src/apps/ocioview/ocioview/items/view_model.py b/src/apps/ocioview/ocioview/items/view_model.py index 064b46dff..7fd341263 100644 --- a/src/apps/ocioview/ocioview/items/view_model.py +++ b/src/apps/ocioview/ocioview/items/view_model.py @@ -4,7 +4,7 @@ from typing import Any, Optional, Union import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from ..ref_space_manager import ReferenceSpaceManager diff --git a/src/apps/ocioview/ocioview/items/view_transform_edit.py b/src/apps/ocioview/ocioview/items/view_transform_edit.py index 50ffa0e78..c8a087359 100644 --- a/src/apps/ocioview/ocioview/items/view_transform_edit.py +++ b/src/apps/ocioview/ocioview/items/view_transform_edit.py @@ -4,7 +4,7 @@ from functools import partial from typing import Optional -from PySide2 import QtWidgets +from PySide6 import QtWidgets import PyOpenColorIO as ocio from ..config_cache import ConfigCache diff --git a/src/apps/ocioview/ocioview/items/view_transform_model.py b/src/apps/ocioview/ocioview/items/view_transform_model.py index 63a954082..69595ecf6 100644 --- a/src/apps/ocioview/ocioview/items/view_transform_model.py +++ b/src/apps/ocioview/ocioview/items/view_transform_model.py @@ -5,7 +5,7 @@ from typing import Any, Optional, Union import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from ..utils import get_enum_member, get_glyph_icon diff --git a/src/apps/ocioview/ocioview/items/viewing_rule_edit.py b/src/apps/ocioview/ocioview/items/viewing_rule_edit.py index 67c2ef83f..83c90a70b 100644 --- a/src/apps/ocioview/ocioview/items/viewing_rule_edit.py +++ b/src/apps/ocioview/ocioview/items/viewing_rule_edit.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..config_cache import ConfigCache from ..utils import get_glyph_icon diff --git a/src/apps/ocioview/ocioview/items/viewing_rule_model.py b/src/apps/ocioview/ocioview/items/viewing_rule_model.py index 381635ae8..7e04efa3d 100644 --- a/src/apps/ocioview/ocioview/items/viewing_rule_model.py +++ b/src/apps/ocioview/ocioview/items/viewing_rule_model.py @@ -7,7 +7,7 @@ from typing import Any, Optional, Union import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from ..config_cache import ConfigCache from ..undo import ConfigSnapshotUndoCommand diff --git a/src/apps/ocioview/ocioview/main_window.py b/src/apps/ocioview/ocioview/main_window.py index e68b165f9..69646b266 100644 --- a/src/apps/ocioview/ocioview/main_window.py +++ b/src/apps/ocioview/ocioview/main_window.py @@ -7,7 +7,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from .config_cache import ConfigCache from .config_dock import ConfigDock diff --git a/src/apps/ocioview/ocioview/message_router.py b/src/apps/ocioview/ocioview/message_router.py index bbc3744a7..668cb219b 100644 --- a/src/apps/ocioview/ocioview/message_router.py +++ b/src/apps/ocioview/ocioview/message_router.py @@ -10,7 +10,7 @@ from queue import Empty, SimpleQueue import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from .utils import config_to_html, processor_to_ctf_html, processor_to_shader_html diff --git a/src/apps/ocioview/ocioview/settings.py b/src/apps/ocioview/ocioview/settings.py index fded91dd5..9f2c5ac7b 100644 --- a/src/apps/ocioview/ocioview/settings.py +++ b/src/apps/ocioview/ocioview/settings.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenColorIO Project. -from PySide2 import QtCore +from PySide6 import QtCore settings = QtCore.QSettings( diff --git a/src/apps/ocioview/ocioview/style.py b/src/apps/ocioview/ocioview/style.py index 6acf1399a..1f35c1564 100644 --- a/src/apps/ocioview/ocioview/style.py +++ b/src/apps/ocioview/ocioview/style.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtGui, QtWidgets +from PySide6 import QtGui, QtWidgets from .constants import ( BORDER_COLOR_ROLE, diff --git a/src/apps/ocioview/ocioview/transform_manager.py b/src/apps/ocioview/ocioview/transform_manager.py index fb1078b10..65d72a248 100644 --- a/src/apps/ocioview/ocioview/transform_manager.py +++ b/src/apps/ocioview/ocioview/transform_manager.py @@ -7,7 +7,7 @@ from typing import Callable, Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from .utils import get_glyph_icon diff --git a/src/apps/ocioview/ocioview/transforms/allocation_edit.py b/src/apps/ocioview/ocioview/transforms/allocation_edit.py index 96885a9a5..2e7bde4a0 100644 --- a/src/apps/ocioview/ocioview/transforms/allocation_edit.py +++ b/src/apps/ocioview/ocioview/transforms/allocation_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..widgets import EnumComboBox, FloatEdit, FloatEditArray from .transform_edit import BaseTransformEdit diff --git a/src/apps/ocioview/ocioview/transforms/builtin_edit.py b/src/apps/ocioview/ocioview/transforms/builtin_edit.py index 0813d33c9..2be865f24 100644 --- a/src/apps/ocioview/ocioview/transforms/builtin_edit.py +++ b/src/apps/ocioview/ocioview/transforms/builtin_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..widgets import ComboBox from .transform_edit import BaseTransformEdit diff --git a/src/apps/ocioview/ocioview/transforms/cdl_edit.py b/src/apps/ocioview/ocioview/transforms/cdl_edit.py index 174b7cace..d411d16ae 100644 --- a/src/apps/ocioview/ocioview/transforms/cdl_edit.py +++ b/src/apps/ocioview/ocioview/transforms/cdl_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..constants import RGB from ..widgets import EnumComboBox, FloatEdit, FloatEditArray diff --git a/src/apps/ocioview/ocioview/transforms/color_space_edit.py b/src/apps/ocioview/ocioview/transforms/color_space_edit.py index f297ded44..db83ec88b 100644 --- a/src/apps/ocioview/ocioview/transforms/color_space_edit.py +++ b/src/apps/ocioview/ocioview/transforms/color_space_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..config_cache import ConfigCache from ..widgets import CheckBox, CallbackComboBox diff --git a/src/apps/ocioview/ocioview/transforms/display_view_edit.py b/src/apps/ocioview/ocioview/transforms/display_view_edit.py index 059dfc8f4..e5cb3bfae 100644 --- a/src/apps/ocioview/ocioview/transforms/display_view_edit.py +++ b/src/apps/ocioview/ocioview/transforms/display_view_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..config_cache import ConfigCache from ..utils import SignalsBlocked diff --git a/src/apps/ocioview/ocioview/transforms/exponent_edit.py b/src/apps/ocioview/ocioview/transforms/exponent_edit.py index d7c294a7d..c5ed3dba2 100644 --- a/src/apps/ocioview/ocioview/transforms/exponent_edit.py +++ b/src/apps/ocioview/ocioview/transforms/exponent_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..constants import RGBA from ..widgets import EnumComboBox, FloatEditArray diff --git a/src/apps/ocioview/ocioview/transforms/exponent_with_linear_edit.py b/src/apps/ocioview/ocioview/transforms/exponent_with_linear_edit.py index 2f78a68b6..004bdb02f 100644 --- a/src/apps/ocioview/ocioview/transforms/exponent_with_linear_edit.py +++ b/src/apps/ocioview/ocioview/transforms/exponent_with_linear_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..constants import RGBA from ..widgets import EnumComboBox, FloatEditArray diff --git a/src/apps/ocioview/ocioview/transforms/exposure_contrast_edit.py b/src/apps/ocioview/ocioview/transforms/exposure_contrast_edit.py index eece95377..891eade24 100644 --- a/src/apps/ocioview/ocioview/transforms/exposure_contrast_edit.py +++ b/src/apps/ocioview/ocioview/transforms/exposure_contrast_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..widgets import EnumComboBox, FloatEdit from .transform_edit import BaseTransformEdit diff --git a/src/apps/ocioview/ocioview/transforms/file_edit.py b/src/apps/ocioview/ocioview/transforms/file_edit.py index 68a633477..464eb0ca9 100644 --- a/src/apps/ocioview/ocioview/transforms/file_edit.py +++ b/src/apps/ocioview/ocioview/transforms/file_edit.py @@ -5,7 +5,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..widgets import EnumComboBox, LineEdit from .transform_edit import BaseTransformEdit diff --git a/src/apps/ocioview/ocioview/transforms/fixed_function_edit.py b/src/apps/ocioview/ocioview/transforms/fixed_function_edit.py index 35935fab2..ebf701908 100644 --- a/src/apps/ocioview/ocioview/transforms/fixed_function_edit.py +++ b/src/apps/ocioview/ocioview/transforms/fixed_function_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..widgets import EnumComboBox, FloatEditArray, ExpandingStackedWidget from .transform_edit import BaseTransformEdit diff --git a/src/apps/ocioview/ocioview/transforms/log_affine_edit.py b/src/apps/ocioview/ocioview/transforms/log_affine_edit.py index 285f021e2..4190c9691 100644 --- a/src/apps/ocioview/ocioview/transforms/log_affine_edit.py +++ b/src/apps/ocioview/ocioview/transforms/log_affine_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..constants import RGB from ..widgets import FloatEditArray diff --git a/src/apps/ocioview/ocioview/transforms/log_camera_edit.py b/src/apps/ocioview/ocioview/transforms/log_camera_edit.py index 03b4d605c..ddc865000 100644 --- a/src/apps/ocioview/ocioview/transforms/log_camera_edit.py +++ b/src/apps/ocioview/ocioview/transforms/log_camera_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..constants import RGB from ..widgets import FloatEdit, FloatEditArray diff --git a/src/apps/ocioview/ocioview/transforms/log_edit.py b/src/apps/ocioview/ocioview/transforms/log_edit.py index f845571b7..638eb9417 100644 --- a/src/apps/ocioview/ocioview/transforms/log_edit.py +++ b/src/apps/ocioview/ocioview/transforms/log_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..widgets import FloatEdit from .transform_edit import BaseTransformEdit diff --git a/src/apps/ocioview/ocioview/transforms/look_edit.py b/src/apps/ocioview/ocioview/transforms/look_edit.py index 396ee74d3..e6b0005a1 100644 --- a/src/apps/ocioview/ocioview/transforms/look_edit.py +++ b/src/apps/ocioview/ocioview/transforms/look_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore +from PySide6 import QtCore from ..config_cache import ConfigCache from ..widgets import CheckBox, CallbackComboBox, LineEdit diff --git a/src/apps/ocioview/ocioview/transforms/matrix_edit.py b/src/apps/ocioview/ocioview/transforms/matrix_edit.py index dad31c769..5cd48068b 100644 --- a/src/apps/ocioview/ocioview/transforms/matrix_edit.py +++ b/src/apps/ocioview/ocioview/transforms/matrix_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import RGB, RGBA from ..widgets import ( diff --git a/src/apps/ocioview/ocioview/transforms/range_edit.py b/src/apps/ocioview/ocioview/transforms/range_edit.py index f0d6281dc..c6f4d058b 100644 --- a/src/apps/ocioview/ocioview/transforms/range_edit.py +++ b/src/apps/ocioview/ocioview/transforms/range_edit.py @@ -4,7 +4,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..widgets import CheckBox, EnumComboBox, FloatEdit from .transform_edit import BaseTransformEdit diff --git a/src/apps/ocioview/ocioview/transforms/transform_edit.py b/src/apps/ocioview/ocioview/transforms/transform_edit.py index 65821f2e1..9c297fa2a 100644 --- a/src/apps/ocioview/ocioview/transforms/transform_edit.py +++ b/src/apps/ocioview/ocioview/transforms/transform_edit.py @@ -7,7 +7,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import ICON_SIZE_ITEM, BORDER_COLOR_ROLE from ..style import apply_top_tool_bar_style, apply_widget_with_top_tool_bar_style diff --git a/src/apps/ocioview/ocioview/transforms/transform_edit_stack.py b/src/apps/ocioview/ocioview/transforms/transform_edit_stack.py index b01b8edfb..1f7eaf10b 100644 --- a/src/apps/ocioview/ocioview/transforms/transform_edit_stack.py +++ b/src/apps/ocioview/ocioview/transforms/transform_edit_stack.py @@ -5,7 +5,7 @@ from typing import Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets # Register all transform edit types from .. import transforms @@ -48,7 +48,7 @@ def __init__(self, parent: Optional[QtCore.QObject] = None): self.add_tf_button.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) self.add_tf_button.setMenu(self.tf_menu) - self._start_collapsed_action = QtWidgets.QAction("Start Collapsed") + self._start_collapsed_action = QtGui.QAction("Start Collapsed") self._start_collapsed_action.setCheckable(True) self._start_collapsed_action.triggered[bool].connect( self._on_start_collapsed_changed diff --git a/src/apps/ocioview/ocioview/undo.py b/src/apps/ocioview/ocioview/undo.py index aee5ddef6..d8b0d14f9 100644 --- a/src/apps/ocioview/ocioview/undo.py +++ b/src/apps/ocioview/ocioview/undo.py @@ -6,16 +6,16 @@ from typing import Any, Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtGui from .config_cache import ConfigCache -undo_stack = QtWidgets.QUndoStack() +undo_stack = QtGui.QUndoStack() """Global undo stack.""" -class ItemModelUndoCommand(QtWidgets.QUndoCommand): +class ItemModelUndoCommand(QtGui.QUndoCommand): """ Undo command for use in item model ``setData`` implementations. @@ -31,7 +31,7 @@ def __init__( index: QtCore.QPersistentModelIndex, redo_value: Any, undo_value: Any, - parent: Optional[QtWidgets.QUndoCommand] = None, + parent: Optional[QtGui.QUndoCommand] = None, ): """ :param text: Undo/redo command menu text @@ -59,7 +59,7 @@ def undo(self) -> None: model.setData(self._index, self._undo_value) -class ConfigSnapshotUndoCommand(QtWidgets.QUndoCommand): +class ConfigSnapshotUndoCommand(QtGui.QUndoCommand): """ Undo command for complex config changes like item adds, moves, and deletes, to be used as a content manager in which the entry @@ -71,7 +71,7 @@ def __init__( text: str, model: Optional[QtCore.QAbstractItemModel] = None, item_name: Optional[str] = None, - parent: Optional[QtWidgets.QUndoCommand] = None, + parent: Optional[QtGui.QUndoCommand] = None, ): """ :param text: Undo/redo command menu text diff --git a/src/apps/ocioview/ocioview/utils.py b/src/apps/ocioview/ocioview/utils.py index 23a02e088..31091a8fe 100644 --- a/src/apps/ocioview/ocioview/utils.py +++ b/src/apps/ocioview/ocioview/utils.py @@ -12,7 +12,7 @@ from pygments import highlight from pygments.lexers import GLShaderLexer, HLSLShaderLexer, XmlLexer, YamlLexer from pygments.formatters import HtmlFormatter -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from .constants import ICON_SCALE_FACTOR, ICON_SIZE_BUTTON diff --git a/src/apps/ocioview/ocioview/viewer/image_plane.py b/src/apps/ocioview/ocioview/viewer/image_plane.py index b36c4cc4a..7b06fd4cb 100644 --- a/src/apps/ocioview/ocioview/viewer/image_plane.py +++ b/src/apps/ocioview/ocioview/viewer/image_plane.py @@ -11,13 +11,16 @@ from functools import partial from pathlib import Path from typing import Any, Optional +import sys -import imath import numpy as np from OpenGL import GL -import OpenImageIO as oiio +try: + import OpenImageIO as oiio +except: + import imageio as iio import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL +from PySide6 import QtCore, QtGui, QtWidgets, QtOpenGLWidgets from ..log_handlers import message_queue from ..ref_space_manager import ReferenceSpaceManager @@ -88,7 +91,7 @@ """ -class ImagePlane(QtOpenGL.QGLWidget): +class ImagePlane(QtOpenGLWidgets.QOpenGLWidget): """ Qt-wrapped OpenGL window for drawing with PyOpenGL. """ @@ -125,8 +128,8 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None): self._ocio_uniform_ids = {} # MVP matrix components - self._model_view_mat = imath.M44f() - self._proj_mat = imath.M44f() + self._model_view_mat = np.eye(4) + self._proj_mat = np.eye(4) # Keyboard shortcuts self._shortcuts = [] @@ -136,10 +139,10 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None): self._mouse_last_pos = QtCore.QPointF() # Image texture - self._image_buf = None + self._image_array = None self._image_tex = None - self._image_pos = imath.V2f(0.0, 0.0) - self._image_size = imath.V2f(1.0, 1.0) + self._image_pos = np.array([0.0, 0.0]) + self._image_size = np.array([1.0, 1.0]) self._image_scale = 1.0 # Image plane VAO @@ -170,8 +173,8 @@ def initializeGL(self) -> None: GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, - self._image_size.x, - self._image_size.y, + self._image_size[0], + self._image_size[1], 0, GL.GL_RGBA, GL.GL_FLOAT, @@ -261,6 +264,31 @@ def initializeGL(self) -> None: self._build_program() + def _orthographicProjMatrix(self, near, far, left, right, top, bottom): + rightPlusLeft = right + left + rightMinusLeft = right - left + + topPlusBottom = top + bottom + topMinusBottom = top - bottom + + farPlusNear = far + near + farMinusNear = far - near + + tx = -rightPlusLeft / rightMinusLeft + ty = -topPlusBottom / topMinusBottom + tz = -farPlusNear / farMinusNear + + A = 2 / rightMinusLeft + B = 2 / topMinusBottom + C = -2 / farMinusNear + + return np.array([ + [A, 0, 0, tx], + [0, B, 0, ty], + [0, 0, C, tz], + [0, 0, 0, 1 ] + ]) + def resizeGL(self, w: int, h: int) -> None: """ Called whenever the widget is resized. @@ -271,18 +299,15 @@ def resizeGL(self, w: int, h: int) -> None: GL.glViewport(0, 0, w, h) # Center image plane - # fmt: off - frustum = imath.Frustumf( + # fmt: on + self._proj_mat = self._orthographicProjMatrix( -1.0, # Near 1.0, # Far -w / 2.0, # Left w / 2.0, # Right h / 2.0, # Top -h / 2.0, # Bottom - True, ) - # fmt: on - self._proj_mat = frustum.projectionMatrix() self._update_model_view_mat() @@ -301,10 +326,10 @@ def paintGL(self) -> None: self._use_ocio_uniforms() # Set uniforms - mvp_mat = self._proj_mat * self._model_view_mat + mvp_mat = self._proj_mat @ self._model_view_mat mvp_mat_loc = GL.glGetUniformLocation(self._shader_program, "mvpMat") GL.glUniformMatrix4fv( - mvp_mat_loc, 1, GL.GL_FALSE, self._m44f_to_ndarray(mvp_mat) + mvp_mat_loc, 1, GL.GL_FALSE, mvp_mat.T ) image_tex_loc = GL.glGetUniformLocation(self._shader_program, "imageTex") @@ -322,6 +347,55 @@ def paintGL(self) -> None: GL.glBindVertexArray(0) + def load_oiio(self, image_path: Path) -> np.ndarray: + image_buf = oiio.ImageBuf(image_path.as_posix()) + spec = image_buf.spec() + + # Convert to RGBA, filling missing color channels with 0.0, and a + # missing alpha with 1.0. + if spec.nchannels < 4: + image_buf = oiio.ImageBufAlgo.channels( + image_buf, + tuple( + list(range(spec.nchannels)) + + ([0.0] * (4 - spec.nchannels - 1)) + + [1.0] + ), + newchannelnames=("R", "G", "B", "A"), + ) + elif spec.nchannels > 4: + image_buf = oiio.ImageBufAlgo.channels( + image_buf, (0, 1, 2, 3), newchannelnames=("R", "G", "B", "A") + ) + + # Get pixels as 32-bit float NumPy array + return image_buf.get_pixels(oiio.FLOAT) + + def load_iio(self, image_path: Path) -> np.ndarray: + data = iio.imread(image_path.as_posix()) + + # Convert to 32-bit float + if not np.issubdtype(data.dtype, np.floating): + data = data.astype(np.float32) / np.iinfo(data.dtype).max + if data.dtype != np.float32: + data = data.astype(np.float32) + + # Convert to RGBA, filling missing color channels with 0.0, and a + # missing alpha with 1.0. + nchannels = 1 + if len(data.shape) == 3: + nchannels = data.shape[-1] + + while nchannels < 3: + data = np.dstack((data, np.zeros(data.shape[:2]))) + nchannels += 1 + if nchannels < 4: + data = np.dstack((data, np.ones(data.shape[:2]))) + if nchannels > 4: + data = data[..., :4] + + return data + def load_image(self, image_path: Path) -> None: """ Load an image into the image plane texture. @@ -342,34 +416,18 @@ def load_image(self, image_path: Path) -> None: color_space_name = ocio.ROLE_DEFAULT self._ocio_input_color_space = color_space_name - self._image_buf = oiio.ImageBuf(image_path.as_posix()) - spec = self._image_buf.spec() - - # Convert to RGBA, filling missing color channels with 0.0, and a - # missing alpha with 1.0. - if spec.nchannels < 4: - self._image_buf = oiio.ImageBufAlgo.channels( - self._image_buf, - tuple( - list(range(spec.nchannels)) - + ([0.0] * (4 - spec.nchannels - 1)) - + [1.0] - ), - newchannelnames=("R", "G", "B", "A"), - ) - elif spec.nchannels > 4: - self._image_buf = oiio.ImageBufAlgo.channels( - self._image_buf, (0, 1, 2, 3), newchannelnames=("R", "G", "B", "A") - ) + if "OpenImageIO" in sys.modules: + self._image_array = self.load_oiio(image_path) + else: + self._image_array = self.load_iio(image_path) - # Get pixels as 32-bit float NumPy array - data = self._image_buf.get_pixels(oiio.FLOAT) + width = self._image_array.shape[1] + height = self._image_array.shape[0] # Stash image size for pan/zoom calculations - self._image_pos.x = spec.x - self._image_pos.y = spec.y - self._image_size.x = spec.width - self._image_size.y = spec.height + + self._image_pos = np.array([0, 1], dtype=np.float64) + self._image_size = np.array([width, height], dtype=np.float64) # Load image data into texture self.makeCurrent() @@ -379,16 +437,16 @@ def load_image(self, image_path: Path) -> None: GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, - spec.width, - spec.height, + width, + height, 0, GL.GL_RGBA, GL.GL_FLOAT, - data.ravel(), + self._image_array.ravel(), ) self.image_loaded.emit( - image_path, int(self._image_size.x), int(self._image_size.y) + image_path, int(self._image_size[0]), int(self._image_size[1]) ) self.update_ocio_proc(input_color_space=self._ocio_input_color_space) @@ -628,7 +686,7 @@ def mouseMoveEvent(self, event: QtGui.QMouseEvent) -> None: pos = event.pos() if self._mouse_pressed: - offset = imath.V2f(*(pos - self._mouse_last_pos).toTuple()) + offset = np.array([*(pos - self._mouse_last_pos).toTuple()]) self._mouse_last_pos = pos self.pan(offset, update=True) @@ -638,29 +696,24 @@ def mouseMoveEvent(self, event: QtGui.QMouseEvent) -> None: # Trace mouse position through the inverse MVP matrix to update sampled # pixel. - screen_pos = imath.V3f( + screen_pos = np.array([ pos.x() / widget_w * 2.0 - 1.0, (widget_h - pos.y() - 1) / widget_h * 2.0 - 1.0, 0.0, - ) - model_pos = ( - (self._proj_mat * self._model_view_mat) - .inverse() - .multVecMatrix(screen_pos) - ) - pixel_pos = ( - imath.V2f(model_pos.x + 0.5, model_pos.y + 0.5) * self._image_size - ) + 1.0 + ]) + model_pos = np.linalg.inv(self._proj_mat @ self._model_view_mat) @ screen_pos + pixel_pos = np.array([model_pos[0] + 0.5, model_pos[1] + 0.5]) * self._image_size # Broadcast sample position if ( - self._image_buf is not None - and 0 <= pixel_pos.x <= self._image_size.x - and 0 <= pixel_pos.y <= self._image_size.y + self._image_array is not None + and 0 <= pixel_pos[0] <= self._image_size[0] + and 0 <= pixel_pos[1] <= self._image_size[1] ): - pixel_x = math.floor(pixel_pos.x) - pixel_y = math.floor(pixel_pos.y) - pixel_input = list(self._image_buf.getpixel(pixel_x, pixel_y)) + pixel_x = math.floor(pixel_pos[0]) + pixel_y = math.floor(pixel_pos[1]) + pixel_input = list(self._image_array[pixel_y, pixel_x]) if len(pixel_input) < 3: pixel_input += [0.0] * (3 - len(pixel_input)) elif len(pixel_input) > 3: @@ -685,9 +738,9 @@ def wheelEvent(self, event: QtGui.QWheelEvent) -> None: # Fit image to frame if h > w: - min_scale = w / self._image_size.x + min_scale = w / self._image_size[0] else: - min_scale = h / self._image_size.y + min_scale = h / self._image_size[1] # Fill frame with 1 pixel with 0.5 pixel overscan max_scale = max(w, h) * 1.5 @@ -712,7 +765,7 @@ def wheelEvent(self, event: QtGui.QWheelEvent) -> None: self.zoom(event.pos(), scale, update=True, absolute=True) def pan( - self, offset: imath.V2f, update: bool = True, absolute: bool = False + self, offset: np.ndarray, update: bool = True, absolute: bool = False ) -> None: """ Pan the viewport by the specified offset in screen space. @@ -746,7 +799,7 @@ def zoom( :param absolute: When True, amount will be treated as an absolute scale to set the viewport to. """ - offset = imath.V2f(*(point - self.rect().center()).toTuple()) + offset = np.array([*(point - self.rect().center()).toTuple()]) self.pan(-offset, update=False) @@ -759,7 +812,7 @@ def zoom( self.pan(offset, update=update) - if self._image_buf is not None: + if self._image_array is not None: self.scale_changed.emit(self._image_scale) def fit(self, update: bool = True) -> None: @@ -773,12 +826,12 @@ def fit(self, update: bool = True) -> None: # Fit image to frame if h > w: - scale = w / self._image_size.x + scale = w / self._image_size[0] else: - scale = h / self._image_size.y + scale = h / self._image_size[1] self.zoom(QtCore.QPoint(), scale, update=False, absolute=True) - self.pan(imath.V2f(), update=update, absolute=True) + self.pan(np.array([0.0, 0.0]), update=update, absolute=True) def _install_shortcuts(self) -> None: """ @@ -787,7 +840,7 @@ def _install_shortcuts(self) -> None: # R,G,B,A = view channel # C = view color for i, key in enumerate(("R", "G", "B", "A", "C")): - channel_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(key), self) + channel_shortcut = QtGui.QShortcut(QtGui.QKeySequence(key), self) channel_shortcut.activated.connect( partial(self.update_ocio_proc, channel=i) ) @@ -795,7 +848,7 @@ def _install_shortcuts(self) -> None: # Number keys = Subscribe to transform @ slot for i in range(10): - subscribe_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(str(i)), self) + subscribe_shortcut = QtGui.QShortcut(QtGui.QKeySequence(str(i)), self) subscribe_shortcut.activated.connect( lambda slot=i: self.tf_subscription_requested.emit(slot) ) @@ -803,7 +856,7 @@ def _install_shortcuts(self) -> None: # Ctrl + Number keys = Power of 2 scale: 1 = x1, 2 = x2, 3 = x4, ... for i in range(9): - scale_shortcut = QtWidgets.QShortcut( + scale_shortcut = QtGui.QShortcut( QtGui.QKeySequence(f"Ctrl+{i + 1}"), self ) scale_shortcut.activated.connect( @@ -814,7 +867,7 @@ def _install_shortcuts(self) -> None: self._shortcuts.append(scale_shortcut) # F = fit image to viewport - fit_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence("F"), self) + fit_shortcut = QtGui.QShortcut(QtGui.QKeySequence("F"), self) fit_shortcut.activated.connect(self.fit) self._shortcuts.append(fit_shortcut) @@ -912,18 +965,17 @@ def _update_model_view_mat(self, update: bool = True) -> None: :param bool update: Optionally redraw the window """ - size = self._widget_size_to_v2f(self) + size = np.array([self.width(), self.height()]) - self._model_view_mat.makeIdentity() + self._model_view_mat = np.eye(4) # Flip Y to account for different OIIO/OpenGL image origin - self._model_view_mat.scale(imath.V3f(1.0, -1.0, 1.0)) + self._model_view_mat *= [1.0, -1.0, 1.0, 1.0] - self._model_view_mat.scale(imath.V3f(self._image_scale, self._image_scale, 1.0)) - self._model_view_mat.translate( - self._v2f_to_v3f(self._image_pos / size * 2.0, 0.0) - ) - self._model_view_mat.scale(self._v2f_to_v3f(self._image_size, 1.0)) + self._model_view_mat *= [self._image_scale, self._image_scale, 1.0, 1.0] + self._model_view_mat[:2, -1] += self._image_pos / size * 2.0 + + self._model_view_mat *= self._image_size.tolist() + [1.0, 1.0] # Use nearest interpolation when scaling up to see pixels if self._image_scale > 1.0: @@ -1138,43 +1190,3 @@ def _update_ocio_channel_hot(self, channel: int) -> None: else: for i in range(4): self._ocio_channel_hot[i] = 1 - - def _m44f_to_ndarray(self, m44f: imath.M44f) -> np.ndarray: - """ - Convert Imath.M44f matrix to a flat NumPy float32 array, so that it - can be passed to PyOpenGL functions. - - :param m44f: 4x4 matrix - :return: NumPy array - """ - # fmt: off - return np.array( - [ - m44f[0][0], m44f[0][1], m44f[0][2], m44f[0][3], - m44f[1][0], m44f[1][1], m44f[1][2], m44f[1][3], - m44f[2][0], m44f[2][1], m44f[2][2], m44f[2][3], - m44f[3][0], m44f[3][1], m44f[3][2], m44f[3][3], - ], - dtype=np.float32, - ) - # fmt: on - - def _v2f_to_v3f(self, v2f: imath.V2f, z: float) -> imath.V3f: - """ - Extend an Imath.V2f to an Imath.V3f by adding a Z dimension - value. - - :param v2f: 2D float vector to extend - :param z: Z value to extend vector with - :return: 3D float vector - """ - return imath.V3f(v2f.x, v2f.y, z) - - def _widget_size_to_v2f(self, widget: QtWidgets.QWidget) -> imath.V2f: - """ - Get QWidget dimensions as an Imath.V2f. - - :param widget: Widget to get dimensions of - :return: 2D float vector - """ - return imath.V2f(widget.width(), widget.height()) diff --git a/src/apps/ocioview/ocioview/viewer/image_viewer.py b/src/apps/ocioview/ocioview/viewer/image_viewer.py index f687e7b13..11436a06c 100644 --- a/src/apps/ocioview/ocioview/viewer/image_viewer.py +++ b/src/apps/ocioview/ocioview/viewer/image_viewer.py @@ -6,7 +6,7 @@ from typing import Generator, Optional import PyOpenColorIO as ocio -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..transform_manager import TransformManager from ..config_cache import ConfigCache @@ -253,7 +253,7 @@ def __init__(self, parent: Optional[QtWidgets.QWidget] = None): self.image_plane.tf_subscription_requested.connect( self._on_tf_subscription_requested ) - self.input_color_space_box.currentIndexChanged[str].connect( + self.input_color_space_box.currentTextChanged[str].connect( self._on_input_color_space_changed ) self.tf_box.currentIndexChanged[int].connect(self._on_transform_changed) diff --git a/src/apps/ocioview/ocioview/viewer_dock.py b/src/apps/ocioview/ocioview/viewer_dock.py index 26cdb075f..b295fc35c 100644 --- a/src/apps/ocioview/ocioview/viewer_dock.py +++ b/src/apps/ocioview/ocioview/viewer_dock.py @@ -5,7 +5,7 @@ from pathlib import Path from typing import Optional -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from .settings import settings from .transform_manager import TransformManager diff --git a/src/apps/ocioview/ocioview/widgets/check_box.py b/src/apps/ocioview/ocioview/widgets/check_box.py index eb2566a74..7dcdbc828 100644 --- a/src/apps/ocioview/ocioview/widgets/check_box.py +++ b/src/apps/ocioview/ocioview/widgets/check_box.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenColorIO Project. -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..utils import SignalsBlocked diff --git a/src/apps/ocioview/ocioview/widgets/combo_box.py b/src/apps/ocioview/ocioview/widgets/combo_box.py index 2f1f0f0c6..5ddc2b308 100644 --- a/src/apps/ocioview/ocioview/widgets/combo_box.py +++ b/src/apps/ocioview/ocioview/widgets/combo_box.py @@ -4,7 +4,7 @@ import enum from typing import Callable, Optional -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..utils import SignalsBlocked @@ -12,7 +12,7 @@ class ComboBox(QtWidgets.QComboBox): def __init__(self, parent: Optional[QtCore.QObject] = None): super().__init__(parent=parent) - self.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength) + self.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLengthWithIcon) # DataWidgetMapper user property interface @QtCore.Property(str, user=True) @@ -103,7 +103,6 @@ def __init__( self._item_icon = item_icon self.setEditable(editable) - self.setAutoCompletion(True) self.setInsertPolicy(QtWidgets.QComboBox.NoInsert) completer = self.completer() diff --git a/src/apps/ocioview/ocioview/widgets/item_view.py b/src/apps/ocioview/ocioview/widgets/item_view.py index 2d81b5ec5..44d05fe18 100644 --- a/src/apps/ocioview/ocioview/widgets/item_view.py +++ b/src/apps/ocioview/ocioview/widgets/item_view.py @@ -3,7 +3,7 @@ from typing import Callable, Optional -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import ICON_SIZE_BUTTON, ICON_SIZE_ITEM from ..style import apply_top_tool_bar_style, apply_widget_with_top_tool_bar_style @@ -241,6 +241,6 @@ def _on_preset_menu_requested(self) -> None: else: self.preset_menu.addAction(preset) - def _on_preset_triggered(self, action: QtWidgets.QAction) -> None: + def _on_preset_triggered(self, action: QtGui.QAction) -> None: """Add a new item from the triggered preset.""" self.add_item(action.text()) diff --git a/src/apps/ocioview/ocioview/widgets/layout.py b/src/apps/ocioview/ocioview/widgets/layout.py index e21cb71ea..331b057f2 100644 --- a/src/apps/ocioview/ocioview/widgets/layout.py +++ b/src/apps/ocioview/ocioview/widgets/layout.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets class FormLayout(QtWidgets.QFormLayout): diff --git a/src/apps/ocioview/ocioview/widgets/line_edit.py b/src/apps/ocioview/ocioview/widgets/line_edit.py index 3588bd70e..0562cb549 100644 --- a/src/apps/ocioview/ocioview/widgets/line_edit.py +++ b/src/apps/ocioview/ocioview/widgets/line_edit.py @@ -5,7 +5,7 @@ from pathlib import Path from typing import Any, Optional, Sequence -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import R_COLOR, G_COLOR, B_COLOR from ..utils import SignalsBlocked, get_glyph_icon @@ -50,7 +50,7 @@ class PathEdit(LineEdit): QtWidgets.QFileDialog.AnyFile: "ph.file", QtWidgets.QFileDialog.ExistingFile: "ph.file", QtWidgets.QFileDialog.Directory: "ph.folder", - QtWidgets.QFileDialog.DirectoryOnly: "ph.folder", + QtWidgets.QFileDialog.ShowDirsOnly: "ph.folder", } def __init__( @@ -75,7 +75,7 @@ def __init__( if self._file_mode in self.BROWSE_GLYPHS: self._browse_action = self.addAction( get_glyph_icon(self.BROWSE_GLYPHS[self._file_mode]), - self.TrailingPosition, + self.ActionPosition.TrailingPosition, ) self._browse_action.triggered.connect(self._on_browse_action_triggered) diff --git a/src/apps/ocioview/ocioview/widgets/list_widget.py b/src/apps/ocioview/ocioview/widgets/list_widget.py index 88fc5159c..8fc686058 100644 --- a/src/apps/ocioview/ocioview/widgets/list_widget.py +++ b/src/apps/ocioview/ocioview/widgets/list_widget.py @@ -3,7 +3,7 @@ from typing import Callable, Optional, TYPE_CHECKING, Union -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..utils import SignalsBlocked, next_name from .item_view import BaseItemView diff --git a/src/apps/ocioview/ocioview/widgets/log_view.py b/src/apps/ocioview/ocioview/widgets/log_view.py index 79cfd4ea6..91f79b8f4 100644 --- a/src/apps/ocioview/ocioview/widgets/log_view.py +++ b/src/apps/ocioview/ocioview/widgets/log_view.py @@ -3,7 +3,7 @@ from typing import Any, Optional -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import ICON_SIZE_BUTTON from ..style import ( diff --git a/src/apps/ocioview/ocioview/widgets/structure.py b/src/apps/ocioview/ocioview/widgets/structure.py index b29571756..dc1492a2e 100644 --- a/src/apps/ocioview/ocioview/widgets/structure.py +++ b/src/apps/ocioview/ocioview/widgets/structure.py @@ -4,7 +4,7 @@ from pathlib import Path from typing import Optional, Union -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import ICON_SIZE_BUTTON, BORDER_COLOR_ROLE from ..style import apply_top_tool_bar_style diff --git a/src/apps/ocioview/ocioview/widgets/table_widget.py b/src/apps/ocioview/ocioview/widgets/table_widget.py index c0da4af86..fc6df1d5c 100644 --- a/src/apps/ocioview/ocioview/widgets/table_widget.py +++ b/src/apps/ocioview/ocioview/widgets/table_widget.py @@ -3,7 +3,7 @@ from typing import Callable, Optional -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from ..constants import ICON_SIZE_ITEM from ..utils import SignalsBlocked, next_name diff --git a/src/apps/ocioview/ocioview/widgets/text_edit.py b/src/apps/ocioview/ocioview/widgets/text_edit.py index b1a18dd12..d654215ec 100644 --- a/src/apps/ocioview/ocioview/widgets/text_edit.py +++ b/src/apps/ocioview/ocioview/widgets/text_edit.py @@ -3,7 +3,7 @@ from typing import Optional -from PySide2 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from ..utils import SignalsBlocked diff --git a/src/apps/ocioview/requirements.txt b/src/apps/ocioview/requirements.txt index 1a453b819..2da54714f 100644 --- a/src/apps/ocioview/requirements.txt +++ b/src/apps/ocioview/requirements.txt @@ -1,7 +1,7 @@ -# imath +imageio numpy -# OpenImageIO pygments PyOpenGL -PySide2 +PySide6 QtAwesome +OpenColorIO \ No newline at end of file diff --git a/src/apps/pyociodisplay/pyociodisplay.py b/src/apps/pyociodisplay/pyociodisplay.py index 1588001a7..3142f9ba9 100644 --- a/src/apps/pyociodisplay/pyociodisplay.py +++ b/src/apps/pyociodisplay/pyociodisplay.py @@ -11,11 +11,10 @@ import logging import sys -from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL +from PySide6 import QtCore, QtGui, QtWidgets, QtOpenGL from OpenGL import GL import PyOpenColorIO as ocio import OpenImageIO as oiio -import imath import numpy as np