2010-11-17 19:35:50 +01:00
///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
// Copyright (C) 2004-2010 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 "Dialog_Processing.h"
# include "Global.h"
2010-11-19 21:11:54 +01:00
# include "Model_FileList.h"
2010-11-18 00:32:46 +01:00
# include "Model_Progress.h"
# include "Thread_Process.h"
2010-11-17 19:35:50 +01:00
# include <QApplication>
# include <QRect>
# include <QDesktopWidget>
# include <QMovie>
2010-11-18 00:32:46 +01:00
# include <QMessageBox>
# include <QTimer>
# include <QCloseEvent>
# include <QDesktopServices>
# include <QUrl>
# include <Windows.h>
////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////
2010-11-17 19:35:50 +01:00
2010-11-19 21:11:54 +01:00
ProcessingDialog : : ProcessingDialog ( FileListModel * fileListModel )
2010-11-17 19:35:50 +01:00
{
//Init the dialog, from the .ui file
setupUi ( this ) ;
setWindowFlags ( windowFlags ( ) ^ Qt : : WindowContextHelpButtonHint ) ;
2010-11-18 22:37:35 +01:00
//Setup version info
2010-11-17 19:35:50 +01:00
label_versionInfo - > setText ( QString ( ) . sprintf ( " v%d.%02d %s (Build %d) " , lamexp_version_major ( ) , lamexp_version_minor ( ) , lamexp_version_release ( ) , lamexp_version_build ( ) ) ) ;
2010-11-18 00:32:46 +01:00
label_versionInfo - > installEventFilter ( this ) ;
2010-11-17 19:35:50 +01:00
2010-11-18 22:37:35 +01:00
//Register meta type
qRegisterMetaType < QUuid > ( " QUuid " ) ;
2010-11-17 19:35:50 +01:00
//Center window in screen
QRect desktopRect = QApplication : : desktop ( ) - > screenGeometry ( ) ;
QRect thisRect = this - > geometry ( ) ;
move ( ( desktopRect . width ( ) - thisRect . width ( ) ) / 2 , ( desktopRect . height ( ) - thisRect . height ( ) ) / 2 ) ;
setMinimumSize ( thisRect . width ( ) , thisRect . height ( ) ) ;
2010-11-18 00:32:46 +01:00
//Enable buttons
connect ( button_AbortProcess , SIGNAL ( clicked ( ) ) , this , SLOT ( abortEncoding ( ) ) ) ;
2010-11-17 19:35:50 +01:00
//Init progress indicator
m_progressIndicator = new QMovie ( " :/images/Working.gif " ) ;
label_headerWorking - > setMovie ( m_progressIndicator ) ;
2010-11-18 00:32:46 +01:00
progressBar - > setValue ( 0 ) ;
//Init progress model
m_progressModel = new ProgressModel ( ) ;
view_log - > setModel ( m_progressModel ) ;
view_log - > verticalHeader ( ) - > setResizeMode ( QHeaderView : : ResizeToContents ) ;
view_log - > verticalHeader ( ) - > hide ( ) ;
view_log - > horizontalHeader ( ) - > setResizeMode ( QHeaderView : : ResizeToContents ) ;
view_log - > horizontalHeader ( ) - > setResizeMode ( 0 , QHeaderView : : Stretch ) ;
2010-11-19 21:11:54 +01:00
//Enque jobs
if ( fileListModel )
{
for ( int i = 0 ; i < fileListModel - > rowCount ( ) ; i + + )
{
m_pendingJobs . append ( fileListModel - > getFile ( fileListModel - > index ( i , 0 ) ) ) ;
}
}
//Init other vars
m_runningThreads = 0 ;
m_userAborted = false ;
2010-11-17 19:35:50 +01:00
}
2010-11-18 00:32:46 +01:00
////////////////////////////////////////////////////////////
// Destructor
////////////////////////////////////////////////////////////
2010-11-17 19:35:50 +01:00
ProcessingDialog : : ~ ProcessingDialog ( void )
{
2010-11-18 00:32:46 +01:00
view_log - > setModel ( NULL ) ;
2010-11-17 19:35:50 +01:00
if ( m_progressIndicator ) m_progressIndicator - > stop ( ) ;
LAMEXP_DELETE ( m_progressIndicator ) ;
2010-11-18 00:32:46 +01:00
LAMEXP_DELETE ( m_progressModel ) ;
2010-11-19 21:11:54 +01:00
while ( ! m_threadList . isEmpty ( ) )
{
delete m_threadList . takeFirst ( ) ;
}
2010-11-18 00:32:46 +01:00
}
////////////////////////////////////////////////////////////
// EVENTS
////////////////////////////////////////////////////////////
void ProcessingDialog : : showEvent ( QShowEvent * event )
{
setCloseButtonEnabled ( false ) ;
button_closeDialog - > setEnabled ( false ) ;
button_AbortProcess - > setEnabled ( false ) ;
QTimer : : singleShot ( 1000 , this , SLOT ( initEncoding ( ) ) ) ;
}
void ProcessingDialog : : closeEvent ( QCloseEvent * event )
{
2010-11-18 22:37:35 +01:00
if ( ! button_closeDialog - > isEnabled ( ) ) event - > ignore ( ) ;
2010-11-18 00:32:46 +01:00
}
bool ProcessingDialog : : eventFilter ( QObject * obj , QEvent * event )
{
static QColor defaultColor = QColor ( ) ;
if ( obj = = label_versionInfo )
{
if ( event - > type ( ) = = QEvent : : Enter )
{
QPalette palette = label_versionInfo - > palette ( ) ;
defaultColor = palette . color ( QPalette : : Normal , QPalette : : WindowText ) ;
palette . setColor ( QPalette : : Normal , QPalette : : WindowText , Qt : : red ) ;
label_versionInfo - > setPalette ( palette ) ;
}
else if ( event - > type ( ) = = QEvent : : Leave )
{
QPalette palette = label_versionInfo - > palette ( ) ;
palette . setColor ( QPalette : : Normal , QPalette : : WindowText , defaultColor ) ;
label_versionInfo - > setPalette ( palette ) ;
}
else if ( event - > type ( ) = = QEvent : : MouseButtonPress )
{
QUrl url ( " http://mulder.dummwiedeutsch.de/ " ) ;
QDesktopServices : : openUrl ( url ) ;
}
}
return false ;
}
////////////////////////////////////////////////////////////
// SLOTS
////////////////////////////////////////////////////////////
void ProcessingDialog : : initEncoding ( void )
{
2010-11-19 21:11:54 +01:00
m_runningThreads = 0 ;
m_userAborted = false ;
2010-11-18 00:32:46 +01:00
label_progress - > setText ( " Encoding files, please wait... " ) ;
m_progressIndicator - > start ( ) ;
button_closeDialog - > setEnabled ( false ) ;
button_AbortProcess - > setEnabled ( true ) ;
2010-11-19 21:11:54 +01:00
progressBar - > setRange ( 0 , m_pendingJobs . count ( ) ) ;
startNextJob ( ) ;
startNextJob ( ) ;
2010-11-18 00:32:46 +01:00
}
void ProcessingDialog : : abortEncoding ( void )
{
2010-11-19 21:11:54 +01:00
m_userAborted = true ;
2010-11-18 00:32:46 +01:00
button_AbortProcess - > setEnabled ( false ) ;
2010-11-19 21:11:54 +01:00
for ( int i = 0 ; i < m_threadList . count ( ) ; i + + )
2010-11-18 00:32:46 +01:00
{
2010-11-19 21:11:54 +01:00
m_threadList . at ( i ) - > abort ( ) ;
2010-11-18 00:32:46 +01:00
}
}
void ProcessingDialog : : doneEncoding ( void )
{
2010-11-19 21:11:54 +01:00
m_runningThreads - - ;
2010-11-18 00:32:46 +01:00
progressBar - > setValue ( progressBar - > value ( ) + 1 ) ;
2010-11-19 21:11:54 +01:00
label_progress - > setText ( QString ( " %1 files out of %2 completed, please wait... " ) . arg ( QString : : number ( progressBar - > value ( ) ) , QString : : number ( progressBar - > maximum ( ) ) ) ) ;
2010-11-18 00:32:46 +01:00
2010-11-19 21:11:54 +01:00
if ( ! m_pendingJobs . isEmpty ( ) & & ! m_userAborted )
2010-11-18 00:32:46 +01:00
{
2010-11-19 21:11:54 +01:00
startNextJob ( ) ;
qDebug ( " Running jobs: %u " , m_runningThreads ) ;
2010-11-18 00:32:46 +01:00
return ;
}
2010-11-19 21:11:54 +01:00
if ( m_runningThreads > 0 )
{
qDebug ( " Running jobs: %u " , m_runningThreads ) ;
return ;
}
qDebug ( " Running jobs: %u " , m_runningThreads ) ;
label_progress - > setText ( m_userAborted ? " Process aborted by user. " : " Alle files completed. " ) ;
2010-11-18 00:32:46 +01:00
m_progressIndicator - > stop ( ) ;
setCloseButtonEnabled ( true ) ;
button_closeDialog - > setEnabled ( true ) ;
button_AbortProcess - > setEnabled ( false ) ;
progressBar - > setValue ( 100 ) ;
}
////////////////////////////////////////////////////////////
// Private Functions
////////////////////////////////////////////////////////////
2010-11-19 21:11:54 +01:00
void ProcessingDialog : : startNextJob ( void )
{
if ( m_pendingJobs . isEmpty ( ) )
{
return ;
}
ProcessThread * thread = new ProcessThread ( m_pendingJobs . takeFirst ( ) ) ;
m_threadList . append ( thread ) ;
connect ( thread , SIGNAL ( finished ( ) ) , this , SLOT ( doneEncoding ( ) ) , Qt : : QueuedConnection ) ;
connect ( thread , SIGNAL ( processStateInitialized ( QUuid , QString , QString , int ) ) , m_progressModel , SLOT ( addJob ( QUuid , QString , QString , int ) ) , Qt : : QueuedConnection ) ;
connect ( thread , SIGNAL ( processStateChanged ( QUuid , QString , int ) ) , m_progressModel , SLOT ( updateJob ( QUuid , QString , int ) ) , Qt : : QueuedConnection ) ;
m_runningThreads + + ;
thread - > start ( ) ;
}
2010-11-18 00:32:46 +01:00
void ProcessingDialog : : setCloseButtonEnabled ( bool enabled )
{
HMENU hMenu = GetSystemMenu ( ( HWND ) winId ( ) , FALSE ) ;
EnableMenuItem ( hMenu , SC_CLOSE , MF_BYCOMMAND | ( enabled ? MF_ENABLED : MF_GRAYED ) ) ;
2010-11-17 19:35:50 +01:00
}