def __init__(self, text, image, authors, translators, parent=None): super(AboutDialog, self).__init__(parent) self.parent = parent self.authors = authors self.translators = translators imageQL = QLabel() imageQL.setMaximumSize(QSize(63, 61)) imageQL.setPixmap(QPixmap(image)) imageQL.setScaledContents(True) textQL = QLabel() textQL.setText(text) textQL.setOpenExternalLinks(True) creditsQPB = QPushButton(self.tr('C&redits')) closeQPB = QPushButton(self.tr('&Close')) vlayout1 = utils.add_to_layout('v', imageQL, None) hlayout1 = utils.add_to_layout('h', vlayout1, textQL) hlayout2 = utils.add_to_layout('h', creditsQPB, None, closeQPB) fin_layout = utils.add_to_layout('v', hlayout1, hlayout2) self.setLayout(fin_layout) closeQPB.clicked.connect(self.close) creditsQPB.clicked.connect(self.show_credits) self.resize(455, 200) self.setWindowTitle(self.tr('About FF Multi Converter'))
def __init__(self, text, image, authors, translators, parent=None): super(AboutDialog, self).__init__(parent) self.parent = parent self.authors = authors self.translators = translators imageQL = QLabel() imageQL.setMaximumSize(QSize(63, 61)) imageQL.setPixmap(QPixmap(image)) imageQL.setScaledContents(True) textQL = QLabel() textQL.setText(text) textQL.setOpenExternalLinks(True) creditsQPB = QPushButton(self.tr("C&redits")) closeQPB = QPushButton(self.tr("&Close")) vlayout1 = utils.add_to_layout("v", imageQL, None) hlayout1 = utils.add_to_layout("h", vlayout1, textQL) hlayout2 = utils.add_to_layout("h", creditsQPB, None, closeQPB) fin_layout = utils.add_to_layout("v", hlayout1, hlayout2) self.setLayout(fin_layout) closeQPB.clicked.connect(self.close) creditsQPB.clicked.connect(self.show_credits) self.resize(455, 200) self.setWindowTitle(self.tr("About FF Multi Converter"))
def __init__(self, parent): self.parent = parent super(DocumentTab, self).__init__(parent) self.name = 'Documents' self.formats = { 'doc' : ['odt', 'pdf'], 'html' : ['odt'], 'odp' : ['pdf', 'ppt'], 'ods' : ['pdf'], 'odt' : ['doc', 'html', 'pdf', 'rtf', 'sxw', 'txt','xml'], 'ppt' : ['odp'], 'rtf' : ['odt'], 'sdw' : ['odt'], 'sxw' : ['odt'], 'txt' : ['odt'], 'xls' : ['ods'], 'xml' : ['doc', 'odt', 'pdf'] } flist = [] for i in self.formats: for y in self.formats[i]: flist.append(i + ' to ' + y) flist.sort() convertQL = QLabel(self.tr('Convert:')) self.convertQCB = QComboBox() self.convertQCB.addItems(flist) final_layout = utils.add_to_layout( 'h', convertQL, self.convertQCB, None) self.setLayout(final_layout)
def __init__(self, parent): self.parent = parent super(DocumentTab, self).__init__(parent) self.name = 'Documents' self.formats = config.document_formats convertQL = QLabel(self.tr('Convert to:')) self.extQCB = QComboBox() final_layout = utils.add_to_layout('h', convertQL, self.extQCB, None) self.setLayout(final_layout)
def __init__(self, parent): super(ImageTab, self).__init__(parent) self.parent = parent self.name = 'Images' self.formats = [ 'bmp', 'cgm', 'dpx', 'emf', 'eps', 'fpx', 'gif', 'jbig', 'jng', 'jpeg', 'mrsid', 'p7', 'pdf', 'picon', 'png', 'ppm', 'psd', 'rad', 'tga', 'tif','webp', 'xpm' ] self.extra_img = [ 'bmp2', 'bmp3', 'dib', 'epdf', 'epi', 'eps2', 'eps3', 'epsf', 'epsi', 'icon', 'jpe', 'jpg', 'pgm', 'png24', 'png32', 'pnm', 'ps', 'ps2', 'ps3', 'sid', 'tiff' ] validator = QRegExpValidator(QRegExp(r'^[1-9]\d*'), self) converttoQL = QLabel(self.tr('Convert to:')) self.extQCB = QComboBox() self.extQCB.addItems(self.formats) commandQL = QLabel(self.tr('Extra options:')) self.commandQLE = QLineEdit() hlayout2 = utils.add_to_layout( 'h', converttoQL, self.extQCB, commandQL, self.commandQLE) sizeQL = QLabel( '<html><p align="center">' + self.tr('Image Size:') + '</p></html>') self.widthQLE = utils.create_LineEdit((50, 16777215), validator, 4) self.heightQLE = utils.create_LineEdit((50, 16777215), validator, 4) label = QLabel('<html><p align="center">x</p></html>') label.setMaximumWidth(25) hlayout1 = utils.add_to_layout('h', self.widthQLE, label,self.heightQLE) sizelayout = utils.add_to_layout('v', sizeQL, hlayout1) self.imgaspectQChB = QCheckBox(self.tr("Maintain aspect ratio")) self.autocropQChB = QCheckBox(self.tr("Auto-crop")) vlayout = utils.add_to_layout('v', self.imgaspectQChB,self.autocropQChB) rotateQL = QLabel( "<html><div align='center'>" + self.tr("Rotate") + ":</div><br>(" + self.tr("degrees - clockwise") + ")</html>") self.rotateQLE = utils.create_LineEdit((100, 16777215), validator, 3) self.vflipQChB = QCheckBox("Vertical flip") self.hflipQChB = QCheckBox("Horizontal flip") vlayout2 = utils.add_to_layout('v', self.vflipQChB, self.hflipQChB) hlayout3 = utils.add_to_layout( 'h', sizelayout, vlayout, rotateQL, self.rotateQLE, vlayout2, None) final_layout = utils.add_to_layout('v', hlayout2, hlayout3) self.setLayout(final_layout)
def __init__(self, authors, translators, parent=None): super(CreditsDialog, self).__init__(parent) self.parent = parent authorsLabel = QPlainTextEdit(authors) authorsLabel.setReadOnly(True) translatorsLabel = QPlainTextEdit(translators) translatorsLabel.setReadOnly(True) TabWidget = QTabWidget() TabWidget.addTab(authorsLabel, self.tr('Written by')) TabWidget.addTab(translatorsLabel, self.tr('Translated by')) closeQPB = QPushButton(self.tr('&Close')) hlayout = utils.add_to_layout('h', None, closeQPB) vlayout = utils.add_to_layout('v', TabWidget, hlayout) self.setLayout(vlayout) closeQPB.clicked.connect(self.close) self.setMinimumSize(QSize(335, 370)) self.setMaximumSize(QSize(335, 370)) self.setWindowTitle(self.tr('Credits'))
def __init__(self, authors, translators, parent=None): super(CreditsDialog, self).__init__(parent) self.parent = parent authorsLabel = QPlainTextEdit(authors) authorsLabel.setReadOnly(True) translatorsLabel = QPlainTextEdit(translators) translatorsLabel.setReadOnly(True) TabWidget = QTabWidget() TabWidget.addTab(authorsLabel, self.tr("Written by")) TabWidget.addTab(translatorsLabel, self.tr("Translated by")) closeQPB = QPushButton(self.tr("&Close")) hlayout = utils.add_to_layout("h", None, closeQPB) vlayout = utils.add_to_layout("v", TabWidget, hlayout) self.setLayout(vlayout) closeQPB.clicked.connect(self.close) self.setMinimumSize(QSize(335, 370)) self.setMaximumSize(QSize(335, 370)) self.setWindowTitle(self.tr("Credits"))
def __init__(self, parent): super(ImageTab, self).__init__(parent) self.parent = parent self.name = 'Images' self.formats = config.image_formats self.extra_img = config.image_extra_formats validator = QRegExpValidator(QRegExp(r'^[1-9]\d*'), self) converttoQL = QLabel(self.tr('Convert to:')) self.extQCB = QComboBox() self.extQCB.addItems(self.formats) commandQL = QLabel(self.tr('Extra options:')) self.commandQLE = QLineEdit() hlayout2 = utils.add_to_layout('h', converttoQL, self.extQCB, commandQL, self.commandQLE) sizeQL = QLabel('<html><p align="center">' + self.tr('Image Size:') + '</p></html>') self.widthQLE = utils.create_LineEdit((50, 16777215), validator, 4) self.heightQLE = utils.create_LineEdit((50, 16777215), validator, 4) label = QLabel('<html><p align="center">x</p></html>') label.setMaximumWidth(25) hlayout1 = utils.add_to_layout('h', self.widthQLE, label, self.heightQLE) sizelayout = utils.add_to_layout('v', sizeQL, hlayout1) self.imgaspectQChB = QCheckBox(self.tr("Maintain aspect ratio")) self.autocropQChB = QCheckBox(self.tr("Auto-crop")) vlayout = utils.add_to_layout('v', self.imgaspectQChB, self.autocropQChB) rotateQL = QLabel("<html><div align='center'>" + self.tr("Rotate") + ":</div><br>(" + self.tr("degrees - clockwise") + ")</html>") self.rotateQLE = utils.create_LineEdit((100, 16777215), validator, 3) self.vflipQChB = QCheckBox(self.tr('Vertical flip')) self.hflipQChB = QCheckBox(self.tr('Horizontal flip')) vlayout2 = utils.add_to_layout('v', self.vflipQChB, self.hflipQChB) hlayout3 = utils.add_to_layout('h', sizelayout, vlayout, rotateQL, self.rotateQLE, vlayout2, None) final_layout = utils.add_to_layout('v', hlayout2, hlayout3) self.setLayout(final_layout)
def __init__(self, parent): super(ImageTab, self).__init__(parent) self.parent = parent self.name = 'Images' self.formats = config.image_formats self.extra_img = config.image_extra_formats validator = QRegExpValidator(QRegExp(r'^[1-9]\d*'), self) converttoQL = QLabel(self.tr('Convert to:')) self.extQCB = QComboBox() self.extQCB.addItems(self.formats) commandQL = QLabel(self.tr('Extra options:')) self.commandQLE = QLineEdit() hlayout2 = utils.add_to_layout( 'h', converttoQL, self.extQCB, commandQL, self.commandQLE) sizeQL = QLabel( '<html><p align="center">' + self.tr('Image Size:') + '</p></html>') self.widthQLE = utils.create_LineEdit((50, 16777215), validator, 4) self.heightQLE = utils.create_LineEdit((50, 16777215), validator, 4) label = QLabel('<html><p align="center">x</p></html>') label.setMaximumWidth(25) hlayout1 = utils.add_to_layout('h', self.widthQLE, label,self.heightQLE) sizelayout = utils.add_to_layout('v', sizeQL, hlayout1) self.imgaspectQChB = QCheckBox(self.tr("Maintain aspect ratio")) self.autocropQChB = QCheckBox(self.tr("Auto-crop")) vlayout = utils.add_to_layout('v', self.imgaspectQChB,self.autocropQChB) rotateQL = QLabel( "<html><div align='center'>" + self.tr("Rotate") + ":</div><br>(" + self.tr("degrees - clockwise") + ")</html>") self.rotateQLE = utils.create_LineEdit((100, 16777215), validator, 3) self.vflipQChB = QCheckBox(self.tr('Vertical flip')) self.hflipQChB = QCheckBox(self.tr('Horizontal flip')) vlayout2 = utils.add_to_layout('v', self.vflipQChB, self.hflipQChB) hlayout3 = utils.add_to_layout( 'h', sizelayout, vlayout, rotateQL, self.rotateQLE, vlayout2, None) final_layout = utils.add_to_layout('v', hlayout2, hlayout3) self.setLayout(final_layout)
def __init__(self, parent): self.parent = parent super(DocumentTab, self).__init__(parent) self.name = 'Documents' self.formats = config.document_formats flist = [] for i in self.formats: for y in self.formats[i]: flist.append(i + ' to ' + y) flist.sort() convertQL = QLabel(self.tr('Convert:')) self.convertQCB = QComboBox() self.convertQCB.addItems(flist) final_layout = utils.add_to_layout('h', convertQL, self.convertQCB, None) self.setLayout(final_layout)
def __init__(self, parent): self.parent = parent super(DocumentTab, self).__init__(parent) self.name = 'Documents' self.formats = config.document_formats flist = [] for i in self.formats: for y in self.formats[i]: flist.append(i + ' to ' + y) flist.sort() convertQL = QLabel(self.tr('Convert:')) self.convertQCB = QComboBox() self.convertQCB.addItems(flist) final_layout = utils.add_to_layout( 'h', convertQL, self.convertQCB, None) self.setLayout(final_layout)
def __init__(self, xml_element, edit=False, parent=None): super(AddorEditPreset, self).__init__(parent) nameQL = QLabel(self.tr('Preset name (one word, A-z, 0-9)')) self.nameQLE = QLineEdit() labelQL = QLabel(self.tr('Preset label')) self.labelQLE = QLineEdit() commandQL = QLabel(self.tr('Preset command line parameters')) self.commandQLE = QLineEdit() extQL = QLabel(self.tr('Output file extension')) self.extQLE = QLineEdit() buttonBox = QDialogButtonBox( QDialogButtonBox.Ok|QDialogButtonBox.Cancel) final_layout = utils.add_to_layout( 'v', nameQL, self.nameQLE, labelQL, self.labelQLE, commandQL, self.commandQLE, extQL, self.extQLE, buttonBox ) self.setLayout(final_layout) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) self.resize(410, 280) if edit: self.nameQLE.setText(xml_element.tag) self.labelQLE.setText(xml_element[0].text) self.commandQLE.setText(xml_element[1].text) self.commandQLE.home(False) self.extQLE.setText(xml_element[2].text) title = self.tr('Edit {0}'.format(xml_element.tag)) else: title = self.tr('Add preset') self.resize(410, 280) self.setWindowTitle(title)
def __init__(self, xml_element, edit=False, parent=None): super(AddorEditPreset, self).__init__(parent) nameQL = QLabel(self.tr('Preset name (one word, A-z, 0-9)')) self.nameQLE = QLineEdit() labelQL = QLabel(self.tr('Preset label')) self.labelQLE = QLineEdit() commandQL = QLabel(self.tr('Preset command line parameters')) self.commandQLE = QLineEdit() extQL = QLabel(self.tr('Output file extension')) self.extQLE = QLineEdit() buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) final_layout = utils.add_to_layout('v', nameQL, self.nameQLE, labelQL, self.labelQLE, commandQL, self.commandQLE, extQL, self.extQLE, buttonBox) self.setLayout(final_layout) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) self.resize(410, 280) if edit: self.nameQLE.setText(xml_element.tag) self.labelQLE.setText(xml_element[0].text) self.commandQLE.setText(xml_element[1].text) self.commandQLE.home(False) self.extQLE.setText(xml_element[2].text) title = self.tr('Edit {0}'.format(xml_element.tag)) else: title = self.tr('Add preset') self.resize(410, 280) self.setWindowTitle(title)
def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.fnames = [] # list of file names to be converted self.office_listener_started = False self.parse_cla() addQPB = QPushButton(self.tr('Add')) delQPB = QPushButton(self.tr('Delete')) clearQPB = QPushButton(self.tr('Clear')) vlayout1 = utils.add_to_layout('v', addQPB, delQPB, clearQPB, None) self.filesList = utils.FilesList() self.filesList.setSelectionMode(QAbstractItemView.ExtendedSelection) hlayout1 = utils.add_to_layout('h', self.filesList, vlayout1) outputQL = QLabel(self.tr('Output folder:')) self.toQLE = QLineEdit() self.toQLE.setReadOnly(True) self.toQTB = QToolButton() self.toQTB.setText('...') hlayout2 = utils.add_to_layout('h', outputQL, self.toQLE, self.toQTB) self.audiovideo_tab = AudioVideoTab(self) self.image_tab = ImageTab(self) self.document_tab = DocumentTab(self) self.tabs = [self.audiovideo_tab, self.image_tab, self.document_tab] tab_names = [ self.tr('Audio/Video'), self.tr('Images'), self.tr('Documents') ] self.tabWidget = QTabWidget() for num, tab in enumerate(tab_names): self.tabWidget.addTab(self.tabs[num], tab) self.tabWidget.setCurrentIndex(0) self.origQCB = QCheckBox( self.tr('Save each file in the same\nfolder as input file')) self.deleteQCB = QCheckBox(self.tr('Delete original')) convertQPB = QPushButton(self.tr('&Convert')) hlayout3 = utils.add_to_layout('h', self.origQCB, self.deleteQCB, None) hlayout4 = utils.add_to_layout('h', None, convertQPB) final_layout = utils.add_to_layout('v', hlayout1, self.tabWidget, hlayout2, hlayout3, hlayout4) self.dependenciesQL = QLabel() self.statusBar().addPermanentWidget(self.dependenciesQL, stretch=1) widget = QWidget() widget.setLayout(final_layout) self.setCentralWidget(widget) openAction = utils.create_action(self, self.tr('Open'), QKeySequence.Open, None, self.tr('Open a file'), self.filesList_add) convertAction = utils.create_action(self, self.tr('Convert'), 'Ctrl+C', None, self.tr('Convert files'), self.start_conversion) quitAction = utils.create_action(self, self.tr('Quit'), 'Ctrl+Q', None, self.tr('Quit'), self.close) edit_presetsAction = utils.create_action(self, self.tr('Edit Presets'), 'Ctrl+P', None, self.tr('Edit Presets'), self.open_dialog_presets) importAction = utils.create_action(self, self.tr('Import'), None, None, self.tr('Import presets'), self.import_presets) exportAction = utils.create_action(self, self.tr('Export'), None, None, self.tr('Export presets'), self.export_presets) resetAction = utils.create_action(self, self.tr('Reset'), None, None, self.tr('Reset presets'), self.reset_presets) syncAction = utils.create_action(self, self.tr('Synchronize'), None, None, self.tr('Synchronize presets'), self.sync_presets) removeoldAction = utils.create_action(self, self.tr('Remove old'), None, None, self.tr('Remove old presets'), self.removeold_presets) clearallAction = utils.create_action(self, self.tr('Clear All'), None, None, self.tr('Clear form'), self.clear_all) preferencesAction = utils.create_action(self, self.tr('Preferences'), 'Alt+Ctrl+P', None, self.tr('Preferences'), self.open_dialog_preferences) trackerAction = utils.create_action( self, 'Issue tracker', None, None, None, lambda: webbrowser.open( "https://github.com/Ilias95/FF-Multi-Converter/issues")) wikiAction = utils.create_action( self, 'Wiki', None, None, None, lambda: webbrowser.open( "https://github.com/Ilias95/FF-Multi-Converter/wiki")) ffmpegdocAction = utils.create_action( self, 'FFmpeg ' + self.tr('documentation'), None, None, None, lambda: webbrowser.open("https://www.ffmpeg.org/documentation.html" )) imagemagickdocAction = utils.create_action( self, 'ImageMagick ' + self.tr('documentation'), None, None, None, lambda: webbrowser.open( "http://www.imagemagick.org/script/convert.php")) aboutAction = utils.create_action(self, self.tr('About'), 'Ctrl+?', None, self.tr('About'), self.open_dialog_about) fileMenu = self.menuBar().addMenu(self.tr('File')) editMenu = self.menuBar().addMenu(self.tr('Edit')) presetsMenu = self.menuBar().addMenu(self.tr('Presets')) helpMenu = self.menuBar().addMenu(self.tr('Help')) utils.add_actions(fileMenu, [openAction, convertAction, None, quitAction]) utils.add_actions(presetsMenu, [ edit_presetsAction, importAction, exportAction, resetAction, None, syncAction, removeoldAction ]) utils.add_actions(editMenu, [clearallAction, None, preferencesAction]) utils.add_actions(helpMenu, [ trackerAction, wikiAction, None, ffmpegdocAction, imagemagickdocAction, None, aboutAction ]) self.filesList.dropped.connect(self.filesList_add_dragged) addQPB.clicked.connect(self.filesList_add) delQPB.clicked.connect(self.filesList_delete) clearQPB.clicked.connect(self.filesList_clear) self.tabWidget.currentChanged.connect( lambda: self.tabs[0].moreQPB.setChecked(False)) self.origQCB.toggled.connect( lambda: self.toQLE.setEnabled(not self.origQCB.isChecked())) self.toQTB.clicked.connect(self.get_output_folder) convertQPB.clicked.connect(convertAction.triggered) del_shortcut = QShortcut(self) del_shortcut.setKey(Qt.Key_Delete) del_shortcut.activated.connect(self.filesList_delete) self.setWindowTitle('FF Multi Converter') self.load_settings() self.check_for_dependencies() self.audiovideo_tab.set_default_command() self.image_tab.set_default_command() self.toQLE.setText(self.default_output) self.filesList_update()
def __init__(self, files, tab, delete, parent, test=False): """ Keyword arguments: files -- list with dicts containing file names tab -- instanseof AudioVideoTab, ImageTab or DocumentTab indicating currently active tab delete -- boolean that shows if files must removed after conversion parent -- parent widget files: Each dict have only one key and one corresponding value. Key is a file to be converted and it's value is the name of the new file that will be converted. Example list: [{"/foo/bar.png" : "/foo/bar.bmp"}, {"/f/bar2.png" : "/f/bar2.bmp"}] """ super(Progress, self).__init__(parent) self.parent = parent self.files = files self.num_total_files = len(self.files) self.tab = tab self.delete = delete if not test: self._type = tab.name self.ok = 0 self.error = 0 self.running = True self.nowQL = QLabel(self.tr('In progress: ')) self.nowQPBar = QProgressBar() self.nowQPBar.setValue(0) self.shutdownQCB = QCheckBox(self.tr('Shutdown after conversion')) self.cancelQPB = QPushButton(self.tr('Cancel')) detailsQPB = QCommandLinkButton(self.tr('Details')) detailsQPB.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) detailsQPB.setCheckable(True) detailsQPB.setMaximumWidth(113) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) self.outputQTE = QTextEdit() self.outputQTE.setReadOnly(True) self.frame = QFrame() frame_layout = utils.add_to_layout('h', self.outputQTE) self.frame.setLayout(frame_layout) self.frame.hide() hlayout1 = utils.add_to_layout('h', None, self.nowQL, None) hlayout2 = utils.add_to_layout('h', detailsQPB, line) hlayout3 = utils.add_to_layout('h', self.frame) hlayout4 = utils.add_to_layout('h', None, self.cancelQPB) vlayout = utils.add_to_layout( 'v', hlayout1, self.nowQPBar, hlayout2, hlayout3, self.shutdownQCB, hlayout4 ) self.setLayout(vlayout) detailsQPB.toggled.connect(self.resize_dialog) detailsQPB.toggled.connect(self.frame.setVisible) self.cancelQPB.clicked.connect(self.reject) self.file_converted_signal.connect(self.next_file) self.update_text_edit_signal.connect(self.update_text_edit) self.resize(484, 190) self.setWindowTitle('FF Multi Converter - ' + self.tr('Conversion')) if not test: self.get_data() # should be first and not in QTimer.singleShot() QTimer.singleShot(0, self.manage_conversions)
def __init__(self, parent): super(AudioVideoTab, self).__init__(parent) self.parent = parent self.name = 'AudioVideo' self.defaultStr = self.tr('Default') self.DisableStream = self.tr('Disable') self.formats = config.video_formats frequency_values = [self.defaultStr] + config.video_frequency_values bitrate_values = [self.defaultStr] + config.video_bitrate_values rotation_options = [ self.tr('None'), '90 ' + self.tr('clockwise'), '90 ' + self.tr('clockwise') + ' + ' + self.tr('vertical flip'), '90 ' + self.tr('counter clockwise'), '90 ' + self.tr('counter clockwise') + ' + ' + self.tr('vertical flip'), '180', self.tr('horizontal flip'), self.tr('vertical flip') ] digits_validator = QRegExpValidator(QRegExp(r'[1-9]\d*'), self) digits_validator_wzero = QRegExpValidator(QRegExp(r'\d*'), self) digits_validator_minus = QRegExpValidator(QRegExp(r'(-1|[1-9]\d*)'), self) time_validator = QRegExpValidator( QRegExp(r'\d{1,2}:\d{1,2}:\d{1,2}\.\d+'), self) converttoQL = QLabel(self.tr('Convert to:')) self.extQCB = QComboBox() self.extQCB.setMinimumWidth(100) vidcodecQL = QLabel('Video codec:') self.vidcodecQCB = QComboBox() self.vidcodecQCB.setMinimumWidth(110) audcodecQL = QLabel('Audio codec:') self.audcodecQCB = QComboBox() self.audcodecQCB.setMinimumWidth(110) hlayout1 = utils.add_to_layout('h', converttoQL, self.extQCB, QSpacerItem(180, 20), vidcodecQL, self.vidcodecQCB, audcodecQL, self.audcodecQCB) commandQL = QLabel(self.tr('Command:')) self.commandQLE = QLineEdit() self.presetQPB = QPushButton(self.tr('Preset')) self.defaultQPB = QPushButton(self.defaultStr) hlayout2 = utils.add_to_layout('h', commandQL, self.commandQLE, self.presetQPB, self.defaultQPB) sizeQL = QLabel(self.tr('Video Size:')) aspectQL = QLabel(self.tr('Aspect:')) frameQL = QLabel(self.tr('Frame Rate (fps):')) bitrateQL = QLabel(self.tr('Video Bitrate (kbps):')) self.widthQLE = utils.create_LineEdit((70, 16777215), digits_validator_minus, 4) self.heightQLE = utils.create_LineEdit((70, 16777215), digits_validator_minus, 4) label = QLabel('<html><p align="center">x</p></html>') layout1 = utils.add_to_layout('h', self.widthQLE, label, self.heightQLE) self.aspect1QLE = utils.create_LineEdit((50, 16777215), digits_validator, 2) self.aspect2QLE = utils.create_LineEdit((50, 16777215), digits_validator, 2) label = QLabel('<html><p align="center">:</p></html>') layout2 = utils.add_to_layout('h', self.aspect1QLE, label, self.aspect2QLE) self.frameQLE = utils.create_LineEdit((120, 16777215), digits_validator, 4) self.bitrateQLE = utils.create_LineEdit((130, 16777215), digits_validator, 6) labels = [sizeQL, aspectQL, frameQL, bitrateQL] widgets = [layout1, layout2, self.frameQLE, self.bitrateQLE] self.preserveaspectQChB = QCheckBox(self.tr("Preserve aspect ratio")) self.preservesizeQChB = QCheckBox(self.tr("Preserve video size")) preserve_layout = utils.add_to_layout('v', self.preserveaspectQChB, self.preservesizeQChB) videosettings_layout = QHBoxLayout() for a, b in zip(labels, widgets): a.setText('<html><p align="center">{0}</p></html>'.format( a.text())) layout = utils.add_to_layout('v', a, b) videosettings_layout.addLayout(layout) if a == aspectQL: # add vidaspectCB in layout after aspectQL videosettings_layout.addLayout(preserve_layout) freqQL = QLabel(self.tr('Frequency (Hz):')) chanQL = QLabel(self.tr('Audio Channels:')) bitrateQL = QLabel(self.tr('Audio Bitrate (kbps):')) threadsQL = QLabel(self.tr('Threads:')) self.freqQCB = QComboBox() self.freqQCB.addItems(frequency_values) self.chan1QRB = QRadioButton('1') self.chan1QRB.setMaximumSize(QSize(51, 16777215)) self.chan2QRB = QRadioButton('2') self.chan2QRB.setMaximumSize(QSize(51, 16777215)) self.group = QButtonGroup() self.group.addButton(self.chan1QRB) self.group.addButton(self.chan2QRB) spcr1 = QSpacerItem(40, 20, QSizePolicy.Preferred, QSizePolicy.Minimum) spcr2 = QSpacerItem(40, 20, QSizePolicy.Preferred, QSizePolicy.Minimum) chanlayout = utils.add_to_layout('h', spcr1, self.chan1QRB, self.chan2QRB, spcr2) self.audbitrateQCB = QComboBox() self.audbitrateQCB.addItems(bitrate_values) self.threadsQLE = utils.create_LineEdit((50, 16777215), digits_validator_wzero, 1) labels = [freqQL, bitrateQL, chanQL, threadsQL] widgets = [ self.freqQCB, self.audbitrateQCB, chanlayout, self.threadsQLE ] audiosettings_layout = QHBoxLayout() for a, b in zip(labels, widgets): a.setText('<html><p align="center">{0}</p></html>'.format( a.text())) layout = utils.add_to_layout('v', a, b) audiosettings_layout.addLayout(layout) time_format = " (hh:mm:ss):" beginQL = QLabel(self.tr("Split file. Begin time") + time_format) self.beginQLE = utils.create_LineEdit(None, time_validator, None) durationQL = QLabel(self.tr("Duration") + time_format) self.durationQLE = utils.create_LineEdit(None, time_validator, None) hlayout4 = utils.add_to_layout('h', beginQL, self.beginQLE, durationQL, self.durationQLE) embedQL = QLabel(self.tr("Embed subtitle:")) self.embedQLE = QLineEdit() self.embedQTB = QToolButton() self.embedQTB.setText("...") rotateQL = QLabel(self.tr("Rotate:")) self.rotateQCB = QComboBox() self.rotateQCB.addItems(rotation_options) hlayout5 = utils.add_to_layout('h', rotateQL, self.rotateQCB, embedQL, self.embedQLE, self.embedQTB) hidden_layout = utils.add_to_layout('v', videosettings_layout, audiosettings_layout, hlayout4, hlayout5) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) self.moreQPB = QPushButton(QApplication.translate('Tab', 'More')) self.moreQPB.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.moreQPB.setCheckable(True) hlayout3 = utils.add_to_layout('h', line, self.moreQPB) self.frame = QFrame() self.frame.setLayout(hidden_layout) self.frame.hide() final_layout = utils.add_to_layout('v', hlayout1, hlayout2, hlayout3, self.frame) self.setLayout(final_layout) self.presetQPB.clicked.connect(self.choose_preset) self.defaultQPB.clicked.connect(self.set_default_command) self.embedQTB.clicked.connect(self.open_subtitle_file) self.moreQPB.toggled.connect(self.frame.setVisible) self.moreQPB.toggled.connect( lambda: QTimer.singleShot(100, self.resize_parent)) self.widthQLE.textChanged.connect(self.command_update_size) self.heightQLE.textChanged.connect(self.command_update_size) self.aspect1QLE.textChanged.connect(self.command_update_aspect) self.aspect2QLE.textChanged.connect(self.command_update_aspect) self.frameQLE.textChanged.connect(self.command_update_frames) self.bitrateQLE.textChanged.connect(self.command_update_vidbitrate) self.threadsQLE.textChanged.connect(self.command_update_threads) self.beginQLE.textChanged.connect(self.command_update_begin_time) self.durationQLE.textChanged.connect(self.command_update_duration) self.embedQLE.textChanged.connect(self.command_update_subtitles) self.vidcodecQCB.currentIndexChanged.connect( self.command_update_vcodec) self.audcodecQCB.currentIndexChanged.connect( self.command_update_acodec) self.freqQCB.currentIndexChanged.connect(self.command_update_frequency) self.rotateQCB.currentIndexChanged.connect( self.command_update_rotation) self.audbitrateQCB.currentIndexChanged.connect( self.command_update_audbitrate) self.chan1QRB.clicked.connect( lambda: self.command_update_channels('1')) self.chan2QRB.clicked.connect( lambda: self.command_update_channels('2')) self.preserveaspectQChB.toggled.connect( self.command_update_preserve_aspect) self.preservesizeQChB.toggled.connect( self.command_update_preserve_size)
def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.fnames = [] # list of file names to be converted self.office_listener_started = False self.parse_cla() addQPB = QPushButton(self.tr('Add')) delQPB = QPushButton(self.tr('Delete')) clearQPB = QPushButton(self.tr('Clear')) vlayout1 = utils.add_to_layout('v', addQPB, delQPB, clearQPB, None) self.filesList = utils.FilesList() self.filesList.setSelectionMode(QAbstractItemView.ExtendedSelection) hlayout1 = utils.add_to_layout('h', self.filesList, vlayout1) outputQL = QLabel(self.tr('Output folder:')) self.toQLE = QLineEdit() self.toQLE.setReadOnly(True) self.toQTB = QToolButton() self.toQTB.setText('...') hlayout2 = utils.add_to_layout('h', outputQL, self.toQLE, self.toQTB) self.audiovideo_tab = AudioVideoTab(self) self.image_tab = ImageTab(self) self.document_tab = DocumentTab(self) self.tabs = [self.audiovideo_tab, self.image_tab, self.document_tab] tab_names = [self.tr('Audio/Video'), self.tr('Images'), self.tr('Documents')] self.tabWidget = QTabWidget() for num, tab in enumerate(tab_names): self.tabWidget.addTab(self.tabs[num], tab) self.tabWidget.setCurrentIndex(0) self.origQCB = QCheckBox( self.tr('Save each file in the same\nfolder as input file')) self.deleteQCB = QCheckBox(self.tr('Delete original')) convertQPB = QPushButton(self.tr('&Convert')) hlayout3 = utils.add_to_layout('h', self.origQCB, self.deleteQCB, None) hlayout4 = utils.add_to_layout('h', None, convertQPB) final_layout = utils.add_to_layout( 'v', hlayout1, self.tabWidget, hlayout2, hlayout3, hlayout4) self.dependenciesQL = QLabel() self.statusBar().addPermanentWidget(self.dependenciesQL, stretch=1) widget = QWidget() widget.setLayout(final_layout) self.setCentralWidget(widget) openAction = utils.create_action( self, self.tr('Open'), QKeySequence.Open, None, self.tr('Open a file'), self.add_files ) convertAction = utils.create_action( self, self.tr('Convert'), 'Ctrl+C', None, self.tr('Convert files'), self.start_conversion ) quitAction = utils.create_action( self, self.tr('Quit'), 'Ctrl+Q', None, self.tr('Quit'), self.close ) edit_presetsAction = utils.create_action( self, self.tr('Edit Presets'), 'Ctrl+P', None, self.tr('Edit Presets'), self.open_dialog_presets ) importAction = utils.create_action( self, self.tr('Import'), None, None, self.tr('Import presets'), self.import_presets ) exportAction = utils.create_action( self, self.tr('Export'), None, None, self.tr('Export presets'), self.export_presets ) resetAction = utils.create_action( self, self.tr('Reset'), None, None, self.tr('Reset presets'), self.reset_presets ) syncAction = utils.create_action( self, self.tr('Synchronize'), None, None, self.tr('Synchronize presets'), self.sync_presets ) removeoldAction = utils.create_action( self, self.tr('Remove old'), None, None, self.tr('Remove old presets'), self.removeold_presets ) clearallAction = utils.create_action( self, self.tr('Clear All'), None, None, self.tr('Clear form'), self.clear_all ) preferencesAction = utils.create_action( self, self.tr('Preferences'), 'Alt+Ctrl+P', None, self.tr('Preferences'), self.open_dialog_preferences ) trackerAction = utils.create_action( self, 'Issue tracker', None, None, None, lambda: webbrowser.open( "https://github.com/Ilias95/FF-Multi-Converter/issues") ) wikiAction = utils.create_action( self, 'Wiki', None, None, None, lambda: webbrowser.open( "https://github.com/Ilias95/FF-Multi-Converter/wiki") ) ffmpegdocAction = utils.create_action( self, 'FFmpeg ' + self.tr('documentation'), None, None, None, lambda: webbrowser.open( "https://www.ffmpeg.org/documentation.html") ) imagemagickdocAction = utils.create_action( self, 'ImageMagick ' + self.tr('documentation'), None, None, None, lambda: webbrowser.open( "http://www.imagemagick.org/script/convert.php") ) aboutAction = utils.create_action( self, self.tr('About'), 'Ctrl+?', None, self.tr('About'), self.open_dialog_about ) fileMenu = self.menuBar().addMenu(self.tr('File')) editMenu = self.menuBar().addMenu(self.tr('Edit')) presetsMenu = self.menuBar().addMenu(self.tr('Presets')) helpMenu = self.menuBar().addMenu(self.tr('Help')) utils.add_actions( fileMenu, [openAction, convertAction, None, quitAction]) utils.add_actions( presetsMenu, [edit_presetsAction, importAction, exportAction, resetAction, None, syncAction, removeoldAction] ) utils.add_actions(editMenu, [clearallAction, None, preferencesAction]) utils.add_actions( helpMenu, [trackerAction, wikiAction, None, ffmpegdocAction, imagemagickdocAction, None, aboutAction] ) self.filesList.dropped.connect(self.add_files_dropped) addQPB.clicked.connect(self.add_files) delQPB.clicked.connect(self.delete_files) clearQPB.clicked.connect(self.clear_fileslist) self.tabWidget.currentChanged.connect( lambda: self.tabs[0].moreQPB.setChecked(False)) self.origQCB.toggled.connect( lambda: self.toQLE.setEnabled(not self.origQCB.isChecked())) self.toQTB.clicked.connect(self.open_dir) convertQPB.clicked.connect(convertAction.triggered) del_shortcut = QShortcut(self) del_shortcut.setKey(Qt.Key_Delete) del_shortcut.activated.connect(self.delete_files) self.setWindowTitle('FF Multi Converter') QTimer.singleShot(0, self.check_for_dependencies) QTimer.singleShot(0, self.load_settings) QTimer.singleShot(0, self.audiovideo_tab.set_default_command) QTimer.singleShot(0, self.update_filesList)
def __init__(self, files, tab, delete, parent, test=False): """ Keyword arguments: files -- list with dicts containing file names tab -- instanseof AudioVideoTab, ImageTab or DocumentTab indicating currently active tab delete -- boolean that shows if files must removed after conversion parent -- parent widget files: Each dict have only one key and one corresponding value. Key is a file to be converted and it's value is the name of the new file that will be converted. Example list: [{"/foo/bar.png" : "/foo/bar.bmp"}, {"/f/bar2.png" : "/f/bar2.bmp"}] """ super(Progress, self).__init__(parent) self.parent = parent self.files = files self.num_total_files = len(self.files) self.tab = tab self.delete = delete if not test: self._type = tab.name self.step = int(100 / len(files)) self.ok = 0 self.error = 0 self.running = True self.nowQL = QLabel(self.tr('In progress: ')) totalQL = QLabel(self.tr('Total:')) self.nowQPBar = QProgressBar() self.nowQPBar.setValue(0) self.totalQPBar = QProgressBar() self.totalQPBar.setValue(0) self.cancelQPB = QPushButton(self.tr('Cancel')) detailsQPB = QCommandLinkButton(self.tr('Details')) detailsQPB.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) detailsQPB.setCheckable(True) detailsQPB.setMaximumWidth(113) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) self.outputQTE = QTextEdit() self.outputQTE.setReadOnly(True) self.frame = QFrame() frame_layout = utils.add_to_layout('h', self.outputQTE) self.frame.setLayout(frame_layout) self.frame.hide() hlayout = utils.add_to_layout('h', None, self.nowQL, None) hlayout2 = utils.add_to_layout('h', None, totalQL, None) hlayout3 = utils.add_to_layout('h', detailsQPB, line) hlayout4 = utils.add_to_layout('h', self.frame) hlayout5 = utils.add_to_layout('h', None, self.cancelQPB) vlayout = utils.add_to_layout( 'v', hlayout, self.nowQPBar, hlayout2, self.totalQPBar, None, hlayout3, hlayout4, hlayout5 ) self.setLayout(vlayout) detailsQPB.toggled.connect(self.resize_dialog) detailsQPB.toggled.connect(self.frame.setVisible) self.cancelQPB.clicked.connect(self.reject) self.file_converted_signal.connect(self.next_file) self.refr_bars_signal.connect(self.refresh_progress_bars) self.update_text_edit_signal.connect(self.update_text_edit) self.resize(484, 200) self.setWindowTitle('FF Multi Converter - ' + self.tr('Conversion')) if not test: self.get_data() # should be first and not in QTimer.singleShot() QTimer.singleShot(0, self.manage_conversions)
def __init__(self, parent=None, choose=False): super(ShowPresets, self).__init__(parent) self.original_presets_file = utils.find_presets_file( config.presets_file_name, config.presets_lookup_dirs, config.presets_lookup_virtenv ) self.current_presets_file = config.presets_file self.presQLW = QListWidget() labelQL = QLabel(self.tr("Preset label")) self.labelQLE = QLineEdit() self.labelQLE.setReadOnly(True) commandQL = QLabel(self.tr("Preset command line parameters")) self.commandQLE = QLineEdit() self.commandQLE.setReadOnly(True) extQL = QLabel(self.tr("Output file extension")) self.extQLE = QLineEdit() self.extQLE.setReadOnly(True) addQPB = QPushButton(self.tr("Add")) self.deleteQPB = QPushButton(self.tr("Delete")) self.delete_allQPB = QPushButton(self.tr("Delete all")) self.editQPB = QPushButton(self.tr("Edit")) searchQL = QLabel(self.tr("Search")) self.searchQLE = QLineEdit() okQPB = QPushButton(self.tr("OK")) okQPB.setDefault(True) spc1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spc2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spc3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) grid = utils.add_to_grid([self.delete_allQPB, addQPB, spc1], [self.deleteQPB, self.editQPB, spc2]) hlayout = utils.add_to_layout("h", searchQL, self.searchQLE, None, okQPB) final_layout = utils.add_to_layout( "v", self.presQLW, labelQL, self.labelQLE, commandQL, self.commandQLE, extQL, self.extQLE, grid, spc3, hlayout, ) self.setLayout(final_layout) okQPB.clicked.connect(self.accept) self.presQLW.currentRowChanged.connect(self.show_preset) addQPB.clicked.connect(self.add_preset) self.deleteQPB.clicked.connect(self.delete_preset) self.delete_allQPB.clicked.connect(self.delete_all_presets) self.editQPB.clicked.connect(self.edit_preset) self.searchQLE.textEdited.connect(self.search) if choose: self.presQLW.doubleClicked.connect(okQPB.click) del_shortcut = QShortcut(self) del_shortcut.setKey(Qt.Key_Delete) del_shortcut.activated.connect(self.delete_preset) self.resize(430, 480) self.setWindowTitle(self.tr("Edit Presets")) QTimer.singleShot(0, self.load_xml) QTimer.singleShot(0, self.fill_presQLW)
def __init__(self, parent=None): super(ShowPresets, self).__init__(parent) self.original_presets_file = config.find_presets_file( config.presets_file_name) self.current_presets_file = config.presets_file self.presQLW = QListWidget() labelQL = QLabel(self.tr('Preset label')) self.labelQLE = QLineEdit() self.labelQLE.setReadOnly(True) commandQL = QLabel(self.tr('Preset command line parameters')) self.commandQLE = QLineEdit() self.commandQLE.setReadOnly(True) extQL = QLabel(self.tr('Output file extension')) self.extQLE = QLineEdit() self.extQLE.setReadOnly(True) addQPB = QPushButton(self.tr('Add')) self.deleteQPB = QPushButton(self.tr('Delete')) self.delete_allQPB = QPushButton(self.tr('Delete all')) self.editQPB = QPushButton(self.tr('Edit')) searchQL = QLabel(self.tr('Search')) self.searchQLE = QLineEdit() okQPB = QPushButton(self.tr('OK')) okQPB.setDefault(True) spc1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spc2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spc3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) grid = utils.add_to_grid( [self.delete_allQPB, addQPB, spc1], [self.deleteQPB, self.editQPB, spc2] ) hlayout = utils.add_to_layout( 'h', searchQL, self.searchQLE, None, okQPB) final_layout = utils.add_to_layout( 'v', self.presQLW, labelQL, self.labelQLE, commandQL, self.commandQLE, extQL, self.extQLE, grid, spc3, hlayout ) self.setLayout(final_layout) okQPB.clicked.connect(self.accept) self.presQLW.currentRowChanged.connect(self.show_preset) addQPB.clicked.connect(self.add_preset) self.deleteQPB.clicked.connect(self.delete_preset) self.delete_allQPB.clicked.connect(self.delete_all_presets) self.editQPB.clicked.connect(self.edit_preset) self.searchQLE.textEdited.connect(self.search) del_shortcut = QShortcut(self) del_shortcut.setKey(Qt.Key_Delete) del_shortcut.activated.connect(self.delete_preset) self.resize(430, 480) self.setWindowTitle(self.tr('Edit Presets')) QTimer.singleShot(0, self.load_xml) QTimer.singleShot(0, self.fill_presQLW)
def __init__(self, parent=None): super(MainWindow, self).__init__(parent) # main window dimensions self.main_width = 780 self.main_height = 510 self.main_fixed_height = 684 self.default_command = config.default_ffmpeg_cmd self.fnames = list() # list of file names to be converted self.docconv = False # True when a documents conversion is running self.parse_cla() addQPB = QPushButton(self.tr('Add')) delQPB = QPushButton(self.tr('Delete')) clearQPB = QPushButton(self.tr('Clear')) vlayout1 = utils.add_to_layout('v', addQPB, delQPB, clearQPB, None) self.filesList = utils.FilesList() self.filesList.setSelectionMode(QAbstractItemView.ExtendedSelection) hlayout1 = utils.add_to_layout('h', self.filesList, vlayout1) outputQL = QLabel(self.tr('Output folder:')) self.toQLE = QLineEdit() self.toQLE.setReadOnly(True) self.toQTB = QToolButton() self.toQTB.setText('...') hlayout2 = utils.add_to_layout('h', outputQL, self.toQLE, self.toQTB) self.audiovideo_tab = AudioVideoTab(self) self.image_tab = ImageTab(self) self.document_tab = DocumentTab(self) self.tabs = [self.audiovideo_tab, self.image_tab, self.document_tab] tab_names = [self.tr('Audio/Video'), self.tr('Images'), self.tr('Documents')] self.tabWidget = QTabWidget() for num, tab in enumerate(tab_names): self.tabWidget.addTab(self.tabs[num], tab) self.tabWidget.setCurrentIndex(0) self.origQCB = QCheckBox( self.tr('Save each file in the same\nfolder as input file')) self.deleteQCB = QCheckBox(self.tr('Delete original')) convertQPB = QPushButton(self.tr('&Convert')) hlayout3 = utils.add_to_layout('h', self.origQCB, self.deleteQCB, None) hlayout4 = utils.add_to_layout('h', None, convertQPB) final_layout = utils.add_to_layout( 'v', hlayout1, self.tabWidget, hlayout2, hlayout3, hlayout4) self.dependenciesQL = QLabel() self.statusBar().addPermanentWidget(self.dependenciesQL, stretch=1) widget = QWidget() widget.setLayout(final_layout) self.setCentralWidget(widget) openAction = utils.create_action( self, self.tr('Open'), QKeySequence.Open, None, self.tr('Open a file'), self.add_files ) convertAction = utils.create_action( self, self.tr('Convert'), 'Ctrl+C', None, self.tr('Convert files'), self.start_conversion ) quitAction = utils.create_action( self, self.tr('Quit'), 'Ctrl+Q', None, self.tr('Quit'), self.close ) edit_presetsAction = utils.create_action( self, self.tr('Edit Presets'), 'Ctrl+P', None, self.tr('Edit Presets'), self.presets ) importAction = utils.create_action( self, self.tr('Import'), None, None, self.tr('Import presets'), self.import_presets ) exportAction = utils.create_action( self, self.tr('Export'), None, None, self.tr('Export presets'), self.export_presets ) resetAction = utils.create_action( self, self.tr('Reset'), None, None, self.tr('Reset presets'), self.reset_presets ) syncAction = utils.create_action( self, self.tr('Synchronize'), None, None, self.tr('Synchronize presets'), self.sync_presets ) removeoldAction = utils.create_action( self, self.tr('Remove old'), None, None, self.tr('Remove old presets'), self.removeold_presets ) clearallAction = utils.create_action( self, self.tr('Clear All'), None, None, self.tr('Clear form'), self.clear_all ) preferencesAction = utils.create_action( self, self.tr('Preferences'), 'Alt+Ctrl+P', None, self.tr('Preferences'), self.preferences ) aboutAction = utils.create_action( self, self.tr('About'), 'Ctrl+?', None, self.tr('About'), self.about ) fileMenu = self.menuBar().addMenu(self.tr('File')) editMenu = self.menuBar().addMenu(self.tr('Edit')) presetsMenu = self.menuBar().addMenu(self.tr('Presets')) helpMenu = self.menuBar().addMenu(self.tr('Help')) utils.add_actions( fileMenu, [openAction, convertAction, None, quitAction]) utils.add_actions( presetsMenu, [edit_presetsAction, importAction, exportAction, resetAction, None, syncAction, removeoldAction] ) utils.add_actions(editMenu, [clearallAction, None, preferencesAction]) utils.add_actions(helpMenu, [aboutAction]) self.filesList.dropped.connect(self.url_dropped) addQPB.clicked.connect(self.add_files) delQPB.clicked.connect(self.delete_files) clearQPB.clicked.connect(self.clear_fileslist) self.tabWidget.currentChanged.connect( lambda: self.tabs[0].moreQPB.setChecked(False)) self.origQCB.clicked.connect( lambda: self.toQLE.setEnabled(not self.origQCB.isChecked())) self.toQTB.clicked.connect(self.open_dir) convertQPB.clicked.connect(convertAction.triggered) del_shortcut = QShortcut(self) del_shortcut.setKey(Qt.Key_Delete) del_shortcut.activated.connect(self.delete_files) self.resize(self.main_width, self.main_height) self.setWindowTitle('FF Multi Converter') QTimer.singleShot(0, self.check_for_dependencies) QTimer.singleShot(0, self.load_settings) QTimer.singleShot(0, self.audiovideo_tab.set_default_command) QTimer.singleShot(0, self.update_filesList)
def __init__(self, parent=None, test=False): super(Preferences, self).__init__(parent) self.parent = parent self.test = test saveQL = QLabel('<html><b>' + self.tr('Save files') + '</b></html>') existQL = QLabel(self.tr('Existing files:')) self.exst_prefixQRB = QRadioButton(self.tr("Add '~' prefix")) self.exst_overwriteQRB = QRadioButton(self.tr('Overwrite')) exist_layout = utils.add_to_layout('h', self.exst_prefixQRB, self.exst_overwriteQRB) defaultQL = QLabel(self.tr('Default output destination:')) self.defaultQLE = QLineEdit() self.defaultQTB = QToolButton() self.defaultQTB.setText('...') deafult_fol_layout = utils.add_to_layout('h', self.defaultQLE, self.defaultQTB) nameQL = QLabel('<html><b>' + self.tr('Name files') + '</b></html>') prefixQL = QLabel(self.tr('Prefix:')) suffixQL = QLabel(self.tr('Suffix:')) self.prefixQLE = QLineEdit() self.suffixQLE = QLineEdit() grid = utils.add_to_grid([prefixQL, self.prefixQLE], [suffixQL, self.suffixQLE]) prefix_layout = utils.add_to_layout('h', grid, None) tabwidget1_layout = utils.add_to_layout('v', saveQL, QSpacerItem(14, 13), existQL, exist_layout, QSpacerItem(14, 13), defaultQL, deafult_fol_layout, QSpacerItem(13, 13), nameQL, QSpacerItem(14, 13), prefix_layout, None) ffmpegQL = QLabel('<html><b>FFmpeg</b></html>') default_cmd_ffmpegQL = QLabel(self.tr('Default command:')) self.ffmpegcmdQLE = QLineEdit() vidcodecsQL = QLabel('<html><b>' + self.tr('Video codecs') + '</b></html>') self.vidcodecsQPTE = QPlainTextEdit() audcodecsQL = QLabel('<html><b>' + self.tr('Audio codecs') + '</b></html>') self.audcodecsQPTE = QPlainTextEdit() extraformatsffmpegQL = QLabel('<html><b>' + self.tr('Extra formats') + '</b></html>') self.extraformatsffmpegQPTE = QPlainTextEdit() gridlayout = utils.add_to_grid( [vidcodecsQL, audcodecsQL, extraformatsffmpegQL], [ self.vidcodecsQPTE, self.audcodecsQPTE, self.extraformatsffmpegQPTE ]) defvidcodecsQPB = QPushButton(self.tr("Default video codecs")) defaudcodecsQPB = QPushButton(self.tr("Default audio codecs")) hlayout1 = utils.add_to_layout('h', None, defvidcodecsQPB, defaudcodecsQPB) tabwidget2_layout = utils.add_to_layout('v', ffmpegQL, QSpacerItem(14, 13), default_cmd_ffmpegQL, self.ffmpegcmdQLE, QSpacerItem(20, 20), gridlayout, hlayout1, None) imagemagickQL = QLabel('<html><b>ImageMagick (convert)</b></html>') default_cmd_imageQL = QLabel(self.tr('Default options:')) self.imagecmdQLE = QLineEdit() extraformatsimageQL = QLabel('<html><b>' + self.tr('Extra formats') + '</b></html>') self.extraformatsimageQPTE = QPlainTextEdit() hlayout2 = utils.add_to_layout('h', self.extraformatsimageQPTE, QSpacerItem(220, 20)) tabwidget3_layout = utils.add_to_layout('v', imagemagickQL, QSpacerItem(14, 13), default_cmd_imageQL, self.imagecmdQLE, QSpacerItem(20, 20), extraformatsimageQL, hlayout2, None) widget1 = QWidget() widget1.setLayout(tabwidget1_layout) widget2 = QWidget() widget2.setLayout(tabwidget2_layout) widget3 = QWidget() widget3.setLayout(tabwidget3_layout) tabWidget = QTabWidget() tabWidget.addTab(widget1, self.tr('General')) tabWidget.addTab(widget2, self.tr('Audio/Video')) tabWidget.addTab(widget3, self.tr('Images')) buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) final_layout = utils.add_to_layout('v', tabWidget, None, buttonBox) self.setLayout(final_layout) self.defaultQTB.clicked.connect(self.open_dir) buttonBox.accepted.connect(self.save_settings) buttonBox.rejected.connect(self.reject) defvidcodecsQPB.clicked.connect(self.set_default_videocodecs) defaudcodecsQPB.clicked.connect(self.set_default_audiocodecs) self.resize(400, 450) self.setWindowTitle(self.tr('Preferences')) QTimer.singleShot(0, self.load_settings)
def __init__(self, parent=None, test = False): super(Preferences, self).__init__(parent) self.parent = parent self.test = test self.default_videocodecs = [ 'flv', 'h263', 'libvpx', 'libx264', 'libxvid', 'mpeg2video', 'mpeg4', 'msmpeg4', 'wmv2' ] self.default_audiocodecs = [ 'aac', 'ac3', 'copy', 'libfaac', 'libmp3lame', 'libvo_aacenc', 'libvorbis', 'mp2', 'wmav2' ] saveQL = QLabel('<html><b>' + self.tr('Save files') + '</b></html>') existQL = QLabel(self.tr('Existing files:')) self.exst_prefixQRB = QRadioButton(self.tr("Add '~' prefix")) self.exst_overwriteQRB = QRadioButton(self.tr('Overwrite')) exist_layout = utils.add_to_layout( 'h', self.exst_prefixQRB, self.exst_overwriteQRB) defaultQL = QLabel(self.tr('Default output destination:')) self.defaultQLE = QLineEdit() self.defaultQTB = QToolButton() self.defaultQTB.setText('...') deafult_fol_layout = utils.add_to_layout( 'h', self.defaultQLE, self.defaultQTB) nameQL = QLabel('<html><b>' + self.tr('Name files') +'</b></html>') prefixQL = QLabel(self.tr('Prefix:')) suffixQL = QLabel(self.tr('Suffix:')) self.prefixQLE = QLineEdit() self.suffixQLE = QLineEdit() grid = utils.add_to_grid( [prefixQL, self.prefixQLE], [suffixQL, self.suffixQLE]) prefix_layout = utils.add_to_layout('h', grid, None) tabwidget1_layout = utils.add_to_layout( 'v', saveQL, QSpacerItem(14, 13), existQL, exist_layout, QSpacerItem(14, 13), defaultQL, deafult_fol_layout, QSpacerItem(13, 13), nameQL, QSpacerItem(14, 13), prefix_layout, None ) ffmpegQL = QLabel('<html><b>' + self.tr('FFmpeg') +'</b></html>') default_cmdQL = QLabel(self.tr('Default command:')) self.cmdQLE = QLineEdit() useQL = QLabel(self.tr('Use:')) self.ffmpegQRB = QRadioButton(self.tr('FFmpeg')) self.avconvQRB = QRadioButton(self.tr('avconv')) hlayout = utils.add_to_layout('h', self.ffmpegQRB, self.avconvQRB) vidcodecsQL = QLabel( '<html><b>' + self.tr('Video codecs') +'</b></html>') self.vidcodecsQPTE = QPlainTextEdit() audcodecsQL = QLabel( '<html><b>' + self.tr('Audio codecs') +'</b></html>') self.audcodecsQPTE = QPlainTextEdit() extraformatsQL = QLabel( '<html><b>' + self.tr('Extra formats') +'</b></html>') self.extraformatsQPTE = QPlainTextEdit() gridlayout = utils.add_to_grid( [vidcodecsQL, audcodecsQL, extraformatsQL], [self.vidcodecsQPTE, self.audcodecsQPTE, self.extraformatsQPTE]) defvidcodecsQPB = QPushButton(self.tr("Default video codecs")) defaudcodecsQPB = QPushButton(self.tr("Default audio codecs")) hlayout2 = utils.add_to_layout( 'h', None, defvidcodecsQPB, defaudcodecsQPB) tabwidget2_layout = utils.add_to_layout( 'v', ffmpegQL, QSpacerItem(14, 13), useQL, hlayout, QSpacerItem(14, 13), default_cmdQL, self.cmdQLE, QSpacerItem(20, 20), gridlayout, hlayout2, None ) widget1 = QWidget() widget1.setLayout(tabwidget1_layout) widget2 = QWidget() widget2.setLayout(tabwidget2_layout) tabWidget = QTabWidget() tabWidget.addTab(widget1, self.tr('General')) tabWidget.addTab(widget2, self.tr('Audio/Video')) buttonBox = QDialogButtonBox( QDialogButtonBox.Ok|QDialogButtonBox.Cancel) final_layout = utils.add_to_layout('v', tabWidget, None, buttonBox) self.setLayout(final_layout) self.defaultQTB.clicked.connect(self.open_dir) buttonBox.accepted.connect(self.save_settings) buttonBox.rejected.connect(self.reject) defvidcodecsQPB.clicked.connect(self.set_default_videocodecs) defaudcodecsQPB.clicked.connect(self.set_default_audiocodecs) self.resize(400, 480) self.setWindowTitle(self.tr('Preferences')) QTimer.singleShot(0, self.load_settings)
def __init__(self, parent): super(AudioVideoTab, self).__init__(parent) self.parent = parent self.name = "AudioVideo" self.defaultStr = self.tr("Default") self.DisableStream = self.tr("Disable") self.formats = config.video_formats frequency_values = [self.defaultStr] + config.video_frequency_values bitrate_values = [self.defaultStr] + config.video_bitrate_values rotation_options = [ self.tr("None"), "90 " + self.tr("clockwise"), "90 " + self.tr("clockwise") + " + " + self.tr("vertical flip"), "90 " + self.tr("counter clockwise"), "90 " + self.tr("counter clockwise") + " + " + self.tr("vertical flip"), "180", self.tr("horizontal flip"), self.tr("vertical flip"), ] digits_validator = QRegExpValidator(QRegExp(r"[1-9]\d*"), self) digits_validator_wzero = QRegExpValidator(QRegExp(r"\d*"), self) digits_validator_minus = QRegExpValidator(QRegExp(r"(-1|[1-9]\d*)"), self) time_validator = QRegExpValidator(QRegExp(r"\d{1,2}:\d{1,2}:\d{1,2}\.\d+"), self) converttoQL = QLabel(self.tr("Convert to:")) self.extQCB = QComboBox() self.extQCB.setMinimumWidth(100) vidcodecQL = QLabel("Video codec:") self.vidcodecQCB = QComboBox() self.vidcodecQCB.setMinimumWidth(110) audcodecQL = QLabel("Audio codec:") self.audcodecQCB = QComboBox() self.audcodecQCB.setMinimumWidth(110) hlayout1 = utils.add_to_layout( "h", converttoQL, self.extQCB, QSpacerItem(180, 20), vidcodecQL, self.vidcodecQCB, audcodecQL, self.audcodecQCB, ) commandQL = QLabel(self.tr("Command:")) self.commandQLE = QLineEdit() self.presetQPB = QPushButton(self.tr("Preset")) self.defaultQPB = QPushButton(self.defaultStr) hlayout2 = utils.add_to_layout("h", commandQL, self.commandQLE, self.presetQPB, self.defaultQPB) sizeQL = QLabel(self.tr("Video Size:")) aspectQL = QLabel(self.tr("Aspect:")) frameQL = QLabel(self.tr("Frame Rate (fps):")) bitrateQL = QLabel(self.tr("Video Bitrate (kbps):")) self.widthQLE = utils.create_LineEdit((70, 16777215), digits_validator_minus, 4) self.heightQLE = utils.create_LineEdit((70, 16777215), digits_validator_minus, 4) label = QLabel('<html><p align="center">x</p></html>') layout1 = utils.add_to_layout("h", self.widthQLE, label, self.heightQLE) self.aspect1QLE = utils.create_LineEdit((50, 16777215), digits_validator, 2) self.aspect2QLE = utils.create_LineEdit((50, 16777215), digits_validator, 2) label = QLabel('<html><p align="center">:</p></html>') layout2 = utils.add_to_layout("h", self.aspect1QLE, label, self.aspect2QLE) self.frameQLE = utils.create_LineEdit((120, 16777215), digits_validator, 4) self.bitrateQLE = utils.create_LineEdit((130, 16777215), digits_validator, 6) labels = [sizeQL, aspectQL, frameQL, bitrateQL] widgets = [layout1, layout2, self.frameQLE, self.bitrateQLE] self.preserveaspectQChB = QCheckBox(self.tr("Preserve aspect ratio")) self.preservesizeQChB = QCheckBox(self.tr("Preserve video size")) preserve_layout = utils.add_to_layout("v", self.preserveaspectQChB, self.preservesizeQChB) videosettings_layout = QHBoxLayout() for a, b in zip(labels, widgets): a.setText('<html><p align="center">{0}</p></html>'.format(a.text())) layout = utils.add_to_layout("v", a, b) videosettings_layout.addLayout(layout) if a == aspectQL: # add vidaspectCB in layout after aspectQL videosettings_layout.addLayout(preserve_layout) freqQL = QLabel(self.tr("Frequency (Hz):")) chanQL = QLabel(self.tr("Audio Channels:")) bitrateQL = QLabel(self.tr("Audio Bitrate (kbps):")) threadsQL = QLabel(self.tr("Threads:")) self.freqQCB = QComboBox() self.freqQCB.addItems(frequency_values) self.chan1QRB = QRadioButton("1") self.chan1QRB.setMaximumSize(QSize(51, 16777215)) self.chan2QRB = QRadioButton("2") self.chan2QRB.setMaximumSize(QSize(51, 16777215)) self.group = QButtonGroup() self.group.addButton(self.chan1QRB) self.group.addButton(self.chan2QRB) spcr1 = QSpacerItem(40, 20, QSizePolicy.Preferred, QSizePolicy.Minimum) spcr2 = QSpacerItem(40, 20, QSizePolicy.Preferred, QSizePolicy.Minimum) chanlayout = utils.add_to_layout("h", spcr1, self.chan1QRB, self.chan2QRB, spcr2) self.audbitrateQCB = QComboBox() self.audbitrateQCB.addItems(bitrate_values) self.threadsQLE = utils.create_LineEdit((50, 16777215), digits_validator_wzero, 1) labels = [freqQL, bitrateQL, chanQL, threadsQL] widgets = [self.freqQCB, self.audbitrateQCB, chanlayout, self.threadsQLE] audiosettings_layout = QHBoxLayout() for a, b in zip(labels, widgets): a.setText('<html><p align="center">{0}</p></html>'.format(a.text())) layout = utils.add_to_layout("v", a, b) audiosettings_layout.addLayout(layout) time_format = " (hh:mm:ss):" beginQL = QLabel(self.tr("Split file. Begin time") + time_format) self.beginQLE = utils.create_LineEdit(None, time_validator, None) durationQL = QLabel(self.tr("Duration") + time_format) self.durationQLE = utils.create_LineEdit(None, time_validator, None) hlayout4 = utils.add_to_layout("h", beginQL, self.beginQLE, durationQL, self.durationQLE) embedQL = QLabel(self.tr("Embed subtitle:")) self.embedQLE = QLineEdit() self.embedQTB = QToolButton() self.embedQTB.setText("...") rotateQL = QLabel(self.tr("Rotate:")) self.rotateQCB = QComboBox() self.rotateQCB.addItems(rotation_options) hlayout5 = utils.add_to_layout("h", rotateQL, self.rotateQCB, embedQL, self.embedQLE, self.embedQTB) hidden_layout = utils.add_to_layout("v", videosettings_layout, audiosettings_layout, hlayout4, hlayout5) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) self.moreQPB = QPushButton(QApplication.translate("Tab", "More")) self.moreQPB.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.moreQPB.setCheckable(True) hlayout3 = utils.add_to_layout("h", line, self.moreQPB) self.frame = QFrame() self.frame.setLayout(hidden_layout) self.frame.hide() final_layout = utils.add_to_layout("v", hlayout1, hlayout2, hlayout3, self.frame) self.setLayout(final_layout) self.presetQPB.clicked.connect(self.choose_preset) self.defaultQPB.clicked.connect(self.set_default_command) self.embedQTB.clicked.connect(self.open_subtitle_file) self.moreQPB.toggled.connect(self.frame.setVisible) self.moreQPB.toggled.connect(lambda: QTimer.singleShot(100, self.resize_parent)) self.widthQLE.textChanged.connect(self.command_update_size) self.heightQLE.textChanged.connect(self.command_update_size) self.aspect1QLE.textChanged.connect(self.command_update_aspect) self.aspect2QLE.textChanged.connect(self.command_update_aspect) self.frameQLE.textChanged.connect(self.command_update_frames) self.bitrateQLE.textChanged.connect(self.command_update_vidbitrate) self.threadsQLE.textChanged.connect(self.command_update_threads) self.beginQLE.textChanged.connect(self.command_update_begin_time) self.durationQLE.textChanged.connect(self.command_update_duration) self.embedQLE.textChanged.connect(self.command_update_subtitles) self.vidcodecQCB.currentIndexChanged.connect(self.command_update_vcodec) self.audcodecQCB.currentIndexChanged.connect(self.command_update_acodec) self.freqQCB.currentIndexChanged.connect(self.command_update_frequency) self.rotateQCB.currentIndexChanged.connect(self.command_update_rotation) self.audbitrateQCB.currentIndexChanged.connect(self.command_update_audbitrate) self.chan1QRB.clicked.connect(lambda: self.command_update_channels("1")) self.chan2QRB.clicked.connect(lambda: self.command_update_channels("2")) self.preserveaspectQChB.toggled.connect(self.command_update_preserve_aspect) self.preservesizeQChB.toggled.connect(self.command_update_preserve_size)
def __init__(self, parent=None, choose=False): super(ShowPresets, self).__init__(parent) self.original_presets_file = utils.find_presets_file( config.presets_file_name, config.presets_lookup_dirs, config.presets_lookup_virtenv) self.current_presets_file = config.presets_file self.presQLW = QListWidget() labelQL = QLabel(self.tr('Preset label')) self.labelQLE = QLineEdit() self.labelQLE.setReadOnly(True) commandQL = QLabel(self.tr('Preset command line parameters')) self.commandQLE = QLineEdit() self.commandQLE.setReadOnly(True) extQL = QLabel(self.tr('Output file extension')) self.extQLE = QLineEdit() self.extQLE.setReadOnly(True) addQPB = QPushButton(self.tr('Add')) self.deleteQPB = QPushButton(self.tr('Delete')) self.delete_allQPB = QPushButton(self.tr('Delete all')) self.editQPB = QPushButton(self.tr('Edit')) searchQL = QLabel(self.tr('Search')) self.searchQLE = QLineEdit() okQPB = QPushButton(self.tr('OK')) okQPB.setDefault(True) spc1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spc2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spc3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) grid = utils.add_to_grid([self.delete_allQPB, addQPB, spc1], [self.deleteQPB, self.editQPB, spc2]) hlayout = utils.add_to_layout('h', searchQL, self.searchQLE, None, okQPB) final_layout = utils.add_to_layout('v', self.presQLW, labelQL, self.labelQLE, commandQL, self.commandQLE, extQL, self.extQLE, grid, spc3, hlayout) self.setLayout(final_layout) okQPB.clicked.connect(self.accept) self.presQLW.currentRowChanged.connect(self.show_preset) addQPB.clicked.connect(self.add_preset) self.deleteQPB.clicked.connect(self.delete_preset) self.delete_allQPB.clicked.connect(self.delete_all_presets) self.editQPB.clicked.connect(self.edit_preset) self.searchQLE.textEdited.connect(self.search) if choose: self.presQLW.doubleClicked.connect(okQPB.click) del_shortcut = QShortcut(self) del_shortcut.setKey(Qt.Key_Delete) del_shortcut.activated.connect(self.delete_preset) self.resize(430, 480) self.setWindowTitle(self.tr('Edit Presets')) QTimer.singleShot(0, self.load_xml) QTimer.singleShot(0, self.fill_presQLW)
def __init__(self, parent=None, test = False): super(Preferences, self).__init__(parent) self.parent = parent self.test = test saveQL = QLabel('<html><b>' + self.tr('Save files') + '</b></html>') existQL = QLabel(self.tr('Existing files:')) self.exst_prefixQRB = QRadioButton(self.tr("Add '~' prefix")) self.exst_overwriteQRB = QRadioButton(self.tr('Overwrite')) exist_layout = utils.add_to_layout( 'h', self.exst_prefixQRB, self.exst_overwriteQRB) defaultQL = QLabel(self.tr('Default output destination:')) self.defaultQLE = QLineEdit() self.defaultQTB = QToolButton() self.defaultQTB.setText('...') deafult_fol_layout = utils.add_to_layout( 'h', self.defaultQLE, self.defaultQTB) nameQL = QLabel('<html><b>' + self.tr('Name files') +'</b></html>') prefixQL = QLabel(self.tr('Prefix:')) suffixQL = QLabel(self.tr('Suffix:')) self.prefixQLE = QLineEdit() self.suffixQLE = QLineEdit() grid = utils.add_to_grid( [prefixQL, self.prefixQLE], [suffixQL, self.suffixQLE]) prefix_layout = utils.add_to_layout('h', grid, None) tabwidget1_layout = utils.add_to_layout( 'v', saveQL, QSpacerItem(14, 13), existQL, exist_layout, QSpacerItem(14, 13), defaultQL, deafult_fol_layout, QSpacerItem(13, 13), nameQL, QSpacerItem(14, 13), prefix_layout, None ) ffmpegQL = QLabel('<html><b>FFmpeg</b></html>') ffmpeg_pathQL= QLabel(self.tr('Path to executable:')) self.ffmpegpathQLE = QLineEdit() default_cmd_ffmpegQL = QLabel(self.tr('Default command:')) self.ffmpegcmdQLE = QLineEdit() vidcodecsQL = QLabel( '<html><b>' + self.tr('Video codecs') +'</b></html>') self.vidcodecsQPTE = QPlainTextEdit() audcodecsQL = QLabel( '<html><b>' + self.tr('Audio codecs') +'</b></html>') self.audcodecsQPTE = QPlainTextEdit() extraformatsffmpegQL = QLabel( '<html><b>' + self.tr('Extra formats') +'</b></html>') self.extraformatsffmpegQPTE = QPlainTextEdit() gridlayout = utils.add_to_grid( [vidcodecsQL, audcodecsQL, extraformatsffmpegQL], [self.vidcodecsQPTE, self.audcodecsQPTE, self.extraformatsffmpegQPTE] ) defvidcodecsQPB = QPushButton(self.tr("Default video codecs")) defaudcodecsQPB = QPushButton(self.tr("Default audio codecs")) hlayout1 = utils.add_to_layout( 'h', None, defvidcodecsQPB, defaudcodecsQPB) tabwidget2_layout = utils.add_to_layout( 'v', ffmpegQL, QSpacerItem(14, 13), ffmpeg_pathQL, self.ffmpegpathQLE, default_cmd_ffmpegQL, self.ffmpegcmdQLE, QSpacerItem(20, 20), gridlayout, hlayout1, None ) imagemagickQL = QLabel('<html><b>ImageMagick (convert)</b></html>') default_cmd_imageQL = QLabel(self.tr('Default options:')) self.imagecmdQLE = QLineEdit() extraformatsimageQL = QLabel( '<html><b>' + self.tr('Extra formats') +'</b></html>') self.extraformatsimageQPTE = QPlainTextEdit() hlayout2 = utils.add_to_layout('h', self.extraformatsimageQPTE, QSpacerItem(220,20)) tabwidget3_layout = utils.add_to_layout( 'v', imagemagickQL, QSpacerItem(14,13), default_cmd_imageQL, self.imagecmdQLE, QSpacerItem(20,20), extraformatsimageQL, hlayout2, None ) extraformatsdocumentQL = QLabel( '<html><b>' + self.tr('Extra formats') +'</b></html>') self.extraformatsdocumentQPTE = QPlainTextEdit() hlayout3 = utils.add_to_layout('h', self.extraformatsdocumentQPTE, QSpacerItem(220,20)) tabwidget4_layout = utils.add_to_layout( 'v', extraformatsdocumentQL, hlayout3, None) widget1 = QWidget() widget1.setLayout(tabwidget1_layout) widget2 = QWidget() widget2.setLayout(tabwidget2_layout) widget3 = QWidget() widget3.setLayout(tabwidget3_layout) widget4 = QWidget() widget4.setLayout(tabwidget4_layout) tabWidget = QTabWidget() tabWidget.addTab(widget1, self.tr('General')) tabWidget.addTab(widget2, self.tr('Audio/Video')) tabWidget.addTab(widget3, self.tr('Images')) tabWidget.addTab(widget4, self.tr('Documents')) buttonBox = QDialogButtonBox( QDialogButtonBox.Ok|QDialogButtonBox.Cancel) final_layout = utils.add_to_layout('v', tabWidget, None, buttonBox) self.setLayout(final_layout) self.defaultQTB.clicked.connect(self.open_dir) buttonBox.accepted.connect(self.save_settings) buttonBox.rejected.connect(self.reject) defvidcodecsQPB.clicked.connect( lambda: self.set_videocodecs(config.video_codecs)) defaudcodecsQPB.clicked.connect( lambda: self.set_audiocodecs(config.audio_codecs)) self.resize(400, 450) self.setWindowTitle(self.tr('Preferences')) QTimer.singleShot(0, self.load_settings)