Fixed VideoPlayerPage.qml failure to set cameraConfig
[harmattan/cameraplus] / declarative / viewfinder.cpp
1 // -*- c++ -*-
2
3 /*!
4  * This file is part of CameraPlus.
5  *
6  * Copyright (C) 2012-2013 Mohammed Sameer <msameer@foolab.org>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
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, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  */
22
23 #include "viewfinder.h"
24 #include "camera.h"
25 #include "cameraconfig.h"
26 #include "qtcamviewfinderrenderer.h"
27 #if defined(QT4)
28 #include <QDeclarativeInfo>
29 #elif defined(QT5)
30 #include <QQmlInfo>
31 #endif
32 #include <QPainter>
33 #include "qtcamdevice.h"
34
35 #if defined(QT4)
36 Viewfinder::Viewfinder(QDeclarativeItem *parent) :
37   QDeclarativeItem(parent),
38 #elif defined(QT5)
39 Viewfinder::Viewfinder(QQuickItem *parent) :
40   QQuickPaintedItem(parent),
41 #endif
42   m_renderer(0),
43   m_cam(0),
44   m_conf(0),
45   m_enabled(true) {
46
47 #if defined(QT4)
48   setFlag(QGraphicsItem::ItemHasNoContents, false);
49 #endif
50 }
51
52 Viewfinder::~Viewfinder() {
53
54 }
55
56 bool Viewfinder::isRenderingEnabled() const {
57   return m_enabled;
58 }
59
60 void Viewfinder::setRenderingEnabled(bool enabled) {
61   if (m_enabled != enabled) {
62     m_enabled = enabled;
63     emit renderingEnabledChanged();
64   }
65 }
66
67 Camera *Viewfinder::camera() const {
68   return m_cam;
69 }
70
71 void Viewfinder::setCamera(Camera *camera) {
72   if (m_cam == camera) {
73     return;
74   }
75
76   if (m_cam && m_cam != camera) {
77     qmlInfo(this) << "Cannot reset Camera";
78     return;
79   }
80
81   if (!camera) {
82     qmlInfo(this) << "Camera cannot be empty";
83     return;
84   }
85
86   if (m_cam) {
87     QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
88   }
89
90   m_cam = camera;
91
92   if (m_cam) {
93     QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
94   }
95
96   if (isComponentComplete()) {
97     deviceChanged();
98   }
99
100   emit cameraChanged();
101 }
102
103 CameraConfig *Viewfinder::cameraConfig() const {
104   return m_conf;
105 }
106
107 void Viewfinder::setCameraConfig(CameraConfig *config) {
108   if (m_conf && m_conf != config) {
109     qmlInfo(this) << "Cannot reset CameraConfig";
110     return;
111   }
112
113   if (!config) {
114     qmlInfo(this) << "CameraConfig cannot be empty";
115     return;
116   }
117
118   if (m_conf == config) {
119     return;
120   }
121
122   m_conf = config;
123
124   if (isComponentComplete()) {
125     deviceChanged();
126   }
127
128   emit cameraConfigChanged();
129 }
130
131 #if defined(QT4)
132 void Viewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
133                        QWidget *widget) {
134
135   Q_UNUSED(widget);
136   Q_UNUSED(option);
137 #elif defined(QT5)
138 void Viewfinder::paint(QPainter *painter) {
139 #endif
140   painter->fillRect(boundingRect(), Qt::black);
141
142   if (!m_renderer || !m_enabled) {
143     return;
144   }
145
146   m_renderer->paint(painter);
147 }
148
149 QRectF Viewfinder::renderArea() const {
150   return m_renderer ? m_renderer->renderArea() : QRectF();
151 }
152
153 QSizeF Viewfinder::videoResolution() const {
154   return m_renderer ? m_renderer->videoResolution() : QSizeF();
155 }
156
157 void Viewfinder::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) {
158 #if defined(QT4)
159   QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
160 #elif defined(QT5)
161   QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry);
162 #endif
163
164   if (m_renderer) {
165     m_renderer->resize(newGeometry.size());
166   }
167 }
168
169 void Viewfinder::componentComplete() {
170   if (!m_cam) {
171     qmlInfo(this) << "Camera not set";
172     return;
173   }
174
175   if (!m_conf) {
176     qmlInfo(this) << "CameraConfig not set";
177     return;
178   }
179
180   m_renderer = QtCamViewfinderRenderer::create(m_conf->config(), this);
181   if (!m_renderer) {
182     qmlInfo(this) << "Failed to create viewfinder renderer";
183     return;
184   }
185
186   m_renderer->resize(QSizeF(width(), height()));
187   QObject::connect(m_renderer, SIGNAL(updateRequested()), this, SLOT(updateRequested()));
188   QObject::connect(m_renderer, SIGNAL(renderAreaChanged()), this, SIGNAL(renderAreaChanged()));
189   QObject::connect(m_renderer, SIGNAL(videoResolutionChanged()), this, SIGNAL(videoResolutionChanged()));
190 }
191
192 void Viewfinder::deviceChanged() {
193   if (!m_renderer) {
194     qmlInfo(this) << "No renderer";
195     return;
196   }
197
198   QtCamDevice *dev = m_cam->device();
199
200   if (dev) {
201     dev->setViewfinder(this);
202   }
203
204   emit renderAreaChanged();
205   emit videoResolutionChanged();
206 }
207
208 GstElement *Viewfinder::sinkElement() {
209   return m_renderer ? m_renderer->sinkElement() : 0;
210 }
211
212 bool Viewfinder::setDevice(QtCamDevice *device) {
213   Q_UNUSED(device);
214
215   return true;
216 }
217
218 void Viewfinder::stop() {
219   if (m_renderer) {
220     m_renderer->reset();
221   }
222 }
223
224 void Viewfinder::updateRequested() {
225   if (m_enabled) {
226     update();
227   }
228 }