From f2ec69ec3ad0d38650a74f96b2f90e51faf583ab Mon Sep 17 00:00:00 2001 From: Mohammed Sameer Date: Sat, 24 Aug 2013 12:33:55 +0300 Subject: [PATCH] Implemented capturing via proximity sensor --- qml/CaptureControl.qml | 76 ++++++++++++++++++++++++++++++++++++++++++ qml/ImageOverlay.qml | 28 +++++++++------- qml/VideoOverlay.qml | 22 +++++++++--- qml/qml.qrc | 1 + 4 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 qml/CaptureControl.qml diff --git a/qml/CaptureControl.qml b/qml/CaptureControl.qml new file mode 100644 index 0000000..ce778fc --- /dev/null +++ b/qml/CaptureControl.qml @@ -0,0 +1,76 @@ +// -*- qml -*- + +/*! + * This file is part of CameraPlus. + * + * Copyright (C) 2012-2013 Mohammed Sameer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +import QtQuick 2.0 + +Item { + id: captureControl + + property bool capturePressed: false + property bool zoomPressed: false + property bool proximityClosed: false + property bool canceled: false + property bool showCancelBanner: (zoomPressed || proximityClosed) && state == "capturing" + + signal startCapture + signal cancelCapture + + states: [ + State { + name: "idle" + when: !capturePressed && !zoomPressed && !proximityClosed + }, + State { + name: "canceled" + when: canceled + }, + State { + name: "capturing" + when: capturePressed || zoomPressed || proximityClosed + } + ] + + state: "idle" + + onStateChanged: { + if (state == "idle") { + captureControl.canceled = false + } + } + + transitions: [ + Transition { + from: "capturing" + to: "idle" + ScriptAction { + script: captureControl.startCapture() + } + }, + Transition { + from: "capturing" + to: "canceled" + ScriptAction { + script: captureControl.cancelCapture() + } + } + ] +} diff --git a/qml/ImageOverlay.qml b/qml/ImageOverlay.qml index 99d9fb6..f191b35 100644 --- a/qml/ImageOverlay.qml +++ b/qml/ImageOverlay.qml @@ -76,13 +76,12 @@ Item { width: 75 height: 75 opacity: 0.5 - onClicked: captureImage() visible: controlsVisible onExited: { if (mouseX <= 0 || mouseY <= 0 || mouseX > width || mouseY > height) { // Release outside the button: - stopAutoFocus() + captureControl.canceled = true } } } @@ -90,7 +89,7 @@ Item { Timer { id: autoFocusTimer interval: 200 - running: capture.pressed || zoomCapture.zoomPressed + running: captureControl.state == "capturing" repeat: false onTriggered: { if (cam.autoFocus.cafStatus != AutoFocus.Success) { @@ -101,18 +100,21 @@ Item { ZoomCaptureButton { id: zoomCapture - onReleased: parent.captureImage() + } + + CaptureControl { + id: captureControl + capturePressed: capture.pressed + zoomPressed: zoomCapture.zoomPressed + proximityClosed: proximitySensor.close + onStartCapture: captureImage() + onCancelCapture: stopAutoFocus() } CaptureCancel { anchors.fill: parent - enabled: zoomCapture.zoomPressed - onPressed: { - zoomCapture.zoomPressed = false - if (!autoFocusTimer.running) { - stopAutoFocus() - } - } + enabled: captureControl.showCancelBanner + onPressed: captureControl.canceled = true } CameraToolBar { @@ -291,7 +293,9 @@ Item { function stopAutoFocus() { if (!overlay.cam.quirks.hasQuirk(Quirks.NoAutoFocus)) { - cam.autoFocus.stopAutoFocus() + if (!autoFocusTimer.running) { + cam.autoFocus.stopAutoFocus() + } } } diff --git a/qml/VideoOverlay.qml b/qml/VideoOverlay.qml index 6f19d48..164ebae 100644 --- a/qml/VideoOverlay.qml +++ b/qml/VideoOverlay.qml @@ -66,13 +66,20 @@ Item { ZoomCaptureButton { id: zoomCapture - onReleased: overlay.toggleRecording() + } + + CaptureControl { + id: captureControl + capturePressed: capture.pressed + zoomPressed: zoomCapture.zoomPressed + proximityClosed: proximitySensor.close + onStartCapture: overlay.toggleRecording() } CaptureCancel { anchors.fill: parent - enabled: zoomCapture.zoomPressed - onPressed: zoomCapture.zoomPressed = false + enabled: captureControl.showCancelBanner + onPressed: captureControl.canceled = true } CaptureButton { @@ -85,9 +92,14 @@ Item { height: 75 opacity: 0.5 - onClicked: overlay.toggleRecording() - visible: controlsVisible + + onExited: { + if (mouseX <= 0 || mouseY <= 0 || mouseX > width || mouseY > height) { + // Release outside the button: + captureControl.canceled = true + } + } } CameraToolBar { diff --git a/qml/qml.qrc b/qml/qml.qrc index 99858db..3875f11 100644 --- a/qml/qml.qrc +++ b/qml/qml.qrc @@ -47,5 +47,6 @@ ZoomCaptureButton.qml CaptureCancel.qml ZoomSlider.qml + CaptureControl.qml -- 2.25.1