diff options
Diffstat (limited to 'src/widgets/qsplashscreen.cpp')
-rw-r--r-- | src/widgets/qsplashscreen.cpp | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/src/widgets/qsplashscreen.cpp b/src/widgets/qsplashscreen.cpp new file mode 100644 index 000000000..ab528a7a3 --- /dev/null +++ b/src/widgets/qsplashscreen.cpp @@ -0,0 +1,271 @@ +/**************************************************************************** +** +** Definition of TQSplashScreen class +** +** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the widgets module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "qsplashscreen.h" + +#ifndef QT_NO_SPLASHSCREEN + +#include "qapplication.h" +#include "qpainter.h" +#include "qpixmap.h" + +class TQSplashScreenPrivate +{ +public: + TQPixmap pixmap; + TQString currStatus; + TQColor currColor; + int currAlign; +}; + +/*! + \class TQSplashScreen qsplashscreen.h + \brief The TQSplashScreen widget provides a splash screen that can + be shown during application startup. + + \ingroup misc + \mainclass + + A splash screen is a widget that is usually displayed when an + application is being started. Splash screens are often used for + applications that have long start up times (e.g. database or + networking applications that take time to establish connections) to + provide the user with feedback that the application is loading. + + The splash screen appears centered on the screen. It may be useful to add + the \c WStyle_StaysOnTop if you desire to keep above all the windows in the + GUI. + + Some X11 window managers do not support the "stays on top" flag. A + solution is to set up a timer that periodically calls raise() on + the splash screen to simulate the "stays on top" effect. + + The most common usage is to show a splash screen before the main + widget is displayed on the screen. This is illustrated in the + following code snippet. + + \code + int main( int argc, char **argv ) + { + TQApplication app( argc, argv ); + TQPixmap pixmap( "splash.png" ); + TQSplashScreen *splash = new TQSplashScreen( pixmap ); + splash->show(); + TQMainWindow *mainWin = new TQMainWindow; + ... + app.setMainWidget( mainWin ); + mainWin->show(); + splash->finish( mainWin ); + delete splash; + return app.exec(); + } + \endcode + + It is sometimes useful to update the splash screen with messages, + for example, announcing connections established or modules loaded + as the application starts up. TQSplashScreen supports this with the + message() function. If you wish to do your own drawing you can + get a pointer to the pixmap used in the splash screen with pixmap(). + Alternatively, you can subclass TQSplashScreen and reimplement + drawContents(). + + The user can hide the splash screen by clicking on it with the + mouse. Since the splash screen is typically displayed before the + event loop has started running, it is necessary to periodically + call TQApplication::processEvents() to receive the mouse clicks. + + \code + TQPixmap pixmap( "splash.png" ); + TQSplashScreen *splash = new TQSplashScreen( pixmap ); + splash->show(); + ... // Loading some items + splash->message( "Loaded modules" ); + qApp->processEvents(); + ... // Establishing connections + splash->message( "Established connections" ); + qApp->processEvents(); + \endcode + +*/ + +/*! + Construct a splash screen that will display the \a pixmap. + + There should be no need to set the widget flags, \a f, except + perhaps \c WDestructiveClose or \c WStyle_StaysOnTop. +*/ +TQSplashScreen::TQSplashScreen( const TQPixmap &pixmap, WFlags f ) + : TQWidget( 0, 0, WStyle_Customize | WStyle_Splash | f ) +{ + d = new TQSplashScreenPrivate(); + d->pixmap = pixmap; + setPixmap( d->pixmap ); // Does an implicit repaint +} + +/*! + Destructor. +*/ +TQSplashScreen::~TQSplashScreen() +{ + delete d; +} + +/*! + \reimp +*/ +void TQSplashScreen::mousePressEvent( TQMouseEvent * ) +{ + hide(); +} + +/*! + This overrides TQWidget::repaint(). It differs from the standard + repaint function in that it also calls TQApplication::flush() to + ensure the updates are displayed, even when there is no event loop + present. +*/ +void TQSplashScreen::repaint() +{ + drawContents(); + TQWidget::repaint(); + TQApplication::flush(); +} + +/*! + \fn TQSplashScreen::messageChanged( const TQString &message ) + + This signal is emitted when the message on the splash screen + changes. \a message is the new message and is a null-string + when the message has been removed. + + \sa message(), clear() +*/ + + + +/*! + Draws the \a message text onto the splash screen with color \a + color and aligns the text according to the flags in \a alignment. + + \sa TQt::AlignmentFlags clear() +*/ +void TQSplashScreen::message( const TQString &message, int alignment, + const TQColor &color ) +{ + d->currStatus = message; + d->currAlign = alignment; + d->currColor = color; + emit messageChanged( d->currStatus ); + repaint(); +} + +/*! + Removes the message being displayed on the splash screen + + \sa message() + */ +void TQSplashScreen::clear() +{ + d->currStatus = TQString::null; + emit messageChanged( d->currStatus ); + repaint(); +} + +/*! + Makes the splash screen wait until the widget \a mainWin is displayed + before calling close() on itself. +*/ +void TQSplashScreen::finish( TQWidget *mainWin ) +{ + if ( mainWin ) { +#if defined(Q_WS_X11) + extern void qt_wait_for_window_manager( TQWidget *mainWin ); + qt_wait_for_window_manager( mainWin ); +#endif + } + close(); +} + +/*! + Sets the pixmap that will be used as the splash screen's image to + \a pixmap. +*/ +void TQSplashScreen::setPixmap( const TQPixmap &pixmap ) +{ + d->pixmap = pixmap; + TQRect r(0, 0, d->pixmap.size().width(), d->pixmap.size().height()); + resize( d->pixmap.size() ); + move( TQApplication::desktop()->screenGeometry().center() - r.center() ); + repaint(); +} + +/*! + Returns the pixmap that is used in the splash screen. The image + does not have any of the text drawn by message() calls. +*/ +TQPixmap* TQSplashScreen::pixmap() const +{ + return &( d->pixmap ); +} + +/*! + \internal +*/ +void TQSplashScreen::drawContents() +{ + TQPixmap textPix = d->pixmap; + TQPainter painter( &textPix, this ); + drawContents( &painter ); + setErasePixmap( textPix ); +} + +/*! + Draw the contents of the splash screen using painter \a painter. + The default implementation draws the message passed by message(). + Reimplement this function if you want to do your own drawing on + the splash screen. +*/ +void TQSplashScreen::drawContents( TQPainter *painter ) +{ + painter->setPen( d->currColor ); + TQRect r = rect(); + r.setRect( r.x() + 5, r.y() + 5, r.width() - 10, r.height() - 10 ); + painter->drawText( r, d->currAlign, d->currStatus ); +} + +#endif //QT_NO_SPLASHSCREEN |