1 /****************************************************************************
2 **
3 ** Copyright (C) 2017 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the ActiveQt framework of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** BSD License Usage
18 ** Alternatively, you may use this file under the terms of the BSD license
19 ** as follows:
20 **
21 ** "Redistribution and use in source and binary forms, with or without
22 ** modification, are permitted provided that the following conditions are
23 ** met:
24 **   * Redistributions of source code must retain the above copyright
25 **     notice, this list of conditions and the following disclaimer.
26 **   * Redistributions in binary form must reproduce the above copyright
27 **     notice, this list of conditions and the following disclaimer in
28 **     the documentation and/or other materials provided with the
29 **     distribution.
30 **   * Neither the name of The Qt Company Ltd nor the names of its
31 **     contributors may be used to endorse or promote products derived
32 **     from this software without specific prior written permission.
33 **
34 **
35 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
36 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
38 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
39 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
45 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
46 **
47 ** $QT_END_LICENSE$
48 **
49 **
50 ****************************************************************************/
51 
52 /*
53   ORIGINAL COPYRIGHT HEADER
54   PictureFlow - animated image show widget
55   http://pictureflow.googlecode.com
56 
57   Copyright (C) 2007 Ariya Hidayat (ariya@kde.org)
58 
59   Permission is hereby granted, free of charge, to any person obtaining a copy
60   of this software and associated documentation files (the "Software"), to deal
61   in the Software without restriction, including without limitation the rights
62   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
63   copies of the Software, and to permit persons to whom the Software is
64   furnished to do so, subject to the following conditions:
65 
66   The above copyright notice and this permission notice shall be included in
67   all copies or substantial portions of the Software.
68 
69   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
70   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
71   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
72   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
73   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
74   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
75   THE SOFTWARE.
76 */
77 
78 #ifndef PICTUREFLOW_H
79 #define PICTUREFLOW_H
80 
81 #include <QWidget>
82 
83 class PictureFlowPrivate;
84 
85 /*!
86   Class PictureFlow implements an image show widget with animation effect
87   like Apple's CoverFlow (in iTunes and iPod). Images are arranged in form
88   of slides, one main slide is shown at the center with few slides on
89   the left and right sides of the center slide. When the next or previous
90   slide is brought to the front, the whole slides flow to the right or
91   the right with smooth animation effect; until the new slide is finally
92   placed at the center.
93 
94  */
95 class PictureFlow : public QWidget
96 {
97 Q_OBJECT
98 
99   Q_PROPERTY(int slideCount READ slideCount WRITE setSlideCount)
100   Q_PROPERTY(int currentSlide READ currentSlide WRITE setCurrentSlide)
101   Q_PROPERTY(QSize slideSize READ slideSize WRITE setSlideSize)
102   Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor)
103 
104 public:
105   /*!
106     Creates a new PictureFlow widget.
107   */
108   PictureFlow(QWidget* parent = 0);
109 
110   /*!
111     Destroys the widget.
112   */
113   ~PictureFlow();
114 
115   /*!
116     Returns the total number of slides.
117   */
118   int slideCount() const;
119 
120   /*!
121     Sets the total number of slides.
122   */
123   void setSlideCount(int count);
124 
125   /*!
126     Returns the dimension of each slide (in pixels).
127   */
128   QSize slideSize() const;
129 
130   /*!
131     Sets the dimension of each slide (in pixels).
132   */
133   void setSlideSize(QSize size);
134 
135   /*!
136     Sets the zoom factor (in percent).
137   */
138   void setZoomFactor(int zoom);
139 
140   /*!
141     Returns the zoom factor (in percent).
142   */
143   int zoomFactor() const;
144 
145   /*!
146     Clears any caches held to free up memory
147   */
148   void clearCaches();
149 
150   /*!
151     Returns QImage of specified slide.
152     This function will be called only whenever necessary, e.g. the 100th slide
153     will not be retrived when only the first few slides are visible.
154   */
155   virtual QImage slide(int index) const;
156 
157   /*!
158     Sets an image for specified slide. If the slide already exists,
159     it will be replaced.
160   */
161   virtual void setSlide(int index, const QImage& image);
162 
163   virtual void setSlideCaption(int index, QString caption);
164 
165   /*!
166     Sets a pixmap for specified slide. If the slide already exists,
167     it will be replaced.
168   */
169   virtual void setSlide(int index, const QPixmap& pixmap);
170 
171   /*!
172     Returns the index of slide currently shown in the middle of the viewport.
173   */
174   int currentSlide() const;
175 
176 public slots:
177 
178   /*!
179     Sets slide to be shown in the middle of the viewport. No animation
180     effect will be produced, unlike using showSlide.
181   */
182   void setCurrentSlide(int index);
183 
184   /*!
185     Clears images of all slides.
186   */
187   void clear();
188 
189   /*!
190     Rerender the widget. Normally this function will be automatically invoked
191     whenever necessary, e.g. during the transition animation.
192   */
193   void render();
194 
195   /*!
196     Shows previous slide using animation effect.
197   */
198   void showPrevious();
199 
200   /*!
201     Shows next slide using animation effect.
202   */
203   void showNext();
204 
205   /*!
206     Go to specified slide using animation effect.
207   */
208   void showSlide(int index);
209 
210 signals:
211   void itemActivated(int index);
212   void inputReceived();
213 
214 protected:
215   void paintEvent(QPaintEvent *event) override;
216   void keyPressEvent(QKeyEvent *event) override;
217   void mouseMoveEvent(QMouseEvent *event) override;
218   void mousePressEvent(QMouseEvent *event) override;
219   void mouseReleaseEvent(QMouseEvent *event) override;
220   void resizeEvent(QResizeEvent *event) override;
221   void timerEvent(QTimerEvent *event) override;
222 
223 private:
224   PictureFlowPrivate* d;
225 };
226 
227 #endif // PICTUREFLOW_H
228