|  | Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |

# bubble.cpp Example File
opengl/overpainting/bubble.cpp

        /****************************************************************************
        **
        ** Copyright (C) 2006-2006 Trolltech ASA. All rights reserved.
        **
        ** This file is part of the example classes of the Qt Toolkit.
        **
        ** Licensees holding valid Qt Preview licenses may use this file in
        ** accordance with the Qt Preview License Agreement provided with the
        ** Software.
        **
        ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
        ** information about Qt Commercial License Agreements.
        **
        ** Contact info@trolltech.com if any conditions of this licensing are
        ** not clear to you.
        **
        ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
        ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        **
        ****************************************************************************/

        #include <QtGui>

        #include "bubble.h"

        Bubble::Bubble(const QPointF &position, qreal radius, const QPointF &velocity)
            : position(position), vel(velocity), radius(radius)
        {
            innerColor = randomColor();
            outerColor = randomColor();
            updateBrush();
        }

        void Bubble::updateBrush()
        {
            QRadialGradient gradient(QPointF(radius, radius), radius,
                                     QPointF(radius*0.5, radius*0.5));

            gradient.setColorAt(0, QColor(255, 255, 255, 255));
            gradient.setColorAt(0.25, innerColor);
            gradient.setColorAt(1, outerColor);
            brush = QBrush(gradient);
        }

        void Bubble::drawBubble(QPainter *painter)
        {
            painter->save();
            painter->translate(position.x() - radius, position.y() - radius);
            painter->setBrush(brush);
            painter->drawEllipse(0, 0, int(2*radius), int(2*radius));
            painter->restore();
        }

        QColor Bubble::randomColor()
        {
            int red = int(205 + 50.0*rand()/(RAND_MAX+1.0));
            int green = int(205 + 50.0*rand()/(RAND_MAX+1.0));
            int blue = int(205 + 50.0*rand()/(RAND_MAX+1.0));
            int alpha = int(91 + 100.0*rand()/(RAND_MAX+1.0));

            return QColor(red, green, blue, alpha);
        }

        void Bubble::move(const QRect &bbox)
        {
            position += vel;
            qreal leftOverflow = position.x() - radius - bbox.left();
            qreal rightOverflow = position.x() + radius - bbox.right();
            qreal topOverflow = position.y() - radius - bbox.top();
            qreal bottomOverflow = position.y() + radius - bbox.bottom();

            if (leftOverflow < 0.0) {
                position.setX(position.x() - 2 * leftOverflow);
                vel.setX(-vel.x());
            } else if (rightOverflow > 0.0) {
                position.setX(position.x() - 2 * rightOverflow);
                vel.setX(-vel.x());
            }

            if (topOverflow < 0.0) {
                position.setY(position.y() - 2 * topOverflow);
                vel.setY(-vel.y());
            } else if (bottomOverflow > 0.0) {
                position.setY(position.y() - 2 * bottomOverflow);
                vel.setY(-vel.y());
            }
        }

        QRectF Bubble::rect()
        {
            return QRectF(position.x() - radius, position.y() - radius,
                          2 * radius, 2 * radius);
        }