summaryrefslogtreecommitdiffstats
path: root/src/gui/widgets/qsplashscreen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets/qsplashscreen.cpp')
-rw-r--r--src/gui/widgets/qsplashscreen.cpp350
1 files changed, 350 insertions, 0 deletions
diff --git a/src/gui/widgets/qsplashscreen.cpp b/src/gui/widgets/qsplashscreen.cpp
new file mode 100644
index 0000000..4240096
--- /dev/null
+++ b/src/gui/widgets/qsplashscreen.cpp
@@ -0,0 +1,350 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsplashscreen.h"
+
+#ifndef QT_NO_SPLASHSCREEN
+
+#include "qapplication.h"
+#include "qdesktopwidget.h"
+#include "qpainter.h"
+#include "qpixmap.h"
+#include "qtextdocument.h"
+#include "qtextcursor.h"
+#include <QtCore/qdebug.h>
+#include <private/qwidget_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSplashScreenPrivate : public QWidgetPrivate
+{
+ Q_DECLARE_PUBLIC(QSplashScreen)
+public:
+ QPixmap pixmap;
+ QString currStatus;
+ QColor currColor;
+ int currAlign;
+
+ inline QSplashScreenPrivate();
+ void drawContents();
+};
+
+/*!
+ \class QSplashScreen
+ \brief The QSplashScreen 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 in the center of the screen. It may be
+ useful to add the Qt::WindowStaysOnTopHint to the splash widget's
+ window flags if you want to keep it above all the other windows on
+ the desktop.
+
+ 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 in which a splash screen is displayed and
+ some initialization tasks are performed before the application's
+ main window is shown:
+
+ \snippet doc/src/snippets/qsplashscreen/main.cpp 0
+ \dots
+ \snippet doc/src/snippets/qsplashscreen/main.cpp 1
+
+ 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 QApplication::processEvents() to receive the mouse clicks.
+
+ It is sometimes useful to update the splash screen with messages,
+ for example, announcing connections established or modules loaded
+ as the application starts up:
+
+ \snippet doc/src/snippets/code/src_gui_widgets_qsplashscreen.cpp 0
+
+ QSplashScreen supports this with the showMessage() 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 QSplashScreen and reimplement drawContents().
+*/
+
+/*!
+ Construct a splash screen that will display the \a pixmap.
+
+ There should be no need to set the widget flags, \a f, except
+ perhaps Qt::WindowStaysOnTopHint.
+*/
+QSplashScreen::QSplashScreen(const QPixmap &pixmap, Qt::WindowFlags f)
+ : QWidget(*(new QSplashScreenPrivate()), 0, Qt::SplashScreen | f)
+{
+ d_func()->pixmap = pixmap;
+ setPixmap(d_func()->pixmap); // Does an implicit repaint
+}
+
+/*!
+ \overload
+
+ This function allows you to specify a parent for your splashscreen. The
+ typical use for this constructor is if you have a multiple screens and
+ prefer to have the splash screen on a different screen than your primary
+ one. In that case pass the proper desktop() as the \a parent.
+*/
+QSplashScreen::QSplashScreen(QWidget *parent, const QPixmap &pixmap, Qt::WindowFlags f)
+ : QWidget(*new QSplashScreenPrivate, parent, Qt::SplashScreen | f)
+{
+ d_func()->pixmap = pixmap;
+ setPixmap(d_func()->pixmap); // Does an implicit repaint
+}
+
+/*!
+ Destructor.
+*/
+QSplashScreen::~QSplashScreen()
+{
+}
+
+/*!
+ \reimp
+*/
+void QSplashScreen::mousePressEvent(QMouseEvent *)
+{
+ hide();
+}
+
+/*!
+ This overrides QWidget::repaint(). It differs from the standard
+ repaint function in that it also calls QApplication::flush() to
+ ensure the updates are displayed, even when there is no event loop
+ present.
+*/
+void QSplashScreen::repaint()
+{
+ d_func()->drawContents();
+ QWidget::repaint();
+ QApplication::flush();
+}
+
+/*!
+ \fn QSplashScreen::messageChanged(const QString &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 showMessage(), clearMessage()
+*/
+
+
+
+/*!
+ 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 Qt::Alignment, clearMessage()
+*/
+void QSplashScreen::showMessage(const QString &message, int alignment,
+ const QColor &color)
+{
+ Q_D(QSplashScreen);
+ d->currStatus = message;
+ d->currAlign = alignment;
+ d->currColor = color;
+ emit messageChanged(d->currStatus);
+ repaint();
+}
+
+/*!
+ Removes the message being displayed on the splash screen
+
+ \sa showMessage()
+ */
+void QSplashScreen::clearMessage()
+{
+ d_func()->currStatus.clear();
+ emit messageChanged(d_func()->currStatus);
+ repaint();
+}
+
+/*!
+ Makes the splash screen wait until the widget \a mainWin is displayed
+ before calling close() on itself.
+*/
+void QSplashScreen::finish(QWidget *mainWin)
+{
+ if (mainWin) {
+#if defined(Q_WS_X11)
+ extern void qt_x11_wait_for_window_manager(QWidget *mainWin);
+ qt_x11_wait_for_window_manager(mainWin);
+#endif
+ }
+ close();
+}
+
+/*!
+ Sets the pixmap that will be used as the splash screen's image to
+ \a pixmap.
+*/
+void QSplashScreen::setPixmap(const QPixmap &pixmap)
+{
+ Q_D(QSplashScreen);
+
+ if (pixmap.hasAlpha()) {
+ QPixmap opaque(pixmap.size());
+ QPainter p(&opaque);
+ p.fillRect(0, 0, pixmap.width(), pixmap.height(), palette().background());
+ p.drawPixmap(0, 0, pixmap);
+ p.end();
+ d->pixmap = opaque;
+ } else {
+ d->pixmap = pixmap;
+ }
+
+ QRect r(0, 0, d->pixmap.size().width(), d->pixmap.size().height());
+ resize(d->pixmap.size());
+ move(QApplication::desktop()->screenGeometry().center() - r.center());
+ if (!isVisible())
+ d->drawContents();
+ else
+ repaint();
+}
+
+/*!
+ Returns the pixmap that is used in the splash screen. The image
+ does not have any of the text drawn by showMessage() calls.
+*/
+const QPixmap QSplashScreen::pixmap() const
+{
+ return d_func()->pixmap;
+}
+
+/*!
+ \internal
+*/
+void QSplashScreenPrivate::drawContents()
+{
+ Q_Q(QSplashScreen);
+ QPixmap textPix = pixmap;
+ if (!textPix.isNull()) {
+ QPainter painter(&textPix);
+ painter.initFrom(q);
+ q->drawContents(&painter);
+ QPalette p = q->palette();
+ p.setBrush(q->backgroundRole(), QBrush(textPix));
+ q->setPalette(p);
+ }
+}
+
+/*!
+ \internal
+*/
+inline QSplashScreenPrivate::QSplashScreenPrivate() : currAlign(Qt::AlignLeft)
+{
+}
+
+/*!
+ Draw the contents of the splash screen using painter \a painter.
+ The default implementation draws the message passed by showMessage().
+ Reimplement this function if you want to do your own drawing on
+ the splash screen.
+*/
+void QSplashScreen::drawContents(QPainter *painter)
+{
+ Q_D(QSplashScreen);
+ painter->setPen(d->currColor);
+ QRect r = rect();
+ r.setRect(r.x() + 5, r.y() + 5, r.width() - 10, r.height() - 10);
+ if (Qt::mightBeRichText(d->currStatus)) {
+ QTextDocument doc;
+#ifdef QT_NO_TEXTHTMLPARSER
+ doc.setPlainText(d->currStatus);
+#else
+ doc.setHtml(d->currStatus);
+#endif
+ doc.setTextWidth(r.width());
+ QTextCursor cursor(&doc);
+ cursor.select(QTextCursor::Document);
+ QTextBlockFormat fmt;
+ fmt.setAlignment(Qt::Alignment(d->currAlign));
+ cursor.mergeBlockFormat(fmt);
+ painter->save();
+ painter->translate(r.topLeft());
+ doc.drawContents(painter);
+ painter->restore();
+ } else {
+ painter->drawText(r, d->currAlign, d->currStatus);
+ }
+}
+
+/*!
+ \fn void QSplashScreen::message(const QString &message, int alignment,
+ const QColor &color)
+ \compat
+
+ Use showMessage() instead.
+*/
+
+/*!
+ \fn void QSplashScreen::clear()
+ \compat
+
+ Use clearMessage() instead.
+*/
+
+/*! \reimp */
+bool QSplashScreen::event(QEvent *e)
+{
+ return QWidget::event(e);
+}
+
+QT_END_NAMESPACE
+
+#endif //QT_NO_SPLASHSCREEN