def __init__(self, plug, **kw): GafferUI.PlugValueWidget.__init__(self, QtWidgets.QDateTimeEdit(), plug, **kw) self._qtWidget().setCalendarPopup(True) self._qtWidget().setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) self._qtWidget().calendarWidget().setGridVisible(True) headerFormat = QtGui.QTextCharFormat() headerFormat.setFontWeight(100) self._qtWidget().calendarWidget().setHeaderTextFormat(headerFormat) # remove weekday text format overrides so the stylesheet gets to do what it wants self._qtWidget().calendarWidget().setWeekdayTextFormat( QtCore.Qt.Saturday, QtGui.QTextCharFormat()) self._qtWidget().calendarWidget().setWeekdayTextFormat( QtCore.Qt.Sunday, QtGui.QTextCharFormat()) self._qtWidget().dateTimeChanged.connect( Gaffer.WeakMethod(self.__dateTimeChanged)) self._addPopupMenu() self._updateFromPlug()
def __init__(self, context_model, parent=None): super(TimestampWidget, self).__init__(parent) self.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Sunken) self.context_model = context_model self.popup = None self.package_btn = IconButton("package", "select package release date") self.clock_btn = IconButton("clock", "select time in the past") self.checkbox = QtWidgets.QCheckBox("ignore packages released after:") pane = create_pane( [None, self.checkbox, self.package_btn, self.clock_btn], True, compact=True) self.edit = QtWidgets.QDateTimeEdit() self.edit.setCalendarPopup(True) self.edit.setDateTime(QtCore.QDateTime.currentDateTime()) create_pane([pane, self.edit], False, compact=True, parent_widget=self) self.checkbox.stateChanged.connect(self._stateChanged) self.package_btn.clicked.connect(self._selectPackage) self.clock_btn.clicked.connect(self._selectTime) self.refresh()
def __init__(self, parent=None): super(LogsWidget, self).__init__(parent=parent) model = LogModel() filter_layout = QtWidgets.QHBoxLayout() # user_filter = SearchComboBox(self, "Users") user_filter = CustomCombo("Users", self) users = model.dbcon.distinct("user") user_filter.populate(users) user_filter.selection_changed.connect(self.user_changed) level_filter = CustomCombo("Levels", self) # levels = [(level, True) for level in model.dbcon.distinct("level")] levels = model.dbcon.distinct("level") level_filter.addItems(levels) date_from_label = QtWidgets.QLabel("From:") date_filter_from = QtWidgets.QDateTimeEdit() date_from_layout = QtWidgets.QVBoxLayout() date_from_layout.addWidget(date_from_label) date_from_layout.addWidget(date_filter_from) # now = datetime.datetime.now() # QtCore.QDateTime(now.year, now.month, now.day, now.hour, now.minute, second = 0, msec = 0, timeSpec = 0) date_to_label = QtWidgets.QLabel("To:") date_filter_to = QtWidgets.QDateTimeEdit() date_to_layout = QtWidgets.QVBoxLayout() date_to_layout.addWidget(date_to_label) date_to_layout.addWidget(date_filter_to) filter_layout.addWidget(user_filter) filter_layout.addWidget(level_filter) filter_layout.addLayout(date_from_layout) filter_layout.addLayout(date_to_layout) view = QtWidgets.QTreeView(self) view.setAllColumnsShowFocus(True) # # Set view delegates # time_delegate = PrettyTimeDelegate() # column = model.COLUMNS.index("time") # view.setItemDelegateForColumn(column, time_delegate) layout = QtWidgets.QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addLayout(filter_layout) layout.addWidget(view) view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) view.setSortingEnabled(True) view.sortByColumn(model.COLUMNS.index("timestamp"), QtCore.Qt.AscendingOrder) view.setModel(model) view.customContextMenuRequested.connect(self.on_context_menu) view.selectionModel().selectionChanged.connect(self.active_changed) # user_filter.connect() # TODO remove if nothing will affect... # header = self.view.header() # # Enforce the columns to fit the data (purely cosmetic) # if Qt.__binding__ in ("PySide2", "PyQt5"): # header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) # else: # header.setResizeMode(QtWidgets.QHeaderView.ResizeToContents) # Set signals # prepare model.refresh() # Store to memory self.model = model self.view = view self.user_filter = user_filter
def __init__(self): QtWidgets.QWidget.__init__(self) self.constructed = False self.evaluated = False self.test = False self.setWindowTitle('Scan Scan - CGRU ' + cgruconfig.VARS['CGRU_VERSION']) self.mainLayout = QtWidgets.QVBoxLayout(self) self.tabwidget = QtWidgets.QTabWidget(self) self.generalwidget = QtWidgets.QWidget(self) self.tabwidget.addTab(self.generalwidget, 'General') self.generallayout = QtWidgets.QVBoxLayout(self.generalwidget) self.parameterswidget = QtWidgets.QWidget(self) self.tabwidget.addTab(self.parameterswidget, 'Parameters') self.parameterslayout = QtWidgets.QVBoxLayout(self.parameterswidget) self.mainLayout.addWidget(self.tabwidget) # General: self.lFormat = QtWidgets.QHBoxLayout() self.tFormat = QtWidgets.QLabel('Format:', self) self.tFormat.setToolTip('Movie resolution.\n' 'Format presets located in\n' + FormatsPath) self.cbFormat = QtWidgets.QComboBox(self) i = 0 for format in FormatValues: self.cbFormat.addItem(FormatNames[i], format) if format == Options.format: self.cbFormat.setCurrentIndex(i) i += 1 self.cbFormat.currentIndexChanged.connect(self.evaluate) self.tCodec = QtWidgets.QLabel('Codec:', self) self.tCodec.setToolTip('Codec presets located in\n' + CodecsPath) self.cbCodec = QtWidgets.QComboBox(self) i = 0 for name in CodecNames: self.cbCodec.addItem(name, CodecFiles[i]) if os.path.basename(CodecFiles[i]) == Options.codec: self.cbCodec.setCurrentIndex(i) i += 1 self.cbCodec.currentIndexChanged.connect(self.evaluate) self.tFPS = QtWidgets.QLabel('FPS:', self) self.tFPS.setToolTip('Frame rate.') self.cbFPS = QtWidgets.QComboBox(self) self.cbFPS.addItem('24') self.cbFPS.addItem('25') self.cbFPS.addItem('30') self.cbFPS.setCurrentIndex(0) self.cbFPS.currentIndexChanged.connect(self.evaluate) self.lFormat.addWidget(self.tFormat) self.lFormat.addWidget(self.cbFormat) self.lFormat.addWidget(self.tFPS) self.lFormat.addWidget(self.cbFPS) self.lFormat.addWidget(self.tCodec) self.lFormat.addWidget(self.cbCodec) self.generallayout.addLayout(self.lFormat) self.lInput = QtWidgets.QHBoxLayout() self.tInput = QtWidgets.QLabel('Scan Folder', self) self.lInput.addWidget(self.tInput) self.editInput = QtWidgets.QLineEdit(InputFolder, self) self.editInput.textEdited.connect(self.evaluate) self.lInput.addWidget(self.editInput) self.btnInputBrowse = QtWidgets.QPushButton('Browse', self) self.btnInputBrowse.pressed.connect(self.inputBrowse) self.lInput.addWidget(self.btnInputBrowse) self.generallayout.addLayout(self.lInput) self.lExtensions = QtWidgets.QHBoxLayout() self.tExtensions = QtWidgets.QLabel('Search extensions:', self) tooltip = 'Comma separated list.\n' \ 'Leave empty to find all known:\n' for ext in Extensions: tooltip += ext + ' ' self.tExtensions.setToolTip(tooltip) self.lExtensions.addWidget(self.tExtensions) self.editExtensions = QtWidgets.QLineEdit(Options.extensions, self) self.editExtensions.editingFinished.connect(self.evaluate) self.lExtensions.addWidget(self.editExtensions) self.generallayout.addLayout(self.lExtensions) self.lInclude = QtWidgets.QHBoxLayout() self.tInclude = QtWidgets.QLabel('Include pattern:', self) self.lInclude.addWidget(self.tInclude) self.editInclude = QtWidgets.QLineEdit(Options.include, self) self.editInclude.textEdited.connect(self.evaluate) self.lInclude.addWidget(self.editInclude) self.generallayout.addLayout(self.lInclude) self.lExclude = QtWidgets.QHBoxLayout() self.tExclude = QtWidgets.QLabel('Exclude pattern:', self) self.lExclude.addWidget(self.tExclude) self.editExclude = QtWidgets.QLineEdit(Options.exclude, self) self.editExclude.textEdited.connect(self.evaluate) self.lExclude.addWidget(self.editExclude) self.generallayout.addLayout(self.lExclude) self.lDateTime = QtWidgets.QHBoxLayout() self.cDateTime = QtWidgets.QCheckBox('Skip folders ealier than:', self) self.cDateTime.stateChanged.connect(self.evaluate) self.lDateTime.addWidget(self.cDateTime) self.eDateTime = QtWidgets.QDateTimeEdit( QtCore.QDateTime.currentDateTime(), self) self.eDateTime.setCalendarPopup(True) self.eDateTime.setDisplayFormat(DateTimeFormat) self.eDateTime.dateTimeChanged.connect(self.evaluate) self.lDateTime.addWidget(self.eDateTime) self.generallayout.addLayout(self.lDateTime) self.lOutput = QtWidgets.QHBoxLayout() self.tOutput = QtWidgets.QLabel('Output Folder:', self) self.lOutput.addWidget(self.tOutput) self.editOutput = QtWidgets.QLineEdit(OutputFolder, self) self.editOutput.editingFinished.connect(self.evaluate) self.lOutput.addWidget(self.editOutput) self.btnOutputBrowse = QtWidgets.QPushButton('Browse', self) self.btnOutputBrowse.pressed.connect(self.browseOutput) self.lOutput.addWidget(self.btnOutputBrowse) self.generallayout.addLayout(self.lOutput) # Parameters: self.cAbsPath = QtWidgets.QCheckBox( 'Prefix movies names with images absolute input files path', self) self.cAbsPath.setChecked(Options.abspath) self.cAbsPath.stateChanged.connect(self.evaluate) self.parameterslayout.addWidget(self.cAbsPath) self.lTemplates = QtWidgets.QHBoxLayout() self.tTemplate = QtWidgets.QLabel('Frame Template:', self) self.tTemplate.setToolTip('Frame template.\n' 'Templates are located in\n' + TemplatesPath) self.cbTemplate = QtWidgets.QComboBox(self) for template in Templates: self.cbTemplate.addItem(template) self.cbTemplate.setCurrentIndex(Template) self.lTemplates.addWidget(self.tTemplate) self.lTemplates.addWidget(self.cbTemplate) self.cbTemplate.currentIndexChanged.connect(self.evaluate) self.parameterslayout.addLayout(self.lTemplates) self.lAspect = QtWidgets.QHBoxLayout() self.lAspect.addWidget(QtWidgets.QLabel('Input Images Aspect', self)) self.dsbAspect = QtWidgets.QDoubleSpinBox(self) self.dsbAspect.setRange(-1.0, 10.0) self.dsbAspect.setDecimals(6) self.dsbAspect.setValue(Options.aspect_in) self.dsbAspect.valueChanged.connect(self.evaluate) self.lAspect.addWidget(self.dsbAspect) self.lAspect.addWidget(QtWidgets.QLabel(' (-1 = no changes) ', self)) self.parameterslayout.addLayout(self.lAspect) self.lAutoAspect = QtWidgets.QHBoxLayout() self.tAutoAspect = QtWidgets.QLabel('Auto Input Aspect', self) self.tAutoAspect.setToolTip( 'Images with width/height ratio > this value will be ' 'treated as 2:1.') self.lAutoAspect.addWidget(self.tAutoAspect) self.dsbAutoAspect = QtWidgets.QDoubleSpinBox(self) self.dsbAutoAspect.setRange(-1.0, 10.0) self.dsbAutoAspect.setDecimals(3) self.dsbAutoAspect.setValue(Options.aspect_auto) self.dsbAutoAspect.valueChanged.connect(self.evaluate) self.lAutoAspect.addWidget(self.dsbAutoAspect) self.lAutoAspect.addWidget( QtWidgets.QLabel(' (-1 = no changes) ', self)) self.parameterslayout.addLayout(self.lAutoAspect) self.gCorrectionSettings = QtWidgets.QGroupBox('Image Correction') self.lCorr = QtWidgets.QHBoxLayout() self.gCorrectionSettings.setLayout(self.lCorr) self.tGamma = QtWidgets.QLabel('Gamma:', self) self.dsbGamma = QtWidgets.QDoubleSpinBox(self) self.dsbGamma.setRange(0.1, 10.0) self.dsbGamma.setDecimals(1) self.dsbGamma.setSingleStep(0.1) self.dsbGamma.setValue(1.0) self.dsbGamma.valueChanged.connect(self.evaluate) self.lCorr.addWidget(self.tGamma) self.lCorr.addWidget(self.dsbGamma) self.parameterslayout.addWidget(self.gCorrectionSettings) # Bottom tab: self.cmdField = QtWidgets.QTextEdit(self) self.cmdField.setReadOnly(True) self.mainLayout.addWidget(self.cmdField) self.lProcess = QtWidgets.QHBoxLayout() self.btnStart = QtWidgets.QPushButton('Start', self) self.btnStart.setEnabled(False) self.btnStart.pressed.connect(self.execute) self.btnStop = QtWidgets.QPushButton('Stop', self) self.btnStop.setEnabled(False) self.btnStop.pressed.connect(self.processStop) self.btnTest = QtWidgets.QPushButton('Test', self) self.btnTest.setEnabled(False) self.btnTest.pressed.connect(self.executeTest) self.lProcess.addWidget(self.btnTest) self.lProcess.addWidget(self.btnStart) self.lProcess.addWidget(self.btnStop) self.mainLayout.addLayout(self.lProcess) self.lAfanasy = QtWidgets.QHBoxLayout() self.cAfanasy = QtWidgets.QCheckBox('Afanasy', self) self.cAfanasy.setChecked(Options.afanasy != 0) self.cAfanasy.stateChanged.connect(self.afanasy) self.tAfCapacity = QtWidgets.QLabel('Capacity:', self) self.sbAfCapacity = QtWidgets.QSpinBox(self) self.sbAfCapacity.setRange(-1, 1000000) self.sbAfCapacity.setValue(Options.afanasy) self.sbAfCapacity.valueChanged.connect(self.evaluate) self.tAfMaxHosts = QtWidgets.QLabel('Maximum Hosts:', self) self.sbAfMaxHosts = QtWidgets.QSpinBox(self) self.sbAfMaxHosts.setRange(-1, 1000000) self.sbAfMaxHosts.setValue(Options.maxhosts) self.sbAfMaxHosts.valueChanged.connect(self.evaluate) self.cAfPause = QtWidgets.QCheckBox('Pause', self) self.lAfanasy.addWidget(self.cAfanasy) self.lAfanasy.addWidget(self.tAfCapacity) self.lAfanasy.addWidget(self.sbAfCapacity) self.lAfanasy.addWidget(self.tAfMaxHosts) self.lAfanasy.addWidget(self.sbAfMaxHosts) self.lAfanasy.addWidget(self.cAfPause) self.mainLayout.addLayout(self.lAfanasy) self.constructed = True self.afanasy() self.evaluate()
def __init__(self, parent=None): super(LogsWidget, self).__init__(parent=parent) model = LogModel() filter_layout = QtWidgets.QHBoxLayout() # user_filter = SearchComboBox(self, "Users") user_filter = CustomCombo("Users", self) users = model.dbcon.distinct("user") user_filter.populate(users) user_filter.selection_changed.connect(self.user_changed) level_filter = CustomCombo("Levels", self) # levels = [(level, True) for level in model.dbcon.distinct("level")] levels = model.dbcon.distinct("level") level_filter.addItems(levels) date_from_label = QtWidgets.QLabel("From:") date_filter_from = QtWidgets.QDateTimeEdit() date_from_layout = QtWidgets.QVBoxLayout() date_from_layout.addWidget(date_from_label) date_from_layout.addWidget(date_filter_from) # now = datetime.datetime.now() # QtCore.QDateTime( # now.year, # now.month, # now.day, # now.hour, # now.minute, # second=0, # msec=0, # timeSpec=0 # ) date_to_label = QtWidgets.QLabel("To:") date_filter_to = QtWidgets.QDateTimeEdit() date_to_layout = QtWidgets.QVBoxLayout() date_to_layout.addWidget(date_to_label) date_to_layout.addWidget(date_filter_to) filter_layout.addWidget(user_filter) filter_layout.addWidget(level_filter) filter_layout.addLayout(date_from_layout) filter_layout.addLayout(date_to_layout) view = QtWidgets.QTreeView(self) view.setAllColumnsShowFocus(True) layout = QtWidgets.QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addLayout(filter_layout) layout.addWidget(view) view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) view.setSortingEnabled(True) view.sortByColumn(model.COLUMNS.index("started"), QtCore.Qt.AscendingOrder) view.setModel(model) view.pressed.connect(self._on_activated) # prepare model.refresh() # Store to memory self.model = model self.view = view self.user_filter = user_filter self.level_filter = level_filter
def createDialog(): def createLayoutH(i_args): h_layout = QtWidgets.QHBoxLayout() i_args['layout'].addLayout(h_layout) if 'spacing' in i_args: h_layout.addSpacing(i_args['spacing']) return h_layout def createLabel(i_args): label = QtWidgets.QLabel(i_args['label']) i_args['layout'].addWidget(label) label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) if 'lwidth' in i_args: label.setFixedWidth(i_args['lwidth']) if 'tip' in i_args: label.setToolTip(i_args['tip']) def createField(i_args): i_args['layout'] = createLayoutH({'layout': i_args['layout']}) createLabel(i_args) if not 'type' in i_args: i_args['type'] = 'str' if i_args['type'] == 'int': edit = QtWidgets.QSpinBox() if 'min' in i_args: edit.setMinimum(i_args['min']) else: edit.setMinimum(-1000000000) if 'max' in i_args: edit.setMaximum(i_args['max']) else: edit.setMaximum(1000000000) if 'val' in i_args: edit.setValue(i_args['val']) else: edit = QtWidgets.QLineEdit() if 'val' in i_args: edit.setText(i_args['val']) if 'ewidth' in i_args: edit.setFixedWidth(i_args['ewidth']) i_args['layout'].addWidget(edit) Fields[i_args['name']] = edit def createButton(i_args): btn = QtWidgets.QPushButton(i_args['label']) i_args['layout'].addWidget(btn) if 'width' in i_args: btn.setFixedWidth(i_args['width']) btn.pressed.connect(i_args['slot']) return btn # Top widget: dialog = QtWidgets.QWidget() dialog.setWindowTitle('Afanasy Submit') dialog.setWindowIcon( QtWidgets.QIcon('%s/icons/afanasy.png' % cgruconfig.VARS['CGRU_LOCATION'])) dialog_layout = QtWidgets.QVBoxLayout(dialog) tabs = QtWidgets.QTabWidget(dialog) dialog_layout.addWidget(tabs) # General Tab: tab = QtWidgets.QWidget(tabs) tabs.addTab(tab, 'General') tab_layout = QtWidgets.QVBoxLayout(tab) lwidth = 80 rwidth = 80 # Job name: h_layout = createLayoutH({'layout': tab_layout}) createField({ 'name': 'job_name', 'label': 'Job Name', 'layout': h_layout, 'val': os.path.basename(Filename), 'lwidth': lwidth }) # Engine: createLabel({'label': 'Engine', 'layout': h_layout, 'lwidth': lwidth}) engines = ['clarisse_node', 'clarisse_render', 'cnode', 'crender'] combo = QtWidgets.QComboBox() combo.setFixedWidth(150) h_layout.addWidget(combo) for engine in engines: combo.addItem(engine) Fields['engine'] = combo # Help button: createButton({ 'label': 'Help', 'slot': showHelp, 'layout': h_layout, 'width': rwidth }) # Archive: h_layout = createLayoutH({'layout': tab_layout}) createField({ 'name': 'archive', 'label': 'Archive', 'layout': h_layout, 'val': Archive, 'lwidth': lwidth, 'tip': '"@TIME@" will be replaced with the current time.' }) createButton({ 'label': 'Browse', 'slot': browseArchive, 'layout': h_layout, 'width': rwidth }) h_layout = createLayoutH({'layout': tab_layout, 'spacing': lwidth + 10}) archive_save = QtWidgets.QCheckBox('Export Archive') archive_save.setToolTip( 'Export project file to render archive before job sending.') archive_save.setChecked(True) h_layout.addWidget(archive_save) Fields['archive_save'] = archive_save archive_del = QtWidgets.QCheckBox('Delete Archive') archive_del.setToolTip('Delete render archive after job deletion.') archive_del.setChecked(True) h_layout.addWidget(archive_del) Fields['archive_del'] = archive_del # Images: h_layout = createLayoutH({'layout': tab_layout}) def getAllImages(): objects = ix.api.OfObjectArray() ix.application.get_factory().get_all_objects("Image", objects) return objects def imageChanged(i_index=0): Fields['output'].setText( getAllImages()[i_index].get_attribute('save_as').get_string()) h_layout = createLayoutH({'layout': tab_layout}) createLabel({'label': 'Image', 'layout': h_layout, 'lwidth': lwidth}) combo = QtWidgets.QComboBox() for img in getAllImages(): name = img.get_full_name().replace('project://', '') combo.addItem(name) combo.currentIndexChanged.connect(imageChanged) h_layout.addWidget(combo) Fields['image'] = combo createField({ 'name': 'format', 'label': 'Format', 'layout': h_layout, 'lwidth': 60, 'ewidth': rwidth, 'tip': 'Output images format.\nIf empty, it will not be changed.' }) # Output: h_layout = createLayoutH({'layout': tab_layout}) createField({ 'name': 'output', 'label': 'Output', 'layout': h_layout, 'lwidth': lwidth }) imageChanged() createButton({ 'label': 'Browse', 'slot': browseOutput, 'layout': h_layout, 'width': rwidth }) # Frame range: frange = ix.application.get_current_frame_range() h_layout = createLayoutH({'layout': tab_layout}) createField({ 'name': 'frame_first', 'label': 'Frame First', 'type': 'int', 'val': frange[0], 'layout': h_layout, 'lwidth': lwidth }) createField({ 'name': 'frame_last', 'label': 'Frame Last', 'type': 'int', 'val': frange[1], 'layout': h_layout, 'lwidth': lwidth }) createField({ 'name': 'frame_step', 'label': 'Frame Step', 'type': 'int', 'val': 1, 'min': 1, 'layout': h_layout, 'lwidth': lwidth, 'ewidth': rwidth }) h_layout = createLayoutH({'layout': tab_layout, 'spacing': lwidth + 10}) createField({ 'name': 'frames_per_task', 'label': 'Frames Per Task', 'type': 'int', 'val': 2, 'min': 1, 'layout': h_layout }) createField({ 'name': 'frame_sequential', 'label': 'Frame Sequential', 'type': 'int', 'val': 1, 'layout': h_layout, 'ewidth': rwidth }) tab_layout.addStretch() # Settings Tab: tab = QtWidgets.QWidget(tabs) tabs.addTab(tab, 'Settings') tab_layout = QtWidgets.QVBoxLayout(tab) lwidth = 120 h_layout = createLayoutH({'layout': tab_layout}) createField({ 'name': 'priority', 'label': 'Priority', 'type': 'int', 'val': -1, 'min': -1, 'layout': h_layout, 'lwidth': lwidth }) createField({ 'name': 'capacity', 'label': 'Capacity', 'type': 'int', 'val': -1, 'min': -1, 'layout': h_layout, 'lwidth': lwidth }) h_layout = createLayoutH({'layout': tab_layout}) createField({ 'name': 'max_running_tasks', 'label': 'Max Run Tasks', 'type': 'int', 'val': -1, 'min': -1, 'layout': h_layout, 'lwidth': lwidth }) createField({ 'name': 'max_running_tasks_per_host', 'label': 'Per Host', 'type': 'int', 'val': -1, 'min': -1, 'layout': h_layout, 'lwidth': lwidth }) createField({ 'name': 'tasks_max_run_time', 'label': 'Max Run Time', 'type': 'int', 'val': -1, 'min': -1, 'layout': tab_layout, 'lwidth': lwidth, 'tip': 'Maximum time (in hours) that tasks are allowed to run.' }) # Wait time: h_layout = createLayoutH({'layout': tab_layout}) createLabel({ 'label': 'Wait Time', 'layout': h_layout, 'tip': 'Job will wait this time to start.', 'lwidth': lwidth }) wait_time = QtWidgets.QDateTimeEdit(QtCore.QDateTime.currentDateTime()) wait_time.setDisplayFormat('yyyy.MM.dd hh:mm:ss') Fields['wait_time'] = wait_time h_layout.addWidget(wait_time) # Service/Parser: createField({ 'name': 'service', 'label': 'Service', 'val': 'clarisse', 'layout': tab_layout, 'lwidth': lwidth }) createField({ 'name': 'parser', 'label': 'Parser', 'val': 'clarisse', 'layout': tab_layout, 'lwidth': lwidth }) tab_layout.addStretch() # Conditions Tab: tab = QtWidgets.QWidget(tabs) tabs.addTab(tab, 'Conditions') tab_layout = QtWidgets.QVBoxLayout(tab) lwidth = 150 createField({ 'name': 'need_os', 'label': 'Needed OS', 'layout': tab_layout, 'lwidth': lwidth, 'tip': 'Job tasks will run only on clients with specified OS.' }) createField({ 'name': 'need_properties', 'label': 'Needed Properties', 'layout': tab_layout, 'lwidth': lwidth, 'tip': 'Job tasks will run only on clients with specified properties.' }) createField({ 'name': 'depend_mask', 'label': 'Depend Mask', 'layout': tab_layout, 'lwidth': lwidth, 'tip': 'Job will wait all jobs from the same user which name matches this regular expression.' }) createField({ 'name': 'depend_mask_global', 'label': 'Global Depend Mask', 'layout': tab_layout, 'lwidth': lwidth, 'tip': 'Job will wait all jobs from all users which name matches this regular expression.' }) createField({ 'name': 'hosts_mask', 'label': 'Hosts Mask', 'layout': tab_layout, 'lwidth': lwidth, 'tip': 'Job tasks will run only on hosts which name matches this regular expression.' }) createField({ 'name': 'hosts_mask_exclude', 'label': 'Exclude Hosts Mask', 'layout': tab_layout, 'lwidth': lwidth, 'tip': 'Job tasks will not run on hosts which name matches this regular expression.' }) tab_layout.addStretch() # Send job buttons: h_layout = createLayoutH({'layout': dialog_layout}) Fields['btn_send'] = createButton({ 'label': 'Send Job', 'slot': createJob, 'layout': h_layout }) # Paused: paused = QtWidgets.QCheckBox('Paused') paused.setToolTip( 'Job will be sent with "OFFLINE" state.\nTasks execution is paused.') paused.setFixedWidth(rwidth + 10) h_layout.addWidget(paused) Fields['paused'] = paused # Info line: line = QtWidgets.QLineEdit() dialog_layout.addWidget(line) line.setReadOnly(True) Fields['info'] = line dialog.show() return dialog