Renamed imports to declarative and libimports to libdeclarativeqtcamera
[harmattan/cameraplus] / declarative / mode.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 "mode.h"
22 #include "qtcammode.h"
23 #include "camera.h"
24 #include "qtcamdevice.h"
25 #include "previewprovider.h"
26
27 Mode::Mode(QObject *parent) :
28   QObject(parent),
29   m_cam(0),
30   m_mode(0),
31   m_seq(0) {
32
33 }
34
35 Mode::~Mode() {
36   m_cam = 0;
37   m_mode = 0;
38 }
39
40 Camera *Mode::camera() {
41   return m_cam;
42 }
43
44 void Mode::setCamera(Camera *camera) {
45   if (camera == m_cam) {
46     return;
47   }
48
49   if (m_cam) {
50     QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
51     QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SIGNAL(isReadyChanged()));
52   }
53
54   m_cam = camera;
55
56   if (m_cam) {
57     QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
58     QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SIGNAL(isReadyChanged()));
59   }
60
61   emit cameraChanged();
62
63   deviceChanged();
64
65   emit isReadyChanged();
66 }
67
68 bool Mode::isActive() {
69   return m_mode ? m_mode->isActive() : false;
70 }
71
72 bool Mode::canCapture() {
73   return m_mode ? m_mode->canCapture() : false;
74 }
75
76 void Mode::deviceChanged() {
77   if (m_mode) {
78     QObject::disconnect(m_mode, SIGNAL(canCaptureChanged()), this, SIGNAL(canCaptureChanged()));
79     QObject::disconnect(m_mode, SIGNAL(saved(const QString&)),
80                         this, SIGNAL(saved(const QString&)));
81     QObject::disconnect(m_mode, SIGNAL(previewAvailable(const QImage&, const QString&)),
82                         this, SLOT(gotPreview(const QImage&, const QString&)));
83     QObject::disconnect(m_mode, SIGNAL(activeChanged()), this, SIGNAL(activeChanged()));
84     QObject::disconnect(m_mode, SIGNAL(activeChanged()), this, SIGNAL(canCaptureChanged()));
85     QObject::disconnect(m_cam->device(), SIGNAL(idleStateChanged(bool)),
86                         this, SIGNAL(canCaptureChanged()));
87     QObject::disconnect(m_cam->device(), SIGNAL(runningStateChanged(bool)),
88                         this, SIGNAL(canCaptureChanged()));
89
90     preChangeMode();
91   }
92
93   if (!m_cam || !m_cam->device()) {
94     return;
95   }
96
97   changeMode();
98
99   if (m_mode) {
100     QObject::connect(m_mode, SIGNAL(canCaptureChanged()), this, SIGNAL(canCaptureChanged()));
101     QObject::connect(m_mode, SIGNAL(saved(const QString&)), this, SIGNAL(saved(const QString&)));
102     QObject::connect(m_mode, SIGNAL(previewAvailable(const QImage&, const QString&)),
103                      this, SLOT(gotPreview(const QImage&, const QString&)));
104     QObject::connect(m_mode, SIGNAL(activeChanged()), this, SIGNAL(activeChanged()));
105     QObject::connect(m_mode, SIGNAL(activeChanged()), this, SIGNAL(canCaptureChanged()));
106     QObject::connect(m_cam->device(), SIGNAL(idleStateChanged(bool)),
107                      this, SIGNAL(canCaptureChanged()));
108     QObject::connect(m_cam->device(), SIGNAL(runningStateChanged(bool)),
109                      this, SIGNAL(canCaptureChanged()));
110
111     postChangeMode();
112   }
113
114   emit canCaptureChanged();
115   emit activeChanged();
116 }
117
118 void Mode::gotPreview(const QImage& image, const QString& fileName) {
119   PreviewProvider::instance()->setPreview(image);
120
121   // HACK: QML insists on caching the images.
122   QString url = QString("image://preview/%1").arg(m_seq);
123   ++m_seq;
124
125   emit previewAvailable(url, fileName);
126 }
127
128 bool Mode::isReady() const {
129   return m_mode;
130 }