browsercore/appfw/Common/PictureFlow.h
changeset 0 1450b09d0cfd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browsercore/appfw/Common/PictureFlow.h	Tue May 04 12:39:35 2010 +0300
@@ -0,0 +1,379 @@
+/*
+  PictureFlow - animated image show widget
+  http://pictureflow.googlecode.com
+
+  Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+  Copyright (C) 2008 Ariya Hidayat (ariya@kde.org)
+  Copyright (C) 2007 Ariya Hidayat (ariya@kde.org)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  THE SOFTWARE.
+*/
+
+#ifndef PICTUREFLOW_H
+#define PICTUREFLOW_H
+
+#include <qwidget.h>
+#include "FlowInterface.h"
+
+namespace WRT {
+
+class PictureFlowPrivate;
+
+enum ReflectionEffect
+{
+    NoReflection,
+    PlainReflection,
+    BlurredReflection
+};
+
+/*!
+  Class PictureFlow implements an image show widget with animation effect 
+  like Apple's CoverFlow (in iTunes and iPod). Images are arranged in form 
+  of slides, one main slide is shown at the center with few slides on 
+  the left and right sides of the center slide. When the next or previous 
+  slide is brought to the front, the whole slides flow to the right or 
+  the right with smooth animation effect; until the new slide is finally 
+  placed at the center.
+
+ */ 
+class PictureFlow : public FlowInterface 
+{
+Q_OBJECT
+
+  Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)
+  Q_PROPERTY(QSize slideSize READ slideSize WRITE setSlideSize)
+  Q_PROPERTY(int slideCount READ slideCount)
+  Q_PROPERTY(int centerIndex READ centerIndex WRITE setCenterIndex)
+
+public:
+
+
+
+  /*!
+    Creates a new PictureFlow widget.
+  */  
+  PictureFlow(QWidget* parent = 0);
+
+  /*!
+    Destroys the widget.
+  */
+  ~PictureFlow();
+
+  /*!
+    Returns the background color.
+  */
+  QColor backgroundColor() const;
+
+  /*!
+    Sets the background color. By default it is black.
+  */
+  void setBackgroundColor(const QColor& c);
+
+  /*!
+    Returns the dimension of each slide (in pixels).
+  */  
+  QSize slideSize() const;
+
+  /*!
+    Sets the dimension of each slide (in pixels).
+  */  
+  void setSlideSize(QSize size);
+
+  /*!
+    Returns the total number of slides.
+  */
+  int slideCount() const;
+
+  /*!
+    Returns QImage of specified slide.
+  */  
+  QImage slide(int index) const;
+
+  /*!
+    Returns the index of slide currently shown in the middle of the viewport.
+  */  
+  int centerIndex() const;
+
+  /*!
+    Return true if slide animation is ongoing
+  */
+  bool slideAnimationOngoing() const;
+
+  /*!
+    Returns the effect applied to the reflection.
+  */  
+  ReflectionEffect reflectionEffect() const;
+
+  /*!
+    Sets the effect applied to the reflection. The default is PlainReflection.
+  */  
+  void setReflectionEffect(ReflectionEffect effect);
+
+  QRect centralRect() const;
+
+  void init();
+  
+public slots:
+
+  /*!
+    Adds a new slide.
+  */  
+  void addSlide(const QImage& image);
+
+  /*!
+    Adds a new slide.
+  */  
+  void addSlide(const QPixmap& pixmap);
+
+  /*!
+    Sets an image for specified slide. If the slide already exists,
+    it will be replaced.
+  */  
+  void setSlide(int index, const QImage& image);
+
+  /*!
+    Sets a pixmap for specified slide. If the slide already exists,
+    it will be replaced.
+  */  
+  void setSlide(int index, const QPixmap& pixmap);
+
+  /*!
+    Sets slide to be shown in the middle of the viewport. No animation 
+    effect will be produced, unlike using showSlide.
+  */  
+  void setCenterIndex(int index);
+
+  /*!
+    Clears all slides.
+  */
+  void clear();
+
+  /*!
+    Shows previous slide using animation effect.
+  */
+  void showPrevious();
+
+  /*!
+    Shows next slide using animation effect.
+  */
+  void showNext();
+
+  /*!
+    Go to specified slide using animation effect.
+  */
+  void showSlide(int index);
+
+  /*!
+    Rerender the widget. Normally this function will be automatically invoked
+    whenever necessary, e.g. during the transition animation.
+  */
+  void render();
+
+  /*!
+    Schedules a rendering update. Unlike render(), this function does not cause
+    immediate rendering.
+  */  
+  void triggerRender();
+
+signals:
+  void centerIndexChanged(int index);
+  void ok(int index);
+  void cancel();
+
+protected:
+  void paintEvent(QPaintEvent *event);
+  void keyPressEvent(QKeyEvent* event);
+  void mousePressEvent(QMouseEvent* event);
+  void resizeEvent(QResizeEvent* event);
+  void mouseMoveEvent(QMouseEvent* event);
+  void mouseReleaseEvent(QMouseEvent* event);
+
+private slots:
+  void updateAnimation();
+  void scroll();
+  
+private:
+  PictureFlowPrivate* d;
+  QTimer* m_scrollTimer;
+  QPoint m_lastMoveEventPos;
+};
+
+class GraphicsPictureFlow : public GraphicsFlowInterface 
+{
+Q_OBJECT
+
+  Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)
+  Q_PROPERTY(QSize slideSize READ slideSize WRITE setSlideSize)
+  Q_PROPERTY(int slideCount READ slideCount)
+  Q_PROPERTY(int centerIndex READ centerIndex WRITE setCenterIndex)
+
+public:
+
+  /*!
+    Creates a new PictureFlow widget.
+  */  
+  GraphicsPictureFlow(QObject* parent = 0);
+
+  /*!
+    Destroys the widget.
+  */
+  ~GraphicsPictureFlow();
+
+  /*!
+    Returns the background color.
+  */
+  QColor backgroundColor() const;
+
+  /*!
+    Sets the background color. By default it is black.
+  */
+  void setBackgroundColor(const QColor& c);
+
+  /*!
+    Returns the dimension of each slide (in pixels).
+  */  
+  QSize slideSize() const;
+
+  /*!
+    Sets the dimension of each slide (in pixels).
+  */  
+  void setSlideSize(QSize size);
+
+  /*!
+    Returns the total number of slides.
+  */
+  int slideCount() const;
+
+  /*!
+    Returns QImage of specified slide.
+  */  
+  QImage slide(int index) const;
+
+  /*!
+    Returns the index of slide currently shown in the middle of the viewport.
+  */  
+  int centerIndex() const;
+
+  /*!
+    Return true if slide animation is ongoing
+  */
+  bool slideAnimationOngoing() const;
+
+  /*!
+    Returns the effect applied to the reflection.
+  */  
+  ReflectionEffect reflectionEffect() const;
+
+  /*!
+    Sets the effect applied to the reflection. The default is PlainReflection.
+  */  
+  void setReflectionEffect(ReflectionEffect effect);
+
+  QRect centralRect() const;
+
+  void init();
+  
+public slots:
+
+  /*!
+    Adds a new slide.
+  */  
+  void addSlide(const QImage& image);
+
+  /*!
+    Adds a new slide.
+  */  
+  void addSlide(const QPixmap& pixmap);
+
+  /*!
+    Sets an image for specified slide. If the slide already exists,
+    it will be replaced.
+  */  
+  void setSlide(int index, const QImage& image);
+
+  /*!
+    Sets a pixmap for specified slide. If the slide already exists,
+    it will be replaced.
+  */  
+  void setSlide(int index, const QPixmap& pixmap);
+
+  /*!
+    Sets slide to be shown in the middle of the viewport. No animation 
+    effect will be produced, unlike using showSlide.
+  */  
+  void setCenterIndex(int index);
+
+  /*!
+    Clears all slides.
+  */
+  void clear();
+
+  /*!
+    Shows previous slide using animation effect.
+  */
+  void showPrevious();
+
+  /*!
+    Shows next slide using animation effect.
+  */
+  void showNext();
+
+  /*!
+    Go to specified slide using animation effect.
+  */
+  void showSlide(int index);
+
+  /*!
+    Rerender the widget. Normally this function will be automatically invoked
+    whenever necessary, e.g. during the transition animation.
+  */
+  void render();
+
+  /*!
+    Schedules a rendering update. Unlike render(), this function does not cause
+    immediate rendering.
+  */  
+  void triggerRender();
+
+signals:
+  void centerIndexChanged(int index);
+  void ok(int index);
+  void cancel();
+
+protected:
+  void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0); 
+  void resizeEvent(QGraphicsSceneResizeEvent* event); 
+  void keyPressEvent(QKeyEvent* event);
+  void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
+  void mousePressEvent(QGraphicsSceneMouseEvent* event);
+  void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
+
+private slots:
+  void updateAnimation();
+  void scroll();
+  
+private:
+  PictureFlowPrivate* d;
+  QTimer* m_scrollTimer;
+  QPoint m_lastMoveEventPos;
+};
+
+}
+#endif // PICTUREFLOW_H
+