ayon-core/openpype/modules/sync_server/tray/app.py
2022-12-13 17:46:43 +01:00

162 lines
5.3 KiB
Python

from qtpy import QtWidgets, QtCore, QtGui
from openpype.tools.settings import style
from openpype import resources
from .widgets import (
SyncProjectListWidget,
SyncRepresentationSummaryWidget
)
class SyncServerWindow(QtWidgets.QDialog):
"""
Main window that contains list of synchronizable projects and summary
view with all synchronizable representations for first project
"""
def __init__(self, sync_server, parent=None):
super(SyncServerWindow, self).__init__(parent)
self.sync_server = sync_server
self.setWindowFlags(QtCore.Qt.Window)
self.setFocusPolicy(QtCore.Qt.StrongFocus)
self.setStyleSheet(style.load_stylesheet())
self.setWindowIcon(QtGui.QIcon(resources.get_openpype_icon_filepath()))
self.resize(1450, 700)
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self._hide_message)
body = QtWidgets.QWidget(self)
footer = QtWidgets.QWidget(self)
footer.setFixedHeight(20)
left_column = QtWidgets.QWidget(body)
left_column_layout = QtWidgets.QVBoxLayout(left_column)
self.projects = SyncProjectListWidget(sync_server, self)
self.projects.refresh() # force selection of default
left_column_layout.addWidget(self.projects)
self.pause_btn = QtWidgets.QPushButton("Pause server")
left_column_layout.addWidget(self.pause_btn)
checkbox = QtWidgets.QCheckBox("Show only enabled", self)
checkbox.setStyleSheet("QCheckBox{spacing: 5px;"
"padding:5px 5px 5px 5px;}")
checkbox.setChecked(True)
self.show_only_enabled_chk = checkbox
left_column_layout.addWidget(self.show_only_enabled_chk)
repres = SyncRepresentationSummaryWidget(
sync_server,
project=self.projects.current_project,
parent=self)
container = QtWidgets.QWidget()
container_layout = QtWidgets.QHBoxLayout(container)
container_layout.setContentsMargins(0, 0, 0, 0)
split = QtWidgets.QSplitter()
split.addWidget(left_column)
split.addWidget(repres)
split.setSizes([180, 950, 200])
container_layout.addWidget(split)
body_layout = QtWidgets.QHBoxLayout(body)
body_layout.addWidget(container)
body_layout.setContentsMargins(0, 0, 0, 0)
self.message = QtWidgets.QLabel(footer)
self.message.hide()
footer_layout = QtWidgets.QVBoxLayout(footer)
footer_layout.addWidget(self.message)
footer_layout.setContentsMargins(20, 0, 0, 0)
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(body)
layout.addWidget(footer)
self.setWindowTitle("Sync Queue")
self.projects.project_changed.connect(
self._on_project_change
)
self.pause_btn.clicked.connect(self._pause)
self.pause_btn.setAutoDefault(False)
self.pause_btn.setDefault(False)
repres.message_generated.connect(self._update_message)
self.projects.message_generated.connect(self._update_message)
self.show_only_enabled_chk.stateChanged.connect(
self._on_enabled_change
)
self.representationWidget = repres
def showEvent(self, event):
self.representationWidget.set_project(self.projects.current_project)
self.projects.refresh()
self._set_running(True)
super().showEvent(event)
def closeEvent(self, event):
self._set_running(False)
super().closeEvent(event)
def _on_project_change(self):
if self.projects.current_project is None:
return
self.representationWidget.set_project(self.projects.current_project)
project_name = self.projects.current_project
if not self.sync_server.get_sync_project_setting(project_name):
self.projects.message_generated.emit(
"Project {} not active anymore".format(project_name))
self.projects.refresh()
return
def _on_enabled_change(self):
"""Called when enabled projects only checkbox is toggled."""
self.projects.show_only_enabled = \
self.show_only_enabled_chk.isChecked()
self.projects.refresh()
self.representationWidget.set_project(None)
def _set_running(self, running):
self.representationWidget.model.is_running = running
self.representationWidget.model.timer.setInterval(0)
def _pause(self):
if self.sync_server.is_paused():
self.sync_server.unpause_server()
self.pause_btn.setText("Pause server")
else:
self.sync_server.pause_server()
self.pause_btn.setText("Unpause server")
self.projects.refresh()
def _update_message(self, value):
"""
Update and show message in the footer
"""
self.message.setText(value)
if self.message.isVisible():
self.message.repaint()
else:
self.message.show()
msec_delay = 3000
self.timer.start(msec_delay)
def _hide_message(self):
"""
Hide message in footer
Called automatically by self.timer after a while
"""
self.message.setText("")
self.message.hide()