Cleaned up some commented out defines
[harmattan/cameraplus] / lib / qtcamgraphicsviewfinder.cpp
1 /*!
2  * This file is part of CameraPlus.
3  *
4  * Copyright (C) 2012 Mohammed Sameer <msameer@foolab.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21 #include "qtcamgraphicsviewfinder.h"
22 #include "qtcamconfig.h"
23 #include "qtcamdevice.h"
24 #include <QDebug>
25 #include "qtcamviewfinderrenderer.h"
26 #include <QPainter>
27 #include <QGraphicsSceneResizeEvent>
28
29 class QtCamGraphicsViewfinderPrivate {
30 public:
31   void ensureBackend() {
32     if (!renderer) {
33       renderer = QtCamViewfinderRenderer::create(conf, q_ptr);
34       if (!renderer) {
35         qCritical() << "Failed to create a viewfinder renderer";
36         return;
37       }
38
39       renderer->resize(q_ptr->size());
40       QObject::connect(renderer, SIGNAL(updateRequested()), q_ptr, SLOT(updateRequested()));
41       QObject::connect(renderer, SIGNAL(renderAreaChanged()), q_ptr, SIGNAL(renderAreaChanged()));
42       QObject::connect(renderer, SIGNAL(videoResolutionChanged()), q_ptr, SIGNAL(videoResolutionChanged()));
43     }
44   }
45
46   void resetBackend() {
47     if (renderer) {
48       renderer->reset();
49     }
50   }
51
52   QtCamViewfinderRenderer *renderer;
53   QtCamConfig *conf;
54   QtCamDevice *dev;
55   QtCamGraphicsViewfinder *q_ptr;
56 };
57
58 QtCamGraphicsViewfinder::QtCamGraphicsViewfinder(QtCamConfig *config, QGraphicsItem *parent) :
59   QGraphicsWidget(parent), d_ptr(new QtCamGraphicsViewfinderPrivate) {
60   d_ptr->conf = config;
61   d_ptr->dev = 0;
62   d_ptr->renderer = 0;
63   d_ptr->q_ptr = this;
64 }
65
66 QtCamGraphicsViewfinder::~QtCamGraphicsViewfinder() {
67   delete d_ptr->renderer;
68   delete d_ptr; d_ptr = 0;
69 }
70
71 GstElement *QtCamGraphicsViewfinder::sinkElement() {
72   d_ptr->ensureBackend();
73
74   if (!d_ptr->renderer) {
75     return 0;
76   }
77
78   return d_ptr->renderer->sinkElement();
79 }
80
81 bool QtCamGraphicsViewfinder::setDevice(QtCamDevice *device) {
82   if (device && d_ptr->dev == device) {
83     return true;
84   }
85
86   if (d_ptr->dev) {
87     qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be replaced.";
88     return false;
89   }
90
91   if (!device) {
92     qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be unset.";
93     return false;
94   }
95
96   // This is to break the loop.
97   d_ptr->dev = device;
98   if (!device->setViewfinder(this)) {
99     d_ptr->dev = 0;
100     return false;
101   }
102
103   d_ptr->resetBackend();
104
105   return true;
106 }
107
108 void QtCamGraphicsViewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
109                                     QWidget *widget) {
110   Q_UNUSED(widget);
111   Q_UNUSED(option);
112
113   painter->fillRect(boundingRect(), Qt::black);
114
115   if (!d_ptr->renderer) {
116     return;
117   }
118
119   d_ptr->renderer->paint(painter);
120 }
121
122 void QtCamGraphicsViewfinder::resizeEvent(QGraphicsSceneResizeEvent *event) {
123   QGraphicsWidget::resizeEvent(event);
124
125   if (!d_ptr->renderer) {
126     return;
127   }
128
129   d_ptr->renderer->resize(event->newSize());
130 }
131
132 void QtCamGraphicsViewfinder::updateRequested() {
133   update();
134 }
135
136 void QtCamGraphicsViewfinder::stop() {
137   d_ptr->resetBackend();
138 }
139
140 QRectF QtCamGraphicsViewfinder::renderArea() const {
141   if (!d_ptr->renderer) {
142     return QRectF();
143   }
144
145   return d_ptr->renderer->renderArea();
146 }
147
148 QSizeF QtCamGraphicsViewfinder::videoResolution() const {
149   if (!d_ptr->renderer) {
150     return QSizeF();
151   }
152
153   return d_ptr->renderer->videoResolution();
154 }