diff --git a/openpype/style/data.json b/openpype/style/data.json
index c8adc0674a4..1db0c732cf2 100644
--- a/openpype/style/data.json
+++ b/openpype/style/data.json
@@ -51,6 +51,7 @@
"border-hover": "rgba(168, 175, 189, .3)",
"border-focus": "rgb(92, 173, 214)",
+ "restart-btn-bg": "#458056",
"delete-btn-bg": "rgb(201, 54, 54)",
"delete-btn-bg-disabled": "rgba(201, 54, 54, 64)",
diff --git a/openpype/tools/tray/images/gifts.png b/openpype/tools/tray/images/gifts.png
new file mode 100644
index 00000000000..57fb3f28631
Binary files /dev/null and b/openpype/tools/tray/images/gifts.png differ
diff --git a/openpype/tools/tray/pype_tray.py b/openpype/tools/tray/pype_tray.py
index 7f781402111..0d3e7ae04ca 100644
--- a/openpype/tools/tray/pype_tray.py
+++ b/openpype/tools/tray/pype_tray.py
@@ -29,11 +29,51 @@
ProjectSettings,
DefaultsNotDefined
)
-from openpype.tools.utils import WrappedCallbackItem
+from openpype.tools.utils import (
+ WrappedCallbackItem,
+ paint_image_with_color
+)
from .pype_info_widget import PypeInfoWidget
+# TODO PixmapLabel should be moved to 'utils' in other future PR so should be
+# imported from there
+class PixmapLabel(QtWidgets.QLabel):
+ """Label resizing image to height of font."""
+ def __init__(self, pixmap, parent):
+ super(PixmapLabel, self).__init__(parent)
+ self._empty_pixmap = QtGui.QPixmap(0, 0)
+ self._source_pixmap = pixmap
+
+ def set_source_pixmap(self, pixmap):
+ """Change source image."""
+ self._source_pixmap = pixmap
+ self._set_resized_pix()
+
+ def _get_pix_size(self):
+ size = self.fontMetrics().height() * 3
+ return size, size
+
+ def _set_resized_pix(self):
+ if self._source_pixmap is None:
+ self.setPixmap(self._empty_pixmap)
+ return
+ width, height = self._get_pix_size()
+ self.setPixmap(
+ self._source_pixmap.scaled(
+ width,
+ height,
+ QtCore.Qt.KeepAspectRatio,
+ QtCore.Qt.SmoothTransformation
+ )
+ )
+
+ def resizeEvent(self, event):
+ self._set_resized_pix()
+ super(PixmapLabel, self).resizeEvent(event)
+
+
class VersionDialog(QtWidgets.QDialog):
restart_requested = QtCore.Signal()
ignore_requested = QtCore.Signal()
@@ -43,7 +83,7 @@ class VersionDialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super(VersionDialog, self).__init__(parent)
- self.setWindowTitle("Wrong OpenPype version")
+ self.setWindowTitle("OpenPype update is needed")
icon = QtGui.QIcon(resources.get_openpype_icon_filepath())
self.setWindowIcon(icon)
self.setWindowFlags(
@@ -54,12 +94,23 @@ def __init__(self, parent=None):
self.setMinimumWidth(self._min_width)
self.setMinimumHeight(self._min_height)
- label_widget = QtWidgets.QLabel(self)
+ top_widget = QtWidgets.QWidget(self)
+
+ gift_pixmap = self._get_gift_pixmap()
+ gift_icon_label = PixmapLabel(gift_pixmap, top_widget)
+
+ label_widget = QtWidgets.QLabel(top_widget)
label_widget.setWordWrap(True)
- ignore_btn = QtWidgets.QPushButton("Ignore", self)
- ignore_btn.setObjectName("WarningButton")
- restart_btn = QtWidgets.QPushButton("Restart and Change", self)
+ top_layout = QtWidgets.QHBoxLayout(top_widget)
+ # top_layout.setContentsMargins(0, 0, 0, 0)
+ top_layout.setSpacing(10)
+ top_layout.addWidget(gift_icon_label, 0, QtCore.Qt.AlignCenter)
+ top_layout.addWidget(label_widget, 1)
+
+ ignore_btn = QtWidgets.QPushButton("Later", self)
+ restart_btn = QtWidgets.QPushButton("Restart && Update", self)
+ restart_btn.setObjectName("TrayRestartButton")
btns_layout = QtWidgets.QHBoxLayout()
btns_layout.addStretch(1)
@@ -67,7 +118,7 @@ def __init__(self, parent=None):
btns_layout.addWidget(restart_btn, 0)
layout = QtWidgets.QVBoxLayout(self)
- layout.addWidget(label_widget, 0)
+ layout.addWidget(top_widget, 0)
layout.addStretch(1)
layout.addLayout(btns_layout, 0)
@@ -79,6 +130,21 @@ def __init__(self, parent=None):
self.setStyleSheet(style.load_stylesheet())
+ def _get_gift_pixmap(self):
+ image_path = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),
+ "images",
+ "gifts.png"
+ )
+ src_image = QtGui.QImage(image_path)
+ colors = style.get_objected_colors()
+ color_value = colors["font"]
+
+ return paint_image_with_color(
+ src_image,
+ color_value.get_qcolor()
+ )
+
def showEvent(self, event):
super().showEvent(event)
self._restart_accepted = False
@@ -90,8 +156,8 @@ def closeEvent(self, event):
def update_versions(self, current_version, expected_version):
message = (
- "Your OpenPype version {} does"
- " not match to studio version {}"
+ "Running OpenPype version is {}."
+ " Your production has been updated to version {}."
).format(str(current_version), str(expected_version))
self._label_widget.setText(message)
@@ -113,6 +179,7 @@ def __init__(self, tray_widget, main_window):
self.tray_widget = tray_widget
self.main_window = main_window
self.pype_info_widget = None
+ self._restart_action = None
self.log = Logger.get_logger(self.__class__.__name__)
@@ -158,7 +225,14 @@ def _on_version_check_timer(self):
self.validate_openpype_version()
def validate_openpype_version(self):
- if is_current_version_studio_latest():
+ using_requested = is_current_version_studio_latest()
+ self._restart_action.setVisible(not using_requested)
+ if using_requested:
+ if (
+ self._version_dialog is not None
+ and self._version_dialog.isVisible()
+ ):
+ self._version_dialog.close()
return
if self._version_dialog is None:
@@ -170,25 +244,24 @@ def validate_openpype_version(self):
self._outdated_version_ignored
)
- if self._version_dialog.isVisible():
- return
-
expected_version = get_expected_version()
current_version = get_openpype_version()
self._version_dialog.update_versions(
current_version, expected_version
)
- self._version_dialog.exec_()
+ self._version_dialog.show()
+ self._version_dialog.raise_()
+ self._version_dialog.activateWindow()
def _restart_and_install(self):
self.restart()
def _outdated_version_ignored(self):
self.show_tray_message(
- "Outdated OpenPype version",
+ "OpenPype version is outdated",
(
"Please update your OpenPype as soon as possible."
- " All you have to do is to restart tray."
+ " To update, restart OpenPype Tray application."
)
)
@@ -341,9 +414,22 @@ def _add_version_item(self):
version_action = QtWidgets.QAction(version_string, self.tray_widget)
version_action.triggered.connect(self._on_version_action)
+
+ restart_action = QtWidgets.QAction(
+ "Restart && Update", self.tray_widget
+ )
+ restart_action.triggered.connect(self._on_restart_action)
+ restart_action.setVisible(False)
+
self.tray_widget.menu.addAction(version_action)
+ self.tray_widget.menu.addAction(restart_action)
self.tray_widget.menu.addSeparator()
+ self._restart_action = restart_action
+
+ def _on_restart_action(self):
+ self.restart()
+
def restart(self, reset_version=True):
"""Restart Tray tool.
diff --git a/openpype/tools/utils/__init__.py b/openpype/tools/utils/__init__.py
index 65025ac358e..eb0cb1eef50 100644
--- a/openpype/tools/utils/__init__.py
+++ b/openpype/tools/utils/__init__.py
@@ -6,7 +6,10 @@
)
from .error_dialog import ErrorMessageBox
-from .lib import WrappedCallbackItem
+from .lib import (
+ WrappedCallbackItem,
+ paint_image_with_color
+)
__all__ = (
@@ -18,4 +21,5 @@
"ErrorMessageBox",
"WrappedCallbackItem",
+ "paint_image_with_color",
)