2012-01-28 16:40:14 +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_main.h"
2012-01-28 18:55:40 +01:00
# include "model_jobList.h"
2012-01-29 19:14:46 +01:00
# include "model_options.h"
2012-01-29 04:06:07 +01:00
# include "win_addJob.h"
2012-02-03 00:53:14 +01:00
# include "win_preferences.h"
2012-02-08 00:29:47 +01:00
# include "taskbar7.h"
2012-02-04 01:12:21 +01:00
# include "resource.h"
2012-02-14 23:57:28 +01:00
# include "avisynth_c.h"
2012-01-28 18:55:40 +01:00
# include <QDate>
2012-01-28 19:59:04 +01:00
# include <QTimer>
2012-01-28 23:24:41 +01:00
# include <QCloseEvent>
# include <QMessageBox>
2012-01-29 15:57:23 +01:00
# include <QDesktopServices>
# include <QUrl>
2012-01-29 21:31:09 +01:00
# include <QDir>
2012-01-30 17:50:19 +01:00
# include <QLibrary>
2012-02-02 22:53:40 +01:00
# include <QProcess>
2012-02-04 01:12:21 +01:00
# include <QProgressDialog>
2012-02-13 16:44:50 +01:00
# include <QScrollBar>
2012-01-29 15:57:23 +01:00
2012-02-04 01:12:21 +01:00
# include <Mmsystem.h>
2012-01-28 16:40:14 +01:00
2012-02-02 22:53:40 +01:00
const char * home_url = " http://mulder.brhack.net/ " ;
2012-02-08 00:29:47 +01:00
const char * update_url = " http://code.google.com/p/mulder/downloads/list " ;
2012-02-09 02:06:29 +01:00
const char * tpl_last = " <LAST_USED> " ;
2012-01-30 17:50:19 +01:00
2012-01-31 00:13:32 +01:00
# define SET_FONT_BOLD(WIDGET,BOLD) { QFont _font = WIDGET->font(); _font.setBold(BOLD); WIDGET->setFont(_font); }
# define SET_TEXT_COLOR(WIDGET,COLOR) { QPalette _palette = WIDGET->palette(); _palette.setColor(QPalette::WindowText, (COLOR)); _palette.setColor(QPalette::Text, (COLOR)); WIDGET->setPalette(_palette); }
2012-01-28 16:40:14 +01:00
///////////////////////////////////////////////////////////////////////////////
// Constructor & Destructor
///////////////////////////////////////////////////////////////////////////////
2012-02-10 18:42:16 +01:00
/*
* Constructor
*/
2012-02-07 21:48:25 +01:00
MainWindow : : MainWindow ( const x264_cpu_t * const cpuFeatures )
2012-01-29 01:19:50 +01:00
:
2012-02-07 21:48:25 +01:00
m_cpuFeatures ( cpuFeatures ) ,
2012-01-29 21:31:09 +01:00
m_appDir ( QApplication : : applicationDirPath ( ) ) ,
2012-02-10 18:42:16 +01:00
m_options ( NULL ) ,
m_jobList ( NULL ) ,
m_droppedFiles ( NULL ) ,
2012-01-29 21:31:09 +01:00
m_firstShow ( true )
2012-01-28 16:40:14 +01:00
{
//Init the dialog, from the .ui file
setupUi ( this ) ;
2012-01-29 19:14:46 +01:00
setWindowFlags ( windowFlags ( ) & ( ~ Qt : : WindowMaximizeButtonHint ) ) ;
2012-01-28 18:55:40 +01:00
//Register meta types
qRegisterMetaType < QUuid > ( " QUuid " ) ;
2012-02-21 00:37:31 +01:00
qRegisterMetaType < QUuid > ( " DWORD " ) ;
2012-01-28 18:55:40 +01:00
qRegisterMetaType < EncodeThread : : JobStatus > ( " EncodeThread::JobStatus " ) ;
2012-02-03 00:53:14 +01:00
//Load preferences
2012-02-05 15:42:41 +01:00
PreferencesDialog : : initPreferences ( & m_preferences ) ;
2012-02-03 00:53:14 +01:00
PreferencesDialog : : loadPreferences ( & m_preferences ) ;
2012-02-09 02:06:29 +01:00
//Create options object
m_options = new OptionsModel ( ) ;
OptionsModel : : loadTemplate ( m_options , QString : : fromLatin1 ( tpl_last ) ) ;
2012-02-21 00:37:31 +01:00
//Create IPC thread object
m_ipcThread = new IPCThread ( ) ;
connect ( m_ipcThread , SIGNAL ( instanceCreated ( DWORD ) ) , this , SLOT ( instanceCreated ( DWORD ) ) , Qt : : QueuedConnection ) ;
2012-01-28 18:55:40 +01:00
//Freeze minimum size
setMinimumSize ( size ( ) ) ;
2012-01-31 00:13:32 +01:00
splitter - > setSizes ( QList < int > ( ) < < 16 < < 196 ) ;
2012-01-28 18:55:40 +01:00
2012-01-29 01:19:50 +01:00
//Update title
2012-01-29 21:31:09 +01:00
labelBuildDate - > setText ( tr ( " Built on %1 at %2 " ) . arg ( x264_version_date ( ) . toString ( Qt : : ISODate ) , QString : : fromLatin1 ( x264_version_time ( ) ) ) ) ;
2012-01-31 20:28:40 +01:00
labelBuildDate - > installEventFilter ( this ) ;
2012-02-07 21:48:25 +01:00
setWindowTitle ( QString ( " %1 (%2 Mode) " ) . arg ( windowTitle ( ) , m_cpuFeatures - > x64 ? " 64-Bit " : " 32-Bit " ) ) ;
2012-02-05 04:41:42 +01:00
if ( X264_DEBUG )
{
setWindowTitle ( QString ( " %1 | !!! DEBUG VERSION !!! " ) . arg ( windowTitle ( ) ) ) ;
setStyleSheet ( " QMenuBar, QMainWindow { background-color: yellow } " ) ;
}
else if ( x264_is_prerelease ( ) )
{
setWindowTitle ( QString ( " %1 | PRE-RELEASE VERSION " ) . arg ( windowTitle ( ) ) ) ;
}
2012-02-03 00:53:14 +01:00
2012-01-28 18:55:40 +01:00
//Create model
m_jobList = new JobListModel ( ) ;
2012-01-28 23:24:41 +01:00
connect ( m_jobList , SIGNAL ( dataChanged ( QModelIndex , QModelIndex ) ) , this , SLOT ( jobChangedData ( QModelIndex , QModelIndex ) ) ) ;
2012-01-28 18:55:40 +01:00
jobsView - > setModel ( m_jobList ) ;
2012-01-31 00:13:32 +01:00
2012-01-28 18:55:40 +01:00
//Setup view
2012-01-28 23:24:41 +01:00
jobsView - > horizontalHeader ( ) - > setSectionHidden ( 3 , true ) ;
2012-01-28 18:55:40 +01:00
jobsView - > horizontalHeader ( ) - > setResizeMode ( 0 , QHeaderView : : Stretch ) ;
jobsView - > horizontalHeader ( ) - > setResizeMode ( 1 , QHeaderView : : Fixed ) ;
jobsView - > horizontalHeader ( ) - > setResizeMode ( 2 , QHeaderView : : Fixed ) ;
jobsView - > horizontalHeader ( ) - > resizeSection ( 1 , 150 ) ;
jobsView - > horizontalHeader ( ) - > resizeSection ( 2 , 90 ) ;
jobsView - > verticalHeader ( ) - > setResizeMode ( QHeaderView : : ResizeToContents ) ;
2012-01-28 19:59:04 +01:00
connect ( jobsView - > selectionModel ( ) , SIGNAL ( currentChanged ( QModelIndex , QModelIndex ) ) , this , SLOT ( jobSelected ( QModelIndex , QModelIndex ) ) ) ;
2012-01-28 18:55:40 +01:00
2012-01-31 00:13:32 +01:00
//Create context menu
QAction * actionClipboard = new QAction ( QIcon ( " :/buttons/page_paste.png " ) , tr ( " Copy to Clipboard " ) , logView ) ;
2012-02-02 22:53:40 +01:00
actionClipboard - > setEnabled ( false ) ;
2012-01-31 00:13:32 +01:00
logView - > addAction ( actionClipboard ) ;
connect ( actionClipboard , SIGNAL ( triggered ( bool ) ) , this , SLOT ( copyLogToClipboard ( bool ) ) ) ;
jobsView - > addActions ( menuJob - > actions ( ) ) ;
2012-01-28 18:55:40 +01:00
//Enable buttons
connect ( buttonAddJob , SIGNAL ( clicked ( ) ) , this , SLOT ( addButtonPressed ( ) ) ) ;
2012-01-28 23:24:41 +01:00
connect ( buttonStartJob , SIGNAL ( clicked ( ) ) , this , SLOT ( startButtonPressed ( ) ) ) ;
connect ( buttonAbortJob , SIGNAL ( clicked ( ) ) , this , SLOT ( abortButtonPressed ( ) ) ) ;
2012-02-02 02:13:02 +01:00
connect ( buttonPauseJob , SIGNAL ( toggled ( bool ) ) , this , SLOT ( pauseButtonPressed ( bool ) ) ) ;
2012-02-02 22:53:40 +01:00
connect ( actionJob_Delete , SIGNAL ( triggered ( ) ) , this , SLOT ( deleteButtonPressed ( ) ) ) ;
2012-02-14 23:36:44 +01:00
connect ( actionJob_Restart , SIGNAL ( triggered ( ) ) , this , SLOT ( restartButtonPressed ( ) ) ) ;
2012-02-02 22:53:40 +01:00
connect ( actionJob_Browse , SIGNAL ( triggered ( ) ) , this , SLOT ( browseButtonPressed ( ) ) ) ;
2012-01-28 23:24:41 +01:00
//Enable menu
connect ( actionAbout , SIGNAL ( triggered ( ) ) , this , SLOT ( showAbout ( ) ) ) ;
2012-01-29 15:57:23 +01:00
connect ( actionWebMulder , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
connect ( actionWebX264 , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
connect ( actionWebKomisar , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
connect ( actionWebJarod , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
2012-02-05 15:42:41 +01:00
connect ( actionWebJEEB , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
connect ( actionWebAvisynth32 , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
connect ( actionWebAvisynth64 , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
2012-01-29 15:57:23 +01:00
connect ( actionWebWiki , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
2012-01-30 17:50:19 +01:00
connect ( actionWebBluRay , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
2012-02-13 16:44:50 +01:00
connect ( actionWebAvsWiki , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
2012-02-05 15:42:41 +01:00
connect ( actionWebSecret , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
2012-02-16 23:58:33 +01:00
connect ( actionWebSupport , SIGNAL ( triggered ( ) ) , this , SLOT ( showWebLink ( ) ) ) ;
2012-02-03 00:53:14 +01:00
connect ( actionPreferences , SIGNAL ( triggered ( ) ) , this , SLOT ( showPreferences ( ) ) ) ;
2012-01-29 19:14:46 +01:00
2012-01-31 00:13:32 +01:00
//Create floating label
2012-02-07 21:48:25 +01:00
m_label = new QLabel ( jobsView - > viewport ( ) ) ;
2012-01-31 00:13:32 +01:00
m_label - > setText ( tr ( " No job created yet. Please click the 'Add New Job' button! " ) ) ;
m_label - > setAlignment ( Qt : : AlignHCenter | Qt : : AlignVCenter ) ;
SET_TEXT_COLOR ( m_label , Qt : : darkGray ) ;
SET_FONT_BOLD ( m_label , true ) ;
m_label - > setVisible ( true ) ;
m_label - > setContextMenuPolicy ( Qt : : ActionsContextMenu ) ;
m_label - > addActions ( jobsView - > actions ( ) ) ;
2012-02-07 21:48:25 +01:00
connect ( splitter , SIGNAL ( splitterMoved ( int , int ) ) , this , SLOT ( updateLabelPos ( ) ) ) ;
updateLabelPos ( ) ;
2012-01-28 16:40:14 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* Destructor
*/
2012-01-28 16:40:14 +01:00
MainWindow : : ~ MainWindow ( void )
{
2012-02-09 02:06:29 +01:00
OptionsModel : : saveTemplate ( m_options , QString : : fromLatin1 ( tpl_last ) ) ;
2012-01-28 23:24:41 +01:00
X264_DELETE ( m_jobList ) ;
2012-01-29 19:14:46 +01:00
X264_DELETE ( m_options ) ;
2012-02-10 18:42:16 +01:00
X264_DELETE ( m_droppedFiles ) ;
2012-01-31 00:13:32 +01:00
X264_DELETE ( m_label ) ;
2012-01-29 21:31:09 +01:00
while ( ! m_toolsList . isEmpty ( ) )
{
QFile * temp = m_toolsList . takeFirst ( ) ;
X264_DELETE ( temp ) ;
}
2012-02-21 00:37:31 +01:00
if ( m_ipcThread - > isRunning ( ) )
{
m_ipcThread - > setAbort ( ) ;
if ( ! m_ipcThread - > wait ( 5000 ) )
{
m_ipcThread - > terminate ( ) ;
m_ipcThread - > wait ( ) ;
}
}
X264_DELETE ( m_ipcThread ) ;
2012-01-28 16:40:14 +01:00
}
2012-01-28 18:55:40 +01:00
///////////////////////////////////////////////////////////////////////////////
// Slots
///////////////////////////////////////////////////////////////////////////////
2012-02-10 18:42:16 +01:00
/*
* The " add " button was clicked
*/
2012-02-15 00:45:42 +01:00
void MainWindow : : addButtonPressed ( const QString & filePathIn , const QString & filePathOut , OptionsModel * options , int fileNo , int fileTotal , bool * ok )
2012-01-28 18:55:40 +01:00
{
2012-02-10 18:42:16 +01:00
qDebug ( " MainWindow::addButtonPressed " ) ;
2012-02-02 18:55:55 +01:00
if ( ok ) * ok = false ;
2012-02-14 23:36:44 +01:00
2012-02-15 00:45:42 +01:00
AddJobDialog * addDialog = new AddJobDialog ( this , options ? options : m_options , m_cpuFeatures - > x64 ) ;
2012-02-04 01:12:21 +01:00
addDialog - > setRunImmediately ( countRunningJobs ( ) < ( m_preferences . autoRunNextJob ? m_preferences . maxRunningJobCount : 1 ) ) ;
2012-02-14 23:36:44 +01:00
2012-02-15 00:45:42 +01:00
if ( options ) addDialog - > setWindowTitle ( tr ( " Restart Job " ) ) ;
2012-02-04 15:56:38 +01:00
if ( ( fileNo > = 0 ) & & ( fileTotal > 1 ) ) addDialog - > setWindowTitle ( addDialog - > windowTitle ( ) . append ( tr ( " (File %1 of %2) " ) . arg ( QString : : number ( fileNo + 1 ) , QString : : number ( fileTotal ) ) ) ) ;
2012-02-14 23:36:44 +01:00
if ( ! filePathIn . isEmpty ( ) ) addDialog - > setSourceFile ( filePathIn ) ;
if ( ! filePathOut . isEmpty ( ) ) addDialog - > setOutputFile ( filePathOut ) ;
2012-02-04 01:12:21 +01:00
2012-01-29 04:06:07 +01:00
int result = addDialog - > exec ( ) ;
if ( result = = QDialog : : Accepted )
{
2012-01-29 15:57:23 +01:00
EncodeThread * thrd = new EncodeThread
(
addDialog - > sourceFile ( ) ,
2012-01-29 19:14:46 +01:00
addDialog - > outputFile ( ) ,
2012-02-15 00:45:42 +01:00
options ? options : m_options ,
2012-01-30 17:50:19 +01:00
QString ( " %1/toolset " ) . arg ( m_appDir ) ,
2012-02-07 21:48:25 +01:00
m_cpuFeatures - > x64 ,
m_cpuFeatures - > x64 & & m_preferences . useAvisyth64Bit
2012-01-29 15:57:23 +01:00
) ;
2012-01-29 04:06:07 +01:00
QModelIndex newIndex = m_jobList - > insertJob ( thrd ) ;
2012-01-29 15:57:23 +01:00
2012-02-02 18:55:55 +01:00
if ( newIndex . isValid ( ) )
2012-01-29 15:57:23 +01:00
{
2012-02-02 18:55:55 +01:00
if ( addDialog - > runImmediately ( ) )
{
jobsView - > selectRow ( newIndex . row ( ) ) ;
QApplication : : processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
m_jobList - > startJob ( newIndex ) ;
}
2012-01-31 00:13:32 +01:00
2012-02-02 18:55:55 +01:00
if ( ok ) * ok = true ;
}
2012-01-29 04:06:07 +01:00
2012-02-14 23:36:44 +01:00
m_label - > setVisible ( m_jobList - > rowCount ( QModelIndex ( ) ) = = 0 ) ;
}
2012-01-29 04:06:07 +01:00
X264_DELETE ( addDialog ) ;
2012-01-28 23:24:41 +01:00
}
2012-01-28 19:59:04 +01:00
2012-02-10 18:42:16 +01:00
/*
* The " start " button was clicked
*/
2012-01-28 23:24:41 +01:00
void MainWindow : : startButtonPressed ( void )
{
m_jobList - > startJob ( jobsView - > currentIndex ( ) ) ;
2012-01-28 19:59:04 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* The " abort " button was clicked
*/
2012-01-28 23:24:41 +01:00
void MainWindow : : abortButtonPressed ( void )
{
m_jobList - > abortJob ( jobsView - > currentIndex ( ) ) ;
}
2012-01-29 00:57:47 +01:00
2012-02-10 18:42:16 +01:00
/*
* The " delete " button was clicked
*/
2012-02-02 22:53:40 +01:00
void MainWindow : : deleteButtonPressed ( void )
{
m_jobList - > deleteJob ( jobsView - > currentIndex ( ) ) ;
m_label - > setVisible ( m_jobList - > rowCount ( QModelIndex ( ) ) = = 0 ) ;
}
2012-02-10 18:42:16 +01:00
/*
* The " browse " button was clicked
*/
2012-02-02 22:53:40 +01:00
void MainWindow : : browseButtonPressed ( void )
{
QString outputFile = m_jobList - > getJobOutputFile ( jobsView - > currentIndex ( ) ) ;
if ( ( ! outputFile . isEmpty ( ) ) & & QFileInfo ( outputFile ) . exists ( ) & & QFileInfo ( outputFile ) . isFile ( ) )
{
QProcess : : startDetached ( QString : : fromLatin1 ( " explorer.exe " ) , QStringList ( ) < < QString : : fromLatin1 ( " /select, " ) < < QDir : : toNativeSeparators ( outputFile ) , QFileInfo ( outputFile ) . path ( ) ) ;
}
else
{
QMessageBox : : warning ( this , tr ( " Not Found " ) , tr ( " Sorry, the output file could not be found! " ) ) ;
}
}
2012-02-10 18:42:16 +01:00
/*
* The " pause " button was clicked
*/
2012-02-02 02:13:02 +01:00
void MainWindow : : pauseButtonPressed ( bool checked )
{
if ( checked )
{
m_jobList - > pauseJob ( jobsView - > currentIndex ( ) ) ;
}
else
{
m_jobList - > resumeJob ( jobsView - > currentIndex ( ) ) ;
}
}
2012-02-14 23:36:44 +01:00
/*
* The " restart " button was clicked
*/
void MainWindow : : restartButtonPressed ( void )
{
const QModelIndex index = jobsView - > currentIndex ( ) ;
const QString & source = m_jobList - > getJobSourceFile ( index ) ;
const QString & output = m_jobList - > getJobOutputFile ( index ) ;
const OptionsModel * options = m_jobList - > getJobOptions ( index ) ;
if ( ( options ) & & ( ! source . isEmpty ( ) ) & & ( ! output . isEmpty ( ) ) )
{
2012-02-15 00:45:42 +01:00
OptionsModel * tempOptions = new OptionsModel ( * options ) ;
addButtonPressed ( source , output , tempOptions ) ;
X264_DELETE ( tempOptions ) ;
2012-02-14 23:36:44 +01:00
}
}
2012-02-10 18:42:16 +01:00
/*
* Job item selected by user
*/
2012-01-28 19:59:04 +01:00
void MainWindow : : jobSelected ( const QModelIndex & current , const QModelIndex & previous )
{
qDebug ( " Job selected: %d " , current . row ( ) ) ;
2012-01-28 23:24:41 +01:00
if ( logView - > model ( ) )
{
disconnect ( logView - > model ( ) , SIGNAL ( rowsInserted ( QModelIndex , int , int ) ) , this , SLOT ( jobLogExtended ( QModelIndex , int , int ) ) ) ;
}
2012-02-02 22:53:40 +01:00
if ( current . isValid ( ) )
{
logView - > setModel ( m_jobList - > getLogFile ( current ) ) ;
connect ( logView - > model ( ) , SIGNAL ( rowsInserted ( QModelIndex , int , int ) ) , this , SLOT ( jobLogExtended ( QModelIndex , int , int ) ) ) ;
logView - > actions ( ) . first ( ) - > setEnabled ( true ) ;
QTimer : : singleShot ( 0 , logView , SLOT ( scrollToBottom ( ) ) ) ;
2012-02-08 00:29:47 +01:00
2012-02-02 22:53:40 +01:00
progressBar - > setValue ( m_jobList - > getJobProgress ( current ) ) ;
editDetails - > setText ( m_jobList - > data ( m_jobList - > index ( current . row ( ) , 3 , QModelIndex ( ) ) , Qt : : DisplayRole ) . toString ( ) ) ;
updateButtons ( m_jobList - > getJobStatus ( current ) ) ;
2012-02-08 00:29:47 +01:00
updateTaskbar ( m_jobList - > getJobStatus ( current ) , m_jobList - > data ( m_jobList - > index ( current . row ( ) , 0 , QModelIndex ( ) ) , Qt : : DecorationRole ) . value < QIcon > ( ) ) ;
2012-02-02 22:53:40 +01:00
}
else
{
logView - > setModel ( NULL ) ;
logView - > actions ( ) . first ( ) - > setEnabled ( false ) ;
progressBar - > setValue ( 0 ) ;
editDetails - > clear ( ) ;
updateButtons ( EncodeThread : : JobStatus_Undefined ) ;
2012-02-08 00:29:47 +01:00
updateTaskbar ( EncodeThread : : JobStatus_Undefined , QIcon ( ) ) ;
2012-02-02 22:53:40 +01:00
}
2012-01-31 00:13:32 +01:00
progressBar - > repaint ( ) ;
2012-01-28 23:24:41 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* Handle update of job info ( status , progress , details , etc )
*/
2012-01-28 23:24:41 +01:00
void MainWindow : : jobChangedData ( const QModelIndex & topLeft , const QModelIndex & bottomRight )
{
int selected = jobsView - > currentIndex ( ) . row ( ) ;
2012-02-03 15:28:00 +01:00
if ( topLeft . column ( ) < = 1 & & bottomRight . column ( ) > = 1 ) /*STATUS*/
2012-01-28 23:24:41 +01:00
{
for ( int i = topLeft . row ( ) ; i < = bottomRight . row ( ) ; i + + )
{
2012-02-04 01:12:21 +01:00
EncodeThread : : JobStatus status = m_jobList - > getJobStatus ( m_jobList - > index ( i , 0 , QModelIndex ( ) ) ) ;
2012-01-28 23:24:41 +01:00
if ( i = = selected )
{
qDebug ( " Current job changed status! " ) ;
2012-01-29 00:57:47 +01:00
updateButtons ( status ) ;
2012-02-08 00:29:47 +01:00
updateTaskbar ( status , m_jobList - > data ( m_jobList - > index ( i , 0 , QModelIndex ( ) ) , Qt : : DecorationRole ) . value < QIcon > ( ) ) ;
2012-01-29 00:57:47 +01:00
}
2012-02-04 01:12:21 +01:00
if ( ( status = = EncodeThread : : JobStatus_Completed ) | | ( status = = EncodeThread : : JobStatus_Failed ) )
2012-01-29 00:57:47 +01:00
{
2012-02-04 01:12:21 +01:00
if ( m_preferences . autoRunNextJob ) QTimer : : singleShot ( 0 , this , SLOT ( launchNextJob ( ) ) ) ;
if ( m_preferences . shutdownComputer ) QTimer : : singleShot ( 0 , this , SLOT ( shutdownComputer ( ) ) ) ;
2012-01-28 23:24:41 +01:00
}
}
}
2012-02-08 00:29:47 +01:00
if ( topLeft . column ( ) < = 2 & & bottomRight . column ( ) > = 2 ) /*PROGRESS*/
2012-01-28 23:24:41 +01:00
{
for ( int i = topLeft . row ( ) ; i < = bottomRight . row ( ) ; i + + )
{
if ( i = = selected )
{
progressBar - > setValue ( m_jobList - > getJobProgress ( m_jobList - > index ( i , 0 , QModelIndex ( ) ) ) ) ;
2012-02-08 00:29:47 +01:00
WinSevenTaskbar : : setTaskbarProgress ( this , progressBar - > value ( ) , progressBar - > maximum ( ) ) ;
2012-01-28 23:24:41 +01:00
break ;
}
}
}
2012-02-08 00:29:47 +01:00
if ( topLeft . column ( ) < = 3 & & bottomRight . column ( ) > = 3 ) /*DETAILS*/
2012-01-28 23:24:41 +01:00
{
for ( int i = topLeft . row ( ) ; i < = bottomRight . row ( ) ; i + + )
{
if ( i = = selected )
{
editDetails - > setText ( m_jobList - > data ( m_jobList - > index ( i , 3 , QModelIndex ( ) ) , Qt : : DisplayRole ) . toString ( ) ) ;
break ;
}
}
}
}
2012-02-10 18:42:16 +01:00
/*
* Handle new log file content
*/
2012-01-28 23:24:41 +01:00
void MainWindow : : jobLogExtended ( const QModelIndex & parent , int start , int end )
{
QTimer : : singleShot ( 0 , logView , SLOT ( scrollToBottom ( ) ) ) ;
}
2012-02-10 18:42:16 +01:00
/*
* About screen
*/
2012-01-28 23:24:41 +01:00
void MainWindow : : showAbout ( void )
{
QString text ;
2012-02-11 00:19:24 +01:00
text + = QString ( ) . sprintf ( " <nobr><tt>Simple x264 Launcher v%u.%02u.%u - use 64-Bit x264 with 32-Bit Avisynth<br> " , x264_version_major ( ) , x264_version_minor ( ) , x264_version_build ( ) ) ;
2012-01-29 00:57:47 +01:00
text + = QString ( ) . sprintf ( " Copyright (c) 2004-%04d LoRd_MuldeR <mulder2@gmx.de>. Some rights reserved.<br> " , qMax ( x264_version_date ( ) . year ( ) , QDate : : currentDate ( ) . year ( ) ) ) ;
text + = QString ( ) . sprintf ( " Built on %s at %s with %s for Win-%s.<br><br> " , x264_version_date ( ) . toString ( Qt : : ISODate ) . toLatin1 ( ) . constData ( ) , x264_version_time ( ) , x264_version_compiler ( ) , x264_version_arch ( ) ) ;
2012-01-28 23:24:41 +01:00
text + = QString ( ) . sprintf ( " This program is free software: you can redistribute it and/or modify<br> " ) ;
text + = QString ( ) . sprintf ( " it under the terms of the GNU General Public License <http://www.gnu.org/>.<br> " ) ;
text + = QString ( ) . sprintf ( " Note that this program is distributed with ABSOLUTELY NO WARRANTY.<br><br> " ) ;
2012-01-29 15:57:23 +01:00
text + = QString ( ) . sprintf ( " Please check the web-site at <a href= \" %s \" >%s</a> for updates !!!<br></tt></nobr> " , home_url , home_url ) ;
2012-01-29 00:57:47 +01:00
2012-02-08 00:29:47 +01:00
QMessageBox aboutBox ( this ) ;
aboutBox . setIconPixmap ( QIcon ( " :/images/movie.png " ) . pixmap ( 64 , 64 ) ) ;
aboutBox . setWindowTitle ( tr ( " About... " ) ) ;
aboutBox . setText ( text . replace ( " - " , " − " ) ) ;
aboutBox . addButton ( tr ( " About x264 " ) , QMessageBox : : NoRole ) ;
2012-02-13 16:44:50 +01:00
aboutBox . addButton ( tr ( " About AVS " ) , QMessageBox : : NoRole ) ;
2012-02-08 00:29:47 +01:00
aboutBox . addButton ( tr ( " About Qt " ) , QMessageBox : : NoRole ) ;
aboutBox . setEscapeButton ( aboutBox . addButton ( tr ( " Close " ) , QMessageBox : : NoRole ) ) ;
2012-02-02 17:20:42 +01:00
forever
{
2012-02-08 00:29:47 +01:00
MessageBeep ( MB_ICONINFORMATION ) ;
switch ( aboutBox . exec ( ) )
2012-02-02 17:20:42 +01:00
{
case 0 :
{
QString text2 ;
2012-02-02 22:53:40 +01:00
text2 + = tr ( " <nobr><tt>x264 - the best H.264/AVC encoder. Copyright (c) 2003-2012 x264 project.<br> " ) ;
2012-02-02 17:20:42 +01:00
text2 + = tr ( " Free software library for encoding video streams into the H.264/MPEG-4 AVC format.<br> " ) ;
text2 + = tr ( " Released under the terms of the GNU General Public License.<br><br> " ) ;
2012-02-13 16:44:50 +01:00
text2 + = tr ( " Please visit <a href= \" %1 \" >%1</a> for obtaining a commercial x264 license.<br> " ) . arg ( " http://x264licensing.com/ " ) ;
text2 + = tr ( " Read the <a href= \" %1 \" >user's manual</a> to get started and use the <a href= \" %2 \" >support forum</a> for help!<br></tt></nobr> " ) . arg ( " http://mewiki.project357.com/wiki/X264_Settings " , " http://forum.doom9.org/forumdisplay.php?f=77 " ) ;
2012-02-08 00:29:47 +01:00
QMessageBox x264Box ( this ) ;
x264Box . setIconPixmap ( QIcon ( " :/images/x264.png " ) . pixmap ( 48 , 48 ) ) ;
x264Box . setWindowTitle ( tr ( " About x264 " ) ) ;
x264Box . setText ( text2 . replace ( " - " , " − " ) ) ;
x264Box . setEscapeButton ( x264Box . addButton ( tr ( " Close " ) , QMessageBox : : NoRole ) ) ;
MessageBeep ( MB_ICONINFORMATION ) ;
x264Box . exec ( ) ;
2012-02-02 17:20:42 +01:00
}
break ;
case 1 :
2012-02-13 16:44:50 +01:00
{
QString text2 ;
2012-02-13 18:52:55 +01:00
text2 + = tr ( " <nobr><tt>Avisynth - powerful video processing scripting language.<br> " ) ;
2012-02-13 16:44:50 +01:00
text2 + = tr ( " Copyright (c) 2000 Ben Rudiak-Gould and all subsequent developers.<br> " ) ;
text2 + = tr ( " Released under the terms of the GNU General Public License.<br><br> " ) ;
text2 + = tr ( " Please visit the web-site <a href= \" %1 \" >%1</a> for more information.<br> " ) . arg ( " http://avisynth.org/ " ) ;
text2 + = tr ( " Read the <a href= \" %1 \" >guide</a> to get started and use the <a href= \" %2 \" >support forum</a> for help!<br></tt></nobr> " ) . arg ( " http://avisynth.org/mediawiki/First_script " , " http://forum.doom9.org/forumdisplay.php?f=33 " ) ;
QMessageBox x264Box ( this ) ;
x264Box . setIconPixmap ( QIcon ( " :/images/avisynth.png " ) . pixmap ( 48 , 67 ) ) ;
x264Box . setWindowTitle ( tr ( " About Avisynth " ) ) ;
x264Box . setText ( text2 . replace ( " - " , " − " ) ) ;
x264Box . setEscapeButton ( x264Box . addButton ( tr ( " Close " ) , QMessageBox : : NoRole ) ) ;
MessageBeep ( MB_ICONINFORMATION ) ;
x264Box . exec ( ) ;
}
break ;
case 2 :
2012-02-02 17:20:42 +01:00
QMessageBox : : aboutQt ( this ) ;
break ;
default :
return ;
}
}
2012-01-29 00:57:47 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* Open web - link
*/
2012-01-29 15:57:23 +01:00
void MainWindow : : showWebLink ( void )
{
2012-02-05 15:42:41 +01:00
if ( QObject : : sender ( ) = = actionWebMulder ) QDesktopServices : : openUrl ( QUrl ( home_url ) ) ;
if ( QObject : : sender ( ) = = actionWebX264 ) QDesktopServices : : openUrl ( QUrl ( " http://www.x264.com/ " ) ) ;
if ( QObject : : sender ( ) = = actionWebKomisar ) QDesktopServices : : openUrl ( QUrl ( " http://komisar.gin.by/ " ) ) ;
if ( QObject : : sender ( ) = = actionWebJarod ) QDesktopServices : : openUrl ( QUrl ( " http://www.x264.nl/ " ) ) ;
if ( QObject : : sender ( ) = = actionWebJEEB ) QDesktopServices : : openUrl ( QUrl ( " http://x264.fushizen.eu/ " ) ) ;
if ( QObject : : sender ( ) = = actionWebAvisynth32 ) QDesktopServices : : openUrl ( QUrl ( " http://sourceforge.net/projects/avisynth2/files/AviSynth%202.5/ " ) ) ;
if ( QObject : : sender ( ) = = actionWebAvisynth64 ) QDesktopServices : : openUrl ( QUrl ( " http://code.google.com/p/avisynth64/downloads/list " ) ) ;
if ( QObject : : sender ( ) = = actionWebWiki ) QDesktopServices : : openUrl ( QUrl ( " http://mewiki.project357.com/wiki/X264_Settings " ) ) ;
if ( QObject : : sender ( ) = = actionWebBluRay ) QDesktopServices : : openUrl ( QUrl ( " http://www.x264bluray.com/ " ) ) ;
2012-02-13 16:44:50 +01:00
if ( QObject : : sender ( ) = = actionWebAvsWiki ) QDesktopServices : : openUrl ( QUrl ( " http://avisynth.org/mediawiki/Main_Page#Usage " ) ) ;
2012-02-16 23:58:33 +01:00
if ( QObject : : sender ( ) = = actionWebSupport ) QDesktopServices : : openUrl ( QUrl ( " http://forum.doom9.org/showthread.php?t=144140 " ) ) ;
2012-02-05 15:42:41 +01:00
if ( QObject : : sender ( ) = = actionWebSecret ) QDesktopServices : : openUrl ( QUrl ( " http://www.youtube.com/watch_popup?v=AXIeHY-OYNI " ) ) ;
2012-01-29 15:57:23 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* Pereferences dialog
*/
2012-02-03 00:53:14 +01:00
void MainWindow : : showPreferences ( void )
{
2012-02-07 21:48:25 +01:00
PreferencesDialog * preferences = new PreferencesDialog ( this , & m_preferences , m_cpuFeatures - > x64 ) ;
2012-02-03 00:53:14 +01:00
preferences - > exec ( ) ;
X264_DELETE ( preferences ) ;
}
2012-02-10 18:42:16 +01:00
/*
* Launch next job , after running job has finished
*/
2012-01-29 00:57:47 +01:00
void MainWindow : : launchNextJob ( void )
{
2012-02-04 01:12:21 +01:00
qDebug ( " launchNextJob(void) " ) ;
2012-01-29 00:57:47 +01:00
const int rows = m_jobList - > rowCount ( QModelIndex ( ) ) ;
2012-02-04 01:12:21 +01:00
if ( countRunningJobs ( ) > = m_preferences . maxRunningJobCount )
2012-01-29 00:57:47 +01:00
{
2012-02-04 01:12:21 +01:00
qDebug ( " Still have too many jobs running, won't launch next one yet! " ) ;
2012-02-03 00:53:14 +01:00
return ;
2012-01-29 00:57:47 +01:00
}
2012-02-04 01:12:21 +01:00
int startIdx = jobsView - > currentIndex ( ) . isValid ( ) ? qBound ( 0 , jobsView - > currentIndex ( ) . row ( ) , rows - 1 ) : 0 ;
for ( int i = 0 ; i < rows ; i + + )
2012-01-29 00:57:47 +01:00
{
2012-02-04 01:12:21 +01:00
int currentIdx = ( i + startIdx ) % rows ;
EncodeThread : : JobStatus status = m_jobList - > getJobStatus ( m_jobList - > index ( currentIdx , 0 , QModelIndex ( ) ) ) ;
if ( status = = EncodeThread : : JobStatus_Enqueued )
2012-01-29 00:57:47 +01:00
{
2012-02-04 01:12:21 +01:00
if ( m_jobList - > startJob ( m_jobList - > index ( currentIdx , 0 , QModelIndex ( ) ) ) )
2012-02-03 00:53:14 +01:00
{
2012-02-04 01:12:21 +01:00
jobsView - > selectRow ( currentIdx ) ;
return ;
2012-02-03 00:53:14 +01:00
}
2012-02-03 15:28:00 +01:00
}
2012-02-04 01:12:21 +01:00
}
2012-02-03 15:28:00 +01:00
2012-02-04 01:12:21 +01:00
qWarning ( " No enqueued jobs left! " ) ;
}
2012-02-10 18:42:16 +01:00
/*
* Shut down the computer ( with countdown )
*/
2012-02-04 01:12:21 +01:00
void MainWindow : : shutdownComputer ( void )
{
qDebug ( " shutdownComputer(void) " ) ;
if ( countPendingJobs ( ) > 0 )
{
qDebug ( " Still have pending jobs, won't shutdown yet! " ) ;
return ;
}
const int iTimeout = 30 ;
const Qt : : WindowFlags flags = Qt : : WindowStaysOnTopHint | Qt : : CustomizeWindowHint | Qt : : WindowTitleHint | Qt : : MSWindowsFixedSizeDialogHint | Qt : : WindowSystemMenuHint ;
const QString text = QString ( " %1%2%1 " ) . arg ( QString ( ) . fill ( ' ' , 18 ) , tr ( " Warning: Computer will shutdown in %1 seconds... " ) ) ;
qWarning ( " Initiating shutdown sequence! " ) ;
QProgressDialog progressDialog ( text . arg ( iTimeout ) , tr ( " Cancel Shutdown " ) , 0 , iTimeout + 1 , this , flags ) ;
QPushButton * cancelButton = new QPushButton ( tr ( " Cancel Shutdown " ) , & progressDialog ) ;
cancelButton - > setIcon ( QIcon ( " :/buttons/power_on.png " ) ) ;
progressDialog . setModal ( true ) ;
progressDialog . setAutoClose ( false ) ;
progressDialog . setAutoReset ( false ) ;
progressDialog . setWindowIcon ( QIcon ( " :/buttons/power_off.png " ) ) ;
progressDialog . setWindowTitle ( windowTitle ( ) ) ;
progressDialog . setCancelButton ( cancelButton ) ;
progressDialog . show ( ) ;
QApplication : : processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
QApplication : : setOverrideCursor ( Qt : : WaitCursor ) ;
PlaySound ( MAKEINTRESOURCE ( IDR_WAVE1 ) , GetModuleHandle ( NULL ) , SND_RESOURCE | SND_SYNC ) ;
QApplication : : restoreOverrideCursor ( ) ;
QTimer timer ;
timer . setInterval ( 1000 ) ;
timer . start ( ) ;
QEventLoop eventLoop ( this ) ;
connect ( & timer , SIGNAL ( timeout ( ) ) , & eventLoop , SLOT ( quit ( ) ) ) ;
connect ( & progressDialog , SIGNAL ( canceled ( ) ) , & eventLoop , SLOT ( quit ( ) ) ) ;
for ( int i = 1 ; i < = iTimeout ; i + + )
{
eventLoop . exec ( ) ;
if ( progressDialog . wasCanceled ( ) )
2012-02-03 15:28:00 +01:00
{
2012-02-04 01:12:21 +01:00
progressDialog . close ( ) ;
return ;
2012-01-29 00:57:47 +01:00
}
2012-02-04 01:12:21 +01:00
progressDialog . setValue ( i + 1 ) ;
progressDialog . setLabelText ( text . arg ( iTimeout - i ) ) ;
if ( iTimeout - i = = 3 ) progressDialog . setCancelButton ( NULL ) ;
QApplication : : processEvents ( ) ;
PlaySound ( MAKEINTRESOURCE ( ( i < iTimeout ) ? IDR_WAVE2 : IDR_WAVE3 ) , GetModuleHandle ( NULL ) , SND_RESOURCE | SND_SYNC ) ;
}
qWarning ( " Shutting down !!! " ) ;
if ( x264_shutdown_computer ( " Simple x264 Launcher: All jobs completed, shutting down! " , 10 , true ) )
{
qApp - > closeAllWindows ( ) ;
2012-01-29 00:57:47 +01:00
}
2012-01-28 23:24:41 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* Main initialization function ( called only once ! )
*/
2012-01-29 21:31:09 +01:00
void MainWindow : : init ( void )
{
2012-02-05 02:49:08 +01:00
static const char * binFiles = " x264.exe:x264_x64.exe:avs2yuv.exe:avs2yuv_x64.exe " ;
2012-01-29 21:31:09 +01:00
QStringList binaries = QString : : fromLatin1 ( binFiles ) . split ( " : " , QString : : SkipEmptyParts ) ;
2012-01-31 00:13:32 +01:00
2012-02-07 21:48:25 +01:00
updateLabelPos ( ) ;
2012-01-31 00:13:32 +01:00
2012-02-21 00:37:31 +01:00
//Check for a running instance
bool firstInstance = false ;
if ( m_ipcThread - > initialize ( & firstInstance ) )
{
if ( ! firstInstance )
{
m_ipcThread - > notifyOtherInstance ( ) ;
close ( ) ; qApp - > exit ( - 1 ) ; return ;
}
m_ipcThread - > start ( ) ;
}
2012-01-30 17:50:19 +01:00
//Check all binaries
2012-01-29 21:31:09 +01:00
while ( ! binaries . isEmpty ( ) )
{
2012-02-02 18:55:55 +01:00
qApp - > processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
2012-01-29 21:31:09 +01:00
QString current = binaries . takeFirst ( ) ;
QFile * file = new QFile ( QString ( " %1/toolset/%2 " ) . arg ( m_appDir , current ) ) ;
if ( file - > open ( QIODevice : : ReadOnly ) )
{
2012-02-02 04:12:58 +01:00
bool binaryTypeOkay = false ;
DWORD binaryType ;
if ( GetBinaryType ( QWCHAR ( file - > fileName ( ) ) , & binaryType ) )
{
binaryTypeOkay = ( binaryType = = SCS_32BIT_BINARY | | binaryType = = SCS_64BIT_BINARY ) ;
}
if ( ! binaryTypeOkay )
{
2012-02-02 13:52:52 +01:00
QMessageBox : : critical ( this , tr ( " Invalid File! " ) , tr ( " <nobr>At least on required tool is not a valid Win32 or Win64 binary:<br>%1<br><br>Please re-install the program in order to fix the problem!</nobr> " ) . arg ( QDir : : toNativeSeparators ( QString ( " %1/toolset/%2 " ) . arg ( m_appDir , current ) ) ) . replace ( " - " , " − " ) ) ;
2012-02-02 04:12:58 +01:00
qFatal ( QString ( " Binary is invalid: %1/toolset/%2 " ) . arg ( m_appDir , current ) . toLatin1 ( ) . constData ( ) ) ;
close ( ) ; qApp - > exit ( - 1 ) ; return ;
}
2012-01-29 21:31:09 +01:00
m_toolsList < < file ;
}
else
{
X264_DELETE ( file ) ;
QMessageBox : : critical ( this , tr ( " File Not Found! " ) , tr ( " <nobr>At least on required tool could not be found:<br>%1<br><br>Please re-install the program in order to fix the problem!</nobr> " ) . arg ( QDir : : toNativeSeparators ( QString ( " %1/toolset/%2 " ) . arg ( m_appDir , current ) ) ) . replace ( " - " , " − " ) ) ;
qFatal ( QString ( " Binary not found: %1/toolset/%2 " ) . arg ( m_appDir , current ) . toLatin1 ( ) . constData ( ) ) ;
2012-01-30 17:50:19 +01:00
close ( ) ; qApp - > exit ( - 1 ) ; return ;
2012-01-29 21:31:09 +01:00
}
2012-02-10 01:58:45 +01:00
}
//Check for portable mode
if ( x264_portable ( ) )
{
bool ok = false ;
static const char * data = " Lorem ipsum dolor sit amet, consectetur adipiscing elit. " ;
2012-02-10 18:42:16 +01:00
QFile writeTest ( QString ( " %1/%2 " ) . arg ( x264_data_path ( ) , QUuid : : createUuid ( ) . toString ( ) ) ) ;
2012-02-10 01:58:45 +01:00
if ( writeTest . open ( QIODevice : : WriteOnly ) )
{
ok = ( writeTest . write ( data ) = = strlen ( data ) ) ;
writeTest . remove ( ) ;
}
if ( ! ok )
{
int val = QMessageBox : : warning ( this , tr ( " Write Test Failed " ) , tr ( " <nobr>The application was launched in portable mode, but the program path is <b>not</b> writable!</nobr> " ) , tr ( " Quit " ) , tr ( " Ignore " ) ) ;
if ( val ! = 1 ) { close ( ) ; qApp - > exit ( - 1 ) ; return ; }
}
2012-01-29 21:31:09 +01:00
}
2012-01-30 17:50:19 +01:00
//Pre-release popup
2012-02-02 22:53:40 +01:00
if ( x264_is_prerelease ( ) )
2012-01-30 17:50:19 +01:00
{
qsrand ( time ( NULL ) ) ; int rnd = qrand ( ) % 3 ;
int val = QMessageBox : : information ( this , tr ( " Pre-Release Version " ) , tr ( " Note: This is a pre-release version. Please do NOT use for production!<br>Click the button #%1 in order to continue...<br><br>(There will be no such message box in the final version of this application) " ) . arg ( QString : : number ( rnd + 1 ) ) , tr ( " (1) " ) , tr ( " (2) " ) , tr ( " (3) " ) , qrand ( ) % 3 ) ;
if ( rnd ! = val ) { close ( ) ; qApp - > exit ( - 1 ) ; return ; }
}
2012-02-07 21:48:25 +01:00
//Make sure this CPU can run x264 (requires MMX + MMXEXT/iSSE to run x264 with ASM enabled, additionally requires SSE1 for most x264 builds)
if ( ! ( m_cpuFeatures - > mmx & & m_cpuFeatures - > mmx2 ) )
{
QMessageBox : : critical ( this , tr ( " Unsupported CPU " ) , tr ( " <nobr>Sorry, but this machine is <b>not</b> physically capable of running x264 (with assembly).<br>Please get a CPU that supports at least the MMX and MMXEXT instruction sets!</nobr> " ) , tr ( " Quit " ) ) ;
qFatal ( " System does not support MMX and MMXEXT, x264 will not work !!! " ) ;
close ( ) ; qApp - > exit ( - 1 ) ; return ;
}
else if ( ! ( m_cpuFeatures - > mmx & & m_cpuFeatures - > sse ) )
{
qWarning ( " WARNING: System does not support SSE1, most x264 builds will not work !!! \n " ) ;
int val = QMessageBox : : warning ( this , tr ( " Unsupported CPU " ) , tr ( " <nobr>It appears that this machine does <b>not</b> support the SSE1 instruction set.<br>Thus most builds of x264 will <b>not</b> run on this computer at all.<br><br>Please get a CPU that supports the MMX and SSE1 instruction sets!</nobr> " ) , tr ( " Quit " ) , tr ( " Ignore " ) ) ;
if ( val ! = 1 ) { close ( ) ; qApp - > exit ( - 1 ) ; return ; }
}
2012-01-30 17:50:19 +01:00
//Check for Avisynth support
2012-02-13 20:49:16 +01:00
if ( ! qApp - > arguments ( ) . contains ( " --skip-avisynth-check " , Qt : : CaseInsensitive ) )
2012-01-30 17:50:19 +01:00
{
2012-02-13 20:49:16 +01:00
double avisynthVersion = 0.0 ;
QLibrary * avsLib = new QLibrary ( " avisynth.dll " ) ;
if ( avsLib - > load ( ) )
2012-02-13 18:52:55 +01:00
{
2012-02-13 20:49:16 +01:00
avisynthVersion = detectAvisynthVersion ( avsLib ) ;
if ( avisynthVersion < 0.0 )
{
int val = QMessageBox : : critical ( this , tr ( " Avisynth Error " ) , tr ( " <nobr>A critical error was encountered while checking your Avisynth version!</nobr> " ) . replace ( " - " , " − " ) , tr ( " Quit " ) , tr ( " Ignore " ) ) ;
if ( val ! = 1 ) { close ( ) ; qApp - > exit ( - 1 ) ; return ; }
}
}
if ( avisynthVersion < 2.5 )
{
int val = QMessageBox : : warning ( this , tr ( " Avisynth Missing " ) , tr ( " <nobr>It appears that Avisynth is <b>not</b> currently installed on your computer.<br>Therefore Avisynth (.avs) input will <b>not</b> be working at all!<br><br>Please download and install Avisynth:<br><a href= \" http://sourceforge.net/projects/avisynth2/files/AviSynth%202.5/ \" >http://sourceforge.net/projects/avisynth2/files/AviSynth 2.5/</a></nobr> " ) . replace ( " - " , " − " ) , tr ( " Quit " ) , tr ( " Ignore " ) ) ;
avsLib - > unload ( ) ; X264_DELETE ( avsLib ) ;
2012-02-13 18:52:55 +01:00
if ( val ! = 1 ) { close ( ) ; qApp - > exit ( - 1 ) ; return ; }
}
2012-01-30 17:50:19 +01:00
}
2012-02-02 02:13:02 +01:00
//Check for expiration
if ( x264_version_date ( ) . addMonths ( 6 ) < QDate : : currentDate ( ) )
{
QMessageBox msgBox ( this ) ;
2012-02-08 00:29:47 +01:00
msgBox . setIconPixmap ( QIcon ( " :/images/update.png " ) . pixmap ( 56 , 56 ) ) ;
2012-02-02 02:13:02 +01:00
msgBox . setWindowTitle ( tr ( " Update Notification " ) ) ;
msgBox . setWindowFlags ( Qt : : Window | Qt : : WindowTitleHint | Qt : : CustomizeWindowHint ) ;
2012-02-08 00:29:47 +01:00
msgBox . setText ( tr ( " <nobr><tt>Your version of 'Simple x264 Launcher' is more than 6 months old!<br><br>Please download the most recent version from the official web-site at:<br><a href= \" %1 \" >%1</a><br></tt></nobr> " ) . replace ( " - " , " − " ) . arg ( update_url ) ) ;
2012-02-02 02:13:02 +01:00
QPushButton * btn1 = msgBox . addButton ( tr ( " Discard " ) , QMessageBox : : NoRole ) ;
QPushButton * btn2 = msgBox . addButton ( tr ( " Discard " ) , QMessageBox : : AcceptRole ) ;
btn1 - > setEnabled ( false ) ;
btn2 - > setVisible ( false ) ;
QTimer : : singleShot ( 5000 , btn1 , SLOT ( hide ( ) ) ) ;
QTimer : : singleShot ( 5000 , btn2 , SLOT ( show ( ) ) ) ;
msgBox . exec ( ) ;
}
2012-02-05 04:41:42 +01:00
//Add files from command-line
bool bAddFile = false ;
QStringList files , args = qApp - > arguments ( ) ;
while ( ! args . isEmpty ( ) )
{
QString current = args . takeFirst ( ) ;
if ( ! bAddFile )
{
bAddFile = ( current . compare ( " --add " , Qt : : CaseInsensitive ) = = 0 ) ;
continue ;
}
2012-02-07 21:48:25 +01:00
if ( ( ! current . startsWith ( " -- " ) ) & & QFileInfo ( current ) . exists ( ) & & QFileInfo ( current ) . isFile ( ) )
2012-02-05 04:41:42 +01:00
{
files < < QFileInfo ( current ) . canonicalFilePath ( ) ;
}
}
if ( int totalFiles = files . count ( ) )
{
bool ok = true ; int n = 0 ;
while ( ( ! files . isEmpty ( ) ) & & ok )
{
QString currentFile = files . takeFirst ( ) ;
qDebug ( " Adding file: %s " , currentFile . toUtf8 ( ) . constData ( ) ) ;
2012-02-14 23:36:44 +01:00
addButtonPressed ( currentFile , QString ( ) , NULL , n + + , totalFiles , & ok ) ;
2012-02-05 04:41:42 +01:00
}
}
2012-01-29 21:31:09 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* Update the label position
*/
2012-02-07 21:48:25 +01:00
void MainWindow : : updateLabelPos ( void )
2012-01-31 00:13:32 +01:00
{
2012-02-07 21:48:25 +01:00
const QWidget * const viewPort = jobsView - > viewport ( ) ;
m_label - > setGeometry ( 0 , 0 , viewPort - > width ( ) , viewPort - > height ( ) ) ;
2012-01-31 00:13:32 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* Copy the complete log to the clipboard
*/
2012-01-31 00:13:32 +01:00
void MainWindow : : copyLogToClipboard ( bool checked )
{
qDebug ( " copyLogToClipboard " ) ;
if ( LogFileModel * log = dynamic_cast < LogFileModel * > ( logView - > model ( ) ) )
{
log - > copyToClipboard ( ) ;
MessageBeep ( MB_ICONINFORMATION ) ;
}
}
2012-02-10 18:42:16 +01:00
/*
* Process the dropped files
*/
void MainWindow : : handleDroppedFiles ( void )
{
qDebug ( " MainWindow::handleDroppedFiles " ) ;
if ( m_droppedFiles )
{
QStringList droppedFiles ( * m_droppedFiles ) ;
m_droppedFiles - > clear ( ) ;
int totalFiles = droppedFiles . count ( ) ;
bool ok = true ; int n = 0 ;
while ( ( ! droppedFiles . isEmpty ( ) ) & & ok )
{
QString currentFile = droppedFiles . takeFirst ( ) ;
qDebug ( " Adding file: %s " , currentFile . toUtf8 ( ) . constData ( ) ) ;
2012-02-14 23:36:44 +01:00
addButtonPressed ( currentFile , QString ( ) , NULL , n + + , totalFiles , & ok ) ;
2012-02-10 18:42:16 +01:00
}
}
qDebug ( " Leave from MainWindow::handleDroppedFiles! " ) ;
}
2012-02-21 00:37:31 +01:00
void MainWindow : : instanceCreated ( DWORD pid )
{
qDebug ( " Notification from other instance received! " ) ;
FLASHWINFO flashWinInfo ;
memset ( & flashWinInfo , 0 , sizeof ( FLASHWINFO ) ) ;
flashWinInfo . cbSize = sizeof ( FLASHWINFO ) ;
flashWinInfo . hwnd = this - > winId ( ) ;
flashWinInfo . dwFlags = FLASHW_ALL ;
flashWinInfo . dwTimeout = 125 ;
flashWinInfo . uCount = 5 ;
SwitchToThisWindow ( this - > winId ( ) , TRUE ) ;
SetForegroundWindow ( this - > winId ( ) ) ;
qApp - > processEvents ( ) ;
FlashWindowEx ( & flashWinInfo ) ;
}
2012-01-28 23:24:41 +01:00
///////////////////////////////////////////////////////////////////////////////
// Event functions
///////////////////////////////////////////////////////////////////////////////
2012-02-10 18:42:16 +01:00
/*
* Window shown event
*/
2012-01-29 21:31:09 +01:00
void MainWindow : : showEvent ( QShowEvent * e )
{
QMainWindow : : showEvent ( e ) ;
if ( m_firstShow )
{
m_firstShow = false ;
QTimer : : singleShot ( 0 , this , SLOT ( init ( ) ) ) ;
}
}
2012-02-10 18:42:16 +01:00
/*
* Window close event
*/
2012-01-28 23:24:41 +01:00
void MainWindow : : closeEvent ( QCloseEvent * e )
2012-01-29 15:57:23 +01:00
{
2012-02-03 15:28:00 +01:00
if ( countRunningJobs ( ) > 0 )
2012-01-29 15:57:23 +01:00
{
e - > ignore ( ) ;
2012-02-02 22:53:40 +01:00
QMessageBox : : warning ( this , tr ( " Jobs Are Running " ) , tr ( " Sorry, can not exit while there still are running jobs! " ) ) ;
2012-01-29 15:57:23 +01:00
return ;
}
2012-02-02 22:53:40 +01:00
2012-02-03 15:28:00 +01:00
if ( countPendingJobs ( ) > 0 )
2012-02-02 22:53:40 +01:00
{
int ret = QMessageBox : : question ( this , tr ( " Jobs Are Pending " ) , tr ( " Do you really want to quit and discard the pending jobs? " ) , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : No ) ;
if ( ret ! = QMessageBox : : Yes )
{
e - > ignore ( ) ;
return ;
}
}
while ( m_jobList - > rowCount ( QModelIndex ( ) ) > 0 )
{
qApp - > processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
if ( ! m_jobList - > deleteJob ( m_jobList - > index ( 0 , 0 , QModelIndex ( ) ) ) )
{
e - > ignore ( ) ;
QMessageBox : : warning ( this , tr ( " Failed To Exit " ) , tr ( " Sorry, at least one job could not be deleted! " ) ) ;
return ;
}
}
2012-01-29 15:57:23 +01:00
2012-02-02 22:53:40 +01:00
qApp - > processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
2012-01-29 15:57:23 +01:00
QMainWindow : : closeEvent ( e ) ;
}
2012-02-10 18:42:16 +01:00
/*
* Window resize event
*/
2012-01-31 00:13:32 +01:00
void MainWindow : : resizeEvent ( QResizeEvent * e )
{
QMainWindow : : resizeEvent ( e ) ;
2012-02-07 21:48:25 +01:00
updateLabelPos ( ) ;
2012-01-31 00:13:32 +01:00
}
2012-02-08 00:29:47 +01:00
/*
* Event filter
*/
2012-01-31 20:28:40 +01:00
bool MainWindow : : eventFilter ( QObject * o , QEvent * e )
{
if ( ( o = = labelBuildDate ) & & ( e - > type ( ) = = QEvent : : MouseButtonPress ) )
{
QTimer : : singleShot ( 0 , this , SLOT ( showAbout ( ) ) ) ;
return true ;
}
return false ;
}
2012-02-08 00:29:47 +01:00
/*
* Win32 message filter
*/
bool MainWindow : : winEvent ( MSG * message , long * result )
{
return WinSevenTaskbar : : handleWinEvent ( message , result ) ;
}
2012-02-02 13:52:52 +01:00
/*
* File dragged over window
*/
void MainWindow : : dragEnterEvent ( QDragEnterEvent * event )
{
QStringList formats = event - > mimeData ( ) - > formats ( ) ;
if ( formats . contains ( " application/x-qt-windows-mime;value= \" FileNameW \" " , Qt : : CaseInsensitive ) & & formats . contains ( " text/uri-list " , Qt : : CaseInsensitive ) )
{
event - > acceptProposedAction ( ) ;
}
}
/*
* File dropped onto window
*/
void MainWindow : : dropEvent ( QDropEvent * event )
{
QStringList droppedFiles ;
QList < QUrl > urls = event - > mimeData ( ) - > urls ( ) ;
while ( ! urls . isEmpty ( ) )
{
QUrl currentUrl = urls . takeFirst ( ) ;
QFileInfo file ( currentUrl . toLocalFile ( ) ) ;
if ( file . exists ( ) & & file . isFile ( ) )
{
2012-02-10 18:42:16 +01:00
qDebug ( " MainWindow::dropEvent: %s " , file . canonicalFilePath ( ) . toUtf8 ( ) . constData ( ) ) ;
2012-02-02 13:52:52 +01:00
droppedFiles < < file . canonicalFilePath ( ) ;
}
}
2012-02-10 18:42:16 +01:00
if ( droppedFiles . count ( ) > 0 )
2012-02-02 13:52:52 +01:00
{
2012-02-10 18:42:16 +01:00
if ( ! m_droppedFiles )
{
m_droppedFiles = new QStringList ( ) ;
}
m_droppedFiles - > append ( droppedFiles ) ;
m_droppedFiles - > sort ( ) ;
QTimer : : singleShot ( 0 , this , SLOT ( handleDroppedFiles ( ) ) ) ;
2012-02-02 13:52:52 +01:00
}
}
2012-01-29 15:57:23 +01:00
///////////////////////////////////////////////////////////////////////////////
// Private functions
///////////////////////////////////////////////////////////////////////////////
2012-02-10 18:42:16 +01:00
/*
* Jobs that are not completed ( or failed , or aborted ) yet
*/
2012-02-03 15:28:00 +01:00
unsigned int MainWindow : : countPendingJobs ( void )
2012-01-28 23:24:41 +01:00
{
2012-02-03 15:28:00 +01:00
unsigned int count = 0 ;
2012-01-28 23:24:41 +01:00
const int rows = m_jobList - > rowCount ( QModelIndex ( ) ) ;
2012-01-29 15:57:23 +01:00
2012-01-28 23:24:41 +01:00
for ( int i = 0 ; i < rows ; i + + )
{
EncodeThread : : JobStatus status = m_jobList - > getJobStatus ( m_jobList - > index ( i , 0 , QModelIndex ( ) ) ) ;
if ( status ! = EncodeThread : : JobStatus_Completed & & status ! = EncodeThread : : JobStatus_Aborted & & status ! = EncodeThread : : JobStatus_Failed )
{
2012-02-03 15:28:00 +01:00
count + + ;
2012-01-28 23:24:41 +01:00
}
}
2012-02-03 15:28:00 +01:00
return count ;
2012-01-29 15:57:23 +01:00
}
2012-01-28 23:24:41 +01:00
2012-02-10 18:42:16 +01:00
/*
* Jobs that are still active , i . e . not terminated or enqueued
*/
2012-02-03 15:28:00 +01:00
unsigned int MainWindow : : countRunningJobs ( void )
2012-02-02 22:53:40 +01:00
{
2012-02-03 15:28:00 +01:00
unsigned int count = 0 ;
2012-02-02 22:53:40 +01:00
const int rows = m_jobList - > rowCount ( QModelIndex ( ) ) ;
for ( int i = 0 ; i < rows ; i + + )
{
EncodeThread : : JobStatus status = m_jobList - > getJobStatus ( m_jobList - > index ( i , 0 , QModelIndex ( ) ) ) ;
if ( status ! = EncodeThread : : JobStatus_Completed & & status ! = EncodeThread : : JobStatus_Aborted & & status ! = EncodeThread : : JobStatus_Failed & & status ! = EncodeThread : : JobStatus_Enqueued )
{
2012-02-03 15:28:00 +01:00
count + + ;
2012-02-02 22:53:40 +01:00
}
}
2012-02-03 15:28:00 +01:00
return count ;
2012-02-02 22:53:40 +01:00
}
2012-02-10 18:42:16 +01:00
/*
* Update all buttons with respect to current job status
*/
2012-01-28 23:24:41 +01:00
void MainWindow : : updateButtons ( EncodeThread : : JobStatus status )
{
qDebug ( " MainWindow::updateButtons(void) " ) ;
buttonStartJob - > setEnabled ( status = = EncodeThread : : JobStatus_Enqueued ) ;
2012-02-02 02:13:02 +01:00
buttonAbortJob - > setEnabled ( status = = EncodeThread : : JobStatus_Indexing | | status = = EncodeThread : : JobStatus_Running | | status = = EncodeThread : : JobStatus_Running_Pass1 | | status = = EncodeThread : : JobStatus_Running_Pass2 | | status = = EncodeThread : : JobStatus_Paused ) ;
buttonPauseJob - > setEnabled ( status = = EncodeThread : : JobStatus_Indexing | | status = = EncodeThread : : JobStatus_Running | | status = = EncodeThread : : JobStatus_Paused | | status = = EncodeThread : : JobStatus_Running_Pass1 | | status = = EncodeThread : : JobStatus_Running_Pass2 ) ;
buttonPauseJob - > setChecked ( status = = EncodeThread : : JobStatus_Paused | | status = = EncodeThread : : JobStatus_Pausing ) ;
2012-01-31 00:13:32 +01:00
2012-02-02 22:53:40 +01:00
actionJob_Delete - > setEnabled ( status = = EncodeThread : : JobStatus_Completed | | status = = EncodeThread : : JobStatus_Aborted | | status = = EncodeThread : : JobStatus_Failed | | status = = EncodeThread : : JobStatus_Enqueued ) ;
2012-02-14 23:36:44 +01:00
actionJob_Restart - > setEnabled ( status = = EncodeThread : : JobStatus_Completed | | status = = EncodeThread : : JobStatus_Aborted | | status = = EncodeThread : : JobStatus_Failed | | status = = EncodeThread : : JobStatus_Enqueued ) ;
2012-02-02 22:53:40 +01:00
actionJob_Browse - > setEnabled ( status = = EncodeThread : : JobStatus_Completed ) ;
2012-01-31 00:13:32 +01:00
actionJob_Start - > setEnabled ( buttonStartJob - > isEnabled ( ) ) ;
actionJob_Abort - > setEnabled ( buttonAbortJob - > isEnabled ( ) ) ;
2012-02-02 02:13:02 +01:00
actionJob_Pause - > setEnabled ( buttonPauseJob - > isEnabled ( ) ) ;
actionJob_Pause - > setChecked ( buttonPauseJob - > isChecked ( ) ) ;
editDetails - > setEnabled ( status ! = EncodeThread : : JobStatus_Paused ) ;
2012-01-28 18:55:40 +01:00
}
2012-02-08 00:29:47 +01:00
2012-02-10 18:42:16 +01:00
/*
* Update the taskbar with current job status
*/
2012-02-08 00:29:47 +01:00
void MainWindow : : updateTaskbar ( EncodeThread : : JobStatus status , const QIcon & icon )
{
qDebug ( " MainWindow::updateTaskbar(void) " ) ;
switch ( status )
{
case EncodeThread : : JobStatus_Undefined :
WinSevenTaskbar : : setTaskbarState ( this , WinSevenTaskbar : : WinSevenTaskbarNoState ) ;
break ;
case EncodeThread : : JobStatus_Aborting :
case EncodeThread : : JobStatus_Starting :
case EncodeThread : : JobStatus_Pausing :
case EncodeThread : : JobStatus_Resuming :
WinSevenTaskbar : : setTaskbarState ( this , WinSevenTaskbar : : WinSevenTaskbarIndeterminateState ) ;
break ;
case EncodeThread : : JobStatus_Aborted :
case EncodeThread : : JobStatus_Failed :
WinSevenTaskbar : : setTaskbarState ( this , WinSevenTaskbar : : WinSevenTaskbarErrorState ) ;
break ;
case EncodeThread : : JobStatus_Paused :
WinSevenTaskbar : : setTaskbarState ( this , WinSevenTaskbar : : WinSevenTaskbarPausedState ) ;
break ;
default :
WinSevenTaskbar : : setTaskbarState ( this , WinSevenTaskbar : : WinSevenTaskbarNormalState ) ;
break ;
}
switch ( status )
{
case EncodeThread : : JobStatus_Aborting :
case EncodeThread : : JobStatus_Starting :
case EncodeThread : : JobStatus_Pausing :
case EncodeThread : : JobStatus_Resuming :
break ;
default :
WinSevenTaskbar : : setTaskbarProgress ( this , progressBar - > value ( ) , progressBar - > maximum ( ) ) ;
break ;
}
WinSevenTaskbar : : setOverlayIcon ( this , icon . isNull ( ) ? NULL : & icon ) ;
}
2012-02-13 18:52:55 +01:00
/*
* Detect Avisynth version
*/
double MainWindow : : detectAvisynthVersion ( QLibrary * avsLib )
{
double version_number = 0.0 ;
__try
{
avs_create_script_environment_func avs_create_script_environment_ptr = ( avs_create_script_environment_func ) avsLib - > resolve ( " avs_create_script_environment " ) ;
avs_invoke_func avs_invoke_ptr = ( avs_invoke_func ) avsLib - > resolve ( " avs_invoke " ) ;
avs_function_exists_func avs_function_exists_ptr = ( avs_function_exists_func ) avsLib - > resolve ( " avs_function_exists " ) ;
avs_delete_script_environment_func avs_delete_script_environment_ptr = ( avs_delete_script_environment_func ) avsLib - > resolve ( " avs_delete_script_environment " ) ;
if ( ( avs_create_script_environment_ptr ! = NULL ) & & ( avs_invoke_ptr ! = NULL ) & & ( avs_function_exists_ptr ! = NULL ) )
{
AVS_ScriptEnvironment * avs_env = avs_create_script_environment_ptr ( AVS_INTERFACE_25 ) ;
if ( avs_env ! = NULL )
{
if ( avs_function_exists_ptr ( avs_env , " VersionNumber " ) )
{
AVS_Value avs_version = avs_invoke_ptr ( avs_env , " VersionNumber " , avs_new_value_array ( NULL , 0 ) , NULL ) ;
if ( ! avs_is_error ( avs_version ) )
{
if ( avs_is_float ( avs_version ) )
{
2012-02-13 20:49:16 +01:00
qDebug ( " Avisynth version: v%.2f " , avs_as_float ( avs_version ) ) ;
2012-02-13 18:52:55 +01:00
version_number = avs_as_float ( avs_version ) ;
}
}
}
if ( avs_delete_script_environment_ptr ! = NULL )
{
avs_delete_script_environment_ptr ( avs_env ) ;
avs_env = NULL ;
}
}
}
else
{
qWarning ( " It seems the Avisynth DLL is missing required API functions! " ) ;
}
}
__except ( 1 )
{
qWarning ( " Exception in Avisynth initialization code! " ) ;
version_number = - 1.0 ;
}
return version_number ;
}