1/* This file is part of the KDE project
2 Copyright (C) 2005-2007 Matthias Kretz <kretz@kde.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) version 3, or any
8 later version accepted by the membership of KDE e.V. (or its
9 successor approved by the membership of KDE e.V.), Nokia Corporation
10 (or its successors, if any) and the KDE Free Qt Foundation, which shall
11 act as a proxy defined in Section 6 of version 3 of the license.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library. If not, see <http://www.gnu.org/licenses/>.
20
21*/
22#ifndef Phonon_VIDEOWIDGET_H
23#define Phonon_VIDEOWIDGET_H
24
25#include "phonon_export.h"
26#include "phonondefs.h"
27#include "abstractvideooutput.h"
28#include <QtGui/QWidget>
29
30QT_BEGIN_HEADER
31QT_BEGIN_NAMESPACE
32
33class QString;
34
35#ifndef QT_NO_PHONON_VIDEO
36
37namespace Phonon
38{
39class AbstractVideoOutput;
40 class VideoWidgetPrivate;
41 /** \class VideoWidget videowidget.h Phonon/VideoWidget
42 * \short Widget to display video.
43 *
44 * This widget shows the video signal.
45 *
46 * \code
47 * MediaObject *media = new MediaObject(parent);
48 * VideoWidget *vwidget = new VideoWidget(parent);
49 * Phonon::createPath(media, vwidget);
50 * \endcode
51 *
52 * \ingroup PhononVideo
53 * \ingroup PhononWidgets
54 * \author Matthias Kretz <kretz@kde.org>
55 */
56 class PHONON_EXPORT VideoWidget : public QWidget, public Phonon::AbstractVideoOutput
57 {
58 K_DECLARE_PRIVATE(VideoWidget)
59 Q_OBJECT
60 Q_ENUMS(AspectRatio ScaleMode)
61 /**
62 * This property holds whether the video is shown using the complete
63 * screen.
64 *
65 * The property differs from QWidget::fullScreen in that it is
66 * writeable.
67 *
68 * By default the widget is not shown in fullScreen.
69 *
70 * \warning When switching the video to fullscreen using setFullScreen
71 * your application loses control over the widget that actually shows
72 * the video (which is then shown as a toplevel window while your
73 * application still uses this widget). If you only need to capture key
74 * events the event forwarding done internally should suffice for your
75 * needs. If you need to map mouse coordinates or add widgets (that are
76 * not overlays) you should probably handle fullscreen yourself.
77 */
78 Q_PROPERTY(bool fullScreen READ isFullScreen WRITE setFullScreen)
79 /**
80 *
81 * Defaults to AspectRatioAuto.
82 *
83 * \see AspectRatio
84 */
85 Q_PROPERTY(AspectRatio aspectRatio READ aspectRatio WRITE setAspectRatio)
86
87 /**
88 * If the size of the widget and the size of the video are not equal.
89 * The video will be zoomed to fit the widget. The smaller zoom
90 * (AddBarsScaleMode) adds black bars at the left/right or top/bottom to
91 * make all of the image visible (default). The bigger zoom (ExpandMode)
92 * fills the widget completely, keeping all information in one direction
93 * and leaving parts of the image outside of the widget in the other
94 * direction.
95 */
96 Q_PROPERTY(ScaleMode scaleMode READ scaleMode WRITE setScaleMode)
97
98 /**
99 * This property holds brightness of the video.
100 *
101 * Default is 0. Acceptable values are in range of -1, 1.
102 */
103 Q_PROPERTY(qreal brightness READ brightness WRITE setBrightness)
104 /**
105 * This property holds the contrast of the video.
106 *
107 * Default is 0. Acceptable values are in range of -1, 1.
108 */
109 Q_PROPERTY(qreal contrast READ contrast WRITE setContrast)
110 /**
111 * This property holds the hue of the video.
112 *
113 * Default is 0. Acceptable values are in range of -1, 1.
114 */
115 Q_PROPERTY(qreal hue READ hue WRITE setHue)
116 /**
117 * This property holds saturation of the video.
118 *
119 * Default is 0. Acceptable values are in range of -1, 1.
120 */
121 Q_PROPERTY(qreal saturation READ saturation WRITE setSaturation)
122
123 public:
124 /**
125 * Defines the width:height to be used for the video.
126 */
127 enum AspectRatio
128 {
129 /**
130 * Let the decoder find the aspect ratio automatically from the
131 * media file (this is the default).
132 */
133 AspectRatioAuto = 0,
134 /**
135 * Fits the video into the widget making the aspect ratio depend
136 * solely on the size of the widget. This way the aspect ratio
137 * is freely resizeable by the user.
138 */
139 AspectRatioWidget = 1,
140 /**
141 * Make width/height == 4/3, which is the old TV size and
142 * monitor size (1024/768 == 4/3). (4:3)
143 */
144 AspectRatio4_3 = 2,
145 /**
146 * Make width/height == 16/9, which is the size of most current
147 * media. (16:9)
148 */
149 AspectRatio16_9 = 3
150//X /**
151//X * Assume that every pixel of the video image needs to be displayed with the same
152//X * physical width and height. (1:1 image pixels, not imagewidth
153//X * = imageheight)
154//X */
155//X AspectRatioSquare = 4,
156 };
157
158 enum ScaleMode {
159 FitInView = 0,
160 ScaleAndCrop = 1
161 };
162
163 /**
164 * Constructs a new video widget with a \p parent.
165 */
166 VideoWidget(QWidget *parent = 0);
167
168 AspectRatio aspectRatio() const;
169 ScaleMode scaleMode() const;
170
171 qreal brightness() const;
172 qreal contrast() const;
173 qreal hue() const;
174 qreal saturation() const;
175 QImage snapshot() const;
176
177 //TODO: bar colors property
178 public Q_SLOTS:
179 void setFullScreen(bool fullscreen);
180
181 /**
182 * Convenience slot, calling setFullScreen(false)
183 */
184 void exitFullScreen();
185
186 /**
187 * Convenience slot, calling setFullScreen(true)
188 */
189 void enterFullScreen();
190
191 void setAspectRatio(AspectRatio);
192 void setScaleMode(ScaleMode);
193
194 void setBrightness(qreal value);
195 void setContrast(qreal value);
196 void setHue(qreal value);
197 void setSaturation(qreal value);
198
199 protected:
200 /**
201 * \internal
202 *
203 * Constructs a new video widget with private data pointer \p d and
204 * a \p parent.
205 */
206 VideoWidget(VideoWidgetPrivate &d, QWidget *parent);
207
208 void mouseMoveEvent(QMouseEvent *);
209 bool event(QEvent *);
210 };
211
212} //namespace Phonon
213
214#endif //QT_NO_PHONON_VIDEO
215
216QT_END_NAMESPACE
217QT_END_HEADER
218
219// vim: sw=4 ts=4 tw=80
220#endif // Phonon_VIDEOWIDGET_H
221