diff options
Diffstat (limited to 'src/imports/multimedia/qdeclarativecamerafocus.cpp')
-rw-r--r-- | src/imports/multimedia/qdeclarativecamerafocus.cpp | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/src/imports/multimedia/qdeclarativecamerafocus.cpp b/src/imports/multimedia/qdeclarativecamerafocus.cpp new file mode 100644 index 000000000..c356d4fd6 --- /dev/null +++ b/src/imports/multimedia/qdeclarativecamerafocus.cpp @@ -0,0 +1,259 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qdeclarativecamera_p.h" +#include "qdeclarativecamerafocus_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmlclass CameraFocus QDeclarativeCameraFocus + \since 4.0 + \brief The CameraFocus element provides interface for focus related camera settings. + \ingroup qml-multimedia + + This element is part of the \bold{Qt.multimediakit 4.0} module. + + It should not be constructed separately but provided by Camera.focus. + + \qml + import QtQuick 2.0 + import Qt.multimediakit 4.0 + + Camera { + id: camera + + focus { + focusMode: Camera.FocusMacro + focusPointMode: Camera.FocusPointCustom + customFocusPoint: Qt.point(0.2, 0.2) //focus to top-left corner + } + } + + \endqml +*/ + +/*! + \class QDeclarativeCameraFocus + \brief The CameraFocus element provides interface for focus related camera settings. +*/ + +/*! + Construct a declarative camera focus object using \a parent object. + */ + +QDeclarativeCameraFocus::QDeclarativeCameraFocus(QCamera *camera, QObject *parent) : + QObject(parent) +{ + m_focus = camera->focus(); + m_focusZones = new FocusZonesModel(this); + + updateFocusZones(); + + connect(m_focus, SIGNAL(focusZonesChanged()), SLOT(updateFocusZones())); +} + +QDeclarativeCameraFocus::~QDeclarativeCameraFocus() +{ +} + + +/*! + \qmlproperty Camera::FocusModes CameraFocus::focusMode + \property QDeclarativeCameraFocus::focusMode + + The current camera focus mode. + + It's possible to combine multiple Camera::FocusMode values, + for example Camera.FocusMacro + Camera.FocusContinuous. +*/ +QDeclarativeCamera::FocusModes QDeclarativeCameraFocus::focusMode() const +{ + return QDeclarativeCamera::FocusModes(m_focus->focusMode()); +} + +bool QDeclarativeCameraFocus::isFocusModeSupported(QDeclarativeCamera::FocusModes mode) const +{ + return m_focus->isFocusModeSupported(QCameraFocus::FocusMode(int(mode))); +} + +void QDeclarativeCameraFocus::setFocusMode(QDeclarativeCamera::FocusModes mode) +{ + m_focus->setFocusMode(QCameraFocus::FocusMode(int(mode))); +} + +/*! + \qmlproperty CameraFocus::FocusPointMode CameraFocus::focusPointMode + \property QDeclarativeCameraFocus::focusPointMode + + The current camera focus point mode. +*/ +QDeclarativeCamera::FocusPointMode QDeclarativeCameraFocus::focusPointMode() const +{ + return QDeclarativeCamera::FocusPointMode(m_focus->focusPointMode()); +} + +void QDeclarativeCameraFocus::setFocusPointMode(QDeclarativeCamera::FocusPointMode mode) +{ + if (mode != focusPointMode()) { + m_focus->setFocusPointMode(QCameraFocus::FocusPointMode(mode)); + emit focusPointModeChanged(focusPointMode()); + } +} + +bool QDeclarativeCameraFocus::isFocusPointModeSupported(QDeclarativeCamera::FocusPointMode mode) const +{ + return m_focus->isFocusPointModeSupported(QCameraFocus::FocusPointMode(mode)); +} + +/*! + \qmlproperty QPointF CameraFocus::customFocusPoint + \property QDeclarativeCameraFocus::customFocusPoint + + Position of custom focus point, in relative frame coordinates: + QPointF(0,0) points to the left top frame point, QPointF(0.5,0.5) points to the frame center. + + Custom focus point is used only in FocusPointCustom focus mode. +*/ + +QPointF QDeclarativeCameraFocus::customFocusPoint() const +{ + return m_focus->customFocusPoint(); +} + +void QDeclarativeCameraFocus::setCustomFocusPoint(const QPointF &point) +{ + if (point != customFocusPoint()) { + m_focus->setCustomFocusPoint(point); + emit customFocusPointChanged(customFocusPoint()); + } +} + +/*! + \qmlproperty QPointF CameraFocus::focusZones + \property QDeclarativeCameraFocus::focusZones + + List of current camera focus zones, + each including area specified in the same coordinates as \l customFocusPoint + and zone status. + + \qml + + VideoOutput { + id: viewfinder + source: camera + + //display focus areas on camera viewfinder: + Repeater { + model: camera.focus.focusZones + + Rectangle { + border { + width: 2 + color: status == CameraFocus.Focused ? "green" : "white" + } + color: "transparent" + + x: area.x * viewfinder.width + y: area.y * viewfinder.height + width: area.width * viewfinder.width + height: area.height * viewfinder.height + } + } + } + \endqml +*/ + +QAbstractListModel *QDeclarativeCameraFocus::focusZones() const +{ + return m_focusZones; +} + +/*! \internal */ +void QDeclarativeCameraFocus::updateFocusZones() +{ + m_focusZones->setFocusZones(m_focus->focusZones()); +} + + +FocusZonesModel::FocusZonesModel(QObject *parent) + :QAbstractListModel(parent) +{ + QHash<int, QByteArray> roles; + roles[StatusRole] = "status"; + roles[AreaRole] = "area"; + setRoleNames(roles); +} + +int FocusZonesModel::rowCount(const QModelIndex &parent) const +{ + if (parent == QModelIndex()) + return m_focusZones.count(); + + return 0; +} + +QVariant FocusZonesModel::data(const QModelIndex &index, int role) const +{ + if (index.row() < 0 || index.row() > m_focusZones.count()) + return QVariant(); + + QCameraFocusZone zone = m_focusZones.value(index.row()); + + if (role == StatusRole) + return zone.status(); + + if (role == AreaRole) + return zone.area(); + + return QVariant(); +} + +void FocusZonesModel::setFocusZones(const QCameraFocusZoneList &zones) +{ + beginResetModel(); + m_focusZones = zones; + endResetModel(); +} + +QT_END_NAMESPACE + +#include "moc_qdeclarativecamerafocus_p.cpp" |