From bf1994a0746b5bc538592ca2e4361edfda95ea89 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 22 Nov 2018 17:58:24 +0100 Subject: [PATCH] Added event server, seems like working properly --- pype/ftrack/ftrackRun.py | 195 +++++++++++++++++++++++++++--------- pype/ftrack/login_dialog.py | 11 +- pype/ftrack/tray.py | 52 ---------- 3 files changed, 155 insertions(+), 103 deletions(-) delete mode 100644 pype/ftrack/tray.py diff --git a/pype/ftrack/ftrackRun.py b/pype/ftrack/ftrackRun.py index a1491c737e..6e7f20ba1d 100644 --- a/pype/ftrack/ftrackRun.py +++ b/pype/ftrack/ftrackRun.py @@ -7,19 +7,24 @@ import time from app import style from app.vendor.Qt import QtCore, QtGui, QtWidgets from pype.ftrack import credentials, login_dialog as login_dialog +from app.api import Logger +import actionServer, eventServer +log = Logger.getLogger(__name__) # Validation if alredy logged into Ftrack class FtrackRunner: def __init__(self, main_parent=None, parent=None): self.parent = parent - self.loginWidget = login_dialog.Login_Dialog_ui() + self.loginWidget = login_dialog.Login_Dialog_ui(self) + self.actionThread = None + self.actionServer = actionServer.FtrackActionServer() + self.eventThread = None + self.eventServer = eventServer.FtrackEventServer() - self.setServer() - try: - self.validate() - except Exception as e: - print(e) + self.boolLogged = False + self.boolActionServer = False + self.boolEventServer = False def showLoginWidget(self): self.loginWidget.show() @@ -39,66 +44,158 @@ class FtrackRunner: self.showLoginWidget() except Exception as e: - print("We are unable to connect to Ftrack") - print(e) + log.error("We are unable to connect to Ftrack: {0}".format(e)) validation = credentials._check_credentials() if validation is True: - print("You are connected to Ftrack") + log.info("Connected to Ftrack successfully") + self.loginChange() else: - print("Please sign in") + log.warning("Please sign in to Ftrack") + self.boolLogged = False + self.setMenuVisibility() + + return validation + + # Necessary - login_dialog works with this method after logging in + def loginChange(self): + self.boolLogged = True + self.setMenuVisibility() + self.runActionServer() def logout(self): credentials._clear_credentials() - print("Logged out of Ftrack") + self.stopActionServer() + self.stopEventServer() + log.info("Logged out of Ftrack") + self.boolLogged = False + self.setMenuVisibility() + + # Actions part + def runActionServer(self): + if self.actionThread is None: + self.actionThread = threading.Thread(target=self.setActionServer) + self.actionThread.daemon=True + self.actionThread.start() + + log.info("Ftrack action server launched") + self.boolActionServer = True + self.setMenuVisibility() + + def setActionServer(self): + self.actionServer.run_action_server() + + def resetActionServer(self): + self.stopActionServer() + self.runActionServer() + + def stopActionServer(self): + try: + self.actionServer.stop_action_session() + if self.actionThread is not None: + self.actionThread.join() + self.actionThread = None + + log.info("Ftrack action server stopped") + self.boolActionServer = False + self.setMenuVisibility() + except Exception as e: + log.error("During Killing action server: {0}".format(e)) + + # Events part + def runEventServer(self): + if self.eventThread is None: + self.eventThread = threading.Thread(target=self.setEventServer) + self.eventThread.daemon=True + self.eventThread.start() + + log.info("Ftrack event server launched") + self.boolEventServer = True + self.setMenuVisibility() + + def setEventServer(self): + self.eventServer.run_event_server() + + def resetEventServer(self): + self.stopEventServer() + self.runEventServer() + + def stopEventServer(self): + try: + self.eventServer.stop_event_session() + if self.eventThread is not None: + self.eventThread.join() + self.eventThread = None + + log.info("Ftrack event server stopped") + self.boolEventServer = False + self.setMenuVisibility() + except Exception as e: + log.error("During Killing Event server: {0}".format(e)) + + # Definition of Tray menu def trayMenu(self, parent): # Menu for Tray App - menu = QtWidgets.QMenu('Ftrack', parent) - menu.setProperty('submenu', 'on') - menu.setStyleSheet(style.load_stylesheet()) + self.menu = QtWidgets.QMenu('Ftrack', parent) + self.menu.setProperty('submenu', 'on') + self.menu.setStyleSheet(style.load_stylesheet()) # Actions - server - smActionS = menu.addMenu("Servers") - aRunActionS = QtWidgets.QAction("Run action server", smActionS) - aRunActionS.triggered.connect(self.runServer) - aStopActionS = QtWidgets.QAction("Stop action server", smActionS) - aStopActionS.triggered.connect(self.stopServer) + self.smActionS = self.menu.addMenu("Action server") + self.aRunActionS = QtWidgets.QAction("Run action server", self.smActionS) + self.aRunActionS.triggered.connect(self.runActionServer) + self.aResetActionS = QtWidgets.QAction("Reset action server", self.smActionS) + self.aResetActionS.triggered.connect(self.resetActionServer) + self.aStopActionS = QtWidgets.QAction("Stop action server", self.smActionS) + self.aStopActionS.triggered.connect(self.stopActionServer) - smActionS.addAction(aRunActionS) - smActionS.addAction(aStopActionS) + self.smActionS.addAction(self.aRunActionS) + self.smActionS.addAction(self.aResetActionS) + self.smActionS.addAction(self.aStopActionS) + + # Actions - server + self.smEventS = self.menu.addMenu("Event server") + self.aRunEventS = QtWidgets.QAction("Run event server", self.smEventS) + self.aRunEventS.triggered.connect(self.runEventServer) + self.aResetEventS = QtWidgets.QAction("Reset event server", self.smEventS) + self.aResetEventS.triggered.connect(self.resetEventServer) + self.aStopEventS = QtWidgets.QAction("Stop event server", self.smEventS) + self.aStopEventS.triggered.connect(self.stopEventServer) + + self.smEventS.addAction(self.aRunEventS) + self.smEventS.addAction(self.aResetEventS) + self.smEventS.addAction(self.aStopEventS) # Actions - basic - aLogin = QtWidgets.QAction("Login",menu) - aLogin.triggered.connect(self.validate) - aLogout = QtWidgets.QAction("Logout",menu) - aLogout.triggered.connect(self.logout) + self.aLogin = QtWidgets.QAction("Login",self.menu) + self.aLogin.triggered.connect(self.validate) + self.aLogout = QtWidgets.QAction("Logout",self.menu) + self.aLogout.triggered.connect(self.logout) - menu.addAction(aLogin) - menu.addAction(aLogout) + self.menu.addAction(self.aLogin) + self.menu.addAction(self.aLogout) - return menu + self.boolLogged = False + self.setMenuVisibility() - def setServer(self): - fname = os.path.join(os.environ["FTRACK_ACTION_SERVER"], "actionServer.py") - print(fname) - DETACHED_PROCESS = 0x00000008 - self.aServer = subprocess.Popen( - [fname], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - universal_newlines=True, - bufsize=1, - cwd=None, - env=os.environ, - executable=sys.executable, - creationflags=DETACHED_PROCESS - ) + return self.menu - def runServer(self): - print("Running server") - self.aServer.wait() + # Definition of visibility of each menu actions + def setMenuVisibility(self): - def stopServer(self): - print("Stopping server") - self.aServer.close() + self.smActionS.menuAction().setVisible(self.boolLogged) + self.smEventS.menuAction().setVisible(self.boolLogged) + self.aLogin.setVisible(not self.boolLogged) + self.aLogout.setVisible(self.boolLogged) + + if self.boolLogged is False: + return + + self.aRunActionS.setVisible(not self.boolActionServer) + self.aResetActionS.setVisible(self.boolActionServer) + self.aStopActionS.setVisible(self.boolActionServer) + + self.aRunEventS.setVisible(not self.boolEventServer) + self.aResetEventS.setVisible(self.boolEventServer) + self.aStopEventS.setVisible(self.boolEventServer) diff --git a/pype/ftrack/login_dialog.py b/pype/ftrack/login_dialog.py index 15d3caf7be..020f917b9a 100644 --- a/pype/ftrack/login_dialog.py +++ b/pype/ftrack/login_dialog.py @@ -19,8 +19,13 @@ class Login_Dialog_ui(QtWidgets.QWidget): def __init__(self, parent=None): - super(Login_Dialog_ui, self).__init__(parent) + super(Login_Dialog_ui, self).__init__() + self.parent = parent + + self.setWindowIcon(self.parent.parent.icon) + self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint) + self.loginSignal.connect(self.loginWithCredentials) self._translate = QtCore.QCoreApplication.translate @@ -33,10 +38,11 @@ class Login_Dialog_ui(QtWidgets.QWidget): self.resize(self.SIZE_W, self.SIZE_H) self.setMinimumSize(QtCore.QSize(self.SIZE_W, self.SIZE_H)) + self.setMaximumSize(QtCore.QSize(self.SIZE_W+100, self.SIZE_H+100)) self.setStyleSheet(style.load_stylesheet()) self.setLayout(self._main()) - self.setWindowTitle('FTrack Login') + self.setWindowTitle('Pype - Ftrack Login') def _main(self): self.main = QtWidgets.QVBoxLayout() @@ -279,6 +285,7 @@ class Login_Dialog_ui(QtWidgets.QWidget): if verification is True: credentials._save_credentials(username, apiKey) credentials._set_env(username, apiKey) + self.parent.loginChange() self._close_widget() def closeEvent(self, event): diff --git a/pype/ftrack/tray.py b/pype/ftrack/tray.py deleted file mode 100644 index 86e645475b..0000000000 --- a/pype/ftrack/tray.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -import sys -import textwrap -from pype.ftrack.ftrackRun import FtrackRunner, login_dialog -from app import style -from app.vendor.Qt import QtCore, QtGui, QtWidgets - - -class SystemTrayIcon(QtWidgets.QSystemTrayIcon): - def __init__(self, parent=None): - - icon = r'C:\Users\jakub.trllo\CODE\pype-setup\repos\avalon-launcher\launcher\res\icon\main.png' - icon = QtGui.QIcon(icon) - - QtWidgets.QSystemTrayIcon.__init__(self, icon, parent) - - # Store parent - QtWidgets.QMainWindow() - self.parent = parent - - # Setup menu in Tray - self.menu = QtWidgets.QMenu() - self.menu.setStyleSheet(style.load_stylesheet()) - - # Add ftrack menu (TODO - Recognize that ftrack is used!!!!!!) - self.ftrack = FtrackRunner(self.parent, self) - self.menu.addMenu(self.ftrack.trayMenu(self.menu)) - - # Add Exit action to menu - aExit = QtWidgets.QAction("Exit", self) - aExit.triggered.connect(self.exit) - self.menu.addAction(aExit) - - # Add menu to Context of SystemTrayIcon - self.setContextMenu(self.menu) - - def exit(self): - QtCore.QCoreApplication.exit() - - -def _sys_tray(): - # code source: https://stackoverflow.com/questions/893984/pyqt-show-menu-in-a-system-tray-application - add answer PyQt5 - #PyQt4 to PyQt5 version: https://stackoverflow.com/questions/20749819/pyqt5-failing-import-of-qtgui - app = QtWidgets.QApplication(sys.argv) - # app.setQuitOnLastWindowClosed(True) - w = QtWidgets.QMainWindow() - # w = QtWidgets.QWidget() - trayIcon = SystemTrayIcon(w) - trayIcon.show() - sys.exit(app.exec_()) - -if (__name__ == ('__main__')): - _sys_tray()