Added NoFaceDetection quirk
[harmattan/cameraplus] / declarative / videosettings.cpp
1 /*!
2  * This file is part of CameraPlus.
3  *
4  * Copyright (C) 2012-2013 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 "videosettings.h"
22 #include "qtcamvideosettings.h"
23 #include "camera.h"
24 #include "qtcamdevice.h"
25 #include "qtcamvideomode.h"
26 #include "videoresolutionmodel.h"
27 #include "videoresolution.h"
28 #include <QDebug>
29
30 VideoSettings::VideoSettings(QObject *parent) :
31   QObject(parent),
32   m_cam(0),
33   m_settings(0),
34   m_resolutions(0),
35   m_currentResolution(0) {
36
37 }
38
39 VideoSettings::~VideoSettings() {
40   m_settings = 0;
41
42   if (m_currentResolution) {
43     delete m_currentResolution;
44     m_currentResolution = 0;
45   }
46 }
47
48 QString VideoSettings::suffix() const {
49   return m_settings ? m_settings->suffix() : QString();
50 }
51
52 QStringList VideoSettings::aspectRatios() const {
53   return m_settings ? m_settings->aspectRatios() : QStringList();
54 }
55
56 Camera *VideoSettings::camera() {
57   return m_cam;
58 }
59
60 void VideoSettings::setCamera(Camera *camera) {
61   if (camera == m_cam) {
62     return;
63   }
64
65   if (m_cam) {
66     QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
67   }
68
69   m_cam = camera;
70
71   if (m_cam) {
72     QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
73   }
74
75   emit cameraChanged();
76
77   if (m_cam->device()) {
78     deviceChanged();
79   }
80   else {
81     delete m_currentResolution;
82     m_currentResolution = 0;
83     emit currentResolutionChanged();
84   }
85 }
86
87 void VideoSettings::deviceChanged() {
88   m_settings = m_cam->device()->videoMode()->settings();
89
90   emit settingsChanged();
91
92   emit readyChanged();
93
94   delete m_resolutions;
95   m_resolutions = 0;
96
97   delete m_currentResolution;
98   m_currentResolution = 0;
99
100   emit aspectRatioCountChanged();
101   emit resolutionsChanged();
102   emit currentResolutionChanged();
103 }
104
105 VideoResolutionModel *VideoSettings::resolutions() {
106   if (!m_settings) {
107     return 0;
108   }
109
110   if (!m_resolutions) {
111     m_resolutions = new VideoResolutionModel(m_settings, this);
112   }
113
114   return m_resolutions;
115 }
116
117 bool VideoSettings::isReady() const {
118   return m_settings != 0;
119 }
120
121 bool VideoSettings::setResolution(const QString& aspectRatio, const QString& resolution) {
122   if (!isReady()) {
123     return false;
124   }
125
126   QList<QtCamVideoResolution> res = m_settings->resolutions(aspectRatio);
127
128   foreach (const QtCamVideoResolution& r, res) {
129     if (r.name() == resolution) {
130       return setResolution(r);
131     }
132   }
133
134   return false;
135 }
136
137 int VideoSettings::aspectRatioCount() const {
138   return aspectRatios().count();
139 }
140
141 VideoResolution *VideoSettings::currentResolution() {
142   if (m_currentResolution) {
143     return m_currentResolution;
144   }
145
146   if (!m_cam || !m_cam->device()) {
147     return 0;
148   }
149
150   m_currentResolution = new VideoResolution(m_cam->device()->videoMode()->currentResolution());
151
152   return m_currentResolution;
153 }
154
155 VideoResolution *VideoSettings::findResolution(const QString& aspectRatio,
156                                                const QString& name) {
157   if (!isReady()) {
158     return 0;
159   }
160
161   QList<QtCamVideoResolution> res = m_settings->resolutions(aspectRatio);
162
163   foreach (const QtCamVideoResolution& r, res) {
164     if (r.name() == name) {
165       return new VideoResolution(r);
166     }
167   }
168
169   return 0;
170 }
171
172 bool VideoSettings::setResolution(VideoResolution *resolution) {
173   return setResolution(resolution->resolution());
174 }
175
176 bool VideoSettings::setResolution(const QtCamVideoResolution& resolution) {
177   if (!isReady()) {
178     return false;
179   }
180
181   if (!m_cam || !m_cam->device()) {
182     return false;
183   }
184
185   if (m_cam->device()->videoMode()->setResolution(resolution)) {
186     delete m_currentResolution;
187     m_currentResolution = 0;
188
189     emit currentResolutionChanged();
190
191     return true;
192   }
193
194   return false;
195 }