diff options
Diffstat (limited to 'examples/graphicsview')
-rw-r--r-- | examples/graphicsview/padnavigator/images/artsfftscope.png | bin | 1291 -> 1290 bytes | |||
-rw-r--r-- | examples/graphicsview/padnavigator/main.cpp | 4 | ||||
-rw-r--r-- | examples/graphicsview/padnavigator/panel.cpp | 168 | ||||
-rw-r--r-- | examples/graphicsview/padnavigator/panel.h | 29 | ||||
-rw-r--r-- | examples/graphicsview/padnavigator/roundrectitem.cpp | 114 | ||||
-rw-r--r-- | examples/graphicsview/padnavigator/roundrectitem.h | 16 | ||||
-rw-r--r-- | examples/graphicsview/padnavigator/splashitem.cpp | 25 | ||||
-rw-r--r-- | examples/graphicsview/padnavigator/splashitem.h | 6 |
8 files changed, 154 insertions, 208 deletions
diff --git a/examples/graphicsview/padnavigator/images/artsfftscope.png b/examples/graphicsview/padnavigator/images/artsfftscope.png Binary files differindex 4db003f..756a1cf 100644 --- a/examples/graphicsview/padnavigator/images/artsfftscope.png +++ b/examples/graphicsview/padnavigator/images/artsfftscope.png diff --git a/examples/graphicsview/padnavigator/main.cpp b/examples/graphicsview/padnavigator/main.cpp index dc5ff0c..f7d6f90 100644 --- a/examples/graphicsview/padnavigator/main.cpp +++ b/examples/graphicsview/padnavigator/main.cpp @@ -40,10 +40,6 @@ ****************************************************************************/ #include <QtGui> -#ifndef QT_NO_OPENGL -# include <QtOpenGL> -#endif - #include "panel.h" int main(int argc, char *argv[]) diff --git a/examples/graphicsview/padnavigator/panel.cpp b/examples/graphicsview/padnavigator/panel.cpp index 28a3cb4..c088fbc 100644 --- a/examples/graphicsview/padnavigator/panel.cpp +++ b/examples/graphicsview/padnavigator/panel.cpp @@ -50,15 +50,15 @@ #endif #include <QtGui/QtGui> -#include <math.h> - Panel::Panel(int width, int height) - : selectedX(0), - selectedY(0), + : selectedIndex(0), + grid(width*height), width(width), height(height), flipped(false), - flipLeft(true) + flippingGroup(0), + rotationXanim(0), + rotationYanim(0) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -72,12 +72,9 @@ Panel::Panel(int width, int height) #endif setMinimumSize(50, 50); - selectionTimeLine = new QTimeLine(150, this); - flipTimeLine = new QTimeLine(500, this); - QRectF bounds((-width / 2.0) * 150, (-height / 2.0) * 150, width * 150, height * 150); - scene = new QGraphicsScene(bounds, this); + QGraphicsScene *scene = new QGraphicsScene(bounds, this); scene->setItemIndexMethod(QGraphicsScene::NoIndex); setScene(scene); @@ -90,28 +87,24 @@ Panel::Panel(int width, int height) ui->hostName->setFocus(); backItem = new RoundRectItem(bounds, embed->palette().window(), embed); - backItem->setTransform(QTransform().rotate(180, Qt::YAxis)); + backItem->setYRotation(180); backItem->setParentItem(baseItem); selectionItem = new RoundRectItem(QRectF(-60, -60, 120, 120), Qt::gray); selectionItem->setParentItem(baseItem); selectionItem->setZValue(-1); - selectionItem->setPos(posForLocation(0, 0)); - startPos = selectionItem->pos(); + selectionItem->setPos(posForLocation(0)); - grid = new QGraphicsItem **[height]; - + int currentIndex = 0; for (int y = 0; y < height; ++y) { - grid[y] = new QGraphicsItem *[width]; - for (int x = 0; x < width; ++x) { RoundRectItem *item = new RoundRectItem(QRectF(-54, -54, 108, 108), QColor(214, 240, 110, 128)); - item->setPos(posForLocation(x, y)); + item->setPos(posForLocation(currentIndex)); item->setParentItem(baseItem); item->setFlag(QGraphicsItem::ItemIsFocusable); - grid[y][x] = item; + grid[currentIndex++] = item; switch (qrand() % 9) { case 0: item->setPixmap(QPixmap(":/images/kontact_contacts.png")); break; @@ -131,14 +124,10 @@ Panel::Panel(int width, int height) } } - grid[0][0]->setFocus(); + grid.first()->setFocus(); connect(backItem, SIGNAL(activated()), this, SLOT(flip())); - connect(selectionTimeLine, SIGNAL(valueChanged(qreal)), - this, SLOT(updateSelectionStep(qreal))); - connect(flipTimeLine, SIGNAL(valueChanged(qreal)), - this, SLOT(updateFlipStep(qreal))); splash = new SplashItem; splash->setZValue(5); @@ -147,16 +136,15 @@ Panel::Panel(int width, int height) splash->grabKeyboard(); - updateSelectionStep(0); + //initialize the position + baseItem->setYRotation(selectionItem->x()/6.); + baseItem->setXRotation(selectionItem->y()/6.); setWindowTitle(tr("Pad Navigator Example")); } Panel::~Panel() { - for (int y = 0; y < height; ++y) - delete [] grid[y]; - delete [] grid; } void Panel::keyPressEvent(QKeyEvent *event) @@ -166,73 +154,93 @@ void Panel::keyPressEvent(QKeyEvent *event) return; } - selectedX = (selectedX + width + (event->key() == Qt::Key_Right) - (event->key() == Qt::Key_Left)) % width; - selectedY = (selectedY + height + (event->key() == Qt::Key_Down) - (event->key() == Qt::Key_Up)) % height; - grid[selectedY][selectedX]->setFocus(); - - selectionTimeLine->stop(); - startPos = selectionItem->pos(); - endPos = posForLocation(selectedX, selectedY); - selectionTimeLine->start(); + selectedIndex = (selectedIndex + grid.count() + (event->key() == Qt::Key_Right) - (event->key() == Qt::Key_Left) + + width * ((event->key() == Qt::Key_Down) - (event->key() == Qt::Key_Up))) % grid.count(); + grid[selectedIndex]->setFocus(); + + const QPointF pos = posForLocation(selectedIndex); + + const double angleY = pos.x() / 6., + angleX = pos.y() / 6.; + + QAnimationGroup *group = new QParallelAnimationGroup(); + + QVariantAnimation *anim = new QPropertyAnimation(baseItem, "xRotation"); + anim->setEndValue(angleX); + anim->setDuration(150); + anim->setEasingCurve(QEasingCurve::OutInSine); + group->addAnimation(anim); + + anim = new QPropertyAnimation(baseItem, "yRotation"); + anim->setEndValue(angleY); + anim->setDuration(150); + anim->setEasingCurve(QEasingCurve::OutInSine); + group->addAnimation(anim); + + anim = new QPropertyAnimation(selectionItem, "pos"); + anim->setEndValue(pos); + anim->setDuration(150); + anim->setEasingCurve(QEasingCurve::Linear); + group->addAnimation(anim); + + group->start(QAbstractAnimation::DeleteWhenStopped); } void Panel::resizeEvent(QResizeEvent *event) { QGraphicsView::resizeEvent(event); - fitInView(scene->sceneRect(), Qt::KeepAspectRatio); + fitInView(scene()->sceneRect(), Qt::KeepAspectRatio); } -void Panel::updateSelectionStep(qreal val) +void Panel::flip() { - QPointF newPos(startPos.x() + (endPos - startPos).x() * val, - startPos.y() + (endPos - startPos).y() * val); - selectionItem->setPos(newPos); - - QTransform transform; - yrot = newPos.x() / 6.0; - xrot = newPos.y() / 6.0; - transform.rotate(newPos.x() / 6.0, Qt::YAxis); - transform.rotate(newPos.y() / 6.0, Qt::XAxis); - baseItem->setTransform(transform); -} + grid[selectedIndex]->setFocus(); + + if (flippingGroup == 0) { + flippingGroup = new QParallelAnimationGroup(this); + + const qreal zoomOut = qreal(.75); + + //slight scaling down while flipping + QVariantAnimation *anim = new QPropertyAnimation(baseItem, "yScale"); + anim->setKeyValueAt(qreal(.5), zoomOut); + anim->setEndValue(1); + anim->setEasingCurve(QEasingCurve::OutInSine); + anim->setDuration(500); + flippingGroup->addAnimation(anim); + + anim = new QPropertyAnimation(baseItem, "xScale"); + anim->setKeyValueAt(qreal(.5), zoomOut); + anim->setEndValue(1); + anim->setEasingCurve(QEasingCurve::OutInSine); + anim->setDuration(500); + flippingGroup->addAnimation(anim); + + rotationXanim = new QPropertyAnimation(baseItem, "xRotation"); + rotationXanim->setEndValue(0); + rotationXanim->setDuration(500); + flippingGroup->addAnimation(rotationXanim); + + rotationYanim = new QPropertyAnimation(baseItem, "yRotation"); + rotationYanim->setStartValue(0); + rotationYanim->setEndValue(180); + rotationYanim->setDuration(500); + flippingGroup->addAnimation(rotationYanim); + } -void Panel::updateFlipStep(qreal val) -{ - qreal finalxrot = xrot - xrot * val; - qreal finalyrot; - if (flipLeft) - finalyrot = yrot - yrot * val - 180 * val; + if (flippingGroup->currentTime() != 0 && flippingGroup->direction() == QAbstractAnimation::Forward) + flippingGroup->setDirection(QAbstractAnimation::Backward); else - finalyrot = yrot - yrot * val + 180 * val; - QTransform transform; - transform.rotate(finalyrot, Qt::YAxis); - transform.rotate(finalxrot, Qt::XAxis); - qreal scale = 1 - sin(3.14 * val) * 0.3; - transform.scale(scale, scale); - baseItem->setTransform(transform); - if (val == 0) - grid[selectedY][selectedX]->setFocus(); -} + flippingGroup->setDirection(QAbstractAnimation::Forward); -void Panel::flip() -{ - if (flipTimeLine->state() == QTimeLine::Running) - return; - - if (flipTimeLine->currentValue() == 0) { - flipTimeLine->setDirection(QTimeLine::Forward); - flipTimeLine->start(); - flipped = true; - flipLeft = selectionItem->pos().x() < 0; - } else { - flipTimeLine->setDirection(QTimeLine::Backward); - flipTimeLine->start(); - flipped = false; - } + flippingGroup->start(); + flipped = !flipped; } -QPointF Panel::posForLocation(int x, int y) const +QPointF Panel::posForLocation(int index) const { + const int x = index % width, + y = index / width; return QPointF(x * 150, y * 150) - QPointF((width - 1) * 75, (height - 1) * 75); } diff --git a/examples/graphicsview/padnavigator/panel.h b/examples/graphicsview/padnavigator/panel.h index 03876b7..cc03530 100644 --- a/examples/graphicsview/padnavigator/panel.h +++ b/examples/graphicsview/padnavigator/panel.h @@ -40,10 +40,12 @@ ****************************************************************************/ #include <QtGui/qgraphicsview.h> +#include <QtGui/qgraphicswidget.h> QT_BEGIN_NAMESPACE -class QTimeLine; class Ui_BackSide; +class QAnimationGroup; +class QPropertyAnimation; QT_END_NAMESPACE; class RoundRectItem; @@ -60,33 +62,24 @@ protected: void resizeEvent(QResizeEvent *event); private Q_SLOTS: - void updateSelectionStep(qreal val); - void updateFlipStep(qreal val); void flip(); private: - QPointF posForLocation(int x, int y) const; + QPointF posForLocation(int index) const; - QGraphicsScene *scene; - RoundRectItem *selectionItem; - RoundRectItem *baseItem; + QGraphicsWidget *selectionItem; + QGraphicsWidget *baseItem; RoundRectItem *backItem; QGraphicsWidget *splash; - QTimeLine *selectionTimeLine; - QTimeLine *flipTimeLine; - int selectedX, selectedY; + int selectedIndex; - QGraphicsItem ***grid; + QVector<QGraphicsItem*> grid; - QPointF startPos; - QPointF endPos; - qreal xrot, yrot; - qreal xrot2, yrot2; - int width; int height; bool flipped; - bool flipLeft; - Ui_BackSide *ui; + + QAnimationGroup *flippingGroup; + QPropertyAnimation *rotationXanim, *rotationYanim; }; diff --git a/examples/graphicsview/padnavigator/roundrectitem.cpp b/examples/graphicsview/padnavigator/roundrectitem.cpp index c5dc35d..ec91966 100644 --- a/examples/graphicsview/padnavigator/roundrectitem.cpp +++ b/examples/graphicsview/padnavigator/roundrectitem.cpp @@ -44,72 +44,61 @@ #include <QtGui/QtGui> RoundRectItem::RoundRectItem(const QRectF &rect, const QBrush &brush, QWidget *embeddedWidget) - : QGraphicsRectItem(rect), + : QGraphicsWidget(), + m_rect(rect), brush(brush), - timeLine(75), - lastVal(0), - opa(1), proxyWidget(0) { - connect(&timeLine, SIGNAL(valueChanged(qreal)), - this, SLOT(updateValue(qreal))); - if (embeddedWidget) { proxyWidget = new QGraphicsProxyWidget(this); proxyWidget->setFocusPolicy(Qt::StrongFocus); proxyWidget->setWidget(embeddedWidget); - proxyWidget->setGeometry(boundingRect().adjusted(25, 25, -25, -25)); } } void RoundRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { - QTransform x = painter->worldTransform(); - - QLineF unit = x.map(QLineF(0, 0, 1, 1)); - if (unit.p1().x() > unit.p2().x() || unit.p1().y() > unit.p2().y()) { - if (proxyWidget && proxyWidget->isVisible()) { + const bool widgetHidden = parentItem() == 0 || qAbs(static_cast<QGraphicsWidget*>(parentItem())->yRotation()) < 90; + + if (proxyWidget) { + if (widgetHidden) { proxyWidget->hide(); - proxyWidget->setGeometry(rect()); + } else { + if (!proxyWidget->isVisible()) { + proxyWidget->setGeometry(boundingRect().adjusted(25, 25, -25, -25)); + proxyWidget->show(); + proxyWidget->setFocus(); + } + painter->setBrush(brush); + painter->setPen(QPen(Qt::black, 1)); + painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + painter->drawRoundRect(m_rect); } - return; - } - - if (proxyWidget && !proxyWidget->isVisible()) { - proxyWidget->show(); - proxyWidget->setFocus(); - } - if (proxyWidget && proxyWidget->pos() != QPoint()) - proxyWidget->setGeometry(boundingRect().adjusted(25, 25, -25, -25)); - - painter->setOpacity(opacity()); - painter->setPen(Qt::NoPen); - painter->setBrush(QColor(0, 0, 0, 64)); - painter->drawRoundRect(rect().translated(2, 2)); + } else if (widgetHidden) { + painter->setPen(Qt::NoPen); + painter->setBrush(QColor(0, 0, 0, 64)); + painter->drawRoundRect(m_rect.translated(2, 2)); - if (!proxyWidget) { - QLinearGradient gradient(rect().topLeft(), rect().bottomRight()); + QLinearGradient gradient(m_rect.topLeft(), m_rect.bottomRight()); const QColor col = brush.color(); gradient.setColorAt(0, col); - gradient.setColorAt(1, col.dark(int(200 + lastVal * 50))); + gradient.setColorAt(1, col.dark(200)); painter->setBrush(gradient); - } else { - painter->setBrush(brush); + painter->setPen(QPen(Qt::black, 1)); + painter->drawRoundRect(m_rect); + if (!pix.isNull()) { + painter->scale(qreal(1.95), qreal(1.95)); + painter->drawPixmap(-pix.width() / 2, -pix.height() / 2, pix); + } } - painter->setPen(QPen(Qt::black, 1)); - painter->drawRoundRect(rect()); - if (!pix.isNull()) { - painter->scale(1.95, 1.95); - painter->drawPixmap(-pix.width() / 2, -pix.height() / 2, pix);; - } } QRectF RoundRectItem::boundingRect() const { - qreal penW = 0.5; - qreal shadowW = 2.0; - return rect().adjusted(-penW, -penW, penW + shadowW, penW + shadowW); + qreal penW = qreal(.5); + qreal shadowW = 2; + return m_rect.adjusted(-penW, -penW, penW + shadowW, penW + shadowW); } void RoundRectItem::setPixmap(const QPixmap &pixmap) @@ -119,46 +108,29 @@ void RoundRectItem::setPixmap(const QPixmap &pixmap) update(); } -qreal RoundRectItem::opacity() const -{ - RoundRectItem *parent = parentItem() ? (RoundRectItem *)parentItem() : 0; - return opa + (parent ? parent->opacity() : 0); -} - -void RoundRectItem::setOpacity(qreal opacity) -{ - opa = opacity; - update(); -} - void RoundRectItem::keyPressEvent(QKeyEvent *event) { - if (event->isAutoRepeat() || event->key() != Qt::Key_Return - || (timeLine.state() == QTimeLine::Running && timeLine.direction() == QTimeLine::Forward)) { - QGraphicsRectItem::keyPressEvent(event); + if (event->isAutoRepeat() || event->key() != Qt::Key_Return) { + QGraphicsWidget::keyPressEvent(event); return; } - timeLine.stop(); - timeLine.setDirection(QTimeLine::Forward); - timeLine.start(); + if (!proxyWidget) { + setXScale(qreal(.9)); + setYScale(qreal(.9)); + } emit activated(); } void RoundRectItem::keyReleaseEvent(QKeyEvent *event) { - if (event->key() != Qt::Key_Return) { - QGraphicsRectItem::keyReleaseEvent(event); + if (event->isAutoRepeat() || event->key() != Qt::Key_Return) { + QGraphicsWidget::keyReleaseEvent(event); return; } - timeLine.stop(); - timeLine.setDirection(QTimeLine::Backward); - timeLine.start(); -} -void RoundRectItem::updateValue(qreal value) -{ - lastVal = value; - if (!proxyWidget) - setTransform(QTransform().scale(1 - value / 10.0, 1 - value / 10.0)); + if (!proxyWidget) { + setXScale(1); + setYScale(1); + } } diff --git a/examples/graphicsview/padnavigator/roundrectitem.h b/examples/graphicsview/padnavigator/roundrectitem.h index 33e33d7..b0d44dd 100644 --- a/examples/graphicsview/padnavigator/roundrectitem.h +++ b/examples/graphicsview/padnavigator/roundrectitem.h @@ -40,15 +40,14 @@ ****************************************************************************/ #include <QtCore/qobject.h> -#include <QtCore/qtimeline.h> -#include <QtGui/qgraphicsitem.h> #include <QtGui/qbrush.h> +#include <QtGui/qgraphicswidget.h> QT_BEGIN_NAMESPACE class QGraphicsProxyWidget; QT_END_NAMESPACE; -class RoundRectItem : public QObject, public QGraphicsRectItem +class RoundRectItem : public QGraphicsWidget { Q_OBJECT public: @@ -59,9 +58,6 @@ public: void setPixmap(const QPixmap &pixmap); - qreal opacity() const; - void setOpacity(qreal opacity); - Q_SIGNALS: void activated(); @@ -69,15 +65,9 @@ protected: void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event); -private slots: - void updateValue(qreal value); - private: + QRectF m_rect; QBrush brush; QPixmap pix; - QTimeLine timeLine; - qreal lastVal; - qreal opa; - QGraphicsProxyWidget *proxyWidget; }; diff --git a/examples/graphicsview/padnavigator/splashitem.cpp b/examples/graphicsview/padnavigator/splashitem.cpp index 2a374bf..a83d4d5 100644 --- a/examples/graphicsview/padnavigator/splashitem.cpp +++ b/examples/graphicsview/padnavigator/splashitem.cpp @@ -46,12 +46,6 @@ SplashItem::SplashItem(QGraphicsItem *parent) : QGraphicsWidget(parent) { - opacity = 1.0; - - - timeLine = new QTimeLine(350); - timeLine->setCurveShape(QTimeLine::EaseInCurve); - connect(timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(setValue(qreal))); text = tr("Welcome to the Pad Navigator Example. You can use the" " keyboard arrows to navigate the icons, and press enter" @@ -61,7 +55,6 @@ SplashItem::SplashItem(QGraphicsItem *parent) void SplashItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { - painter->setOpacity(opacity); painter->setPen(QPen(Qt::black, 2)); painter->setBrush(QColor(245, 245, 255, 220)); painter->setClipRect(rect()); @@ -79,14 +72,14 @@ void SplashItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWid void SplashItem::keyPressEvent(QKeyEvent * /* event */) { - if (timeLine->state() == QTimeLine::NotRunning) - timeLine->start(); -} + QVariantAnimation *anim = new QPropertyAnimation(this, "pos"); + anim->setEndValue(QPointF(x(), scene()->sceneRect().top() - rect().height())); + anim->setDuration(350); + anim->start(QAbstractAnimation::DeleteWhenStopped); -void SplashItem::setValue(qreal value) -{ - opacity = 1 - value; - setPos(x(), scene()->sceneRect().top() - rect().height() * value); - if (value == 1) - hide(); + anim = new QPropertyAnimation(this, "opacity"); + anim->setEndValue(0); + anim->start(QAbstractAnimation::DeleteWhenStopped); + + connect(anim, SIGNAL(finished()), SLOT(close())); } diff --git a/examples/graphicsview/padnavigator/splashitem.h b/examples/graphicsview/padnavigator/splashitem.h index 982bbe2..e2655ec 100644 --- a/examples/graphicsview/padnavigator/splashitem.h +++ b/examples/graphicsview/padnavigator/splashitem.h @@ -40,7 +40,6 @@ ****************************************************************************/ #include <QtCore/qobject.h> -#include <QtCore/qtimeline.h> #include <QtGui/qgraphicswidget.h> class SplashItem : public QGraphicsWidget @@ -53,11 +52,6 @@ public: protected: void keyPressEvent(QKeyEvent *event); -private Q_SLOTS: - void setValue(qreal value); - private: - QTimeLine *timeLine; QString text; - qreal opacity; }; |