Initial implementation
[harmattan/cameraplus] / lib / qtcamgraphicsviewfinder.cpp
1 #include "qtcamgraphicsviewfinder.h"
2 #include "qtcamconfig.h"
3 #include "qtcamdevice.h"
4 #include <QDebug>
5 #include "qtcamviewfinderrenderer.h"
6 #include <QPainter>
7 #include <QGraphicsSceneResizeEvent>
8
9 class QtCamGraphicsViewfinderPrivate {
10 public:
11   void ensureBackend() {
12     if (!renderer) {
13       renderer = QtCamViewfinderRenderer::create(conf, q_ptr);
14       renderer->resize(q_ptr->size());
15       QObject::connect(renderer, SIGNAL(updateRequested()), q_ptr, SLOT(updateRequested()));
16     }
17   }
18
19   void resetBackend() {
20     if (renderer) {
21       renderer->reset();
22     }
23   }
24
25   QtCamViewfinderRenderer *renderer;
26   QtCamConfig *conf;
27   QtCamDevice *dev;
28   QtCamGraphicsViewfinder *q_ptr;
29 };
30
31 QtCamGraphicsViewfinder::QtCamGraphicsViewfinder(QtCamConfig *config, QGraphicsItem *parent) :
32   QGraphicsWidget(parent), d_ptr(new QtCamGraphicsViewfinderPrivate) {
33   d_ptr->conf = config;
34   d_ptr->dev = 0;
35   d_ptr->renderer = 0;
36   d_ptr->q_ptr = this;
37 }
38
39 QtCamGraphicsViewfinder::~QtCamGraphicsViewfinder() {
40   delete d_ptr; d_ptr = 0;
41 }
42
43 GstElement *QtCamGraphicsViewfinder::sinkElement() {
44   d_ptr->ensureBackend();
45
46   return d_ptr->renderer->sinkElement();
47 }
48
49 bool QtCamGraphicsViewfinder::setDevice(QtCamDevice *device) {
50   if (device && d_ptr->dev == device) {
51     return true;
52   }
53
54   if (d_ptr->dev) {
55     qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be replaced.";
56     return false;
57   }
58
59   if (!device) {
60     qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be unset.";
61     return false;
62   }
63
64   // This is to break the loop.
65   d_ptr->dev = device;
66   if (!device->setViewfinder(this)) {
67     d_ptr->dev = 0;
68     return false;
69   }
70
71   d_ptr->resetBackend();
72
73   return true;
74 }
75
76 void QtCamGraphicsViewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
77                                     QWidget *widget) {
78   Q_UNUSED(widget);
79   Q_UNUSED(option);
80
81   painter->fillRect(boundingRect(), Qt::black);
82
83   if (!d_ptr->renderer) {
84     return;
85   }
86
87   d_ptr->renderer->paint(painter);
88 }
89
90 void QtCamGraphicsViewfinder::resizeEvent(QGraphicsSceneResizeEvent *event) {
91   QGraphicsWidget::resizeEvent(event);
92
93   if (!d_ptr->renderer) {
94     return;
95   }
96
97   d_ptr->renderer->resize(event->newSize());
98 }
99
100 void QtCamGraphicsViewfinder::updateRequested() {
101   update();
102 }