Beispiel #1
0
	def addAction( self, menuname, separator, actionname, function, iconname = None):
		if separator: self.menu[menuname].addSeparator()
		if iconname is None: iconname = actionname.lower().replace(' ','_').replace('.','')
		iconpath = cgruutils.getIconFileName( iconname)
		action = QtGui.QAction( actionname, self)
		if iconpath is not None: action.setIcon( QtGui.QIcon( iconpath))
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), function)
		self.menu[menuname].addAction( action)				
Beispiel #2
0
	def addMenu( self, parentmenu, menuname, iconname = None):
		if menuname in self.menu: return False
		if iconname is None: iconname = menuname.lower().replace(' ','_').replace('.','')
		iconpath = cgruutils.getIconFileName( iconname)
		if iconpath is not None:
			self.menu[menuname] = parentmenu.addMenu( QtGui.QIcon( iconpath), menuname)
		else:
			self.menu[menuname] = parentmenu.addMenu( menuname)
		return True
Beispiel #3
0
	def __init__(self, parent=None):
		QtGui.QTextEdit.__init__(self, parent)

		self.setWindowTitle(
			'Configuration: %s version %s' % (
				cgruconfig.VARS['company'],
				cgruconfig.VARS['CGRU_VERSION']
			)
		)

		self.ftitle = QtGui.QTextCharFormat()
		self.ftitle.setFontWeight(QtGui.QFont.Bold)
		self.ftitle.setFontItalic(True)
		self.fname = QtGui.QTextCharFormat()
		self.fname.setFontWeight(QtGui.QFont.Bold)
		self.fvalue = QtGui.QTextCharFormat()
		self.fundefined = QtGui.QTextCharFormat()
		self.fundefined.setFontItalic(True)

		self.textCursor().insertText('Python:\n', self.ftitle)
		self.appendVar(cgrupyqt.PythonQtType, str(cgrupyqt.PythonQt))
		self.appendVar('sys.prefix', sys.prefix)
		self.appendVar('Executable', os.getenv('CGRU_PYTHONEXE'))
		self.appendVar('Version', sys.version)

		self.textCursor().insertText('\nVariables:\n', self.ftitle)

		self.appendVars(cgruconfig.VARS)

		self.textCursor().insertText('\nAFANASY Environment:\n', self.ftitle)
		self.appendEnvVar('AF_ROOT')
		self.appendEnvVar('AF_RENDER_CMD')
		self.appendEnvVar('AF_WATCH_CMD')

		self.textCursor().insertText('\nPython Environment:\n', self.ftitle)
		self.appendEnvVar('PYTHONHOME')
		self.appendEnvVar('PYTHONPATH')
		self.appendEnvVar('CGRU_PYTHON')
		self.appendEnvVar('AF_PYTHON')

		self.textCursor().insertText('\nSystem Environment:\n', self.ftitle)
		self.appendEnvVar('PATH')
		self.appendVar('PWD', os.getcwd())

		for afile in cgruconfig.VARS['filenames']:
			self.appendConfigFile(afile)

		# Set window icon:
		iconpath = cgruutils.getIconFileName('info')
		if iconpath is not None:
			self.setWindowIcon(QtGui.QIcon(iconpath))

		self.resize(self.viewport().size())
		self.moveCursor(QtGui.QTextCursor.Start)
		self.setReadOnly(True)
		self.show()
Beispiel #4
0
 def __init__(self, parent, name, command, iconpath=None):
     QtWidgets.QAction.__init__(self, name, parent)
     if iconpath is not None:
         iconpath = cgruutils.getIconFileName(iconpath)
         if iconpath is not None:
             self.setIcon(QtGui.QIcon(iconpath))
         else:
             print('WARNING: Icon "%s" does not exist.' % iconpath)
     self.name = name
     self.cmd = command
Beispiel #5
0
	def __init__( self, parent, name, command, iconpath = None):
		QtGui.QAction.__init__( self, name, parent)
		if iconpath is not None:
			iconpath = cgruutils.getIconFileName( iconpath)
			if iconpath is not None:
				self.setIcon( QtGui.QIcon( iconpath))
			else:
				print('WARNING: Icon "%s" does not exist.' % iconpath)
		self.name = name
		self.cmd = command
Beispiel #6
0
 def addMenu(self, parentmenu, menuname, iconname=None):
     if menuname in self.menu: return False
     if iconname is None:
         iconname = menuname.lower().replace(' ', '_').replace('.', '')
     iconpath = cgruutils.getIconFileName(iconname)
     if iconpath is not None:
         self.menu[menuname] = parentmenu.addMenu(QtGui.QIcon(iconpath),
                                                  menuname)
     else:
         self.menu[menuname] = parentmenu.addMenu(menuname)
     return True
Beispiel #7
0
    def __init__(self, parent=None):
        QtWidgets.QTextEdit.__init__(self, parent)

        self.setWindowTitle(
            'Configuration: %s version %s' %
            (cgruconfig.VARS['company'], cgruconfig.VARS['CGRU_VERSION']))

        self.ftitle = QtGui.QTextCharFormat()
        self.ftitle.setFontWeight(QtGui.QFont.Bold)
        self.ftitle.setFontItalic(True)
        self.fname = QtGui.QTextCharFormat()
        self.fname.setFontWeight(QtGui.QFont.Bold)
        self.fvalue = QtGui.QTextCharFormat()
        self.fundefined = QtGui.QTextCharFormat()
        self.fundefined.setFontItalic(True)

        self.appendVar('Platform', ",".join(cgruconfig.VARS['platform']))

        self.textCursor().insertText('\nPython:\n', self.ftitle)
        self.appendVar(
            'Qt', '%s %s (%s)' %
            (Qt.__qt_version__, Qt.__binding__, Qt.__binding_version__))
        self.appendVar('sys.prefix', sys.prefix)
        self.appendVar('Executable', os.getenv('CGRU_PYTHONEXE'))
        self.appendVar('Version', sys.version)

        self.textCursor().insertText('\nEnvironment:\n', self.ftitle)
        self.appendEnvVar('PYTHONHOME')
        self.appendEnvVar('PYTHONPATH')
        self.appendEnvVar('CGRU_PYTHON')
        self.appendEnvVar('AF_ROOT')
        self.appendEnvVar('AF_PYTHON')
        self.appendEnvVar('AF_RENDER_CMD')
        self.appendEnvVar('AF_WATCH_CMD')
        self.appendVar('PWD', os.getcwd())
        self.appendEnvVar('PATH')

        self.textCursor().insertText('\nVariables:\n', self.ftitle)

        self.appendVars(cgruconfig.VARS)

        for afile in cgruconfig.VARS['filenames']:
            self.appendConfigFile(afile)

        # Set window icon:
        iconpath = cgruutils.getIconFileName('info')
        if iconpath is not None:
            self.setWindowIcon(QtGui.QIcon(iconpath))

        self.resize(self.viewport().size())
        self.moveCursor(QtGui.QTextCursor.Start)
        self.setReadOnly(True)
        self.show()
Beispiel #8
0
 def addAction(self,
               menuname,
               separator,
               actionname,
               function,
               iconname=None):
     if separator: self.menu[menuname].addSeparator()
     if iconname is None:
         iconname = actionname.lower().replace(' ', '_').replace('.', '')
     iconpath = cgruutils.getIconFileName(iconname)
     action = QtGui.QAction(actionname, self)
     if iconpath is not None: action.setIcon(QtGui.QIcon(iconpath))
     QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'), function)
     self.menu[menuname].addAction(action)
    def initUI(self):
        # Window Title
        self.setWindowTitle('Pool Server Configurator   CGRU %s' %
                            os.getenv('CGRU_VERSION', ''))
        
        # Window icon
        iconpath = cgruutils.getIconFileName('afanasy')
        if iconpath is not None:
            self.setWindowIcon(QtGui.QIcon(iconpath))
        
        self.ipLabel = QtWidgets.QLabel("Binding IP:")
        self.ipLineEdit = QtGui.QLineEdit()
        self.ipLineEdit.setPlaceholderText("If empty localhost is set.")
        self.ipLayout = QtWidgets.QHBoxLayout()
        self.ipLayout.addWidget(self.ipLabel)
        self.ipLayout.addWidget(self.ipLineEdit)

        self.portLabel = QtWidgets.QLabel("Port:")
        self.portSpinBox = QtGui.QSpinBox()
        self.portSpinBox.setMinimum(0)
        self.portSpinBox.setMaximum(65535)
        self.portLayout = QtWidgets.QHBoxLayout()
        self.portLayout.addWidget(self.portLabel)
        self.portLayout.addWidget(self.portSpinBox)

        self.maxClientsLabel = QtWidgets.QLabel("Max. Clients: (Renderfarm clients.)")
        self.maxClientsSpinBox = QtGui.QSpinBox()
        self.maxClientsSpinBox.setMinimum(0)
        self.maxClientsSpinBox.setMaximum(100000)
        self.maxClientsLayout = QtWidgets.QHBoxLayout()
        self.maxClientsLayout.addWidget(self.maxClientsLabel)
        self.maxClientsLayout.addWidget(self.maxClientsSpinBox)

        self.saveButton = QtWidgets.QPushButton("Save")
        self.saveButton.clicked.connect(self.save)

        # Top Root Layout
        self.topLayout = QtWidgets.QVBoxLayout(self)
        self.topLayout.addLayout(self.ipLayout)
        self.topLayout.addLayout(self.portLayout)
        self.topLayout.addLayout(self.maxClientsLayout)
        self.topLayout.addWidget(self.saveButton)
    def initUI(self):
        # Modality
        self.setWindowModality(QtCore.Qt.ApplicationModal)

        # Window Title
        self.setWindowTitle("Scanning network for hosts ...")
        
        # Window icon
        iconpath = cgruutils.getIconFileName('afanasy')
        if iconpath is not None:
            self.setWindowIcon(QtGui.QIcon(iconpath))
        
        # ProgessBar
        self.progressBar = QtGui.QProgressBar()
        self.progressBar.minimum = 1
        self.progressBar.maximum = 100

        # Root node.
        self.topLayout = QtWidgets.QHBoxLayout(self)
        self.topLayout.addWidget(self.progressBar)
Beispiel #11
0
	def __init__( self, parent = None):
		QtGui.QSystemTrayIcon.__init__( self, parent)
		self.parent = parent

		# Menu:
		self.menu = dict()
		self.menu['menu'] = QtGui.QMenu()

		# Update item only if CGRU_UPDATE_CMD defined:
		if cgruconfig.VARS['CGRU_UPDATE_CMD'] is not None:
			action = QtGui.QAction('Update', self)
			QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.update)
			self.menu['menu'].addAction( action)
			self.menu['menu'].addSeparator()

		# Load menu:
		menu_path = os.path.join( os.path.join( cgruconfig.VARS['CGRU_LOCATION'],'start'))
		menu_paths = cgruconfig.VARS['menu_path']
		if menu_paths is None: menu_paths = menu_path
		if menu_paths.find(';') != -1: menu_paths = menu_paths.split(';')
		elif sys.platform.find('win') == -1: menu_paths = menu_paths.split(':')
		else: menu_paths = [menu_paths]
		if not menu_path in menu_paths: menu_paths.append( menu_path)
		for menu_path in menu_paths:
			if not os.path.isdir( menu_path): continue
			for dirpath, dirnames, filenames in os.walk( menu_path, True, None, True):
				if dirpath.find('/.') != -1: continue
				if dirpath.find('\\.') != -1: continue
				menuname = os.path.basename( dirpath)
				if menuname == os.path.basename( menu_path):
					menuname = 'menu'
				else:
					self.addMenu( self.menu['menu'], menuname)
				filenames.sort()
				was_separator = True
				for filename in filenames:
					if filename[0] == '.' or filename[0] == '_': continue
					if sys.platform[:3] == 'win':
						if filename[-4:] != '.cmd': continue
						itemname = filename[:-4]
					else:
						if filename[-3:] != '.sh': continue
						itemname = filename[:-3]
					filename = os.path.join( dirpath, filename)
					file = open( filename,'r')
					lines = file.readlines()
					file.close()
					iconpath = None
					separator = False
					for line in lines:
						if line.find('Name=') != -1:
							itemname = line.split('Name=')[-1].strip()
						if line.find('Icon=') != -1:
							iconpath = line.split('Icon=')[-1].strip()
						if line.find('Separator') != -1: separator = True
					if separator:
						if not was_separator: self.menu[menuname].addSeparator()
						was_separator = True
					else: was_separator = False
					action = ActionCommand( self, itemname, filename, iconpath)
					self.menu[menuname].addAction( action)
					QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), action.runCommand)
					if separator: self.menu[menuname].addSeparator()

		# Add permanent items to 'Afanasy':
		if not self.addMenu( self.menu['menu'], 'AFANASY'): self.menu['AFANASY'].addSeparator()

		action = QtGui.QAction('Web GUI', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.afwebgui)
		self.menu['AFANASY'].addAction( action)
		self.menu['AFANASY'].addSeparator()

		action = QtGui.QAction('Set nibmy', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), nimby.setnimby)
		self.menu['AFANASY'].addAction( action)
		action = QtGui.QAction('Set NIMBY', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), nimby.setNIMBY)
		self.menu['AFANASY'].addAction( action)
		action = QtGui.QAction('Set Free', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), nimby.setFree)
		self.menu['AFANASY'].addAction( action)
		action = QtGui.QAction('Eject Tasks', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), nimby.ejectTasks)
		self.menu['AFANASY'].addAction( action)
		action = QtGui.QAction('Eject Not My Tasks', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), nimby.ejectNotMyTasks)
		self.menu['AFANASY'].addAction( action)
		action = QtGui.QAction('Render Info', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), self.renderInfo)
		self.menu['AFANASY'].addAction( action)

		self.menu['AFANASY'].addSeparator()

		action = QtGui.QAction('Nimby Schedule...', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), self.editNimby)
		self.menu['AFANASY'].addAction( action)

		self.menu['AFANASY'].addSeparator()

		action = QtGui.QAction('Set Server...', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.setAFANASYServer)
		self.menu['AFANASY'].addAction( action)

		self.menu['AFANASY'].addSeparator()

		action = QtGui.QAction('Exit Render', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.exitRender)
		self.menu['AFANASY'].addAction( action)
		action = QtGui.QAction('Exit Watch', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.exitMonitor)
		self.menu['AFANASY'].addAction( action)
		action = QtGui.QAction('Exit Talk', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.exitTalk)
		self.menu['AFANASY'].addAction( action)
		action = QtGui.QAction('Exit All Clients', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.exitClients)
		self.menu['AFANASY'].addAction( action)

		self.menu['menu'].addSeparator()

		# Add Software menu if it was not created by custom files:
		if not 'Software' in self.menu:
			self.addMenu( self.menu['menu'], 'Software')
			self.menu['menu'].addSeparator()
			action = QtGui.QAction( QtGui.QIcon( cgruutils.getIconFileName('folder')), '[ browse ]', self)
			QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), software.browse)
			self.menu['Software'].addAction( action)
			for soft in software.Names:
				icon = software.getIcon( soft)
				if icon is None:
					action = QtGui.QAction( soft, self)
				else:
					action = QtGui.QAction( icon, soft, self)
				eval("QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), software.start%s)" % soft)
				self.menu['Software'].addAction( action)
			# Software setup:
			self.menu['Setup Soft'] = QtGui.QMenu('Setup Soft')
			self.menu['Software'].addMenu( self.menu['Setup Soft'])
			for soft in software.Names:
				action = QtGui.QAction( soft, self)
				eval("QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), software.locate%s)" % soft)
				self.menu['Setup Soft'].addAction( action)
			# Software examples:
			self.menu['Examples'] = QtGui.QMenu('Examples')
			self.menu['Software'].addMenu( self.menu['Examples'])
			for soft in software.Names:
				action = QtGui.QAction( soft, self)
				eval("QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), software.example%s)" % soft)
				self.menu['Examples'].addAction( action)

		# Add permanent items to 'Configure':
		if not self.addMenu( self.menu['menu'], 'Configure'): self.menu['Configure'].addSeparator()
		action = QtGui.QAction('Reload Config', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.confReload)
		self.menu['Configure'].addAction( action)
		action = QtGui.QAction('Set Docs URL...', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.setDocsURL)
		self.menu['Configure'].addAction( action)
		action = QtGui.QAction('Edit Config...', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.editCGRUConfig)
		self.menu['Configure'].addAction( action)
		action = QtGui.QAction('Set Web Browser...', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.setWebBrowser)
		self.menu['Configure'].addAction( action)
		action = QtGui.QAction('Set Text Editor...', self)
		QtCore.QObject.connect( action, QtCore.SIGNAL('triggered()'), cmd.setTextEditor)
		self.menu['Configure'].addAction( action)

		self.addAction('menu', True,'Show Info...', self.cgruInfo,'info')
		self.addAction('menu', True,'Documentation', cmd.cgruDocs)
		self.addAction('menu', True,'Restart', cmd.restart)
		self.addAction('menu', False,'Quit && Exit Clients', cmd.quitExitClients)
		self.addAction('menu', False,'Quit', cmd.quit)

		self.setContextMenu( self.menu['menu'])

		# Prepare Icons:
		self.icons = dict()
		icon_filename = cgruconfig.VARS['tray_icon']
		if icon_filename is None: icon_filename = 'keeper'
		icon_filename = cgruutils.getIconFileName( icon_filename)
		self.icon_epmty = QtGui.QPixmap( icon_filename)
		self.icons['empty'] = QtGui.QIcon( self.icon_epmty)
		self.makeIcon('offline_free',		 online=False, nimby=False, busy=False)
		self.makeIcon('online_free',		  online=True,  nimby=False, busy=False)
		self.makeIcon('offline_nimby',		online=False, nimby=True,  busy=False)
		self.makeIcon('online_nimby',		 online=True,  nimby=True,  busy=False)
		self.makeIcon('offline_free_busy',  online=False, nimby=False, busy=True )
		self.makeIcon('online_free_busy',	online=True,  nimby=False, busy=True )
		self.makeIcon('offline_nimby_busy', online=False, nimby=True,  busy=True )
		self.makeIcon('online_nimby_busy',  online=True,  nimby=True,  busy=True )

		# Decorate and show:
		self.showIcon()
		self.setToolTip( cgruconfig.VARS['company'].upper() + ' Keeper ' + os.getenv('CGRU_VERSION', ''))
		QtCore.QObject.connect( self, QtCore.SIGNAL('activated( QSystemTrayIcon::ActivationReason)'), self.activated_slot)

		self.show()
    def initUI(self):
        # Window Title
        self.setWindowTitle('Afanasy Pool Manager   CGRU %s' %
                            os.getenv('CGRU_VERSION', ''))
        
        # Window icon
        iconpath = cgruutils.getIconFileName('afanasy')
        if iconpath is not None:
            self.setWindowIcon(QtGui.QIcon(iconpath))

        # Pools List
        self.poolsLabel = QtWidgets.QLabel("Pools")
        self.poolsList = QtWidgets.QListWidget()
        self.poolsList.itemClicked.connect(self.onPoolClicked)

        # Create Pool Button
        self.createPoolButton = QtWidgets.QPushButton("Create")
        self.createPoolButton.clicked.connect(self.createPool)

        # Edit Pool Button
        self.editPoolButton = QtWidgets.QPushButton("Edit")
        self.editPoolButton.clicked.connect(self.editPool)
        
        # Delete Pool Button
        self.deletePoolButton = QtWidgets.QPushButton("Delete")
        self.deletePoolButton.clicked.connect(self.deletePool)

        self.poolsButtonLayout = QtWidgets.QHBoxLayout()
        self.poolsButtonLayout.addWidget(self.createPoolButton)
        self.poolsButtonLayout.addWidget(self.editPoolButton)
        self.poolsButtonLayout.addWidget(self.deletePoolButton)

        self.poolsLayout = QtWidgets.QVBoxLayout()
        self.poolsLayout.addWidget(self.poolsLabel)
        self.poolsLayout.addWidget(self.poolsList)
        self.poolsLayout.addLayout(self.poolsButtonLayout)

        # Clients List
        self.clientsLabel = QtWidgets.QLabel("Clients")
        self.clientsList = QtWidgets.QListWidget()
        self.clientsList.itemClicked.connect(self.onClientClicked)

        # Add Client Button
        self.addClientButton = QtWidgets.QPushButton("Add Client(s)")
        self.addClientButton.clicked.connect(self.addClient)

        # Remove Client Button
        self.removeClientButton = QtWidgets.QPushButton("Remove Client")
        self.removeClientButton.clicked.connect(self.removeClient)

        self.clientsButtonLayout = QtWidgets.QHBoxLayout()
        self.clientsButtonLayout.addWidget(self.addClientButton)
        self.clientsButtonLayout.addWidget(self.removeClientButton)

        self.clientsLayout = QtWidgets.QVBoxLayout()
        self.clientsLayout.addWidget(self.clientsLabel)
        self.clientsLayout.addWidget(self.clientsList)
        self.clientsLayout.addLayout(self.clientsButtonLayout)

        self.listsLayout = QtWidgets.QHBoxLayout()
        self.listsLayout.addLayout(self.poolsLayout)
        self.listsLayout.addLayout(self.clientsLayout)

        # Top Root Layout
        self.topLayout = QtWidgets.QVBoxLayout(self)
        self.topLayout.addLayout(self.listsLayout)

        # Inits the MenuBar
        self.initMenuBar()
        self.initStatusBar()
        self.loadPools()
    def initUI(self):
        self.setFixedSize(780, 300)
        self.setWindowModality(QtCore.Qt.ApplicationModal)

        # Window Title
        self.setWindowTitle("Add Client(s)")
        
        # Window icon
        iconpath = cgruutils.getIconFileName('afanasy')
        if iconpath is not None:
            self.setWindowIcon(QtGui.QIcon(iconpath))

        # Network Scan List
        self.networkList = QtWidgets.QListWidget()
        self.scanNetworkButton = QtWidgets.QPushButton("Scan Network")
        self.scanNetworkButton.clicked.connect(self.scanNetwork)
        
        self.networkLayout = QtWidgets.QVBoxLayout()
        self.networkLayout.addWidget(self.networkList)
        self.networkLayout.addWidget(self.scanNetworkButton)

        self.networkGroupBox = QtWidgets.QGroupBox("Local Network")
        self.networkGroupBox.setLayout(self.networkLayout)

        # Add Hostname Button
        self.addHostnameButton = QtWidgets.QPushButton("(+) Hostname")
        self.addHostnameButton.clicked.connect(self.addHostname)

        # Remove Hostname Button
        self.remHostnameButton = QtWidgets.QPushButton("(-) Hostname")
        self.remHostnameButton.clicked.connect(self.removeHostname)

        self.hostnamesButtonsLayout = QtWidgets.QHBoxLayout()
        self.hostnamesButtonsLayout.addWidget(self.addHostnameButton)
        self.hostnamesButtonsLayout.addWidget(self.remHostnameButton)

        # Hostname List
        self.hostnamesList = QtWidgets.QListWidget()
        self.hostnamesLayout = QtWidgets.QVBoxLayout()
        self.hostnamesLayout.addWidget(self.hostnamesList)
        self.hostnamesLayout.addLayout(self.hostnamesButtonsLayout)

        self.hostnamesGroupBox = QtWidgets.QGroupBox("Hostnames")
        self.hostnamesGroupBox.setLayout(self.hostnamesLayout)

        # Afanasy Clients List
        self.clientsList = QtWidgets.QListWidget()

        self.clientsLayout = QtWidgets.QVBoxLayout()
        self.clientsLayout.addWidget(self.clientsList)

        self.clientsGroupBox = QtWidgets.QGroupBox("Afanasy Clients")
        self.clientsGroupBox.setLayout(self.clientsLayout)
       
        self.groupBoxesLayout = QtWidgets.QHBoxLayout()
        self.groupBoxesLayout.addWidget(self.clientsGroupBox)
        self.groupBoxesLayout.addWidget(self.hostnamesGroupBox)
        self.groupBoxesLayout.addWidget(self.networkGroupBox)

        # Save Button
        self.saveButton = QtWidgets.QPushButton("Save")
        self.saveButton.clicked.connect(self.save)

        # Root node
        self.topLayout = QtWidgets.QVBoxLayout(self)
        self.topLayout.addLayout(self.groupBoxesLayout)
        self.topLayout.addWidget(self.saveButton)
Beispiel #14
0
	def __init__(self):

		# Main Window
		QtGui.QWidget.__init__(self)
		self.constructed = False
		self.evaluated = False
		self.output = ''
		self.setWindowTitle('Afanasy Starter   CGRU %s' %
							os.getenv('CGRU_VERSION', ''))
		self.fields = dict()
		self.labels = dict()

		# Get File Type dependant dicts
		self.labelNode_name = labelNodeNameDict()
		self.labelNode_tooltip = labelNodeTooltipsDict()
		self.labelTake_name = labelTakeNameDict()
		self.labelTake_tooltip = labelTakeTooltipsDict()

		# Top level layouts:
		topLayout = QtGui.QVBoxLayout(self)
		tabwidget = QtGui.QTabWidget(self)
		topLayout.addWidget(tabwidget)

		# General Tab:
		generalwidget = QtGui.QWidget(self)
		tabwidget.addTab(generalwidget, 'Scene')
		generallayout = QtGui.QVBoxLayout(generalwidget)

		# Job Tab:
		jobwidget = QtGui.QWidget(self)
		tabwidget.addTab(jobwidget, 'Job')
		joblayout = QtGui.QVBoxLayout(jobwidget)

		# Advanced Tab:
		auxwidget = QtGui.QWidget(self)
		tabwidget.addTab(auxwidget, 'Advanced')
		advlayout = QtGui.QVBoxLayout(auxwidget)

		# Service Type:
		lFileType = QtGui.QHBoxLayout()
		generallayout.addLayout(lFileType)
		lFileType.addWidget(QtGui.QLabel('Override Service Type:', self))
		self.fields['servicetype'] = QtGui.QComboBox(self)
		lFileType.addWidget(self.fields['servicetype'])
		QtCore.QObject.connect(self.fields['servicetype'],
							   QtCore.SIGNAL('currentIndexChanged(int)'),
							   self.setFileType)

		# Scene:
		lScene = QtGui.QHBoxLayout()
		generallayout.addLayout(lScene)
		lScene.addWidget(QtGui.QLabel('File:', self))
		self.fields['scenefile'] = QtGui.QLineEdit(Scene, self)
		lScene.addWidget(self.fields['scenefile'])
		QtCore.QObject.connect(self.fields['scenefile'],
							   QtCore.SIGNAL('editingFinished()'),
							   self.evaluate)
		bBrowseScene = QtGui.QPushButton('Browse', self)
		lScene.addWidget(bBrowseScene)
		QtCore.QObject.connect(bBrowseScene,
							   QtCore.SIGNAL('pressed()'),
							   self.browseScene)

		# Working Directory:
		lWDir = QtGui.QHBoxLayout()
		generallayout.addLayout(lWDir)
		lWDir.addWidget(QtGui.QLabel('Working Directory/Project:', self))
		self.fields['wdir'] = QtGui.QLineEdit(self)
		lWDir.addWidget(self.fields['wdir'])
		QtCore.QObject.connect(self.fields['wdir'],
							   QtCore.SIGNAL('editingFinished()'),
							   self.evaluate)
		self.fields['scenewdir'] = QtGui.QCheckBox('Use Scene Folder', self)
		self.fields['scenewdir'].setChecked(True)
		QtCore.QObject.connect(self.fields['scenewdir'],
							   QtCore.SIGNAL('stateChanged(int)'),
							   self.evaluate)
		lWDir.addWidget(self.fields['scenewdir'])

		# Output images:
		lImages = QtGui.QHBoxLayout()
		generallayout.addLayout(lImages)
		lImages.addWidget(QtGui.QLabel('Output Images:', self))
		self.fields['outimages'] = QtGui.QLineEdit(self)
		lImages.addWidget(self.fields['outimages'])
		QtCore.QObject.connect(self.fields['outimages'],
							   QtCore.SIGNAL('editingFinished()'),
							   self.evaluate)
		lImages.addWidget(QtGui.QLabel('Browse'))
		bBrowseOutImages = QtGui.QPushButton('File', self)
		lImages.addWidget(bBrowseOutImages)
		QtCore.QObject.connect(bBrowseOutImages,
							   QtCore.SIGNAL('pressed()'),
							   self.browseOutImages)
		bBrowseOutFolder = QtGui.QPushButton('Dir', self)
		lImages.addWidget(bBrowseOutFolder)
		QtCore.QObject.connect(bBrowseOutFolder,
							   QtCore.SIGNAL('pressed()'),
							   self.browseOutFolder)

		# Frames:
		lFrames = QtGui.QHBoxLayout()
		generallayout.addLayout(lFrames)
		lFrames.addWidget(QtGui.QLabel('Frames:', self))
		self.fields['framestart'] = QtGui.QSpinBox(self)
		self.fields['framestart'].setRange(-1000000000, 1000000000)
		self.fields['framestart'].setValue(1)
		QtCore.QObject.connect(self.fields['framestart'],
							   QtCore.SIGNAL('valueChanged(int)'),
							   self.evaluate)
		lFrames.addWidget(self.fields['framestart'])

		self.fields['frameend'] = QtGui.QSpinBox(self)
		self.fields['frameend'].setRange(-1000000000, 1000000000)
		self.fields['frameend'].setValue(1)
		QtCore.QObject.connect(self.fields['frameend'],
							   QtCore.SIGNAL('valueChanged(int)'),
							   self.evaluate)
		lFrames.addWidget(self.fields['frameend'])

		lFrames.addWidget(QtGui.QLabel('By:', self))
		self.fields['frameby'] = QtGui.QSpinBox(self)
		lFrames.addWidget(self.fields['frameby'])
		QtCore.QObject.connect(self.fields['frameby'],
							   QtCore.SIGNAL('valueChanged(int)'),
							   self.evaluate)
		self.fields['frameby'].setRange(1, 1000000000)

		lFrames.addWidget(QtGui.QLabel('FPT:', self))
		self.fields['framespt'] = QtGui.QSpinBox(self)
		lFrames.addWidget(self.fields['framespt'])
		QtCore.QObject.connect(self.fields['framespt'],
							   QtCore.SIGNAL('valueChanged(int)'),
							   self.evaluate)
		self.fields['framespt'].setRange(1, 1000000000)
		self.fields['framespt'].setToolTip('Frames per task.')

		lFrames.addWidget(QtGui.QLabel('Seq:', self))
		self.fields['frameseq'] = QtGui.QSpinBox(self)
		lFrames.addWidget(self.fields['frameseq'])
		QtCore.QObject.connect(self.fields['frameseq'],
							   QtCore.SIGNAL('valueChanged(int)'),
							   self.evaluate)
		self.fields['frameseq'].setRange(-1000000, 1000000)
		self.fields['frameseq'].setValue(1)
		self.fields['frameseq'].setToolTip('Solve task with this step at first.')


		# Node / Camera / Take:
		lNode = QtGui.QHBoxLayout()
		generallayout.addLayout(lNode)
		self.labels['node'] = QtGui.QLabel(self.labelNode_name['default'])
		lNode.addWidget(self.labels['node'])
		self.labels['node'].setToolTip(self.labelNode_tooltip['default'])
		self.fields['node'] = QtGui.QLineEdit(self)
		lNode.addWidget(self.fields['node'])
		QtCore.QObject.connect(self.fields['node'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)
		self.labels['take'] = QtGui.QLabel(self.labelTake_name['default'])
		lNode.addWidget(self.labels['take'])
		self.labels['take'].setToolTip(self.labelTake_tooltip['default'])
		self.fields['take'] = QtGui.QLineEdit(self)
		lNode.addWidget(self.fields['take'])
		QtCore.QObject.connect(self.fields['take'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)

		# Advanced:
		# OS Type:
		osLayout = QtGui.QHBoxLayout()
		advlayout.addLayout(osLayout)
		osLayout.addWidget(QtGui.QLabel('Operating System Type:'))
		self.fields['os'] = QtGui.QLineEdit(self)
		osLayout.addWidget(self.fields['os'])
		QtCore.QObject.connect(self.fields['os'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)

		# Tasks Command:
		exelayout = QtGui.QHBoxLayout()
		advlayout.addLayout(exelayout)
		label = QtGui.QLabel('Tasks Executable:')
		label.setToolTip('Override launching programm')
		exelayout.addWidget(label)
		self.fields['exec'] = QtGui.QLineEdit(self)
		exelayout.addWidget(self.fields['exec'])
		QtCore.QObject.connect(self.fields['exec'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)
		self.execBrowseButton = QtGui.QPushButton('Browse', self)
		exelayout.addWidget(self.execBrowseButton)
		QtCore.QObject.connect(self.execBrowseButton,
							   QtCore.SIGNAL('pressed()'),
							   self.browseExec)

		# Extra Arguments:
		exarglayout = QtGui.QHBoxLayout()
		advlayout.addLayout(exarglayout)
		exarglayout.addWidget(QtGui.QLabel('Extra Arguments:'))
		self.fields['extrargs'] = QtGui.QLineEdit(self)
		exarglayout.addWidget(self.fields['extrargs'])
		QtCore.QObject.connect(self.fields['extrargs'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)

		# Preview:
		prvlayout = QtGui.QHBoxLayout()
		advlayout.addLayout(prvlayout)
		prvlayout.addWidget(QtGui.QLabel('Preview:'))
		self.fields['preview'] = QtGui.QLineEdit(self)
		prvlayout.addWidget(self.fields['preview'])
		QtCore.QObject.connect(self.fields['preview'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)

		# Job:
		lJobName = QtGui.QHBoxLayout()
		joblayout.addLayout(lJobName)
		lJobName.addWidget(QtGui.QLabel('Name:', self))
		self.fields['jobname'] = QtGui.QLineEdit(self)
		lJobName.addWidget(self.fields['jobname'])
		QtCore.QObject.connect(self.fields['jobname'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)
		self.fields['jobnamescene'] = QtGui.QCheckBox('Use Scene Name', self)
		lJobName.addWidget(self.fields['jobnamescene'])
		self.fields['jobnamescene'].setChecked(True)
		QtCore.QObject.connect(self.fields['jobnamescene'],
							   QtCore.SIGNAL('stateChanged(int)'),
							   self.evaluate)

		# Capacity, max run tasks, priority:
		lCapMax = QtGui.QHBoxLayout()
		joblayout.addLayout(lCapMax)
		lCapMax.addWidget(QtGui.QLabel('Capacity:', self))
		self.fields['capacity'] = QtGui.QSpinBox(self)
		lCapMax.addWidget(self.fields['capacity'])
		self.fields['capacity'].setRange(-1, 1000000)
		self.fields['capacity'].setValue(-1)
		QtCore.QObject.connect(self.fields['capacity'],
							   QtCore.SIGNAL('valueChanged(int)'),
							   self.evaluate)
		lCapMax.addWidget(QtGui.QLabel('Maximum Running Tasks:', self))
		self.fields['maxruntasks'] = QtGui.QSpinBox(self)
		lCapMax.addWidget(self.fields['maxruntasks'])
		self.fields['maxruntasks'].setRange(-1, 1000000)
		self.fields['maxruntasks'].setValue(-1)
		QtCore.QObject.connect(self.fields['maxruntasks'],
							   QtCore.SIGNAL('valueChanged(int)'),
							   self.evaluate)
		lCapMax.addWidget(QtGui.QLabel('Priority:', self))
		self.fields['priority'] = QtGui.QSpinBox(self)
		lCapMax.addWidget(self.fields['priority'])
		self.fields['priority'].setRange(-1, 250)
		self.fields['priority'].setValue(-1)
		QtCore.QObject.connect(self.fields['priority'],
							   QtCore.SIGNAL('valueChanged(int)'),
							   self.evaluate)

		# Depend Masks:
		lDepends = QtGui.QHBoxLayout()
		joblayout.addLayout(lDepends)
		lDepends.addWidget(QtGui.QLabel('Depend Mask:', self))
		self.fields['dependmask'] = QtGui.QLineEdit(self)
		lDepends.addWidget(self.fields['dependmask'])
		QtCore.QObject.connect(self.fields['dependmask'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)
		lDepends.addWidget(QtGui.QLabel('Global:', self))
		self.fields['dependglobal'] = QtGui.QLineEdit(self)
		lDepends.addWidget(self.fields['dependglobal'])
		QtCore.QObject.connect(self.fields['dependglobal'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)

		# Host Masks:
		lHostMasks = QtGui.QHBoxLayout()
		joblayout.addLayout(lHostMasks)
		lHostMasks.addWidget(QtGui.QLabel('Hosts Mask:', self))
		self.fields['hostsmask'] = QtGui.QLineEdit(self)
		lHostMasks.addWidget(self.fields['hostsmask'])
		QtCore.QObject.connect(self.fields['hostsmask'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)
		lHostMasks.addWidget(QtGui.QLabel('Exclude:', self))
		self.fields['hostsexclude'] = QtGui.QLineEdit(self)
		lHostMasks.addWidget(self.fields['hostsexclude'])
		QtCore.QObject.connect(self.fields['hostsexclude'],
							   QtCore.SIGNAL('textEdited(QString)'),
							   self.evaluate)

		# Presets:
		presetsLayout = QtGui.QHBoxLayout()
		topLayout.addLayout(presetsLayout)
		presetsLayout.addWidget(QtGui.QLabel('Recent:', self))
		self.cbRecent = QtGui.QComboBox(self)
		presetsLayout.addWidget(self.cbRecent)
		self.bBrowseLoad = QtGui.QPushButton('Load', self)
		presetsLayout.addWidget(self.bBrowseLoad)
		QtCore.QObject.connect(self.bBrowseLoad,
							   QtCore.SIGNAL('pressed()'),
							   self.browseLoad)
		self.bBrowseSave = QtGui.QPushButton('Save', self)
		presetsLayout.addWidget(self.bBrowseSave)
		QtCore.QObject.connect(self.bBrowseSave,
							   QtCore.SIGNAL('pressed()'),
							   self.browseSave)


		# Command Field:
		self.teCmd = QtGui.QTextEdit(self)
		topLayout.addWidget(self.teCmd)

		# Buttons:
		buttonsLayout = QtGui.QHBoxLayout()
		topLayout.addLayout(buttonsLayout)
		self.bStart = QtGui.QPushButton('&Start', self)
		buttonsLayout.addWidget(self.bStart)
		QtCore.QObject.connect(self.bStart,
							   QtCore.SIGNAL('pressed()'),
							   self.start)
		self.fields['paused'] = QtGui.QCheckBox('Paused', self)
		buttonsLayout.addWidget(self.fields['paused'])
		QtCore.QObject.connect(self.fields['paused'],
							   QtCore.SIGNAL('stateChanged(int)'),
							   self.evaluate)
		self.bRefresh = QtGui.QPushButton('&Refresh', self)
		buttonsLayout.addWidget(self.bRefresh)
		QtCore.QObject.connect(self.bRefresh,
							   QtCore.SIGNAL('pressed()'),
							   self.evaluate)
		self.bQuitSave = QtGui.QPushButton('&Quit&&Store', self)
		buttonsLayout.addWidget(self.bQuitSave)
		QtCore.QObject.connect(self.bQuitSave,
							   QtCore.SIGNAL('pressed()'),
							   self.quitsave)

		self.constructed = True

		# Set window icon:
		iconpath = cgruutils.getIconFileName('afanasy')
		if iconpath is not None:
			self.setWindowIcon(QtGui.QIcon(iconpath))

		# Refresh recent:
		self.refreshRecent()

		# Load last settings:
		if not self.load(FileLast):
			self.evaluate()
Beispiel #15
0
   def __init__( self, parent = None):
      QtGui.QWidget.__init__( self, parent)
      self.setWindowTitle('Edit Nimby')
      rows = ['day','begin','dash','end','enable','allow','eject']
      self.weekdays = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
      self.days = ['mon','tue','wed','thu','fri','sat','sun']
      self.time_format = 'hh:mm'
      self.te_begin = dict()
      self.te_end = dict()
      self.cb_enable = dict()
      self.cb_allow = dict()
      self.cb_eject = dict()

      toplayout = QtGui.QVBoxLayout( self)
      columns = QtGui.QHBoxLayout()
      toplayout.addLayout( columns)
      vlayouts = dict()
      for row in rows:
         vlayouts[row] = QtGui.QVBoxLayout()
         columns.addLayout( vlayouts[row])

      daynum = 0
      for day in self.days:
         time_begin = '00:00'
         time_end = '00:00'
         enable = False
         allow = True
         eject = False
         var = 'nimby_' + day
         if var in cgruconfig.VARS:
            line = cgruconfig.VARS[var]
            if line is None: continue
            lines = line.split(' ')
            if len(lines) < 2: continue
            time_begin = lines[0]
            time_end = lines[1]
            enable = False
            allow = True
            eject = False
            if 'nimby'  in lines: allow  = True
            if 'NIMBY'  in lines: allow  = False
            if 'Eject'  in lines: eject  = True
            if 'Enable' in lines: enable = True

         vlayouts['day'].addWidget( QtGui.QLabel( self.weekdays[daynum], self))

         self.te_begin[day] = QtGui.QTimeEdit( QtCore.QTime.fromString( time_begin, self.time_format))
         self.te_begin[day].setDisplayFormat( self.time_format)
         vlayouts['begin'].addWidget( self.te_begin[day])

         label = QtGui.QLabel(' - ', self)
         label.setFixedWidth( 16)
         vlayouts['dash'].addWidget( label)

         self.te_end[day] = QtGui.QTimeEdit( QtCore.QTime.fromString( time_end, self.time_format))
         self.te_end[day].setDisplayFormat( self.time_format)
         vlayouts['end'].addWidget( self.te_end[day])

         self.cb_enable[day] = QtGui.QCheckBox('Enable', self)
         self.cb_enable[day].setChecked( enable)
         vlayouts['enable'].addWidget( self.cb_enable[day])

         self.cb_allow[day] = QtGui.QCheckBox('Allow My Jobs', self)
         self.cb_allow[day].setChecked( allow)
         vlayouts['allow'].addWidget( self.cb_allow[day])

         self.cb_eject[day] = QtGui.QCheckBox('Eject Running Tasks', self)
         self.cb_eject[day].setChecked( eject)
         vlayouts['eject'].addWidget( self.cb_eject[day])

         daynum += 1

      hlayout = QtGui.QHBoxLayout()
      b_accept = QtGui.QPushButton('Accept', self)
      b_cancel = QtGui.QPushButton('Cancel', self)
      hlayout.addWidget( b_accept)
      hlayout.addWidget( b_cancel)
      toplayout.addLayout( hlayout)
      QtCore.QObject.connect( b_accept, QtCore.SIGNAL('pressed()'), self.applySettings)
      QtCore.QObject.connect( b_cancel, QtCore.SIGNAL('pressed()'), self.close)

      # Set window icon:
      iconpath = cgruutils.getIconFileName('afanasy')
      if iconpath is not None: self.setWindowIcon( QtGui.QIcon( iconpath))

      self.show()
Beispiel #16
0
        self.leName.textEdited.connect( self.evaluate)

        self.lePattern = QtWidgets.QLineEdit('((render|workstation)0[1-4]+)', self)
        layout.addWidget(self.lePattern)
        self.lePattern.textEdited.connect( self.evaluate)

        self.leResult = QtWidgets.QLineEdit(
            'render01-render04 or workstation01-workstation04', self)
        layout.addWidget(self.leResult)
        self.leResult.setReadOnly(True)
        self.leResult.setAutoFillBackground(True)

        self.resize(500, 100)
        self.show()

    def evaluate(self):
        rx = QtCore.QRegExp(self.lePattern.text())
        if not rx.isValid():
            self.leResult.setText('ERROR: %s' % rx.errorString())
            return
        if rx.exactMatch(self.leName.text()):
            self.leResult.setText('MATCH')
        else:
            self.leResult.setText('NOT MATCH')


app = QtWidgets.QApplication(sys.argv)
app.setWindowIcon( QtGui.QIcon(cgruutils.getIconFileName('regexp')))
dialog = Dialog()
app.exec_()
Beispiel #17
0
    def __init__(self):

        # Main Window
        QtWidgets.QWidget.__init__(self)
        self.constructed = False
        self.evaluated = False
        self.output = ''
        self.setWindowTitle('渲染作业   CGRU %s' %
                            os.getenv('CGRU_VERSION', ''))
        self.fields = dict()
        self.labels = dict()

        # Get File Type dependant dicts
        self.labelNode_name = labelNodeNameDict()
        self.labelNode_tooltip = labelNodeTooltipsDict()
        self.labelTake_name = labelTakeNameDict()
        self.labelTake_tooltip = labelTakeTooltipsDict()

        # Top level layouts:
        topLayout = QtWidgets.QVBoxLayout(self)
        tabwidget = QtWidgets.QTabWidget(self)
        topLayout.addWidget(tabwidget)

        # General Tab:
        generalwidget = QtWidgets.QWidget(self)
        #tabwidget.addTab(generalwidget, 'Scene')
        tabwidget.addTab(generalwidget, '场景')
        generallayout = QtWidgets.QVBoxLayout(generalwidget)

        # Job Tab:
        jobwidget = QtWidgets.QWidget(self)
        #tabwidget.addTab(jobwidget, 'Job')
        tabwidget.addTab(jobwidget, '作业设置')
        joblayout = QtWidgets.QVBoxLayout(jobwidget)

        # Advanced Tab:
        auxwidget = QtWidgets.QWidget(self)
        tabwidget.addTab(auxwidget, 'Advanced')
        advlayout = QtWidgets.QVBoxLayout(auxwidget)

        # Service Type:
        lFileType = QtWidgets.QHBoxLayout()
        generallayout.addLayout(lFileType)
        lFileType.addWidget(QtWidgets.QLabel('Override Service Type:', self))
        self.fields['servicetype'] = QtWidgets.QComboBox(self)
        lFileType.addWidget(self.fields['servicetype'])
        self.fields['servicetype'].currentIndexChanged.connect( self.setFileType)

        # Scene:
        lScene = QtWidgets.QHBoxLayout()
        generallayout.addLayout(lScene)
        #lScene.addWidget(QtWidgets.QLabel('File:', self))
        lScene.addWidget(QtWidgets.QLabel('主文件:', self))
        self.fields['scenefile'] = QtWidgets.QLineEdit(Scene, self)
        lScene.addWidget(self.fields['scenefile'])
        self.fields['scenefile'].editingFinished.connect( self.evaluate)
        #bBrowseScene = QtWidgets.QPushButton('Browse', self)
        bBrowseScene = QtWidgets.QPushButton('浏览', self)
        lScene.addWidget(bBrowseScene)
        bBrowseScene.pressed.connect( self.browseScene)

        # Working Directory:
        lWDir = QtWidgets.QHBoxLayout()
        generallayout.addLayout(lWDir)
        #lWDir.addWidget(QtWidgets.QLabel('Working Directory/Project:', self))
        lWDir.addWidget(QtWidgets.QLabel('工程文件:', self))
        self.fields['wdir'] = QtWidgets.QLineEdit(self)
        lWDir.addWidget(self.fields['wdir'])
        self.fields['wdir'].editingFinished.connect( self.evaluate)
        self.fields['scenewdir'] = QtWidgets.QCheckBox('Use Scene Folder', self)
        self.fields['scenewdir'].setChecked(True)
        self.fields['scenewdir'].stateChanged.connect( self.evaluate)
        lWDir.addWidget(self.fields['scenewdir'])

        # Output images:
        lImages = QtWidgets.QHBoxLayout()
        generallayout.addLayout(lImages)
        #lImages.addWidget(QtWidgets.QLabel('Output Images:', self))
        lImages.addWidget(QtWidgets.QLabel('输出路径:', self))
        self.fields['outimages'] = QtWidgets.QLineEdit(self)
        lImages.addWidget(self.fields['outimages'])
        self.fields['outimages'].editingFinished.connect( self.evaluate)
        #lImages.addWidget(QtWidgets.QLabel('Browse'))
        lImages.addWidget(QtWidgets.QLabel('浏览'))
        #bBrowseOutImages = QtWidgets.QPushButton('File', self)
        bBrowseOutImages = QtWidgets.QPushButton('文件', self)
        lImages.addWidget(bBrowseOutImages)
        bBrowseOutImages.pressed.connect( self.browseOutImages)
        #bBrowseOutFolder = QtWidgets.QPushButton('Dir', self)
        bBrowseOutFolder = QtWidgets.QPushButton('目录', self)
        lImages.addWidget(bBrowseOutFolder)
        bBrowseOutFolder.pressed.connect( self.browseOutFolder)

        # Frames:
        lFrames = QtWidgets.QHBoxLayout()
        generallayout.addLayout(lFrames)
        #lFrames.addWidget(QtWidgets.QLabel('Frames:', self))
        lFrames.addWidget(QtWidgets.QLabel('帧范围:', self))
        self.fields['framestart'] = QtWidgets.QSpinBox(self)
        self.fields['framestart'].setRange(-1000000000, 1000000000)
        self.fields['framestart'].setValue(1)
        self.fields['framestart'].valueChanged.connect( self.evaluate)
        lFrames.addWidget(self.fields['framestart'])

        self.fields['frameend'] = QtWidgets.QSpinBox(self)
        self.fields['frameend'].setRange(-1000000000, 1000000000)
        self.fields['frameend'].setValue(1)
        self.fields['frameend'].valueChanged.connect( self.evaluate)
        lFrames.addWidget(self.fields['frameend'])

        #lFrames.addWidget(QtWidgets.QLabel('By:', self))
        lFrames.addWidget(QtWidgets.QLabel('帧步:', self))
        self.fields['frameby'] = QtWidgets.QSpinBox(self)
        lFrames.addWidget(self.fields['frameby'])
        self.fields['frameby'].valueChanged.connect( self.evaluate)
        self.fields['frameby'].setRange(1, 1000000000)

        lFrames.addWidget(QtWidgets.QLabel('FPT:', self))
        self.fields['framespt'] = QtWidgets.QSpinBox(self)
        lFrames.addWidget(self.fields['framespt'])
        self.fields['framespt'].valueChanged.connect( self.evaluate)
        self.fields['framespt'].setRange(1, 1000000000)
        self.fields['framespt'].setToolTip('Frames per task.')

        lFrames.addWidget(QtWidgets.QLabel('Seq:', self))
        self.fields['frameseq'] = QtWidgets.QSpinBox(self)
        lFrames.addWidget(self.fields['frameseq'])
        self.fields['frameseq'].valueChanged.connect( self.evaluate)
        self.fields['frameseq'].setRange(-1000000, 1000000)
        self.fields['frameseq'].setValue(1)
        self.fields['frameseq'].setToolTip('Solve task with this step at first.')


        # Node / Camera / Take:
        lNode = QtWidgets.QHBoxLayout()
        generallayout.addLayout(lNode)
        self.labels['node'] = QtWidgets.QLabel(self.labelNode_name['default'])
        lNode.addWidget(self.labels['node'])
        self.labels['node'].setToolTip(self.labelNode_tooltip['default'])
        self.fields['node'] = QtWidgets.QLineEdit(self)
        lNode.addWidget(self.fields['node'])
        self.fields['node'].textEdited.connect( self.evaluate)
        self.labels['take'] = QtWidgets.QLabel(self.labelTake_name['default'])
        lNode.addWidget(self.labels['take'])
        self.labels['take'].setToolTip(self.labelTake_tooltip['default'])
        self.fields['take'] = QtWidgets.QLineEdit(self)
        lNode.addWidget(self.fields['take'])
        self.fields['take'].textEdited.connect( self.evaluate)

        # Advanced:
        # OS Type:
        osLayout = QtWidgets.QHBoxLayout()
        advlayout.addLayout(osLayout)
        #osLayout.addWidget(QtWidgets.QLabel('Operating System Type:'))
        osLayout.addWidget(QtWidgets.QLabel('系统类型:'))
        self.fields['os'] = QtWidgets.QLineEdit(self)
        osLayout.addWidget(self.fields['os'])
        self.fields['os'].textEdited.connect( self.evaluate)

        # Tasks Command:
        exelayout = QtWidgets.QHBoxLayout()
        advlayout.addLayout(exelayout)
        #label = QtWidgets.QLabel('Tasks Executable:')
        label = QtWidgets.QLabel('任务执行:')
        label.setToolTip('Override launching programm')
        exelayout.addWidget(label)
        self.fields['exec'] = QtWidgets.QLineEdit(self)
        exelayout.addWidget(self.fields['exec'])
        self.fields['exec'].textEdited.connect( self.evaluate)
        #self.execBrowseButton = QtWidgets.QPushButton('Browse', self)
        self.execBrowseButton = QtWidgets.QPushButton('浏览', self)
        exelayout.addWidget(self.execBrowseButton)
        self.execBrowseButton.pressed.connect( self.browseExec)

        # Extra Arguments:
        exarglayout = QtWidgets.QHBoxLayout()
        advlayout.addLayout(exarglayout)
        #exarglayout.addWidget(QtWidgets.QLabel('Extra Arguments:'))
        exarglayout.addWidget(QtWidgets.QLabel('其他参数:'))
        self.fields['extrargs'] = QtWidgets.QLineEdit(self)
        exarglayout.addWidget(self.fields['extrargs'])
        self.fields['extrargs'].textEdited.connect( self.evaluate)

        # Preview:
        prvlayout = QtWidgets.QHBoxLayout()
        advlayout.addLayout(prvlayout)
        #prvlayout.addWidget(QtWidgets.QLabel('Preview:'))
        prvlayout.addWidget(QtWidgets.QLabel('预览:'))
        self.fields['preview'] = QtWidgets.QLineEdit(self)
        prvlayout.addWidget(self.fields['preview'])
        self.fields['preview'].textEdited.connect( self.evaluate)

        # Job:
        lJobName = QtWidgets.QHBoxLayout()
        joblayout.addLayout(lJobName)
        #lJobName.addWidget(QtWidgets.QLabel('Name:', self))
        lJobName.addWidget(QtWidgets.QLabel('作业名称:', self))
        self.fields['jobname'] = QtWidgets.QLineEdit(self)
        lJobName.addWidget(self.fields['jobname'])
        self.fields['jobname'].textEdited.connect( self.evaluate)
        #self.fields['jobnamescene'] = QtWidgets.QCheckBox('Use Scene Name', self)
        self.fields['jobnamescene'] = QtWidgets.QCheckBox('默认场景', self)
        lJobName.addWidget(self.fields['jobnamescene'])
        self.fields['jobnamescene'].setChecked(True)
        self.fields['jobnamescene'].stateChanged.connect( self.evaluate)

        # Capacity, max run tasks, priority, max tasks per host:
        lCapMax = QtWidgets.QHBoxLayout()
        joblayout.addLayout(lCapMax)
        #lCapMax.addWidget(QtWidgets.QLabel('Capacity:', self))
        lCapMax.addWidget(QtWidgets.QLabel('容量:', self))
        self.fields['capacity'] = QtWidgets.QSpinBox(self)
        lCapMax.addWidget(self.fields['capacity'])
        self.fields['capacity'].setRange(-1, 1000000)
        self.fields['capacity'].setValue(-1)
        self.fields['capacity'].valueChanged.connect( self.evaluate)
        #lCapMax.addWidget(QtWidgets.QLabel('Maximum Running Tasks:', self))
        lCapMax.addWidget(QtWidgets.QLabel('最大任务数:', self))
        self.fields['maxruntasks'] = QtWidgets.QSpinBox(self)
        lCapMax.addWidget(self.fields['maxruntasks'])
        self.fields['maxruntasks'].setRange(-1, 1000000)
        self.fields['maxruntasks'].setValue(-1)
        self.fields['maxruntasks'].valueChanged.connect( self.evaluate)
        #lCapMax.addWidget(QtWidgets.QLabel('Maximum Tasks Per Host:', self))
        lCapMax.addWidget(QtWidgets.QLabel('最大主机数:', self))
        self.fields['maxtasksperhost'] = QtWidgets.QSpinBox(self)
        lCapMax.addWidget(self.fields['maxtasksperhost'])
        self.fields['maxtasksperhost'].setRange(-1, 1000000)
        self.fields['maxtasksperhost'].setValue(-1)
        self.fields['maxtasksperhost'].valueChanged.connect( self.evaluate)
        #lCapMax.addWidget(QtWidgets.QLabel('Priority:', self))
        lCapMax.addWidget(QtWidgets.QLabel('优先级:', self))
        self.fields['priority'] = QtWidgets.QSpinBox(self)
        lCapMax.addWidget(self.fields['priority'])
        self.fields['priority'].setRange(-1, 250)
        self.fields['priority'].setValue(-1)
        self.fields['priority'].valueChanged.connect( self.evaluate)

        # Depend Masks:
        lDepends = QtWidgets.QHBoxLayout()
        joblayout.addLayout(lDepends)
        #lDepends.addWidget(QtWidgets.QLabel('Depend Mask:', self))
        lDepends.addWidget(QtWidgets.QLabel('作业名模式:', self))
        self.fields['dependmask'] = QtWidgets.QLineEdit(self)
        lDepends.addWidget(self.fields['dependmask'])
        self.fields['dependmask'].textEdited.connect( self.evaluate)
        #lDepends.addWidget(QtWidgets.QLabel('Global:', self))
        lDepends.addWidget(QtWidgets.QLabel('作业等待:', self))
        self.fields['dependglobal'] = QtWidgets.QLineEdit(self)
        lDepends.addWidget(self.fields['dependglobal'])
        self.fields['dependglobal'].textEdited.connect( self.evaluate)

        # Host Masks:
        lHostMasks = QtWidgets.QHBoxLayout()
        joblayout.addLayout(lHostMasks)
        #lHostMasks.addWidget(QtWidgets.QLabel('Hosts Mask:', self))
        lHostMasks.addWidget(QtWidgets.QLabel('宿主机模式:', self))
        self.fields['hostsmask'] = QtWidgets.QLineEdit(self)
        lHostMasks.addWidget(self.fields['hostsmask'])
        self.fields['hostsmask'].textEdited.connect( self.evaluate)
        #lHostMasks.addWidget(QtWidgets.QLabel('Exclude:', self))
        lHostMasks.addWidget(QtWidgets.QLabel('禁止主机:', self))
        self.fields['hostsexclude'] = QtWidgets.QLineEdit(self)
        lHostMasks.addWidget(self.fields['hostsexclude'])
        self.fields['hostsexclude'].textEdited.connect( self.evaluate)

        # Presets:
        presetsLayout = QtWidgets.QHBoxLayout()
        topLayout.addLayout(presetsLayout)
        #presetsLayout.addWidget(QtWidgets.QLabel('Recent:', self))
        presetsLayout.addWidget(QtWidgets.QLabel('最近:', self))
        self.cbRecent = QtWidgets.QComboBox(self)
        self.cbRecent.activated.connect( self.loadRecent)
        presetsLayout.addWidget(self.cbRecent)
        #self.bBrowseLoad = QtWidgets.QPushButton('Load', self)
        self.bBrowseLoad = QtWidgets.QPushButton('加载', self)
        presetsLayout.addWidget(self.bBrowseLoad)
        self.bBrowseLoad.pressed.connect( self.browseLoad)
        #self.bBrowseSave = QtWidgets.QPushButton('Save', self)
        self.bBrowseSave = QtWidgets.QPushButton('保存', self)
        presetsLayout.addWidget(self.bBrowseSave)
        self.bBrowseSave.pressed.connect( self.browseSave)


        # Command Field:
        self.teCmd = QtWidgets.QTextEdit(self)
        topLayout.addWidget(self.teCmd)

        # Buttons:
        buttonsLayout = QtWidgets.QHBoxLayout()
        topLayout.addLayout(buttonsLayout)
        #self.bStart = QtWidgets.QPushButton('&Start', self)
        self.bStart = QtWidgets.QPushButton('&运行', self)
        buttonsLayout.addWidget(self.bStart)
        self.bStart.pressed.connect( self.start)
        #self.fields['paused'] = QtWidgets.QCheckBox('Paused', self)
        self.fields['paused'] = QtWidgets.QCheckBox('暂停', self)
        buttonsLayout.addWidget(self.fields['paused'])
        self.fields['paused'].stateChanged.connect( self.evaluate)
        #self.bRefresh = QtWidgets.QPushButton('&Refresh', self)
        self.bRefresh = QtWidgets.QPushButton('&刷新', self)
        buttonsLayout.addWidget(self.bRefresh)
        self.bRefresh.pressed.connect( self.evaluate)
        #self.bQuitSave = QtWidgets.QPushButton('&Quit&&Store', self)
        self.bQuitSave = QtWidgets.QPushButton('&退出&&保存', self)
        buttonsLayout.addWidget(self.bQuitSave)
        self.bQuitSave.pressed.connect( self.quitsave)

        self.constructed = True

        # Set window icon:
        iconpath = cgruutils.getIconFileName('afanasy')
        if iconpath is not None:
            self.setWindowIcon( QtGui.QIcon(iconpath))

        # Refresh recent:
        self.refreshRecent()

        # Load last settings:
        if not self.load(FileLast):
            self.evaluate()
Beispiel #18
0
Datei: tray.py Projekt: CGRU/cgru
    def __init__(self, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, parent)
        self.parent = parent

        # Menu:
        self.menu = dict()
        self.menu['menu'] = QtWidgets.QMenu()

        # Load menu:
        menu_path = os.path.join(
            os.path.join(cgruconfig.VARS['CGRU_LOCATION'], 'start')
        )  # TODO: why to use os.path.join() two times here, to add '/' at the end ???
        menu_paths = cgruconfig.VARS['menu_path']
        if menu_paths is None:
            menu_paths = menu_path
        if menu_paths.find(';') != -1:
            menu_paths = menu_paths.split(';')
        elif sys.platform.find('win') == -1:
            menu_paths = menu_paths.split(':')
        else:
            menu_paths = [menu_paths]
        if not menu_path in menu_paths:
            menu_paths.append(menu_path)
        for menu_path in menu_paths:
            if not os.path.isdir(menu_path):
                continue
            for dirpath, dirnames, filenames in os.walk(menu_path, True, None,
                                                        True):
                if dirpath.find('/.') != -1:
                    continue
                if dirpath.find('\\.') != -1:
                    continue
                menuname = os.path.basename(dirpath)
                if menuname == os.path.basename(menu_path):
                    menuname = 'menu'
                else:
                    self.addMenu(self.menu['menu'], menuname)
                filenames.sort()
                was_separator = True
                for filename in filenames:
                    if filename[0] == '.' or filename[0] == '_':
                        continue
                    if sys.platform[:3] == 'win':
                        if filename[-4:] != '.cmd':
                            continue
                        itemname = filename[:-4]
                    else:
                        if filename[-3:] != '.sh':
                            continue
                        itemname = filename[:-3]
                    filename = os.path.join(dirpath, filename)
                    with open(filename, 'r') as f:
                        lines = f.readlines()

                    iconpath = None
                    separator = False
                    for line in lines:
                        if line.find('Name=') != -1:
                            itemname = line.split('Name=')[-1].strip()
                        if line.find('Icon=') != -1:
                            iconpath = line.split('Icon=')[-1].strip()
                        if line.find('Separator') != -1:
                            separator = True
                    if separator:
                        if not was_separator:
                            self.menu[menuname].addSeparator()
                        was_separator = True
                    else:
                        was_separator = False
                    action = ActionCommand(self, itemname, filename, iconpath)
                    self.menu[menuname].addAction(action)
                    action.triggered.connect( action.runCommand)
                    if separator:
                        self.menu[menuname].addSeparator()

        # Add permanent items to 'Afanasy':
        if not self.addMenu(self.menu['menu'], 'AFANASY'):
            self.menu['AFANASY'].addSeparator()

        action = QtWidgets.QAction('Web GUI', self)
        action.triggered.connect( cmd.afwebgui)
        self.menu['AFANASY'].addAction(action)
        self.menu['AFANASY'].addSeparator()

        self.action_user = QtWidgets.QAction('Set User...', self)
        self.action_user.triggered.connect( render.setUserDialog)
        self.action_user.setToolTip('Change local render user name.')
        self.menu['AFANASY'].addAction(self.action_user)

        action = QtWidgets.QAction('Set nimby', self)
        action.triggered.connect( nimby.setnimby)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Set NIMBY', self)
        action.triggered.connect( nimby.setNIMBY)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Set Free && Unpause', self)
        action.triggered.connect( nimby.setFreeUnpause)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Eject Tasks', self)
        action.triggered.connect( nimby.ejectTasks)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Eject Not My Tasks', self)
        action.triggered.connect( nimby.ejectNotMyTasks)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Render Info', self)
        action.triggered.connect( self.renderInfo)
        self.menu['AFANASY'].addAction(action)

        self.menu['AFANASY'].addSeparator()

        action = QtWidgets.QAction('Nimby Schedule...', self)
        action.triggered.connect( self.editNimby)
        self.menu['AFANASY'].addAction(action)

        self.menu['AFANASY'].addSeparator()

        action = QtWidgets.QAction('Set Server...', self)
        action.triggered.connect( cmd.setAFANASYServer)
        self.menu['AFANASY'].addAction(action)


        self.menu['menu'].addSeparator()

        # Add Software menu if it was not created by custom files:
        if not 'Software' in self.menu:
            self.addMenu(self.menu['menu'], 'Software')
            self.menu['menu'].addSeparator()

            for soft in software.Names:
                icon = software.getIcon(soft)
                if icon is None:
                    action = QtWidgets.QAction(soft, self)
                else:
                    action = QtWidgets.QAction(icon, soft, self)
                eval("action.triggered.connect(software.start%s)" % soft)
                self.menu['Software'].addAction(action)
            # Software setup:
            self.menu['Setup Soft'] = QtWidgets.QMenu('Setup Soft')
            self.menu['Software'].addMenu(self.menu['Setup Soft'])
            for soft in software.Names:
                action = QtWidgets.QAction(soft, self)
                eval("action.triggered.connect(software.locate%s)" % soft)
                self.menu['Setup Soft'].addAction(action)
            # Software examples:
            self.menu['Examples'] = QtWidgets.QMenu('Examples')
            self.menu['Software'].addMenu(self.menu['Examples'])
            for soft in software.Names:
                action = QtWidgets.QAction(soft, self)
                eval("action.triggered.connect(software.example%s)" % soft)
                self.menu['Examples'].addAction(action)

        # Add permanent items to 'Configure':
        if not self.addMenu(self.menu['menu'], 'Configure'):
            self.menu['Configure'].addSeparator()

        action = QtWidgets.QAction('Execute in terminal', self)
        action.setCheckable(True)
        action.triggered.connect(cmd.triggerExecInTerminal)
        if cgruconfig.getVar('keeper_execute_in_terminal'):
            action.setChecked(True)
        self.menu['Configure'].addAction(action)

        self.menu['Configure'].addSeparator()

        if serverhttps.isRunning:
            self.addAction('Configure', False,  'HTTPS Server...', self.httpsServer)
            self.menu['Configure'].addSeparator()

        action = QtWidgets.QAction('Set Web Browser...', self)
        action.triggered.connect( cmd.setWebBrowser)
        self.menu['Configure'].addAction(action)

        action = QtWidgets.QAction('Set Open Folder...', self)
        action.triggered.connect( cmd.setOpenCmd)
        self.menu['Configure'].addAction(action)

        action = QtWidgets.QAction('Set Teminal...', self)
        action.triggered.connect(cmd.setTerminal)
        self.menu['Configure'].addAction(action)

        action = QtWidgets.QAction('Set Text Editor...', self)
        action.triggered.connect( cmd.setTextEditor)
        self.menu['Configure'].addAction(action)

        action = QtWidgets.QAction('Edit Config...', self)
        action.triggered.connect( cmd.editCGRUConfig)
        self.menu['Configure'].addAction(action)

        self.menu['Configure'].addSeparator()

        action = QtWidgets.QAction('Reload Config', self)
        action.triggered.connect( cmd.confReload)
        self.menu['Configure'].addAction(action)

        # Some general menu items:
        self.addAction('menu', True,  'Documentation...', cmd.cgruDocs)
        self.addAction('menu', False, 'Forum...',         cmd.cgruForum)
        # System sub-menu:
        self.addMenu(self.menu['menu'],'System')
        self.addAction('System', True,'Show Info...', self.cgruInfo,'info')
        # Update item only if CGRU_UPDATE_CMD defined:
        if cgruconfig.VARS['CGRU_UPDATE_CMD'] is not None:
            self.addAction('System', True, 'Update', cmd.update)
        self.addAction('System', True, 'Restart', cmd.restart)
        self.addAction('System', False,'Quit',    cmd.quit)

        self.setContextMenu(self.menu['menu'])

        # Tray tooltip:
        self.setToolTip('%s Keeper' % cgruconfig.VARS['company'].upper())

        # Tray icon:
        icon_filename = cgruconfig.VARS['tray_icon']
        if icon_filename is None: icon_filename = 'keeper'
        icon_filename = cgruutils.getIconFileName(icon_filename)
        self.icon_pixmap = QtGui.QPixmap(icon_filename)
        self.icon_default = QtGui.QIcon(self.icon_pixmap)
        self.showIcon()

        # Show:
        self.activated.connect( self.activated_slot)
        self.show()
Beispiel #19
0
def getIcon(soft):
    iconpath = cgruutils.getIconFileName(os.path.join('software',
                                                      soft.lower()))
    if iconpath is not None:
        return QtGui.QIcon(iconpath)
    return None
Beispiel #20
0
    def processoutput(self):
        output = self.process.readAll().data()
        if not isinstance(output, str):
            output = str(output, 'utf-8')
        output = output.strip()
        print(output)
        self.cmdField.insertPlainText(output + '\n')
        self.cmdField.moveCursor(QtGui.QTextCursor.End)

    def processStop(self):
        self.process.terminate()


def getComboBoxString(comboBox):
    data = comboBox.itemData(comboBox.currentIndex())
    if data is None:
        return ''
    if isinstance(data, str):
        return data
    if isinstance(data, unicode):
        return data
    return comboBox.itemData(comboBox.currentIndex()).toString()


app = QtWidgets.QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon(cgruutils.getIconFileName(Options.wndicon)))
dialog = Dialog()
dialog.show()
app.exec_()
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setWindowTitle('Edit Nimby')
        rows = ['day', 'begin', 'dash', 'end', 'enable', 'allow', 'eject']
        self.weekdays = [
            'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
            'Sunday'
        ]
        self.days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
        self.time_format = 'hh:mm'
        self.te_begin = dict()
        self.te_end = dict()
        self.cb_enable = dict()
        self.cb_allow = dict()
        self.cb_eject = dict()

        toplayout = QtWidgets.QVBoxLayout(self)
        columns = QtWidgets.QHBoxLayout()
        toplayout.addLayout(columns)
        vlayouts = dict()
        for row in rows:
            vlayouts[row] = QtWidgets.QVBoxLayout()
            columns.addLayout(vlayouts[row])

        daynum = 0
        for day in self.days:
            time_begin = '00:00'
            time_end = '00:00'
            enable = False
            allow = True
            eject = False
            var = 'nimby_' + day
            if var in cgruconfig.VARS:
                line = cgruconfig.VARS[var]
                if line is None:
                    continue
                lines = line.split(' ')
                if len(lines) < 2:
                    continue
                time_begin = lines[0]
                time_end = lines[1]
                enable = False
                allow = True
                eject = False
                if 'nimby' in lines:
                    allow = True
                if 'NIMBY' in lines:
                    allow = False
                if 'Eject' in lines:
                    eject = True
                if 'Enable' in lines:
                    enable = True

            vlayouts['day'].addWidget(
                QtWidgets.QLabel(self.weekdays[daynum], self))

            self.te_begin[day] = QtWidgets.QTimeEdit(
                QtCore.QTime.fromString(time_begin, self.time_format))
            self.te_begin[day].setDisplayFormat(self.time_format)
            vlayouts['begin'].addWidget(self.te_begin[day])

            label = QtWidgets.QLabel(' - ', self)
            label.setFixedWidth(16)
            vlayouts['dash'].addWidget(label)

            self.te_end[day] = QtWidgets.QTimeEdit(
                QtCore.QTime.fromString(time_end, self.time_format))
            self.te_end[day].setDisplayFormat(self.time_format)
            vlayouts['end'].addWidget(self.te_end[day])

            self.cb_enable[day] = QtWidgets.QCheckBox('Enable', self)
            self.cb_enable[day].setChecked(enable)
            vlayouts['enable'].addWidget(self.cb_enable[day])

            self.cb_allow[day] = QtWidgets.QCheckBox('Allow My Jobs', self)
            self.cb_allow[day].setChecked(allow)
            vlayouts['allow'].addWidget(self.cb_allow[day])

            self.cb_eject[day] = QtWidgets.QCheckBox('Eject Running Tasks',
                                                     self)
            self.cb_eject[day].setChecked(eject)
            vlayouts['eject'].addWidget(self.cb_eject[day])

            daynum += 1

        hlayout = QtWidgets.QHBoxLayout()
        b_accept = QtWidgets.QPushButton('Accept', self)
        b_cancel = QtWidgets.QPushButton('Cancel', self)
        hlayout.addWidget(b_accept)
        hlayout.addWidget(b_cancel)
        toplayout.addLayout(hlayout)
        b_accept.pressed.connect(self.applySettings)
        b_cancel.pressed.connect(self.close)

        # Set window icon:
        iconpath = cgruutils.getIconFileName('afanasy')
        if iconpath is not None:
            self.setWindowIcon(QtGui.QIcon(iconpath))

        self.show()
Beispiel #22
0
def getIcon( soft):
   iconpath = cgruutils.getIconFileName( os.path.join('software', soft.lower()))
   if iconpath is not None: return QtGui.QIcon( iconpath)
   return None
Beispiel #23
0
      if not self.test: self.cmdField.setText( self.command)
      else: self.test = False
      self.btnTest.setEnabled( True)
      self.btnStart.setEnabled( True)

   def processoutput( self):
      output = self.process.readAll().data()
      if not isinstance( output, str): output = str( output, 'utf-8')
      output = output.strip()
      print(output)
      self.cmdField.insertPlainText( output + '\n')
      self.cmdField.moveCursor( QtGui.QTextCursor.End)

   def processStop( self):
      self.process.terminate()


def getComboBoxString( comboBox):
   data = comboBox.itemData( comboBox.currentIndex())
   if data is None: return ''
   if isinstance( data, str): return data
   if isinstance( data, unicode): return data
   return comboBox.itemData( comboBox.currentIndex()).toString()


app = QtGui.QApplication( sys.argv)
app.setWindowIcon( QtGui.QIcon( cgruutils.getIconFileName( Options.wndicon)))
dialog = Dialog()
dialog.show()
app.exec_()
Beispiel #24
0
        self.lePattern = QtWidgets.QLineEdit('((render|workstation)0[1-4]+)',
                                             self)
        layout.addWidget(self.lePattern)
        self.lePattern.textEdited.connect(self.evaluate)

        self.leResult = QtWidgets.QLineEdit(
            'render01-render04 or workstation01-workstation04', self)
        layout.addWidget(self.leResult)
        self.leResult.setReadOnly(True)
        self.leResult.setAutoFillBackground(True)

        self.resize(500, 100)
        self.show()

    def evaluate(self):
        rx = QtCore.QRegExp(self.lePattern.text())
        if not rx.isValid():
            self.leResult.setText('ERROR: %s' % rx.errorString())
            return
        if rx.exactMatch(self.leName.text()):
            self.leResult.setText('MATCH')
        else:
            self.leResult.setText('NOT MATCH')


app = QtWidgets.QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon(cgruutils.getIconFileName('regexp')))
dialog = Dialog()
app.exec_()
Beispiel #25
0
    def __init__(self, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, parent)
        self.parent = parent

        # Menu:
        self.menu = dict()
        self.menu['menu'] = QtWidgets.QMenu()

        # Load menu:
        menu_path = os.path.join(
            os.path.join(cgruconfig.VARS['CGRU_LOCATION'], 'start')
        )  # TODO: why to use os.path.join() two times here, to add '/' at the end ???
        menu_paths = cgruconfig.VARS['menu_path']
        if menu_paths is None:
            menu_paths = menu_path
        if menu_paths.find(';') != -1:
            menu_paths = menu_paths.split(';')
        elif sys.platform.find('win') == -1:
            menu_paths = menu_paths.split(':')
        else:
            menu_paths = [menu_paths]
        if not menu_path in menu_paths:
            menu_paths.append(menu_path)
        for menu_path in menu_paths:
            if not os.path.isdir(menu_path):
                continue
            for dirpath, dirnames, filenames in os.walk(
                    menu_path, True, None, True):
                if dirpath.find('/.') != -1:
                    continue
                if dirpath.find('\\.') != -1:
                    continue
                menuname = os.path.basename(dirpath)
                if menuname == os.path.basename(menu_path):
                    menuname = 'menu'
                else:
                    self.addMenu(self.menu['menu'], menuname)
                filenames.sort()
                was_separator = True
                for filename in filenames:
                    if filename[0] == '.' or filename[0] == '_':
                        continue
                    if sys.platform[:3] == 'win':
                        if filename[-4:] != '.cmd':
                            continue
                        itemname = filename[:-4]
                    else:
                        if filename[-3:] != '.sh':
                            continue
                        itemname = filename[:-3]
                    filename = os.path.join(dirpath, filename)
                    with open(filename, 'r') as f:
                        lines = f.readlines()

                    iconpath = None
                    separator = False
                    for line in lines:
                        if line.find('Name=') != -1:
                            itemname = line.split('Name=')[-1].strip()
                        if line.find('Icon=') != -1:
                            iconpath = line.split('Icon=')[-1].strip()
                        if line.find('Separator') != -1:
                            separator = True
                    if separator:
                        if not was_separator:
                            self.menu[menuname].addSeparator()
                        was_separator = True
                    else:
                        was_separator = False
                    action = ActionCommand(self, itemname, filename, iconpath)
                    self.menu[menuname].addAction(action)
                    action.triggered.connect(action.runCommand)
                    if separator:
                        self.menu[menuname].addSeparator()

        # Add permanent items to 'Afanasy':
        if not self.addMenu(self.menu['menu'], 'AFANASY'):
            self.menu['AFANASY'].addSeparator()

        action = QtWidgets.QAction('Web GUI', self)
        action.triggered.connect(cmd.afwebgui)
        self.menu['AFANASY'].addAction(action)
        self.menu['AFANASY'].addSeparator()

        self.action_user = QtWidgets.QAction('Set User...', self)
        self.action_user.triggered.connect(render.setUserDialog)
        self.action_user.setToolTip('Change local render user name.')
        self.menu['AFANASY'].addAction(self.action_user)

        action = QtWidgets.QAction('Set nimby', self)
        action.triggered.connect(nimby.setnimby)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Set NIMBY', self)
        action.triggered.connect(nimby.setNIMBY)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Set Free', self)
        action.triggered.connect(nimby.setFree)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Eject Tasks', self)
        action.triggered.connect(nimby.ejectTasks)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Eject And NIMBY', self)
        action.triggered.connect(nimby.ejectAndNIMBY)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Eject Not My Tasks', self)
        action.triggered.connect(nimby.ejectNotMyTasks)
        self.menu['AFANASY'].addAction(action)

        action = QtWidgets.QAction('Render Info', self)
        action.triggered.connect(self.renderInfo)
        self.menu['AFANASY'].addAction(action)

        self.menu['AFANASY'].addSeparator()

        action = QtWidgets.QAction('Nimby Schedule...', self)
        action.triggered.connect(self.editNimby)
        self.menu['AFANASY'].addAction(action)

        self.menu['AFANASY'].addSeparator()

        action = QtWidgets.QAction('Set Server...', self)
        action.triggered.connect(cmd.setAFANASYServer)
        self.menu['AFANASY'].addAction(action)

        self.menu['menu'].addSeparator()

        # Add Software menu if it was not created by custom files:
        if not 'Software' in self.menu:
            self.addMenu(self.menu['menu'], 'Software')
            self.menu['menu'].addSeparator()

            for soft in software.Names:
                icon = software.getIcon(soft)
                if icon is None:
                    action = QtWidgets.QAction(soft, self)
                else:
                    action = QtWidgets.QAction(icon, soft, self)
                eval("action.triggered.connect(software.start%s)" % soft)
                self.menu['Software'].addAction(action)
            # Software setup:
            self.menu['Setup Soft'] = QtWidgets.QMenu('Setup Soft')
            self.menu['Software'].addMenu(self.menu['Setup Soft'])
            for soft in software.Names:
                action = QtWidgets.QAction(soft, self)
                eval("action.triggered.connect(software.locate%s)" % soft)
                self.menu['Setup Soft'].addAction(action)
            # Software examples:
            self.menu['Examples'] = QtWidgets.QMenu('Examples')
            self.menu['Software'].addMenu(self.menu['Examples'])
            for soft in software.Names:
                action = QtWidgets.QAction(soft, self)
                eval("action.triggered.connect(software.example%s)" % soft)
                self.menu['Examples'].addAction(action)

        # Add permanent items to 'Configure':
        if not self.addMenu(self.menu['menu'], 'Configure'):
            self.menu['Configure'].addSeparator()

        action = QtWidgets.QAction('Execute in terminal', self)
        action.setCheckable(True)
        action.triggered.connect(cmd.triggerExecInTerminal)
        if cgruconfig.getVar('keeper_execute_in_terminal'):
            action.setChecked(True)
        self.menu['Configure'].addAction(action)

        self.menu['Configure'].addSeparator()

        if serverhttps.isRunning:
            self.addAction('Configure', False, 'HTTPS Server...',
                           self.httpsServer)
            self.menu['Configure'].addSeparator()

        action = QtWidgets.QAction('Set Web Browser...', self)
        action.triggered.connect(cmd.setWebBrowser)
        self.menu['Configure'].addAction(action)

        action = QtWidgets.QAction('Set Open Folder...', self)
        action.triggered.connect(cmd.setOpenCmd)
        self.menu['Configure'].addAction(action)

        action = QtWidgets.QAction('Set Teminal...', self)
        action.triggered.connect(cmd.setTerminal)
        self.menu['Configure'].addAction(action)

        action = QtWidgets.QAction('Set Text Editor...', self)
        action.triggered.connect(cmd.setTextEditor)
        self.menu['Configure'].addAction(action)

        action = QtWidgets.QAction('Edit Config...', self)
        action.triggered.connect(cmd.editCGRUConfig)
        self.menu['Configure'].addAction(action)

        self.menu['Configure'].addSeparator()

        action = QtWidgets.QAction('Reload Config', self)
        action.triggered.connect(cmd.confReload)
        self.menu['Configure'].addAction(action)

        # Some general menu items:
        self.addAction('menu', True, 'Documentation...', cmd.cgruDocs)
        self.addAction('menu', False, 'Forum...', cmd.cgruForum)
        # System sub-menu:
        self.addMenu(self.menu['menu'], 'System')
        self.addAction('System', True, 'Show Info...', self.cgruInfo, 'info')
        # Update item only if CGRU_UPDATE_CMD defined:
        if cgruconfig.VARS['CGRU_UPDATE_CMD'] is not None:
            self.addAction('System', True, 'Update', cmd.update)
        self.addAction('System', True, 'Restart', cmd.restart)
        self.addAction('System', False, 'Quit', cmd.quit)

        self.setContextMenu(self.menu['menu'])

        # Tray tooltip:
        self.updateToolTip()

        # Tray icon:
        icon_filename = cgruconfig.VARS['tray_icon']
        if icon_filename is None: icon_filename = 'keeper'
        icon_filename = cgruutils.getIconFileName(icon_filename)
        self.icon_pixmap = QtGui.QPixmap(icon_filename)
        self.icon_default = QtGui.QIcon(self.icon_pixmap)
        self.showIcon()

        # Show:
        self.activated.connect(self.activated_slot)
        self.show()
Beispiel #26
0
    def __init__(self, parent=None):
        QtGui.QSystemTrayIcon.__init__(self, parent)
        self.parent = parent

        # Menu:
        self.menu = dict()
        self.menu['menu'] = QtGui.QMenu()

        # Update item only if CGRU_UPDATE_CMD defined:
        if cgruconfig.VARS['CGRU_UPDATE_CMD'] is not None:
            action = QtGui.QAction('Update', self)
            QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                                   cmd.update)
            self.menu['menu'].addAction(action)
            self.menu['menu'].addSeparator()

        # Load menu:
        menu_path = os.path.join(
            os.path.join(cgruconfig.VARS['CGRU_LOCATION'], 'start')
        )  # TODO: why to use os.path.join() two times here, to add '/' at the end ???
        menu_paths = cgruconfig.VARS['menu_path']
        if menu_paths is None:
            menu_paths = menu_path
        if menu_paths.find(';') != -1:
            menu_paths = menu_paths.split(';')
        elif sys.platform.find('win') == -1:
            menu_paths = menu_paths.split(':')
        else:
            menu_paths = [menu_paths]
        if not menu_path in menu_paths:
            menu_paths.append(menu_path)
        for menu_path in menu_paths:
            if not os.path.isdir(menu_path):
                continue
            for dirpath, dirnames, filenames in os.walk(
                    menu_path, True, None, True):
                if dirpath.find('/.') != -1:
                    continue
                if dirpath.find('\\.') != -1:
                    continue
                menuname = os.path.basename(dirpath)
                if menuname == os.path.basename(menu_path):
                    menuname = 'menu'
                else:
                    self.addMenu(self.menu['menu'], menuname)
                filenames.sort()
                was_separator = True
                for filename in filenames:
                    if filename[0] == '.' or filename[0] == '_':
                        continue
                    if sys.platform[:3] == 'win':
                        if filename[-4:] != '.cmd':
                            continue
                        itemname = filename[:-4]
                    else:
                        if filename[-3:] != '.sh':
                            continue
                        itemname = filename[:-3]
                    filename = os.path.join(dirpath, filename)
                    with open(filename, 'r') as f:
                        lines = f.readlines()

                    iconpath = None
                    separator = False
                    for line in lines:
                        if line.find('Name=') != -1:
                            itemname = line.split('Name=')[-1].strip()
                        if line.find('Icon=') != -1:
                            iconpath = line.split('Icon=')[-1].strip()
                        if line.find('Separator') != -1:
                            separator = True
                    if separator:
                        if not was_separator:
                            self.menu[menuname].addSeparator()
                        was_separator = True
                    else:
                        was_separator = False
                    action = ActionCommand(self, itemname, filename, iconpath)
                    self.menu[menuname].addAction(action)
                    QtCore.QObject.connect(action,
                                           QtCore.SIGNAL('triggered()'),
                                           action.runCommand)
                    if separator:
                        self.menu[menuname].addSeparator()

        # Add permanent items to 'Afanasy':
        if not self.addMenu(self.menu['menu'], 'AFANASY'):
            self.menu['AFANASY'].addSeparator()

        action = QtGui.QAction('Web GUI', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.afwebgui)
        self.menu['AFANASY'].addAction(action)
        self.menu['AFANASY'].addSeparator()

        self.action_user = QtGui.QAction('Set User...', self)
        QtCore.QObject.connect(self.action_user, QtCore.SIGNAL('triggered()'),
                               render.setUserDialog)
        self.action_user.setToolTip('Change local render user name.')
        self.menu['AFANASY'].addAction(self.action_user)

        action = QtGui.QAction('Set nimby', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               nimby.setnimby)
        self.menu['AFANASY'].addAction(action)

        action = QtGui.QAction('Set NIMBY', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               nimby.setNIMBY)
        self.menu['AFANASY'].addAction(action)

        action = QtGui.QAction('Set Free', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               nimby.setFree)
        self.menu['AFANASY'].addAction(action)

        action = QtGui.QAction('Eject Tasks', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               nimby.ejectTasks)
        self.menu['AFANASY'].addAction(action)

        action = QtGui.QAction('Eject Not My Tasks', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               nimby.ejectNotMyTasks)
        self.menu['AFANASY'].addAction(action)

        action = QtGui.QAction('Render Info', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               self.renderInfo)
        self.menu['AFANASY'].addAction(action)

        self.menu['AFANASY'].addSeparator()

        action = QtGui.QAction('Nimby Schedule...', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               self.editNimby)
        self.menu['AFANASY'].addAction(action)

        self.menu['AFANASY'].addSeparator()

        action = QtGui.QAction('Set Server...', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.setAFANASYServer)
        self.menu['AFANASY'].addAction(action)

        self.menu['AFANASY'].addSeparator()

        action = QtGui.QAction('Exit Render', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.exitRender)
        self.menu['AFANASY'].addAction(action)
        action = QtGui.QAction('Exit Watch', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.exitMonitor)
        self.menu['AFANASY'].addAction(action)
        action = QtGui.QAction('Exit All Clients', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.exitClients)
        self.menu['AFANASY'].addAction(action)

        self.menu['menu'].addSeparator()

        # Add Software menu if it was not created by custom files:
        if not 'Software' in self.menu:
            self.addMenu(self.menu['menu'], 'Software')
            self.menu['menu'].addSeparator()
            action = QtGui.QAction(
                QtGui.QIcon(cgruutils.getIconFileName('folder')), '[ browse ]',
                self)
            QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                                   software.browse)
            self.menu['Software'].addAction(action)
            for soft in software.Names:
                icon = software.getIcon(soft)
                if icon is None:
                    action = QtGui.QAction(soft, self)
                else:
                    action = QtGui.QAction(icon, soft, self)
                eval("QtCore.QObject.connect(action,"
                     "						 QtCore.SIGNAL('triggered()'),"
                     "						 software.start%s)" % soft)
                self.menu['Software'].addAction(action)
            # Software setup:
            self.menu['Setup Soft'] = QtGui.QMenu('Setup Soft')
            self.menu['Software'].addMenu(self.menu['Setup Soft'])
            for soft in software.Names:
                action = QtGui.QAction(soft, self)
                eval("QtCore.QObject.connect(action,"
                     "						 QtCore.SIGNAL('triggered()'),"
                     "						 software.locate%s)" % soft)
                self.menu['Setup Soft'].addAction(action)
            # Software examples:
            self.menu['Examples'] = QtGui.QMenu('Examples')
            self.menu['Software'].addMenu(self.menu['Examples'])
            for soft in software.Names:
                action = QtGui.QAction(soft, self)
                eval("QtCore.QObject.connect(action,"
                     "						 QtCore.SIGNAL('triggered()'),"
                     "						 software.example%s)" % soft)
                self.menu['Examples'].addAction(action)

        # Add permanent items to 'Configure':
        if not self.addMenu(self.menu['menu'], 'Configure'):
            self.menu['Configure'].addSeparator()
        action = QtGui.QAction('Reload Config', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.confReload)
        self.menu['Configure'].addAction(action)
        action = QtGui.QAction('Set Docs URL...', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.setDocsURL)
        self.menu['Configure'].addAction(action)
        action = QtGui.QAction('Edit Config...', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.editCGRUConfig)
        self.menu['Configure'].addAction(action)
        action = QtGui.QAction('Set Web Browser...', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.setWebBrowser)
        self.menu['Configure'].addAction(action)
        action = QtGui.QAction('Set Text Editor...', self)
        QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
                               cmd.setTextEditor)
        self.menu['Configure'].addAction(action)

        self.addAction('menu', True, 'Show Info...', self.cgruInfo, 'info')
        self.addAction('menu', True, 'Documentation', cmd.cgruDocs)
        self.addAction('menu', True, 'Restart', cmd.restart)
        self.addAction('menu', False, 'Quit && Exit Clients',
                       cmd.quitExitClients)
        self.addAction('menu', False, 'Quit', cmd.quit)

        self.setContextMenu(self.menu['menu'])

        # Prepare Icons:
        self.icons = dict()
        icon_filename = cgruconfig.VARS['tray_icon']
        if icon_filename is None:
            icon_filename = 'keeper'
        icon_filename = cgruutils.getIconFileName(icon_filename)
        self.icon_epmty = QtGui.QPixmap(icon_filename)
        self.icons['empty'] = QtGui.QIcon(self.icon_epmty)
        self.makeIcon('offline_free', online=False, nimby=False, busy=False)
        self.makeIcon('online_free', online=True, nimby=False, busy=False)
        self.makeIcon('offline_nimby', online=False, nimby=True, busy=False)
        self.makeIcon('online_nimby', online=True, nimby=True, busy=False)
        self.makeIcon('offline_free_busy',
                      online=False,
                      nimby=False,
                      busy=True)
        self.makeIcon('online_free_busy', online=True, nimby=False, busy=True)
        self.makeIcon('offline_nimby_busy',
                      online=False,
                      nimby=True,
                      busy=True)
        self.makeIcon('online_nimby_busy', online=True, nimby=True, busy=True)

        # Decorate and show:
        self.showIcon()
        self.setToolTip('%s Keeper %s' % (cgruconfig.VARS['company'].upper(),
                                          os.getenv('CGRU_VERSION', '')))
        QtCore.QObject.connect(
            self,
            QtCore.SIGNAL('activated( QSystemTrayIcon::ActivationReason)'),
            self.activated_slot)

        self.show()
Beispiel #27
0
    def __init__(self):

        # Main Window
        QtGui.QWidget.__init__(self)
        self.constructed = False
        self.evaluated = False
        self.output = ''
        self.setWindowTitle('Afanasy Starter   CGRU ' +
                            os.getenv('CGRU_VERSION', ''))
        self.fields = dict()
        self.labels = dict()

        # Get File Type dependant dicts
        self.labelNode_name = labelNodeNameDict()
        self.labelNode_tooltip = labelNodeTooltipsDict()
        self.labelTake_name = labelTakeNameDict()
        self.labelTake_tooltip = labelTakeTooltipsDict()

        # Top level layouts:
        topLayout = QtGui.QVBoxLayout(self)
        tabwidget = QtGui.QTabWidget(self)
        topLayout.addWidget(tabwidget)

        # General Tab:
        generalwidget = QtGui.QWidget(self)
        tabwidget.addTab(generalwidget, 'Scene')
        generallayout = QtGui.QVBoxLayout(generalwidget)

        # Job Tab:
        jobwidget = QtGui.QWidget(self)
        tabwidget.addTab(jobwidget, 'Job')
        joblayout = QtGui.QVBoxLayout(jobwidget)

        # Advanced Tab:
        auxwidget = QtGui.QWidget(self)
        tabwidget.addTab(auxwidget, 'Advanced')
        advlayout = QtGui.QVBoxLayout(auxwidget)

        # Service Type:
        lFileType = QtGui.QHBoxLayout()
        generallayout.addLayout(lFileType)
        lFileType.addWidget(QtGui.QLabel('Override Service Type:', self))
        self.fields['servicetype'] = QtGui.QComboBox(self)
        lFileType.addWidget(self.fields['servicetype'])
        QtCore.QObject.connect(self.fields['servicetype'],
                               QtCore.SIGNAL('currentIndexChanged(int)'),
                               self.setFileType)

        # Scene:
        lScene = QtGui.QHBoxLayout()
        generallayout.addLayout(lScene)
        lScene.addWidget(QtGui.QLabel('File:', self))
        self.fields['scenefile'] = QtGui.QLineEdit(Scene, self)
        lScene.addWidget(self.fields['scenefile'])
        QtCore.QObject.connect(self.fields['scenefile'],
                               QtCore.SIGNAL('editingFinished()'),
                               self.evaluate)
        bBrowseScene = QtGui.QPushButton('Browse', self)
        lScene.addWidget(bBrowseScene)
        QtCore.QObject.connect(bBrowseScene, QtCore.SIGNAL('pressed()'),
                               self.browseScene)

        # Working Directory:
        lWDir = QtGui.QHBoxLayout()
        generallayout.addLayout(lWDir)
        lWDir.addWidget(QtGui.QLabel('Working Directory/Project:', self))
        self.fields['wdir'] = QtGui.QLineEdit(self)
        lWDir.addWidget(self.fields['wdir'])
        QtCore.QObject.connect(self.fields['wdir'],
                               QtCore.SIGNAL('editingFinished()'),
                               self.evaluate)
        self.fields['scenewdir'] = QtGui.QCheckBox('Use Scene Folder', self)
        self.fields['scenewdir'].setChecked(True)
        QtCore.QObject.connect(self.fields['scenewdir'],
                               QtCore.SIGNAL('stateChanged(int)'),
                               self.evaluate)
        lWDir.addWidget(self.fields['scenewdir'])

        # Output images:
        lImages = QtGui.QHBoxLayout()
        generallayout.addLayout(lImages)
        lImages.addWidget(QtGui.QLabel('Output Images:', self))
        self.fields['outimages'] = QtGui.QLineEdit(self)
        lImages.addWidget(self.fields['outimages'])
        QtCore.QObject.connect(self.fields['outimages'],
                               QtCore.SIGNAL('editingFinished()'),
                               self.evaluate)
        lImages.addWidget(QtGui.QLabel('Browse'))
        bBrowseOutImages = QtGui.QPushButton('File', self)
        lImages.addWidget(bBrowseOutImages)
        QtCore.QObject.connect(bBrowseOutImages, QtCore.SIGNAL('pressed()'),
                               self.browseOutImages)
        bBrowseOutFolder = QtGui.QPushButton('Dir', self)
        lImages.addWidget(bBrowseOutFolder)
        QtCore.QObject.connect(bBrowseOutFolder, QtCore.SIGNAL('pressed()'),
                               self.browseOutFolder)

        # Frames:
        lFrames = QtGui.QHBoxLayout()
        generallayout.addLayout(lFrames)
        lFrames.addWidget(QtGui.QLabel('Frames:', self))
        self.fields['framestart'] = QtGui.QSpinBox(self)
        self.fields['framestart'].setRange(-1000000000, 1000000000)
        self.fields['framestart'].setValue(1)
        QtCore.QObject.connect(self.fields['framestart'],
                               QtCore.SIGNAL('editingFinished()'),
                               self.evaluate)
        lFrames.addWidget(self.fields['framestart'])
        self.fields['frameend'] = QtGui.QSpinBox(self)
        self.fields['frameend'].setRange(-1000000000, 1000000000)
        self.fields['frameend'].setValue(1)
        QtCore.QObject.connect(self.fields['frameend'],
                               QtCore.SIGNAL('editingFinished()'),
                               self.evaluate)
        lFrames.addWidget(self.fields['frameend'])
        lFrames.addWidget(QtGui.QLabel('by', self))
        self.fields['frameby'] = QtGui.QSpinBox(self)
        lFrames.addWidget(self.fields['frameby'])
        QtCore.QObject.connect(self.fields['frameby'],
                               QtCore.SIGNAL('editingFinished()'),
                               self.evaluate)
        self.fields['frameby'].setRange(1, 1000000000)
        lFrames.addWidget(QtGui.QLabel('per task', self))
        self.fields['framespt'] = QtGui.QSpinBox(self)
        lFrames.addWidget(self.fields['framespt'])
        QtCore.QObject.connect(self.fields['framespt'],
                               QtCore.SIGNAL('editingFinished()'),
                               self.evaluate)
        self.fields['framespt'].setRange(1, 1000000000)

        # Node / Camera / Take:
        lNode = QtGui.QHBoxLayout()
        generallayout.addLayout(lNode)
        self.labels['node'] = QtGui.QLabel(self.labelNode_name['default'])
        lNode.addWidget(self.labels['node'])
        self.labels['node'].setToolTip(self.labelNode_tooltip['default'])
        self.fields['node'] = QtGui.QLineEdit(self)
        lNode.addWidget(self.fields['node'])
        QtCore.QObject.connect(self.fields['node'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)
        self.labels['take'] = QtGui.QLabel(self.labelTake_name['default'])
        lNode.addWidget(self.labels['take'])
        self.labels['take'].setToolTip(self.labelTake_tooltip['default'])
        self.fields['take'] = QtGui.QLineEdit(self)
        lNode.addWidget(self.fields['take'])
        QtCore.QObject.connect(self.fields['take'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)

        # Advanced:
        # OS Type:
        osLayout = QtGui.QHBoxLayout()
        advlayout.addLayout(osLayout)
        osLayout.addWidget(QtGui.QLabel('Operating System Type:'))
        self.fields['os'] = QtGui.QLineEdit(self)
        osLayout.addWidget(self.fields['os'])
        QtCore.QObject.connect(self.fields['os'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)

        # Tasks Command:
        exelayout = QtGui.QHBoxLayout()
        advlayout.addLayout(exelayout)
        label = QtGui.QLabel('Tasks Executable:')
        label.setToolTip('Override launching programm')
        exelayout.addWidget(label)
        self.fields['exec'] = QtGui.QLineEdit(self)
        exelayout.addWidget(self.fields['exec'])
        QtCore.QObject.connect(self.fields['exec'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)
        self.execBrowseButton = QtGui.QPushButton('Browse', self)
        exelayout.addWidget(self.execBrowseButton)
        QtCore.QObject.connect(self.execBrowseButton,
                               QtCore.SIGNAL('pressed()'), self.browseExec)

        # Extra Arguments:
        exarglayout = QtGui.QHBoxLayout()
        advlayout.addLayout(exarglayout)
        exarglayout.addWidget(QtGui.QLabel('Extra Arguments:'))
        self.fields['extrargs'] = QtGui.QLineEdit(self)
        exarglayout.addWidget(self.fields['extrargs'])
        QtCore.QObject.connect(self.fields['extrargs'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)

        # Preview:
        prvlayout = QtGui.QHBoxLayout()
        advlayout.addLayout(prvlayout)
        prvlayout.addWidget(QtGui.QLabel('Preview:'))
        self.fields['preview'] = QtGui.QLineEdit(self)
        prvlayout.addWidget(self.fields['preview'])
        QtCore.QObject.connect(self.fields['preview'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)

        # Job:
        lJobName = QtGui.QHBoxLayout()
        joblayout.addLayout(lJobName)
        lJobName.addWidget(QtGui.QLabel('Name:', self))
        self.fields['jobname'] = QtGui.QLineEdit(self)
        lJobName.addWidget(self.fields['jobname'])
        QtCore.QObject.connect(self.fields['jobname'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)
        self.fields['jobnamescene'] = QtGui.QCheckBox('Use Scene Name', self)
        lJobName.addWidget(self.fields['jobnamescene'])
        self.fields['jobnamescene'].setChecked(True)
        QtCore.QObject.connect(self.fields['jobnamescene'],
                               QtCore.SIGNAL('stateChanged(int)'),
                               self.evaluate)

        # Capacity, max run tasks, priority:
        lCapMax = QtGui.QHBoxLayout()
        joblayout.addLayout(lCapMax)
        lCapMax.addWidget(QtGui.QLabel('Capacity:', self))
        self.fields['capacity'] = QtGui.QSpinBox(self)
        lCapMax.addWidget(self.fields['capacity'])
        self.fields['capacity'].setRange(-1, 1000000)
        self.fields['capacity'].setValue(-1)
        QtCore.QObject.connect(self.fields['capacity'],
                               QtCore.SIGNAL('valueChanged(int)'),
                               self.evaluate)
        lCapMax.addWidget(QtGui.QLabel('Maximum Running Tasks:', self))
        self.fields['maxruntasks'] = QtGui.QSpinBox(self)
        lCapMax.addWidget(self.fields['maxruntasks'])
        self.fields['maxruntasks'].setRange(-1, 1000000)
        self.fields['maxruntasks'].setValue(-1)
        QtCore.QObject.connect(self.fields['maxruntasks'],
                               QtCore.SIGNAL('valueChanged(int)'),
                               self.evaluate)
        lCapMax.addWidget(QtGui.QLabel('Priority:', self))
        self.fields['priority'] = QtGui.QSpinBox(self)
        lCapMax.addWidget(self.fields['priority'])
        self.fields['priority'].setRange(-1, 250)
        self.fields['priority'].setValue(-1)
        QtCore.QObject.connect(self.fields['priority'],
                               QtCore.SIGNAL('valueChanged(int)'),
                               self.evaluate)

        # Depend Masks:
        lDepends = QtGui.QHBoxLayout()
        joblayout.addLayout(lDepends)
        lDepends.addWidget(QtGui.QLabel('Depend Mask:', self))
        self.fields['dependmask'] = QtGui.QLineEdit(self)
        lDepends.addWidget(self.fields['dependmask'])
        QtCore.QObject.connect(self.fields['dependmask'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)
        lDepends.addWidget(QtGui.QLabel('Global:', self))
        self.fields['dependglobal'] = QtGui.QLineEdit(self)
        lDepends.addWidget(self.fields['dependglobal'])
        QtCore.QObject.connect(self.fields['dependglobal'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)

        # Host Masks:
        lHostMasks = QtGui.QHBoxLayout()
        joblayout.addLayout(lHostMasks)
        lHostMasks.addWidget(QtGui.QLabel('Hosts Mask:', self))
        self.fields['hostsmask'] = QtGui.QLineEdit(self)
        lHostMasks.addWidget(self.fields['hostsmask'])
        QtCore.QObject.connect(self.fields['hostsmask'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)
        lHostMasks.addWidget(QtGui.QLabel('Exclude:', self))
        self.fields['hostsexclude'] = QtGui.QLineEdit(self)
        lHostMasks.addWidget(self.fields['hostsexclude'])
        QtCore.QObject.connect(self.fields['hostsexclude'],
                               QtCore.SIGNAL('textEdited(QString)'),
                               self.evaluate)

        # Presets:
        presetsLayout = QtGui.QHBoxLayout()
        topLayout.addLayout(presetsLayout)
        presetsLayout.addWidget(QtGui.QLabel('Recent:', self))
        self.cbRecent = QtGui.QComboBox(self)
        presetsLayout.addWidget(self.cbRecent)
        self.bBrowseLoad = QtGui.QPushButton('Load', self)
        presetsLayout.addWidget(self.bBrowseLoad)
        QtCore.QObject.connect(self.bBrowseLoad, QtCore.SIGNAL('pressed()'),
                               self.browseLoad)
        self.bBrowseSave = QtGui.QPushButton('Save', self)
        presetsLayout.addWidget(self.bBrowseSave)
        QtCore.QObject.connect(self.bBrowseSave, QtCore.SIGNAL('pressed()'),
                               self.browseSave)

        # Command Field:
        self.teCmd = QtGui.QTextEdit(self)
        topLayout.addWidget(self.teCmd)

        # Buttons:
        buttonsLayout = QtGui.QHBoxLayout()
        topLayout.addLayout(buttonsLayout)
        self.bStart = QtGui.QPushButton('&Start', self)
        buttonsLayout.addWidget(self.bStart)
        QtCore.QObject.connect(self.bStart, QtCore.SIGNAL('pressed()'),
                               self.start)
        self.fields['paused'] = QtGui.QCheckBox('Paused', self)
        buttonsLayout.addWidget(self.fields['paused'])
        QtCore.QObject.connect(self.fields['paused'],
                               QtCore.SIGNAL('stateChanged(int)'),
                               self.evaluate)
        self.bRefresh = QtGui.QPushButton('&Refresh', self)
        buttonsLayout.addWidget(self.bRefresh)
        QtCore.QObject.connect(self.bRefresh, QtCore.SIGNAL('pressed()'),
                               self.evaluate)
        self.bQuitSave = QtGui.QPushButton('&Quit&&Store', self)
        buttonsLayout.addWidget(self.bQuitSave)
        QtCore.QObject.connect(self.bQuitSave, QtCore.SIGNAL('pressed()'),
                               self.quitsave)

        self.constructed = True

        # Set window icon:
        iconpath = cgruutils.getIconFileName('afanasy')
        if iconpath is not None: self.setWindowIcon(QtGui.QIcon(iconpath))

        # Refresh recent:
        self.refreshRecent()

        # Load last settings:
        if not self.load(FileLast):
            self.evaluate()
Beispiel #28
0
    def __init__(self, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, parent)
        self.parent = parent

        # Menu:
        self.menu = dict()
        self.menu['menu'] = QtWidgets.QMenu()

        # Update item only if CGRU_UPDATE_CMD defined:
        if cgruconfig.VARS['CGRU_UPDATE_CMD'] is not None:
            action = QtWidgets.QAction('Update', self)
            action.triggered.connect(cmd.update)
            self.menu['menu'].addAction(action)
            self.menu['menu'].addSeparator()

        # Load menu:
        menu_path = os.path.join(
            os.path.join(cgruconfig.VARS['CGRU_LOCATION'], 'start')
        )  # TODO: why to use os.path.join() two times here, to add '/' at the end ???
        menu_paths = cgruconfig.VARS['menu_path']
        if menu_paths is None:
            menu_paths = menu_path
        if menu_paths.find(';') != -1:
            menu_paths = menu_paths.split(';')
        elif sys.platform.find('win') == -1:
            menu_paths = menu_paths.split(':')
        else:
            menu_paths = [menu_paths]
        if not menu_path in menu_paths:
            menu_paths.append(menu_path)
        for menu_path in menu_paths:
            if not os.path.isdir(menu_path):
                continue
            for dirpath, dirnames, filenames in os.walk(
                    menu_path, True, None, True):
                if dirpath.find('/.') != -1:
                    continue
                if dirpath.find('\\.') != -1:
                    continue
                menuname = os.path.basename(dirpath)
                if menuname == os.path.basename(menu_path):
                    menuname = 'menu'
                else:
                    self.addMenu(self.menu['menu'], menuname)
                filenames.sort()
                was_separator = True
                for filename in filenames:
                    if filename[0] == '.' or filename[0] == '_':
                        continue
                    if sys.platform[:3] == 'win':
                        if filename[-4:] != '.cmd':
                            continue
                        itemname = filename[:-4]
                    else:
                        if filename[-3:] != '.sh':
                            continue
                        itemname = filename[:-3]
                    filename = os.path.join(dirpath, filename)
                    with open(filename, 'r') as f:
                        lines = f.readlines()

                    iconpath = None
                    separator = False
                    for line in lines:
                        if line.find('Name=') != -1:
                            itemname = line.split('Name=')[-1].strip()
                            if itemname == 'Scan Scan...':
                                itemname = '影视搜索'
                            if itemname == 'Dailies...':
                                itemname = '影视剪辑'
                            if itemname == 'Check RegExp...':
                                itemname = '检测对象'
                            if itemname == 'Start Watch...':
                                itemname = '作业监控'
                            if itemname == 'Submit Job...':
                                itemname = '作业提交'
                            if itemname == 'Local Render...':
                                itemname = '本地渲染'
                        if line.find('Icon=') != -1:
                            iconpath = line.split('Icon=')[-1].strip()
                        if line.find('Separator') != -1:
                            separator = True
                    if separator:
                        if not was_separator:
                            self.menu[menuname].addSeparator()
                        was_separator = True
                    else:
                        was_separator = False
                    action = ActionCommand(self, itemname, filename, iconpath)
                    self.menu[menuname].addAction(action)
                    action.triggered.connect(action.runCommand)
                    if separator:
                        self.menu[menuname].addSeparator()

        # Add permanent items to 'Afanasy':
        # if not self.addMenu(self.menu['menu'], 'AFANASY'):
        if not self.addMenu(self.menu['menu'], '渲染'):
            self.menu['渲染'].addSeparator()

        # action = QtWidgets.QAction('Web GUI', self)
        action = QtWidgets.QAction('Web页面', self)
        action.triggered.connect(cmd.afwebgui)
        self.menu['渲染'].addAction(action)
        self.menu['渲染'].addSeparator()

        # self.action_user = QtWidgets.QAction('Set User...', self)
        self.action_user = QtWidgets.QAction('用户设置', self)
        self.action_user.triggered.connect(render.setUserDialog)
        self.action_user.setToolTip('Change local render user name.')
        self.menu['渲染'].addAction(self.action_user)

        # action = QtWidgets.QAction('Set nimby', self)
        action = QtWidgets.QAction('后台设置', self)
        action.triggered.connect(nimby.setnimby)
        self.menu['渲染'].addAction(action)

        action = QtWidgets.QAction('Set NIMBY', self)
        action.triggered.connect(nimby.setNIMBY)
        self.menu['渲染'].addAction(action)

        # action = QtWidgets.QAction('Set Free && Unpause', self)
        action = QtWidgets.QAction('作业释放', self)
        action.triggered.connect(nimby.setFreeUnpause)
        self.menu['渲染'].addAction(action)

        # action = QtWidgets.QAction('Eject Tasks', self)
        action = QtWidgets.QAction('开始任务', self)
        action.triggered.connect(nimby.ejectTasks)
        self.menu['渲染'].addAction(action)

        # action = QtWidgets.QAction('Eject Not My Tasks', self)
        action = QtWidgets.QAction('关闭其它任务', self)
        action.triggered.connect(nimby.ejectNotMyTasks)
        self.menu['渲染'].addAction(action)

        # action = QtWidgets.QAction('Render Info', self)
        action = QtWidgets.QAction('渲染信息', self)
        action.triggered.connect(self.renderInfo)
        self.menu['渲染'].addAction(action)

        self.menu['渲染'].addSeparator()

        # action = QtWidgets.QAction('Nimby Schedule...', self)
        action = QtWidgets.QAction('运行模式', self)
        action.triggered.connect(self.editNimby)
        self.menu['渲染'].addAction(action)

        self.menu['渲染'].addSeparator()

        #action = QtWidgets.QAction('Set Server...', self)
        action = QtWidgets.QAction('服务器设置', self)
        action.triggered.connect(cmd.setAFANASYServer)
        self.menu['渲染'].addAction(action)

        self.menu['menu'].addSeparator()

        # Add Software menu if it was not created by custom files:
        if not '专业软件' in self.menu:
            self.addMenu(self.menu['menu'], '专业软件')
            self.menu['menu'].addSeparator()
            action = QtWidgets.QAction(
                QtGui.QIcon(cgruutils.getIconFileName('folder')), '[ browse ]',
                self)
            action.triggered.connect(software.browse)
            self.menu['专业软件'].addAction(action)
            for soft in software.Names:
                icon = software.getIcon(soft)
                if icon is None:
                    action = QtWidgets.QAction(soft, self)
                else:
                    action = QtWidgets.QAction(icon, soft, self)
                eval("action.triggered.connect(software.start%s)" % soft)
                self.menu['专业软件'].addAction(action)
            # Software setup:
            self.menu['Setup Soft'] = QtWidgets.QMenu('Setup Soft')
            self.menu['专业软件'].addMenu(self.menu['Setup Soft'])
            for soft in software.Names:
                action = QtWidgets.QAction(soft, self)
                eval("action.triggered.connect(software.locate%s)" % soft)
                self.menu['Setup Soft'].addAction(action)
            # Software examples:
            self.menu['Examples'] = QtWidgets.QMenu('Examples')
            self.menu['专业软件'].addMenu(self.menu['Examples'])
            for soft in software.Names:
                action = QtWidgets.QAction(soft, self)
                eval("action.triggered.connect(software.example%s)" % soft)
                self.menu['Examples'].addAction(action)

        # Add permanent items to 'Configure':
        #if not self.addMenu(self.menu['menu'], 'Configure'):
        if not self.addMenu(self.menu['menu'], '系统配置'):
            self.menu['系统配置'].addSeparator()

        if serverhttps.isRunning:
            self.addAction('系统配置', False, 'HTTPS Server...', self.httpsServer)
            self.menu['系统配置'].addSeparator()

        #action = QtWidgets.QAction('Set Web Browser...', self)
        action = QtWidgets.QAction('配置浏览器...', self)
        action.triggered.connect(cmd.setWebBrowser)
        self.menu['系统配置'].addAction(action)

        #action = QtWidgets.QAction('Set Open Folder...', self)
        action = QtWidgets.QAction('配置文件夹...', self)
        action.triggered.connect(cmd.setOpenCmd)
        self.menu['系统配置'].addAction(action)

        #action = QtWidgets.QAction('Set Docs URL...', self)
        action = QtWidgets.QAction('配置文件主机...', self)
        action.triggered.connect(cmd.setDocsURL)
        self.menu['系统配置'].addAction(action)

        #action = QtWidgets.QAction('Set Text Editor...', self)
        action = QtWidgets.QAction('配置文本编辑器...', self)
        action.triggered.connect(cmd.setTextEditor)
        self.menu['系统配置'].addAction(action)

        #action = QtWidgets.QAction('Edit Config...', self)
        action = QtWidgets.QAction('设置配置', self)
        action.triggered.connect(cmd.editCGRUConfig)
        self.menu['系统配置'].addAction(action)

        self.menu['系统配置'].addSeparator()

        #action = QtWidgets.QAction('Reload Config', self)
        action = QtWidgets.QAction('重置服务', self)
        action.triggered.connect(cmd.confReload)
        self.menu['系统配置'].addAction(action)

        #self.addAction('menu', True,  'Show Info...',         self.cgruInfo, 'info')
        self.addAction('menu', True, '查看配置', self.cgruInfo, 'info')
        #self.addAction('menu', True,  'Documentation...',     cmd.cgruDocs)
        #self.addAction('menu', False, 'Forum...',             cmd.cgruForum)
        #self.addAction('menu', True,  'Restart',              cmd.restart)
        self.addAction('menu', True, '重启服务', cmd.restart)
        #self.addAction('menu', False, 'Quit',                 cmd.quit)
        self.addAction('menu', False, '退出服务', cmd.quit)

        self.setContextMenu(self.menu['menu'])

        # Tray tooltip:
        #self.setToolTip('%s Keeper' % cgruconfig.VARS['company'].upper())
        self.setToolTip('奇幻空间')

        # Tray icon:
        icon_filename = cgruconfig.VARS['tray_icon']
        if icon_filename is None: icon_filename = 'keeper'
        icon_filename = cgruutils.getIconFileName(icon_filename)
        self.icon_pixmap = QtGui.QPixmap(icon_filename)
        self.icon_default = QtGui.QIcon(self.icon_pixmap)
        self.showIcon()

        # Show:
        self.activated.connect(self.activated_slot)
        self.show()