4e6c2e5fa851fe858bb5e78dc177c51441150e82
[harmattan/cameraplus] / imports / camera.cpp
1 #include "camera.h"
2 #include "qtcamera.h"
3 #include "qtcamdevice.h"
4 #include "qtcammode.h"
5 #include "qtcamimagemode.h"
6 #include "qtcamvideomode.h"
7 #include "qtcamgraphicsviewfinder.h"
8 #include "qtcamconfig.h"
9
10 // TODO: a viewfinder class that inherits QDeclarativeItem
11
12 Camera::Camera(QDeclarativeItem *parent) :
13   QDeclarativeItem(parent),
14   m_cam(new QtCamera(this)),
15   m_dev(0),
16   m_vf(new QtCamGraphicsViewfinder(m_cam->config(), this)),
17   m_mode(Camera::ImageMode) {
18
19   // TODO:
20 }
21
22 Camera::~Camera() {
23   // TODO:
24 }
25
26 void Camera::componentComplete() {
27   QDeclarativeItem::componentComplete();
28
29   if (m_id.isValid()) {
30     QVariant oldId = m_id;
31     m_id = QVariant();
32     setDeviceId(oldId);
33   }
34
35   emit deviceCountChanged();
36 }
37
38 int Camera::deviceCount() const {
39   return m_cam ? m_cam->devices().size() : 0;
40 }
41
42 QString Camera::deviceName(int index) const {
43   return m_cam->devices().at(index).first;
44 }
45
46 QVariant Camera::deviceId(int index) const {
47   return m_cam->devices().at(index).second;
48 }
49
50 void Camera::setDeviceId(const QVariant& id) {
51   if (id == m_id) {
52     return;
53   }
54
55   if (!isComponentComplete()) {
56     m_id = id;
57     emit deviceIdChanged();
58     return;
59   }
60
61   if (m_dev && m_dev->stop()) {
62     delete m_dev;
63   }
64   else if (m_dev) {
65     qWarning() << "Failed to stop device";
66     return;
67   }
68
69   m_dev = m_cam->device(id, this);
70
71   m_id = id;
72
73   m_vf->setDevice(m_dev);
74
75   QObject::connect(m_dev, SIGNAL(runningStateChanged(bool)),
76                       this, SIGNAL(runningStateChanged()));
77   QObject::connect(m_dev, SIGNAL(idleStateChanged(bool)), this, SIGNAL(idleStateChanged()));
78   QObject::connect(m_dev, SIGNAL(error(const QString&, int, const QString&)),
79                    this, SIGNAL(error(const QString&, int, const QString&)));
80
81   emit deviceIdChanged();
82   emit deviceChanged();
83 }
84
85 QVariant Camera::deviceId() const {
86   return m_id;
87 }
88
89 void Camera::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) {
90   QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
91
92   m_vf->setGeometry(newGeometry);
93 }
94
95 QtCamDevice *Camera::device() const {
96   return m_dev;
97 }
98
99 void Camera::setMode(const Camera::CameraMode& mode) {
100   if (m_mode == mode) {
101     return;
102   }
103
104   m_mode = mode;
105
106   if (!m_dev) {
107     return;
108   }
109
110   if (m_dev->isRunning()) {
111     applyMode();
112   }
113
114   emit modeChanged();
115 }
116
117 Camera::CameraMode Camera::mode() {
118   return m_mode;
119 }
120
121 bool Camera::start() {
122   if (!m_dev) {
123     return false;
124   }
125
126   applyMode();
127
128   return m_dev->start();
129 }
130
131 bool Camera::stop() {
132   if (m_dev) {
133     return m_dev->stop();
134   }
135
136   return true;
137 }
138
139 bool Camera::isIdle() {
140   return m_dev ? m_dev->isIdle() : true;
141 }
142
143 bool Camera::isRunning() {
144   return m_dev ? m_dev->isRunning() : false;
145 }
146
147 void Camera::applyMode() {
148   if (m_mode == Camera::VideoMode && m_dev->activeMode() != m_dev->videoMode()) {
149     m_dev->videoMode()->activate();
150   }
151   else if (m_mode == Camera::ImageMode && m_dev->activeMode() != m_dev->imageMode()) {
152     m_dev->imageMode()->activate();
153   }
154 }
155
156 QString Camera::imageSuffix() const {
157   return m_cam->config()->imageSuffix();
158 }
159
160 QString Camera::videoSuffix() const {
161   return m_cam->config()->videoSuffix();
162 }