demos/composition/composition.cpp
branchRCL_3
changeset 7 3f74d0d4af4c
parent 4 3b1da2848fc7
equal deleted inserted replaced
6:dee5afe5301f 7:3f74d0d4af4c
    45 #include <QTimer>
    45 #include <QTimer>
    46 #include <QDateTime>
    46 #include <QDateTime>
    47 #include <QSlider>
    47 #include <QSlider>
    48 #include <QMouseEvent>
    48 #include <QMouseEvent>
    49 #include <qmath.h>
    49 #include <qmath.h>
       
    50 
       
    51 const int animationInterval = 15; // update every 16 ms = ~60FPS
    50 
    52 
    51 CompositionWidget::CompositionWidget(QWidget *parent)
    53 CompositionWidget::CompositionWidget(QWidget *parent)
    52     : QWidget(parent)
    54     : QWidget(parent)
    53 {
    55 {
    54     CompositionRenderer *view = new CompositionRenderer(this);
    56     CompositionRenderer *view = new CompositionRenderer(this);
   234 
   236 
   235 CompositionRenderer::CompositionRenderer(QWidget *parent)
   237 CompositionRenderer::CompositionRenderer(QWidget *parent)
   236     : ArthurFrame(parent)
   238     : ArthurFrame(parent)
   237 {
   239 {
   238     m_animation_enabled = true;
   240     m_animation_enabled = true;
       
   241     m_animationTimer = startTimer(animationInterval);
   239 #ifdef Q_WS_QWS
   242 #ifdef Q_WS_QWS
   240     m_image = QPixmap(":res/composition/flower.jpg");
   243     m_image = QPixmap(":res/composition/flower.jpg");
   241     m_image.setAlphaChannel(QPixmap(":res/composition/flower_alpha.jpg"));
   244     m_image.setAlphaChannel(QPixmap(":res/composition/flower_alpha.jpg"));
   242 #else
   245 #else
   243     m_image = QImage(":res/composition/flower.jpg");
   246     m_image = QImage(":res/composition/flower.jpg");
   260 QRectF rectangle_around(const QPointF &p, const QSizeF &size = QSize(250, 200))
   263 QRectF rectangle_around(const QPointF &p, const QSizeF &size = QSize(250, 200))
   261 {
   264 {
   262     QRectF rect(p, size);
   265     QRectF rect(p, size);
   263     rect.translate(-size.width()/2, -size.height()/2);
   266     rect.translate(-size.width()/2, -size.height()/2);
   264     return rect;
   267     return rect;
       
   268 }
       
   269 
       
   270 void CompositionRenderer::setAnimationEnabled(bool enabled)
       
   271 {
       
   272     if (m_animation_enabled == enabled)
       
   273         return;
       
   274     m_animation_enabled = enabled;
       
   275     if (enabled) {
       
   276         Q_ASSERT(!m_animationTimer);
       
   277         m_animationTimer = startTimer(animationInterval);
       
   278     } else {
       
   279         killTimer(m_animationTimer);
       
   280         m_animationTimer = 0;
       
   281     }
   265 }
   282 }
   266 
   283 
   267 void CompositionRenderer::updateCirclePos()
   284 void CompositionRenderer::updateCirclePos()
   268 {
   285 {
   269     if (m_current_object != NoObject)
   286     if (m_current_object != NoObject)
   469         painter->drawPixmap(0, 0, m_buffer);
   486         painter->drawPixmap(0, 0, m_buffer);
   470 #else
   487 #else
   471         painter->drawImage(0, 0, m_buffer);
   488         painter->drawImage(0, 0, m_buffer);
   472 #endif
   489 #endif
   473     }
   490     }
   474 
       
   475     if (m_animation_enabled && m_current_object == NoObject) {
       
   476         updateCirclePos();
       
   477     }
       
   478 }
   491 }
   479 
   492 
   480 void CompositionRenderer::mousePressEvent(QMouseEvent *e)
   493 void CompositionRenderer::mousePressEvent(QMouseEvent *e)
   481 {
   494 {
   482     setDescriptionEnabled(false);
   495     setDescriptionEnabled(false);
   487         m_current_object = Circle;
   500         m_current_object = Circle;
   488         m_offset = circle.center() - e->pos();
   501         m_offset = circle.center() - e->pos();
   489     } else {
   502     } else {
   490         m_current_object = NoObject;
   503         m_current_object = NoObject;
   491     }
   504     }
       
   505     if (m_animation_enabled) {
       
   506         killTimer(m_animationTimer);
       
   507         m_animationTimer = 0;
       
   508     }
   492 }
   509 }
   493 
   510 
   494 void CompositionRenderer::mouseMoveEvent(QMouseEvent *e)
   511 void CompositionRenderer::mouseMoveEvent(QMouseEvent *e)
   495 {
   512 {
   496     if (m_current_object == Circle) setCirclePos(e->pos() + m_offset);
   513     if (m_current_object == Circle) setCirclePos(e->pos() + m_offset);
   498 
   515 
   499 void CompositionRenderer::mouseReleaseEvent(QMouseEvent *)
   516 void CompositionRenderer::mouseReleaseEvent(QMouseEvent *)
   500 {
   517 {
   501     m_current_object = NoObject;
   518     m_current_object = NoObject;
   502 
   519 
   503     if (m_animation_enabled)
   520     if (m_animation_enabled) {
       
   521         Q_ASSERT(!m_animationTimer);
       
   522         m_animationTimer = startTimer(animationInterval);
       
   523     }
       
   524 }
       
   525 
       
   526 void CompositionRenderer::timerEvent(QTimerEvent *event)
       
   527 {
       
   528     if (event->timerId() == m_animationTimer)
   504         updateCirclePos();
   529         updateCirclePos();
   505 }
   530 }
   506 
   531 
   507 void CompositionRenderer::setCirclePos(const QPointF &pos)
   532 void CompositionRenderer::setCirclePos(const QPointF &pos)
   508 {
   533 {