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()
Exemple #2
0
    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()
Exemple #3
0
    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
Exemple #4
0
    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()
Exemple #5
0
    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