diff options
Diffstat (limited to 'src/gui/widgets/qeffects.cpp')
-rw-r--r-- | src/gui/widgets/qeffects.cpp | 613 |
1 files changed, 0 insertions, 613 deletions
diff --git a/src/gui/widgets/qeffects.cpp b/src/gui/widgets/qeffects.cpp deleted file mode 100644 index 6b64d48654..0000000000 --- a/src/gui/widgets/qeffects.cpp +++ /dev/null @@ -1,613 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qapplication.h" -#ifndef QT_NO_EFFECTS -#include "qdesktopwidget.h" -#include "qeffects_p.h" -#include "qevent.h" -#include "qimage.h" -#include "qpainter.h" -#include "qpixmap.h" -#include "qpointer.h" -#include "qtimer.h" -#include "qelapsedtimer.h" -#include "qdebug.h" - -QT_BEGIN_NAMESPACE - -/* - Internal class QAlphaWidget. - - The QAlphaWidget is shown while the animation lasts - and displays the pixmap resulting from the alpha blending. -*/ - -class QAlphaWidget: public QWidget, private QEffects -{ - Q_OBJECT -public: - QAlphaWidget(QWidget* w, Qt::WindowFlags f = 0); - ~QAlphaWidget(); - - void run(int time); - -protected: - void paintEvent(QPaintEvent* e); - void closeEvent(QCloseEvent*); - void alphaBlend(); - bool eventFilter(QObject *, QEvent *); - -protected slots: - void render(); - -private: - QPixmap pm; - double alpha; - QImage backImage; - QImage frontImage; - QImage mixedImage; - QPointer<QWidget> widget; - int duration; - int elapsed; - bool showWidget; - QTimer anim; - QElapsedTimer checkTime; -}; - -static QAlphaWidget* q_blend = 0; - -/* - Constructs a QAlphaWidget. -*/ -QAlphaWidget::QAlphaWidget(QWidget* w, Qt::WindowFlags f) - : QWidget(QApplication::desktop()->screen(QApplication::desktop()->screenNumber(w)), f) -{ -#ifndef Q_WS_WIN - setEnabled(false); -#endif - setAttribute(Qt::WA_NoSystemBackground, true); - widget = w; - alpha = 0; -} - -QAlphaWidget::~QAlphaWidget() -{ -#if defined(Q_WS_WIN) && !defined(Q_WS_WINCE) - // Restore user-defined opacity value - if (widget) - widget->setWindowOpacity(1); -#endif -} - -/* - \reimp -*/ -void QAlphaWidget::paintEvent(QPaintEvent*) -{ - QPainter p(this); - p.drawPixmap(0, 0, pm); -} - -/* - Starts the alphablending animation. - The animation will take about \a time ms -*/ -void QAlphaWidget::run(int time) -{ - duration = time; - - if (duration < 0) - duration = 150; - - if (!widget) - return; - - elapsed = 0; - checkTime.start(); - - showWidget = true; -#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) - qApp->installEventFilter(this); - widget->setWindowOpacity(0.0); - widget->show(); - connect(&anim, SIGNAL(timeout()), this, SLOT(render())); - anim.start(1); -#else - //This is roughly equivalent to calling setVisible(true) without actually showing the widget - widget->setAttribute(Qt::WA_WState_ExplicitShowHide, true); - widget->setAttribute(Qt::WA_WState_Hidden, false); - - qApp->installEventFilter(this); - - move(widget->geometry().x(),widget->geometry().y()); - resize(widget->size().width(), widget->size().height()); - - frontImage = QPixmap::grabWidget(widget).toImage(); - backImage = QPixmap::grabWindow(QApplication::desktop()->winId(), - widget->geometry().x(), widget->geometry().y(), - widget->geometry().width(), widget->geometry().height()).toImage(); - - if (!backImage.isNull() && checkTime.elapsed() < duration / 2) { - mixedImage = backImage.copy(); - pm = QPixmap::fromImage(mixedImage); - show(); - setEnabled(false); - - connect(&anim, SIGNAL(timeout()), this, SLOT(render())); - anim.start(1); - } else { - duration = 0; - render(); - } -#endif -} - -/* - \reimp -*/ -bool QAlphaWidget::eventFilter(QObject *o, QEvent *e) -{ - switch (e->type()) { - case QEvent::Move: - if (o != widget) - break; - move(widget->geometry().x(),widget->geometry().y()); - update(); - break; - case QEvent::Hide: - case QEvent::Close: - if (o != widget) - break; - case QEvent::MouseButtonPress: - case QEvent::MouseButtonDblClick: - showWidget = false; - render(); - break; - case QEvent::KeyPress: { - QKeyEvent *ke = (QKeyEvent*)e; - if (ke->key() == Qt::Key_Escape) { - showWidget = false; - } else { - duration = 0; - } - render(); - break; - } - default: - break; - } - return QWidget::eventFilter(o, e); -} - -/* - \reimp -*/ -void QAlphaWidget::closeEvent(QCloseEvent *e) -{ - e->accept(); - if (!q_blend) - return; - - showWidget = false; - render(); - - QWidget::closeEvent(e); -} - -/* - Render alphablending for the time elapsed. - - Show the blended widget and free all allocated source - if the blending is finished. -*/ -void QAlphaWidget::render() -{ - int tempel = checkTime.elapsed(); - if (elapsed >= tempel) - elapsed++; - else - elapsed = tempel; - - if (duration != 0) - alpha = tempel / double(duration); - else - alpha = 1; - -#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) - if (alpha >= 1 || !showWidget) { - anim.stop(); - qApp->removeEventFilter(this); - widget->setWindowOpacity(1); - q_blend = 0; - deleteLater(); - } else { - widget->setWindowOpacity(alpha); - } -#else - if (alpha >= 1 || !showWidget) { - anim.stop(); - qApp->removeEventFilter(this); - - if (widget) { - if (!showWidget) { -#ifdef Q_WS_WIN - setEnabled(true); - setFocus(); -#endif // Q_WS_WIN - widget->hide(); - } else { - //Since we are faking the visibility of the widget - //we need to unset the hidden state on it before calling show - widget->setAttribute(Qt::WA_WState_Hidden, true); - widget->show(); - lower(); - } - } - q_blend = 0; - deleteLater(); - } else { - alphaBlend(); - pm = QPixmap::fromImage(mixedImage); - repaint(); - } -#endif // defined(Q_OS_WIN) && !defined(Q_OS_WINCE) -} - -/* - Calculate an alphablended image. -*/ -void QAlphaWidget::alphaBlend() -{ - const int a = qRound(alpha*256); - const int ia = 256 - a; - - const int sw = frontImage.width(); - const int sh = frontImage.height(); - const int bpl = frontImage.bytesPerLine(); - switch(frontImage.depth()) { - case 32: - { - uchar *mixed_data = mixedImage.bits(); - const uchar *back_data = backImage.bits(); - const uchar *front_data = frontImage.bits(); - - for (int sy = 0; sy < sh; sy++) { - quint32* mixed = (quint32*)mixed_data; - const quint32* back = (const quint32*)back_data; - const quint32* front = (const quint32*)front_data; - for (int sx = 0; sx < sw; sx++) { - quint32 bp = back[sx]; - quint32 fp = front[sx]; - - mixed[sx] = qRgb((qRed(bp)*ia + qRed(fp)*a)>>8, - (qGreen(bp)*ia + qGreen(fp)*a)>>8, - (qBlue(bp)*ia + qBlue(fp)*a)>>8); - } - mixed_data += bpl; - back_data += bpl; - front_data += bpl; - } - } - default: - break; - } -} - -/* - Internal class QRollEffect - - The QRollEffect widget is shown while the animation lasts - and displays a scrolling pixmap. -*/ - -class QRollEffect : public QWidget, private QEffects -{ - Q_OBJECT -public: - QRollEffect(QWidget* w, Qt::WindowFlags f, DirFlags orient); - - void run(int time); - -protected: - void paintEvent(QPaintEvent*); - void closeEvent(QCloseEvent*); - -private slots: - void scroll(); - -private: - QPointer<QWidget> widget; - - int currentHeight; - int currentWidth; - int totalHeight; - int totalWidth; - - int duration; - int elapsed; - bool done; - bool showWidget; - int orientation; - - QTimer anim; - QElapsedTimer checkTime; - - QPixmap pm; -}; - -static QRollEffect* q_roll = 0; - -/* - Construct a QRollEffect widget. -*/ -QRollEffect::QRollEffect(QWidget* w, Qt::WindowFlags f, DirFlags orient) - : QWidget(0, f), orientation(orient) -{ -#ifndef Q_WS_WIN - setEnabled(false); -#endif - - widget = w; - Q_ASSERT(widget); - - setAttribute(Qt::WA_NoSystemBackground, true); - - if (widget->testAttribute(Qt::WA_Resized)) { - totalWidth = widget->width(); - totalHeight = widget->height(); - } else { - totalWidth = widget->sizeHint().width(); - totalHeight = widget->sizeHint().height(); - } - - currentHeight = totalHeight; - currentWidth = totalWidth; - - if (orientation & (RightScroll|LeftScroll)) - currentWidth = 0; - if (orientation & (DownScroll|UpScroll)) - currentHeight = 0; - - pm = QPixmap::grabWidget(widget); -} - -/* - \reimp -*/ -void QRollEffect::paintEvent(QPaintEvent*) -{ - int x = orientation & RightScroll ? qMin(0, currentWidth - totalWidth) : 0; - int y = orientation & DownScroll ? qMin(0, currentHeight - totalHeight) : 0; - - QPainter p(this); - p.drawPixmap(x, y, pm); -} - -/* - \reimp -*/ -void QRollEffect::closeEvent(QCloseEvent *e) -{ - e->accept(); - if (done) - return; - - showWidget = false; - done = true; - scroll(); - - QWidget::closeEvent(e); -} - -/* - Start the animation. - - The animation will take about \a time ms, or is - calculated if \a time is negative -*/ -void QRollEffect::run(int time) -{ - if (!widget) - return; - - duration = time; - elapsed = 0; - - if (duration < 0) { - int dist = 0; - if (orientation & (RightScroll|LeftScroll)) - dist += totalWidth - currentWidth; - if (orientation & (DownScroll|UpScroll)) - dist += totalHeight - currentHeight; - duration = qMin(qMax(dist/3, 50), 120); - } - - connect(&anim, SIGNAL(timeout()), this, SLOT(scroll())); - - move(widget->geometry().x(),widget->geometry().y()); - resize(qMin(currentWidth, totalWidth), qMin(currentHeight, totalHeight)); - - //This is roughly equivalent to calling setVisible(true) without actually showing the widget - widget->setAttribute(Qt::WA_WState_ExplicitShowHide, true); - widget->setAttribute(Qt::WA_WState_Hidden, false); - - show(); - setEnabled(false); - - qApp->installEventFilter(this); - - showWidget = true; - done = false; - anim.start(1); - checkTime.start(); -} - -/* - Roll according to the time elapsed. -*/ -void QRollEffect::scroll() -{ - if (!done && widget) { - int tempel = checkTime.elapsed(); - if (elapsed >= tempel) - elapsed++; - else - elapsed = tempel; - - if (currentWidth != totalWidth) { - currentWidth = totalWidth * (elapsed/duration) - + (2 * totalWidth * (elapsed%duration) + duration) - / (2 * duration); - // equiv. to int((totalWidth*elapsed) / duration + 0.5) - done = (currentWidth >= totalWidth); - } - if (currentHeight != totalHeight) { - currentHeight = totalHeight * (elapsed/duration) - + (2 * totalHeight * (elapsed%duration) + duration) - / (2 * duration); - // equiv. to int((totalHeight*elapsed) / duration + 0.5) - done = (currentHeight >= totalHeight); - } - done = (currentHeight >= totalHeight) && - (currentWidth >= totalWidth); - - int w = totalWidth; - int h = totalHeight; - int x = widget->geometry().x(); - int y = widget->geometry().y(); - - if (orientation & RightScroll || orientation & LeftScroll) - w = qMin(currentWidth, totalWidth); - if (orientation & DownScroll || orientation & UpScroll) - h = qMin(currentHeight, totalHeight); - - setUpdatesEnabled(false); - if (orientation & UpScroll) - y = widget->geometry().y() + qMax(0, totalHeight - currentHeight); - if (orientation & LeftScroll) - x = widget->geometry().x() + qMax(0, totalWidth - currentWidth); - if (orientation & UpScroll || orientation & LeftScroll) - move(x, y); - - resize(w, h); - setUpdatesEnabled(true); - repaint(); - } - if (done) { - anim.stop(); - qApp->removeEventFilter(this); - if (widget) { - if (!showWidget) { -#ifdef Q_WS_WIN - setEnabled(true); - setFocus(); -#endif - widget->hide(); - } else { - //Since we are faking the visibility of the widget - //we need to unset the hidden state on it before calling show - widget->setAttribute(Qt::WA_WState_Hidden, true); - widget->show(); - lower(); - } - } - q_roll = 0; - deleteLater(); - } -} - -/*! - Scroll widget \a w in \a time ms. \a orient may be 1 (vertical), 2 - (horizontal) or 3 (diagonal). -*/ -void qScrollEffect(QWidget* w, QEffects::DirFlags orient, int time) -{ - if (q_roll) { - q_roll->deleteLater(); - q_roll = 0; - } - - if (!w) - return; - - QApplication::sendPostedEvents(w, QEvent::Move); - QApplication::sendPostedEvents(w, QEvent::Resize); - Qt::WindowFlags flags = Qt::ToolTip; - - // those can be popups - they would steal the focus, but are disabled - q_roll = new QRollEffect(w, flags, orient); - q_roll->run(time); -} - -/*! - Fade in widget \a w in \a time ms. -*/ -void qFadeEffect(QWidget* w, int time) -{ - if (q_blend) { - q_blend->deleteLater(); - q_blend = 0; - } - - if (!w) - return; - - QApplication::sendPostedEvents(w, QEvent::Move); - QApplication::sendPostedEvents(w, QEvent::Resize); - - Qt::WindowFlags flags = Qt::ToolTip; - - // those can be popups - they would steal the focus, but are disabled - q_blend = new QAlphaWidget(w, flags); - - q_blend->run(time); -} - -QT_END_NAMESPACE - -/* - Delete this after timeout -*/ - -#include "qeffects.moc" - -#endif //QT_NO_EFFECTS |