Camera doesn't need to subclass QDeclarativeItem
[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 #include <QDeclarativeInfo>
28 #include <QPainter>
29 #include "qtcamdevice.h"
30
31 Viewfinder::Viewfinder(QDeclarativeItem *parent) :
32   QDeclarativeItem(parent),
33   m_renderer(0),
34   m_cam(0),
35   m_conf(0),
36   m_enabled(true) {
37
38   setFlag(QGraphicsItem::ItemHasNoContents, false);
39 }
40
41 Viewfinder::~Viewfinder() {
42
43 }
44
45 bool Viewfinder::isRenderingEnabled() const {
46   return m_enabled;
47 }
48
49 void Viewfinder::setRenderingEnabled(bool enabled) {
50   if (m_enabled != enabled) {
51     m_enabled = enabled;
52     emit renderingEnabledChanged();
53   }
54 }
55
56 Camera *Viewfinder::camera() const {
57   return m_cam;
58 }
59
60 void Viewfinder::setCamera(Camera *camera) {
61   if (m_cam == camera) {
62     return;
63   }
64
65   if (m_cam && m_cam != camera) {
66     qmlInfo(this) << "Cannot reset Camera";
67     return;
68   }
69
70   if (!camera) {
71     qmlInfo(this) << "Camera cannot be empty";
72     return;
73   }
74
75   if (m_cam) {
76     QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
77   }
78
79   m_cam = camera;
80
81   if (m_cam) {
82     QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
83   }
84
85   if (isComponentComplete()) {
86     deviceChanged();
87   }
88
89   emit cameraChanged();
90 }
91
92 CameraConfig *Viewfinder::cameraConfig() const {
93   return m_conf;
94 }
95
96 void Viewfinder::setCameraConfig(CameraConfig *config) {
97   if (m_conf && m_conf != config) {
98     qmlInfo(this) << "Cannot reset CameraConfig";
99     return;
100   }
101
102   if (!config) {
103     qmlInfo(this) << "CameraConfig cannot be empty";
104     return;
105   }
106
107   if (m_conf == config) {
108     return;
109   }
110
111   m_conf = config;
112
113   if (isComponentComplete()) {
114     deviceChanged();
115   }
116
117   emit cameraConfigChanged();
118 }
119
120 void Viewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
121                        QWidget *widget) {
122
123   Q_UNUSED(widget);
124   Q_UNUSED(option);
125
126   painter->fillRect(boundingRect(), Qt::black);
127
128   if (!m_renderer || !m_enabled) {
129     return;
130   }
131
132   m_renderer->paint(painter);
133 }
134
135 QRectF Viewfinder::renderArea() const {
136   return m_renderer ? m_renderer->renderArea() : QRectF();
137 }
138
139 QSizeF Viewfinder::videoResolution() const {
140   return m_renderer ? m_renderer->videoResolution() : QSizeF();
141 }
142
143 void Viewfinder::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) {
144   QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
145
146   if (m_renderer) {
147     m_renderer->resize(newGeometry.size());
148   }
149 }
150
151 void Viewfinder::componentComplete() {
152   if (!m_cam) {
153     qmlInfo(this) << "Camera not set";
154     return;
155   }
156
157   if (!m_conf) {
158     qmlInfo(this) << "CameraConfig not set";
159     return;
160   }
161
162   m_renderer = QtCamViewfinderRenderer::create(m_conf->config(), this);
163   if (!m_renderer) {
164     qmlInfo(this) << "Failed to create viewfinder renderer";
165     return;
166   }
167
168   m_renderer->resize(QSizeF(width(), height()));
169   QObject::connect(m_renderer, SIGNAL(updateRequested()), this, SLOT(updateRequested()));
170   QObject::connect(m_renderer, SIGNAL(renderAreaChanged()), this, SIGNAL(renderAreaChanged()));
171   QObject::connect(m_renderer, SIGNAL(videoResolutionChanged()), this, SIGNAL(videoResolutionChanged()));
172 }
173
174 void Viewfinder::deviceChanged() {
175   if (!m_renderer) {
176     qmlInfo(this) << "No renderer";
177     return;
178   }
179
180   QtCamDevice *dev = m_cam->device();
181
182   if (dev) {
183     dev->setViewfinder(this);
184   }
185
186   emit renderAreaChanged();
187   emit videoResolutionChanged();
188 }
189
190 GstElement *Viewfinder::sinkElement() {
191   return m_renderer ? m_renderer->sinkElement() : 0;
192 }
193
194 bool Viewfinder::setDevice(QtCamDevice *device) {
195   Q_UNUSED(device);
196
197   return true;
198 }
199
200 void Viewfinder::stop() {
201   if (m_renderer) {
202     m_renderer->reset();
203   }
204 }
205
206 void Viewfinder::updateRequested() {
207   if (m_enabled) {
208     update();
209   }
210 }