summaryrefslogtreecommitdiffstats
path: root/basicsuite/Camera/FocusControl.qml
blob: f9b2f2928256b9d99453c5967b919b7af04ab2b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import QtQuick 2.0
import QtMultimedia 5.0

MouseArea {
    id: focusRoot

    signal searchAndLock

    onClicked: {
        camera.focus.focusPointMode = Camera.FocusPointCustom
        camera.focus.customFocusPoint = viewfinder.mapPointToSourceNormalized(Qt.point(mouse.x, mouse.y))
        focusRoot.searchAndLock()
    }

    Item {
        id: zones
        anchors.fill: parent

        property color focusAreaColor
        property real focusAreaScale: 1

        Repeater {
            model: camera.focus.focusZones

            Rectangle {
                border {
                    width: Math.round(2 * root.contentScale)
                    color: zones.focusAreaColor
                }
                radius: 8 * root.contentScale
                color: "transparent"
                scale: zones.focusAreaScale

                // Map from the relative, normalized frame coordinates
                property rect mappedRect: viewfinder.mapNormalizedRectToItem(area);

                Connections {
                    target: viewfinder
                    onContentRectChanged: {
                        mappedRect = viewfinder.mapNormalizedRectToItem(area);
                    }
                }

                x: mappedRect.x - (width - mappedRect.width) / 2
                y: mappedRect.y - (height - mappedRect.height) / 2
                width: Math.round(120 * root.contentScale)
                height: width

                Rectangle {
                    anchors.fill: parent
                    anchors.margins: -1.5
                    color: "transparent"
                    border.width: 1
                    border.color: "black"
                    radius: parent.radius + 2
                }

                Rectangle {
                    anchors.fill: parent
                    anchors.margins: 1 + parent.border.width / 2 + 0.5
                    color: "transparent"
                    border.width: 1
                    border.color: "black"
                    radius: parent.radius - 3
                }
            }
        }

        states: [
            State {
                name: "unlocked"; when: camera.lockStatus === Camera.Unlocked
                PropertyChanges { target: zones; opacity: 0; focusAreaColor: "red" }
            },
            State {
                name: "searching"; when: camera.lockStatus === Camera.Searching
                PropertyChanges { target: zones; opacity: 1; focusAreaColor: "white" }
            },
            State {
                name: "locked"; when: camera.lockStatus === Camera.Locked
                PropertyChanges { target: zones; opacity: 0; focusAreaColor: "green" }
            }
        ]

        transitions: [
            Transition {
                to: "searching"
                NumberAnimation { properties: "opacity"; duration: 60 }
                SequentialAnimation {
                    NumberAnimation {
                        target: zones; property: "focusAreaScale"; from: 1; to: 1.3; duration: 150
                    }
                    PauseAnimation { duration: 20 }
                    NumberAnimation {
                        target: zones; property: "focusAreaScale"; easing.period: 1; easing.amplitude: 1.4
                        easing.type: Easing.OutElastic; from: 1.3; to: 1
                        duration: 450
                    }
                }
            },
            Transition {
                from: "searching"
                SequentialAnimation {
                    PauseAnimation { duration: 1500 }
                    NumberAnimation { properties: "opacity"; duration: 60 }
                }
            }

        ]
    }

}