2012-01-29 04:06:07 +01:00
///////////////////////////////////////////////////////////////////////////////
// Simple x264 Launcher
// Copyright (C) 2004-2012 LoRd_MuldeR <MuldeR2@GMX.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// http://www.gnu.org/licenses/gpl-2.0.txt
///////////////////////////////////////////////////////////////////////////////
# include "win_addJob.h"
# include "global.h"
2012-01-29 19:14:46 +01:00
# include "model_options.h"
2012-02-01 01:08:54 +01:00
# include "win_help.h"
2012-01-29 04:06:07 +01:00
# include <QDate>
# include <QTimer>
# include <QCloseEvent>
# include <QMessageBox>
2012-01-29 15:57:23 +01:00
# include <QFileDialog>
# include <QDesktopServices>
# include <QValidator>
2012-01-29 21:31:09 +01:00
# include <QDir>
2012-01-31 22:30:21 +01:00
# include <QInputDialog>
2012-02-02 15:56:49 +01:00
# include <QSettings>
2012-01-29 15:57:23 +01:00
2012-01-30 17:50:19 +01:00
static const struct
{
const char * name ;
const char * fext ;
}
g_filters [ ] =
{
{ " Avisynth Scripts " , " avs " } ,
{ " Matroska Files " , " mkv " } ,
{ " MPEG-4 Part 14 Container " , " mp4 " } ,
{ " Audio Video Interleaved " , " avi " } ,
{ " Flash Video " , " flv " } ,
{ NULL , NULL }
} ;
2012-02-02 15:56:49 +01:00
# define VALID_DIR(PATH) ((!(PATH).isEmpty()) && QFileInfo(PATH).exists() && QFileInfo(PATH).isDir())
2012-02-02 18:55:55 +01:00
# define REMOVE_USAFED_ITEM \
{ \
for ( int i = 0 ; i < cbxTemplate - > count ( ) ; i + + ) \
{ \
OptionsModel * temp = reinterpret_cast < OptionsModel * > ( cbxTemplate - > itemData ( i ) . value < void * > ( ) ) ; \
if ( temp = = NULL ) \
{ \
cbxTemplate - > blockSignals ( true ) ; \
cbxTemplate - > removeItem ( i ) ; \
cbxTemplate - > blockSignals ( false ) ; \
break ; \
} \
} \
}
2012-01-29 15:57:23 +01:00
///////////////////////////////////////////////////////////////////////////////
// Validator
///////////////////////////////////////////////////////////////////////////////
class StringValidator : public QValidator
{
2012-01-31 20:28:40 +01:00
public :
StringValidator ( QLabel * notifier ) : m_notifier ( notifier ) { m_notifier - > hide ( ) ; }
2012-01-29 15:57:23 +01:00
virtual State validate ( QString & input , int & pos ) const
{
2012-01-31 20:28:40 +01:00
bool invalid = false ;
invalid = invalid | | ( input . contains ( " -B " ) | | input . startsWith ( " -B " ) ) ;
invalid = invalid | | ( input . contains ( " -o " ) | | input . startsWith ( " -o " ) ) ;
invalid = invalid | | ( input . contains ( " -h " ) | | input . startsWith ( " -h " ) ) ;
invalid = invalid | | ( input . contains ( " -p " ) | | input . startsWith ( " -p " ) ) ;
invalid = invalid | | input . contains ( " --fps " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --frames " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --preset " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --tune " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --profile " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --stdin " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --crf " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --bitrate " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --qp " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --pass " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --stats " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --output " , Qt : : CaseInsensitive ) ;
invalid = invalid | | input . contains ( " --help " , Qt : : CaseInsensitive ) ;
if ( invalid )
2012-01-29 15:57:23 +01:00
{
2012-01-31 20:28:40 +01:00
MessageBeep ( MB_ICONWARNING ) ;
if ( m_notifier - > isHidden ( ) )
{
m_notifier - > show ( ) ;
QTimer : : singleShot ( 1000 , m_notifier , SLOT ( hide ( ) ) ) ;
}
2012-01-29 15:57:23 +01:00
}
return invalid ? QValidator : : Invalid : QValidator : : Acceptable ;
}
virtual void fixup ( QString & input ) const
{
input = input . simplified ( ) ;
}
2012-01-31 20:28:40 +01:00
protected :
QLabel * const m_notifier ;
2012-01-29 15:57:23 +01:00
} ;
2012-01-29 04:06:07 +01:00
///////////////////////////////////////////////////////////////////////////////
// Constructor & Destructor
///////////////////////////////////////////////////////////////////////////////
2012-02-03 12:31:51 +01:00
AddJobDialog : : AddJobDialog ( QWidget * parent , OptionsModel * options , bool x64supported )
2012-01-29 04:06:07 +01:00
:
2012-01-29 19:14:46 +01:00
QDialog ( parent ) ,
2012-01-31 03:03:17 +01:00
m_defaults ( new OptionsModel ( ) ) ,
2012-02-02 15:56:49 +01:00
m_options ( options ) ,
2012-02-03 12:31:51 +01:00
m_x64supported ( x64supported ) ,
2012-02-02 15:56:49 +01:00
initialDir_src ( QDesktopServices : : storageLocation ( QDesktopServices : : MoviesLocation ) ) ,
initialDir_out ( QDesktopServices : : storageLocation ( QDesktopServices : : MoviesLocation ) )
2012-01-29 04:06:07 +01:00
{
//Init the dialog, from the .ui file
setupUi ( this ) ;
2012-01-29 19:14:46 +01:00
setWindowFlags ( windowFlags ( ) & ( ~ Qt : : WindowContextHelpButtonHint ) ) ;
2012-01-29 04:06:07 +01:00
//Fix dialog size
2012-01-31 03:03:17 +01:00
buttonSaveTemplate - > setMaximumHeight ( 20 ) ;
buttonDeleteTemplate - > setMaximumHeight ( 20 ) ;
2012-01-29 04:06:07 +01:00
resize ( width ( ) , minimumHeight ( ) ) ;
setMinimumSize ( size ( ) ) ;
setMaximumHeight ( height ( ) ) ;
2012-01-31 03:03:17 +01:00
//Monitor RC mode combobox
2012-01-29 04:06:07 +01:00
connect ( cbxRateControlMode , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( modeIndexChanged ( int ) ) ) ;
2012-01-29 15:57:23 +01:00
//Activate buttons
connect ( buttonBrowseSource , SIGNAL ( clicked ( ) ) , this , SLOT ( browseButtonClicked ( ) ) ) ;
connect ( buttonBrowseOutput , SIGNAL ( clicked ( ) ) , this , SLOT ( browseButtonClicked ( ) ) ) ;
2012-01-31 22:30:21 +01:00
connect ( buttonSaveTemplate , SIGNAL ( clicked ( ) ) , this , SLOT ( saveTemplateButtonClicked ( ) ) ) ;
connect ( buttonDeleteTemplate , SIGNAL ( clicked ( ) ) , this , SLOT ( deleteTemplateButtonClicked ( ) ) ) ;
2012-01-29 15:57:23 +01:00
//Setup validator
2012-01-31 20:28:40 +01:00
editCustomParams - > installEventFilter ( this ) ;
editCustomParams - > setValidator ( new StringValidator ( labelNotification ) ) ;
2012-01-31 03:03:17 +01:00
editCustomParams - > clear ( ) ;
2012-01-31 00:13:32 +01:00
//Install event filter
labelHelpScreen - > installEventFilter ( this ) ;
2012-01-31 03:03:17 +01:00
//Monitor for options changes
connect ( cbxRateControlMode , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( configurationChanged ( ) ) ) ;
2012-02-04 15:56:38 +01:00
connect ( spinQuantizer , SIGNAL ( valueChanged ( double ) ) , this , SLOT ( configurationChanged ( ) ) ) ;
2012-01-31 03:03:17 +01:00
connect ( spinBitrate , SIGNAL ( valueChanged ( int ) ) , this , SLOT ( configurationChanged ( ) ) ) ;
connect ( cbxPreset , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( configurationChanged ( ) ) ) ;
connect ( cbxTuning , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( configurationChanged ( ) ) ) ;
connect ( cbxProfile , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( configurationChanged ( ) ) ) ;
connect ( editCustomParams , SIGNAL ( textChanged ( QString ) ) , this , SLOT ( configurationChanged ( ) ) ) ;
2012-01-31 22:30:21 +01:00
//Setup template selector
loadTemplateList ( ) ;
2012-01-31 03:03:17 +01:00
connect ( cbxTemplate , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( templateSelected ( ) ) ) ;
2012-02-02 15:56:49 +01:00
//Load directories
const QString appDir = QDesktopServices : : storageLocation ( QDesktopServices : : DataLocation ) ;
QSettings settings ( QString ( " %1/last.ini " ) . arg ( appDir ) , QSettings : : IniFormat ) ;
initialDir_src = settings . value ( " path/directory_openFrom " , initialDir_src ) . toString ( ) ;
initialDir_out = settings . value ( " path/directory_saveTo " , initialDir_out ) . toString ( ) ;
2012-01-29 04:06:07 +01:00
}
AddJobDialog : : ~ AddJobDialog ( void )
{
2012-02-02 15:56:49 +01:00
//Free templates
2012-01-31 22:30:21 +01:00
for ( int i = 0 ; i < cbxTemplate - > model ( ) - > rowCount ( ) ; i + + )
{
if ( cbxTemplate - > itemText ( i ) . startsWith ( " < " ) | | cbxTemplate - > itemText ( i ) . endsWith ( " > " ) )
{
continue ;
}
OptionsModel * item = reinterpret_cast < OptionsModel * > ( cbxTemplate - > itemData ( i ) . value < void * > ( ) ) ;
cbxTemplate - > setItemData ( i , QVariant : : fromValue < void * > ( NULL ) ) ;
X264_DELETE ( item ) ;
}
2012-01-31 03:03:17 +01:00
X264_DELETE ( m_defaults ) ;
2012-01-29 04:06:07 +01:00
}
2012-01-29 15:57:23 +01:00
///////////////////////////////////////////////////////////////////////////////
// Events
///////////////////////////////////////////////////////////////////////////////
2012-01-29 04:06:07 +01:00
void AddJobDialog : : showEvent ( QShowEvent * event )
{
QDialog : : showEvent ( event ) ;
2012-01-31 03:03:17 +01:00
templateSelected ( ) ;
2012-02-02 15:56:49 +01:00
2012-02-03 00:53:14 +01:00
if ( ! editSource - > text ( ) . isEmpty ( ) ) initialDir_src = QFileInfo ( QDir : : fromNativeSeparators ( editSource - > text ( ) ) ) . path ( ) ;
if ( ! editOutput - > text ( ) . isEmpty ( ) ) initialDir_out = QFileInfo ( QDir : : fromNativeSeparators ( editOutput - > text ( ) ) ) . path ( ) ;
if ( ( ! editSource - > text ( ) . isEmpty ( ) ) & & editOutput - > text ( ) . isEmpty ( ) )
2012-02-02 15:56:49 +01:00
{
generateOutputFileName ( QDir : : fromNativeSeparators ( editSource - > text ( ) ) ) ;
2012-02-02 22:53:40 +01:00
buttonAccept - > setFocus ( ) ;
2012-02-02 15:56:49 +01:00
}
2012-01-29 04:06:07 +01:00
}
2012-01-31 00:13:32 +01:00
bool AddJobDialog : : eventFilter ( QObject * o , QEvent * e )
{
if ( ( o = = labelHelpScreen ) & & ( e - > type ( ) = = QEvent : : MouseButtonPress ) )
{
2012-02-03 12:31:51 +01:00
HelpDialog * helpScreen = new HelpDialog ( this , m_x64supported ) ;
2012-02-01 01:08:54 +01:00
helpScreen - > exec ( ) ;
X264_DELETE ( helpScreen ) ;
2012-01-31 20:28:40 +01:00
}
else if ( ( o = = editCustomParams ) & & ( e - > type ( ) = = QEvent : : FocusOut ) )
{
editCustomParams - > setText ( editCustomParams - > text ( ) . simplified ( ) ) ;
2012-01-31 00:13:32 +01:00
}
return false ;
}
2012-01-29 15:57:23 +01:00
///////////////////////////////////////////////////////////////////////////////
// Slots
///////////////////////////////////////////////////////////////////////////////
2012-01-29 04:06:07 +01:00
void AddJobDialog : : modeIndexChanged ( int index )
{
spinQuantizer - > setEnabled ( index = = 0 | | index = = 1 ) ;
spinBitrate - > setEnabled ( index = = 2 | | index = = 3 ) ;
}
2012-01-29 15:57:23 +01:00
void AddJobDialog : : accept ( void )
{
if ( editSource - > text ( ) . trimmed ( ) . isEmpty ( ) )
{
QMessageBox : : warning ( this , tr ( " Not Found! " ) , tr ( " Please select a valid source file first! " ) ) ;
return ;
}
2012-02-02 15:56:49 +01:00
if ( editOutput - > text ( ) . trimmed ( ) . isEmpty ( ) )
{
QMessageBox : : warning ( this , tr ( " Not Selected! " ) , tr ( " Please select a valid output file first! " ) ) ;
return ;
}
2012-01-29 15:57:23 +01:00
QFileInfo sourceFile = QFileInfo ( editSource - > text ( ) ) ;
if ( ! ( sourceFile . exists ( ) & & sourceFile . isFile ( ) ) )
{
QMessageBox : : warning ( this , tr ( " Not Found! " ) , tr ( " The selected source file could not be found! " ) ) ;
return ;
}
QFileInfo outputDir = QFileInfo ( QFileInfo ( editOutput - > text ( ) ) . path ( ) ) ;
if ( ! ( outputDir . exists ( ) & & outputDir . isDir ( ) & & outputDir . isWritable ( ) ) )
{
QMessageBox : : warning ( this , tr ( " Not Writable! " ) , tr ( " Output directory does not exist or is not writable! " ) ) ;
return ;
}
QFileInfo outputFile = QFileInfo ( editOutput - > text ( ) ) ;
if ( outputFile . exists ( ) & & outputFile . isFile ( ) )
{
if ( QMessageBox : : question ( this , tr ( " Already Exists! " ) , tr ( " Output file already exists! Overwrite? " ) , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : No ) ! = QMessageBox : : Yes )
{
return ;
}
}
if ( outputFile . exists ( ) & & ( ! outputFile . isFile ( ) ) )
{
QMessageBox : : warning ( this , tr ( " Not a File! " ) , tr ( " Selected output files does not appear to be a file! " ) ) ;
return ;
}
2012-02-02 15:56:49 +01:00
//Save directories
const QString appDir = QDesktopServices : : storageLocation ( QDesktopServices : : DataLocation ) ;
QSettings settings ( QString ( " %1/last.ini " ) . arg ( appDir ) , QSettings : : IniFormat ) ;
if ( settings . isWritable ( ) )
{
settings . setValue ( " path/directory_openFrom " , initialDir_src ) ;
settings . setValue ( " path/directory_saveTo " , initialDir_out ) ;
settings . sync ( ) ;
}
2012-01-29 19:14:46 +01:00
saveOptions ( m_options ) ;
2012-01-29 15:57:23 +01:00
QDialog : : accept ( ) ;
}
void AddJobDialog : : browseButtonClicked ( void )
{
if ( QObject : : sender ( ) = = buttonBrowseSource )
{
2012-02-02 15:56:49 +01:00
QString filePath = QFileDialog : : getOpenFileName ( this , tr ( " Open Source File " ) , VALID_DIR ( initialDir_src ) ? initialDir_src : QDesktopServices : : storageLocation ( QDesktopServices : : MoviesLocation ) , makeFileFilter ( ) , NULL , QFileDialog : : DontUseNativeDialog ) ;
2012-01-29 15:57:23 +01:00
if ( ! ( filePath . isNull ( ) | | filePath . isEmpty ( ) ) )
{
2012-01-29 21:31:09 +01:00
editSource - > setText ( QDir : : toNativeSeparators ( filePath ) ) ;
2012-02-02 15:56:49 +01:00
generateOutputFileName ( filePath ) ;
initialDir_src = QFileInfo ( filePath ) . path ( ) ;
2012-01-29 15:57:23 +01:00
}
}
else if ( QObject : : sender ( ) = = buttonBrowseOutput )
{
2012-02-04 22:44:19 +01:00
QString types , selectedType ;
types + = tr ( " Matroska Files (*.mkv) " ) . append ( " ;; " ) ;
types + = tr ( " MPEG-4 Part 14 Container (*.mp4) " ) . append ( " ;; " ) ;
types + = tr ( " H.264 Elementary Stream (*.264) " ) ;
2012-01-29 15:57:23 +01:00
2012-02-04 22:44:19 +01:00
QString filePath = QFileDialog : : getSaveFileName ( this , tr ( " Choose Output File " ) , VALID_DIR ( initialDir_out ) ? initialDir_out : QDesktopServices : : storageLocation ( QDesktopServices : : MoviesLocation ) , types , & selectedType , QFileDialog : : DontUseNativeDialog | QFileDialog : : DontConfirmOverwrite ) ;
2012-01-29 15:57:23 +01:00
if ( ! ( filePath . isNull ( ) | | filePath . isEmpty ( ) ) )
{
2012-02-04 22:44:19 +01:00
QRegExp ext ( " \\ ( \\ * \\ .(.+) \ \ ) " ) ;
if ( ext . lastIndexIn ( selectedType ) > = 0 )
2012-02-02 15:56:49 +01:00
{
2012-02-04 22:44:19 +01:00
QString suffix = QFileInfo ( filePath ) . suffix ( ) ;
if ( suffix . compare ( ext . cap ( 1 ) , Qt : : CaseInsensitive ) )
{
filePath = QString ( " %1.%2 " ) . arg ( filePath , ext . cap ( 1 ) ) ;
}
2012-02-02 15:56:49 +01:00
}
2012-02-04 22:44:19 +01:00
2012-01-29 21:31:09 +01:00
editOutput - > setText ( QDir : : toNativeSeparators ( filePath ) ) ;
2012-02-02 15:56:49 +01:00
initialDir_out = QFileInfo ( filePath ) . path ( ) ;
2012-01-29 15:57:23 +01:00
}
}
}
2012-01-29 19:14:46 +01:00
2012-01-31 03:03:17 +01:00
void AddJobDialog : : configurationChanged ( void )
{
OptionsModel * options = reinterpret_cast < OptionsModel * > ( cbxTemplate - > itemData ( cbxTemplate - > currentIndex ( ) ) . value < void * > ( ) ) ;
if ( options )
{
cbxTemplate - > blockSignals ( true ) ;
cbxTemplate - > insertItem ( 0 , tr ( " <Unsaved Configuration> " ) , QVariant : : fromValue < void * > ( NULL ) ) ;
cbxTemplate - > setCurrentIndex ( 0 ) ;
cbxTemplate - > blockSignals ( false ) ;
}
}
void AddJobDialog : : templateSelected ( void )
{
OptionsModel * options = reinterpret_cast < OptionsModel * > ( cbxTemplate - > itemData ( cbxTemplate - > currentIndex ( ) ) . value < void * > ( ) ) ;
if ( options )
{
qDebug ( " Loading options! " ) ;
2012-02-02 18:55:55 +01:00
REMOVE_USAFED_ITEM ;
2012-01-31 03:03:17 +01:00
restoreOptions ( options ) ;
}
modeIndexChanged ( cbxRateControlMode - > currentIndex ( ) ) ;
}
2012-01-31 22:30:21 +01:00
void AddJobDialog : : saveTemplateButtonClicked ( void )
{
qDebug ( " Saving template " ) ;
QString name = tr ( " New Template " ) ;
2012-02-04 19:09:27 +01:00
int n = 2 ;
while ( OptionsModel : : templateExists ( name ) )
{
name = tr ( " New Template (%1) " ) . arg ( QString : : number ( n + + ) ) ;
}
2012-01-31 22:30:21 +01:00
2012-02-02 18:55:55 +01:00
OptionsModel * options = new OptionsModel ( ) ;
saveOptions ( options ) ;
if ( options - > equals ( m_defaults ) )
{
2012-02-04 19:09:27 +01:00
QMessageBox : : warning ( this , tr ( " Oups " ) , tr ( " <nobr>It makes no sense to save the default settings!</nobr> " ) ) ;
2012-02-02 18:55:55 +01:00
cbxTemplate - > blockSignals ( true ) ;
cbxTemplate - > setCurrentIndex ( 0 ) ;
cbxTemplate - > blockSignals ( false ) ;
REMOVE_USAFED_ITEM ;
X264_DELETE ( options ) ;
return ;
}
for ( int i = 0 ; i < cbxTemplate - > count ( ) ; i + + )
{
OptionsModel * test = reinterpret_cast < OptionsModel * > ( cbxTemplate - > itemData ( i ) . value < void * > ( ) ) ;
if ( test ! = NULL )
{
if ( options - > equals ( test ) )
{
2012-02-04 19:09:27 +01:00
QMessageBox : : warning ( this , tr ( " Oups " ) , tr ( " <nobr>There already is a template for the current settings!</nobr> " ) ) ;
2012-02-02 18:55:55 +01:00
cbxTemplate - > blockSignals ( true ) ;
cbxTemplate - > setCurrentIndex ( i ) ;
cbxTemplate - > blockSignals ( false ) ;
REMOVE_USAFED_ITEM ;
X264_DELETE ( options ) ;
return ;
}
}
}
2012-01-31 22:30:21 +01:00
forever
{
bool ok = false ;
2012-02-04 19:09:27 +01:00
name = QInputDialog : : getText ( this , tr ( " Save Template " ) , tr ( " Please enter the name of the template: " ) . leftJustified ( 144 , ' ' ) , QLineEdit : : Normal , name , & ok ) . simplified ( ) ;
2012-02-02 18:55:55 +01:00
if ( ! ok )
{
X264_DELETE ( options ) ;
return ;
}
if ( name . contains ( ' < ' ) | | name . contains ( ' > ' ) | | name . contains ( ' \\ ' ) | | name . contains ( ' / ' ) | | name . contains ( ' " ' ) )
2012-01-31 22:30:21 +01:00
{
2012-02-04 19:09:27 +01:00
QMessageBox : : warning ( this , tr ( " Invalid Name " ) , tr ( " <nobr>Sorry, the name you have entered is invalid!</nobr> " ) ) ;
2012-02-02 18:55:55 +01:00
while ( name . contains ( ' < ' ) ) name . remove ( ' < ' ) ;
while ( name . contains ( ' > ' ) ) name . remove ( ' > ' ) ;
while ( name . contains ( ' \\ ' ) ) name . remove ( ' \\ ' ) ;
while ( name . contains ( ' / ' ) ) name . remove ( ' / ' ) ;
while ( name . contains ( ' " ' ) ) name . remove ( ' " ' ) ;
name = name . simplified ( ) ;
2012-01-31 22:30:21 +01:00
continue ;
}
if ( OptionsModel : : templateExists ( name ) )
{
2012-02-04 19:09:27 +01:00
int ret = QMessageBox : : warning ( this , tr ( " Already Exists " ) , tr ( " <nobr>A template of that name already exists! Overwrite?</nobr> " ) , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : No ) ;
if ( ret ! = QMessageBox : : Yes )
{
continue ;
}
2012-01-31 22:30:21 +01:00
}
break ;
}
if ( ! OptionsModel : : saveTemplate ( options , name ) )
{
2012-02-02 18:55:55 +01:00
QMessageBox : : critical ( this , tr ( " Save Failed " ) , tr ( " Sorry, the template could not be saved! " ) ) ;
2012-01-31 22:30:21 +01:00
X264_DELETE ( options ) ;
return ;
}
int index = cbxTemplate - > model ( ) - > rowCount ( ) ;
cbxTemplate - > blockSignals ( true ) ;
2012-02-04 19:09:27 +01:00
for ( int i = 0 ; i < cbxTemplate - > count ( ) ; i + + )
{
if ( cbxTemplate - > itemText ( i ) . compare ( name , Qt : : CaseInsensitive ) = = 0 )
{
index = - 1 ; //Do not append new template
OptionsModel * oldItem = reinterpret_cast < OptionsModel * > ( cbxTemplate - > itemData ( i ) . value < void * > ( ) ) ;
cbxTemplate - > setItemData ( i , QVariant : : fromValue < void * > ( options ) ) ;
cbxTemplate - > setCurrentIndex ( i ) ;
X264_DELETE ( oldItem ) ;
}
}
if ( index > = 0 )
{
cbxTemplate - > insertItem ( index , name , QVariant : : fromValue < void * > ( options ) ) ;
cbxTemplate - > setCurrentIndex ( index ) ;
}
2012-01-31 22:30:21 +01:00
cbxTemplate - > blockSignals ( false ) ;
2012-02-02 18:55:55 +01:00
REMOVE_USAFED_ITEM ;
2012-01-31 22:30:21 +01:00
}
void AddJobDialog : : deleteTemplateButtonClicked ( void )
{
const int index = cbxTemplate - > currentIndex ( ) ;
QString name = cbxTemplate - > itemText ( index ) ;
2012-02-04 19:09:27 +01:00
if ( name . contains ( ' < ' ) | | name . contains ( ' > ' ) | | name . contains ( ' \\ ' ) | | name . contains ( ' / ' ) )
2012-01-31 22:30:21 +01:00
{
QMessageBox : : warning ( this , tr ( " Invalid Item " ) , tr ( " Sorry, the selected item cannot be deleted! " ) ) ;
return ;
}
2012-02-04 19:09:27 +01:00
int ret = QMessageBox : : question ( this , tr ( " Delete Template " ) , tr ( " <nobr>Do you really want to delete the selected template?</nobr> " ) , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : No ) ;
if ( ret ! = QMessageBox : : Yes )
{
return ;
}
2012-01-31 22:30:21 +01:00
OptionsModel : : deleteTemplate ( name ) ;
OptionsModel * item = reinterpret_cast < OptionsModel * > ( cbxTemplate - > itemData ( index ) . value < void * > ( ) ) ;
cbxTemplate - > removeItem ( index ) ;
X264_DELETE ( item ) ;
}
2012-01-29 21:31:09 +01:00
///////////////////////////////////////////////////////////////////////////////
// Public functions
///////////////////////////////////////////////////////////////////////////////
QString AddJobDialog : : sourceFile ( void )
{
return QDir : : fromNativeSeparators ( editSource - > text ( ) ) ;
}
QString AddJobDialog : : outputFile ( void )
{
return QDir : : fromNativeSeparators ( editOutput - > text ( ) ) ;
}
2012-01-29 19:14:46 +01:00
///////////////////////////////////////////////////////////////////////////////
// Private functions
///////////////////////////////////////////////////////////////////////////////
2012-01-31 22:30:21 +01:00
void AddJobDialog : : loadTemplateList ( void )
{
cbxTemplate - > addItem ( tr ( " <Default> " ) , QVariant : : fromValue < void * > ( m_defaults ) ) ;
cbxTemplate - > setCurrentIndex ( 0 ) ;
QMap < QString , OptionsModel * > templates = OptionsModel : : loadAllTemplates ( ) ;
QStringList templateNames = templates . keys ( ) ;
templateNames . sort ( ) ;
while ( ! templateNames . isEmpty ( ) )
{
QString current = templateNames . takeFirst ( ) ;
cbxTemplate - > addItem ( current , QVariant : : fromValue < void * > ( templates . value ( current ) ) ) ;
if ( templates . value ( current ) - > equals ( m_options ) )
{
cbxTemplate - > setCurrentIndex ( cbxTemplate - > count ( ) - 1 ) ;
}
}
if ( ( cbxTemplate - > currentIndex ( ) = = 0 ) & & ( ! m_options - > equals ( m_defaults ) ) )
{
cbxTemplate - > insertItem ( 1 , tr ( " <Recently Used> " ) , QVariant : : fromValue < void * > ( m_options ) ) ;
cbxTemplate - > setCurrentIndex ( 1 ) ;
}
}
2012-01-29 19:14:46 +01:00
void AddJobDialog : : updateComboBox ( QComboBox * cbox , const QString & text )
{
for ( int i = 0 ; i < cbox - > model ( ) - > rowCount ( ) ; i + + )
{
if ( cbox - > model ( ) - > data ( cbox - > model ( ) - > index ( i , 0 , QModelIndex ( ) ) ) . toString ( ) . compare ( text , Qt : : CaseInsensitive ) = = 0 )
{
cbox - > setCurrentIndex ( i ) ;
break ;
}
}
}
void AddJobDialog : : restoreOptions ( OptionsModel * options )
{
2012-01-31 03:03:17 +01:00
cbxRateControlMode - > blockSignals ( true ) ;
spinQuantizer - > blockSignals ( true ) ;
spinBitrate - > blockSignals ( true ) ;
cbxPreset - > blockSignals ( true ) ;
cbxTuning - > blockSignals ( true ) ;
cbxProfile - > blockSignals ( true ) ;
editCustomParams - > blockSignals ( true ) ;
2012-01-29 19:14:46 +01:00
cbxRateControlMode - > setCurrentIndex ( options - > rcMode ( ) ) ;
spinQuantizer - > setValue ( options - > quantizer ( ) ) ;
spinBitrate - > setValue ( options - > bitrate ( ) ) ;
updateComboBox ( cbxPreset , options - > preset ( ) ) ;
updateComboBox ( cbxTuning , options - > tune ( ) ) ;
updateComboBox ( cbxProfile , options - > profile ( ) ) ;
2012-01-31 03:03:17 +01:00
editCustomParams - > setText ( options - > custom ( ) ) ;
cbxRateControlMode - > blockSignals ( false ) ;
spinQuantizer - > blockSignals ( false ) ;
spinBitrate - > blockSignals ( false ) ;
cbxPreset - > blockSignals ( false ) ;
cbxTuning - > blockSignals ( false ) ;
cbxProfile - > blockSignals ( false ) ;
editCustomParams - > blockSignals ( false ) ;
2012-01-29 19:14:46 +01:00
}
void AddJobDialog : : saveOptions ( OptionsModel * options )
{
options - > setRCMode ( static_cast < OptionsModel : : RCMode > ( cbxRateControlMode - > currentIndex ( ) ) ) ;
options - > setQuantizer ( spinQuantizer - > value ( ) ) ;
options - > setBitrate ( spinBitrate - > value ( ) ) ;
options - > setPreset ( cbxPreset - > model ( ) - > data ( cbxPreset - > model ( ) - > index ( cbxPreset - > currentIndex ( ) , 0 ) ) . toString ( ) ) ;
options - > setTune ( cbxTuning - > model ( ) - > data ( cbxTuning - > model ( ) - > index ( cbxTuning - > currentIndex ( ) , 0 ) ) . toString ( ) ) ;
options - > setProfile ( cbxProfile - > model ( ) - > data ( cbxProfile - > model ( ) - > index ( cbxProfile - > currentIndex ( ) , 0 ) ) . toString ( ) ) ;
2012-01-31 03:03:17 +01:00
options - > setCustom ( editCustomParams - > text ( ) . simplified ( ) ) ;
2012-01-29 19:14:46 +01:00
}
2012-01-30 17:50:19 +01:00
QString AddJobDialog : : makeFileFilter ( void )
{
QString filters ( " All supported files ( " ) ;
for ( size_t index = 0 ; g_filters [ index ] . name & & g_filters [ index ] . fext ; index + + )
{
filters + = QString ( ( index > 0 ) ? " *.%1 " : " *.%1 " ) . arg ( QString : : fromLatin1 ( g_filters [ index ] . fext ) ) ;
}
filters + = QString ( " );; " ) ;
for ( size_t index = 0 ; g_filters [ index ] . name & & g_filters [ index ] . fext ; index + + )
{
filters + = QString ( " %1 (*.%2);; " ) . arg ( QString : : fromLatin1 ( g_filters [ index ] . name ) , QString : : fromLatin1 ( g_filters [ index ] . fext ) ) ;
}
filters + = QString ( " All files (*.*) " ) ;
return filters ;
}
2012-02-02 15:56:49 +01:00
void AddJobDialog : : generateOutputFileName ( const QString & filePath )
{
QString name = QFileInfo ( filePath ) . completeBaseName ( ) ;
QString path = VALID_DIR ( initialDir_out ) ? initialDir_out : QFileInfo ( filePath ) . path ( ) ;
QString outPath = QString ( " %1/%2.mkv " ) . arg ( path , name ) ;
if ( QFileInfo ( outPath ) . exists ( ) )
{
int i = 2 ;
while ( QFileInfo ( outPath ) . exists ( ) )
{
outPath = QString ( " %1/%2 (%3).mkv " ) . arg ( path , name , QString : : number ( i + + ) ) ;
}
}
editOutput - > setText ( QDir : : toNativeSeparators ( outPath ) ) ;
}