2010-11-06 23:04:47 +01:00
///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
2013-02-08 23:50:51 +01:00
// Copyright (C) 2004-2013 LoRd_MuldeR <MuldeR2@GMX.de>
2010-11-06 23:04:47 +01:00
//
// 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_SplashScreen.h"
# include "Global.h"
# include <QThread>
# include <QMovie>
# include <QKeyEvent>
2012-02-23 17:00:22 +01:00
# include <QTimer>
2010-11-06 23:04:47 +01:00
2011-11-07 17:13:41 +01:00
# include "WinSevenTaskbar.h"
2012-04-10 01:25:34 +02:00
# define FADE_DELAY 16
# define OPACITY_DELTA 0.02
2012-04-26 13:43:40 +02:00
/* It can happen that the QThread has just terminated and already emitted the 'terminated' signal, but did NOT change the 'isRunning' flag to FALSE yet. */
2013-10-20 23:36:53 +02:00
/* For this reason the macro will first check the 'isRunning' flag. If (and only if) the flag still returns TRUE, we will call the wait() on the thread. */
# define THREAD_RUNNING(THRD) (((THRD)->isRunning()) ? (!((THRD)->wait(1))) : false)
2010-11-06 23:04:47 +01:00
2013-03-29 03:07:15 +01:00
# define SET_TASKBAR_STATE(FLAG) do \
{ \
if ( FLAG ) \
{ \
if ( ! bTaskBar ) bTaskBar = WinSevenTaskbar : : setTaskbarState ( splashScreen , WinSevenTaskbar : : WinSevenTaskbarIndeterminateState ) ; \
} \
else \
{ \
if ( bTaskBar ) bTaskBar = ( ! WinSevenTaskbar : : setTaskbarState ( splashScreen , WinSevenTaskbar : : WinSevenTaskbarNoState ) ) ; \
} \
} \
while ( 0 )
2012-04-26 13:43:40 +02:00
2013-10-20 23:36:53 +02:00
# define ASYNC_WAIT(LOOP, DELAY) do \
{ \
QTimer : : singleShot ( ( DELAY ) , ( LOOP ) , SLOT ( quit ( ) ) ) ; \
( LOOP ) - > exec ( QEventLoop : : ExcludeUserInputEvents ) ; \
} \
while ( 0 )
2010-11-06 23:04:47 +01:00
////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////
SplashScreen : : SplashScreen ( QWidget * parent )
2012-03-23 01:29:50 +01:00
:
QFrame ( parent , Qt : : CustomizeWindowHint | Qt : : WindowStaysOnTopHint )
2010-11-06 23:04:47 +01:00
{
//Init the dialog, from the .ui file
setupUi ( this ) ;
//Start animation
m_working = new QMovie ( " :/images/Loading.gif " ) ;
labelLoading - > setMovie ( m_working ) ;
m_working - > start ( ) ;
//Set wait cursor
setCursor ( Qt : : WaitCursor ) ;
//Prevent close
m_canClose = false ;
}
////////////////////////////////////////////////////////////
// Destructor
////////////////////////////////////////////////////////////
SplashScreen : : ~ SplashScreen ( void )
{
if ( m_working )
{
m_working - > stop ( ) ;
delete m_working ;
m_working = NULL ;
}
}
////////////////////////////////////////////////////////////
// PUBLIC FUNCTIONS
////////////////////////////////////////////////////////////
void SplashScreen : : showSplash ( QThread * thread )
{
2012-04-10 01:25:34 +02:00
const int opacitySteps = qRound ( 1.0 / OPACITY_DELTA ) ;
2013-03-29 03:07:15 +01:00
bool bTaskBar = false ;
2013-10-20 23:36:53 +02:00
unsigned int deadlockCounter = 0 ;
SplashScreen * splashScreen = new SplashScreen ( ) ;
2010-11-06 23:04:47 +01:00
//Show splash
splashScreen - > m_canClose = false ;
2013-10-20 23:36:53 +02:00
splashScreen - > setWindowOpacity ( OPACITY_DELTA ) ;
2012-04-11 00:44:40 +02:00
splashScreen - > setFixedSize ( splashScreen - > size ( ) ) ;
2010-11-06 23:04:47 +01:00
splashScreen - > show ( ) ;
2011-11-11 18:08:22 +01:00
//Wait for window to show
2012-04-10 01:25:34 +02:00
QApplication : : processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
splashScreen - > repaint ( ) ;
QApplication : : processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
2010-11-06 23:04:47 +01:00
2011-11-11 18:08:22 +01:00
//Setup the event loop
2011-11-07 17:13:41 +01:00
QEventLoop * loop = new QEventLoop ( splashScreen ) ;
connect ( thread , SIGNAL ( terminated ( ) ) , loop , SLOT ( quit ( ) ) , Qt : : QueuedConnection ) ;
connect ( thread , SIGNAL ( finished ( ) ) , loop , SLOT ( quit ( ) ) , Qt : : QueuedConnection ) ;
2012-02-23 21:21:02 +01:00
//Create timer
QTimer * timer = new QTimer ( ) ;
connect ( timer , SIGNAL ( timeout ( ) ) , loop , SLOT ( quit ( ) ) ) ;
2013-10-20 23:36:53 +02:00
//Start the thread
2010-11-06 23:04:47 +01:00
thread - > start ( ) ;
2011-11-11 18:08:22 +01:00
//Init taskbar
2013-03-29 03:07:15 +01:00
SET_TASKBAR_STATE ( true ) ;
2011-11-07 17:13:41 +01:00
2010-11-06 23:04:47 +01:00
//Fade in
2012-04-10 01:25:34 +02:00
for ( int i = 1 ; i < = opacitySteps ; i + + )
2010-11-06 23:04:47 +01:00
{
2013-10-20 23:36:53 +02:00
const double opacity = ( i < opacitySteps ) ? ( OPACITY_DELTA * static_cast < double > ( i ) ) : 1.0 ;
2011-11-11 18:08:22 +01:00
splashScreen - > setWindowOpacity ( opacity ) ;
2013-04-11 00:01:33 +02:00
splashScreen - > update ( ) ;
2013-10-20 23:36:53 +02:00
ASYNC_WAIT ( loop , FADE_DELAY ) ;
2013-03-29 03:07:15 +01:00
SET_TASKBAR_STATE ( true ) ;
2010-11-06 23:04:47 +01:00
}
2012-02-23 21:21:02 +01:00
//Start the timer
2012-03-06 22:29:55 +01:00
timer - > start ( 30720 ) ;
2012-02-23 21:21:02 +01:00
2012-03-22 22:26:54 +01:00
//Loop while thread is still running
2013-10-20 23:36:53 +02:00
while ( THREAD_RUNNING ( thread ) )
2012-02-23 17:00:22 +01:00
{
2013-10-21 15:00:55 +02:00
if ( ( + + deadlockCounter ) > 60 )
2012-02-23 21:21:02 +01:00
{
2013-10-20 23:36:53 +02:00
qFatal ( " Deadlock in initialization thread detected! " ) ;
2012-02-23 21:21:02 +01:00
}
2013-10-21 15:00:55 +02:00
ASYNC_WAIT ( loop , 5000 ) ;
2012-02-23 17:00:22 +01:00
}
2012-03-22 22:26:54 +01:00
2012-02-23 21:21:02 +01:00
//Stop the timer
timer - > stop ( ) ;
2010-11-06 23:04:47 +01:00
//Fade out
2012-04-10 01:25:34 +02:00
for ( int i = opacitySteps ; i > = 0 ; i - - )
2010-11-06 23:04:47 +01:00
{
2013-10-20 23:36:53 +02:00
const double opacity = OPACITY_DELTA * static_cast < double > ( i ) ;
2011-11-11 18:08:22 +01:00
splashScreen - > setWindowOpacity ( opacity ) ;
2013-04-11 00:01:33 +02:00
splashScreen - > update ( ) ;
2013-10-20 23:36:53 +02:00
ASYNC_WAIT ( loop , FADE_DELAY ) ;
2010-11-06 23:04:47 +01:00
}
2011-11-07 17:13:41 +01:00
//Restore taskbar
2013-03-29 03:07:15 +01:00
SET_TASKBAR_STATE ( false ) ;
2011-11-07 17:13:41 +01:00
2010-11-06 23:04:47 +01:00
//Hide splash
splashScreen - > m_canClose = true ;
splashScreen - > close ( ) ;
2011-11-11 18:08:22 +01:00
//Free
2011-11-07 17:13:41 +01:00
LAMEXP_DELETE ( loop ) ;
2012-02-23 21:21:02 +01:00
LAMEXP_DELETE ( timer ) ;
2010-11-06 23:04:47 +01:00
LAMEXP_DELETE ( splashScreen ) ;
}
////////////////////////////////////////////////////////////
// EVENTS
////////////////////////////////////////////////////////////
void SplashScreen : : keyPressEvent ( QKeyEvent * event )
{
event - > ignore ( ) ;
}
void SplashScreen : : keyReleaseEvent ( QKeyEvent * event )
{
event - > ignore ( ) ;
}
void SplashScreen : : closeEvent ( QCloseEvent * event )
{
2011-12-29 14:42:20 +01:00
if ( ! m_canClose ) event - > ignore ( ) ;
2010-11-06 23:04:47 +01:00
}
2011-11-07 17:13:41 +01:00
bool SplashScreen : : winEvent ( MSG * message , long * result )
{
return WinSevenTaskbar : : handleWinEvent ( message , result ) ;
}