summaryrefslogtreecommitdiffstats
path: root/examples/graphicsview/padnavigator/panel.cpp
diff options
context:
space:
mode:
authorThierry Bastian <thierry.bastian@nokia.com>2009-05-22 10:17:59 (GMT)
committerThierry Bastian <thierry.bastian@nokia.com>2009-05-22 10:17:59 (GMT)
commit42fe40e777a35818dcb9f7cd00ddf93e44477e36 (patch)
tree2b4f675826d5d57cbece5ad9b4dc89d470453342 /examples/graphicsview/padnavigator/panel.cpp
parentd0ac49ec731f0781ba48f8f5d8ce04e19ce0010d (diff)
downloadQt-42fe40e777a35818dcb9f7cd00ddf93e44477e36.zip
Qt-42fe40e777a35818dcb9f7cd00ddf93e44477e36.tar.gz
Qt-42fe40e777a35818dcb9f7cd00ddf93e44477e36.tar.bz2
Revert "update the padnavigator example and suppress the padnavigator-ng"
This reverts commit 1cad8c56002a61a6240e6580cdbd784209821fa6. Conflicts: examples/graphicsview/padnavigator/roundrectitem.cpp
Diffstat (limited to 'examples/graphicsview/padnavigator/panel.cpp')
-rw-r--r--examples/graphicsview/padnavigator/panel.cpp168
1 files changed, 80 insertions, 88 deletions
diff --git a/examples/graphicsview/padnavigator/panel.cpp b/examples/graphicsview/padnavigator/panel.cpp
index c088fbc..28a3cb4 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)
- : selectedIndex(0),
- grid(width*height),
+ : selectedX(0),
+ selectedY(0),
width(width),
height(height),
flipped(false),
- flippingGroup(0),
- rotationXanim(0),
- rotationYanim(0)
+ flipLeft(true)
{
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@@ -72,9 +72,12 @@ 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);
- QGraphicsScene *scene = new QGraphicsScene(bounds, this);
+ scene = new QGraphicsScene(bounds, this);
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
setScene(scene);
@@ -87,24 +90,28 @@ Panel::Panel(int width, int height)
ui->hostName->setFocus();
backItem = new RoundRectItem(bounds, embed->palette().window(), embed);
- backItem->setYRotation(180);
+ backItem->setTransform(QTransform().rotate(180, Qt::YAxis));
backItem->setParentItem(baseItem);
selectionItem = new RoundRectItem(QRectF(-60, -60, 120, 120), Qt::gray);
selectionItem->setParentItem(baseItem);
selectionItem->setZValue(-1);
- selectionItem->setPos(posForLocation(0));
+ selectionItem->setPos(posForLocation(0, 0));
+ startPos = selectionItem->pos();
- int currentIndex = 0;
+ grid = new QGraphicsItem **[height];
+
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(currentIndex));
+ item->setPos(posForLocation(x, y));
item->setParentItem(baseItem);
item->setFlag(QGraphicsItem::ItemIsFocusable);
- grid[currentIndex++] = item;
+ grid[y][x] = item;
switch (qrand() % 9) {
case 0: item->setPixmap(QPixmap(":/images/kontact_contacts.png")); break;
@@ -124,10 +131,14 @@ Panel::Panel(int width, int height)
}
}
- grid.first()->setFocus();
+ grid[0][0]->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);
@@ -136,15 +147,16 @@ Panel::Panel(int width, int height)
splash->grabKeyboard();
- //initialize the position
- baseItem->setYRotation(selectionItem->x()/6.);
- baseItem->setXRotation(selectionItem->y()/6.);
+ updateSelectionStep(0);
setWindowTitle(tr("Pad Navigator Example"));
}
Panel::~Panel()
{
+ for (int y = 0; y < height; ++y)
+ delete [] grid[y];
+ delete [] grid;
}
void Panel::keyPressEvent(QKeyEvent *event)
@@ -154,93 +166,73 @@ void Panel::keyPressEvent(QKeyEvent *event)
return;
}
- 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);
+ 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();
}
void Panel::resizeEvent(QResizeEvent *event)
{
QGraphicsView::resizeEvent(event);
- fitInView(scene()->sceneRect(), Qt::KeepAspectRatio);
+ fitInView(scene->sceneRect(), Qt::KeepAspectRatio);
}
-void Panel::flip()
+void Panel::updateSelectionStep(qreal val)
{
- 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);
- }
+ 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);
+}
- if (flippingGroup->currentTime() != 0 && flippingGroup->direction() == QAbstractAnimation::Forward)
- flippingGroup->setDirection(QAbstractAnimation::Backward);
+void Panel::updateFlipStep(qreal val)
+{
+ qreal finalxrot = xrot - xrot * val;
+ qreal finalyrot;
+ if (flipLeft)
+ finalyrot = yrot - yrot * val - 180 * val;
else
- flippingGroup->setDirection(QAbstractAnimation::Forward);
+ 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->start();
- flipped = !flipped;
+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;
+ }
}
-QPointF Panel::posForLocation(int index) const
+QPointF Panel::posForLocation(int x, int y) const
{
- const int x = index % width,
- y = index / width;
return QPointF(x * 150, y * 150)
- QPointF((width - 1) * 75, (height - 1) * 75);
}