summaryrefslogtreecommitdiffstats
path: root/examples/graphicsview
diff options
context:
space:
mode:
Diffstat (limited to 'examples/graphicsview')
-rw-r--r--examples/graphicsview/padnavigator/images/artsfftscope.pngbin1291 -> 1290 bytes
-rw-r--r--examples/graphicsview/padnavigator/main.cpp4
-rw-r--r--examples/graphicsview/padnavigator/panel.cpp168
-rw-r--r--examples/graphicsview/padnavigator/panel.h29
-rw-r--r--examples/graphicsview/padnavigator/roundrectitem.cpp114
-rw-r--r--examples/graphicsview/padnavigator/roundrectitem.h16
-rw-r--r--examples/graphicsview/padnavigator/splashitem.cpp25
-rw-r--r--examples/graphicsview/padnavigator/splashitem.h6
8 files changed, 154 insertions, 208 deletions
diff --git a/examples/graphicsview/padnavigator/images/artsfftscope.png b/examples/graphicsview/padnavigator/images/artsfftscope.png
index 4db003f..756a1cf 100644
--- a/examples/graphicsview/padnavigator/images/artsfftscope.png
+++ b/examples/graphicsview/padnavigator/images/artsfftscope.png
Binary files differ
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;
};