2 * Copyright (C) 2013 Canonical, Ltd.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 import Ubuntu.Components 0.1
19 import Ubuntu.Components.ListItems 0.1
20 import "../Components"
24 anchors.top: parent.top
25 anchors.topMargin: units.gu(4)
26 anchors.horizontalCenter: parent.horizontalCenter
29 property string infoText
30 property string retryText
31 property string errorText
32 property int padWidth: units.gu(34)
33 property int padHeight: units.gu(28)
34 property int minPinLength: -1
35 property int maxPinLength: -1
36 property bool showCancelButton: true
38 readonly property string passphrase: pinentryField.text
40 signal entered(string passphrase)
43 property bool entryEnabled: true
45 function clear(showAnimation) {
46 pinentryField.text = "";
48 pinentryField.incorrectOverride = true;
49 wrongPasswordAnimation.start();
55 anchors.horizontalCenter: parent.horizontalCenter
61 objectName: "infoTextLabel"
64 anchors.horizontalCenter: parent.horizontalCenter
70 anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
75 objectName: "pinentryField"
76 anchors.horizontalCenter: parent.horizontalCenter
77 anchors.verticalCenter: parent.verticalCenter
78 spacing: Math.max(0, Math.min(units.gu(3), (parent.width / root.maxPinLength) - units.gu(3)))
81 property bool incorrectOverride: false
84 model: pinentryField.text.length
87 width: Math.min(units.gu(2), (pinContainer.width - pinContainer.height*2 ) / (root.maxPinLength >= 0 ? root.maxPinLength : 16))
93 function appendNumber(number) {
94 if (incorrectOverride) {
95 incorrectOverride = false;
98 pinentryField.text = pinentryField.text + number
100 if (root.minPinLength > 0 && root.maxPinLength > 0
101 && root.minPinLength == root.maxPinLength && pinentryField.text.length == root.minPinLength) {
102 root.entered(pinentryField.text)
106 function backspace() {
107 pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1)
112 objectName: "wrongNoticeLabel"
115 anchors.horizontalCenter: parent.horizontalCenter
116 horizontalAlignment: Text.AlignHCenter
118 visible: pinentryField.incorrectOverride
119 scale: Math.min(1, parent.width / width)
123 objectName: "backspaceIcon"
124 anchors { right: parent.right; top: parent.top; bottom: parent.bottom }
133 opacity: (pinentryField.text.length && !pinentryField.incorrectOverride) > 0 ? 1 : 0
135 Behavior on opacity {
136 UbuntuNumberAnimation {}
139 onClicked: pinentryField.backspace()
144 objectName: "retryLabel"
147 anchors.horizontalCenter: parent.horizontalCenter
148 text: root.retryText || " "
153 anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
158 anchors { horizontalCenter: parent.horizontalCenter }
161 property int buttonHeight: units.gu(8)
162 property int buttonWidth: units.gu(12)
168 objectName: "pinPadButton" + text
170 height: numbersGrid.buttonHeight
171 width: numbersGrid.buttonWidth
172 enabled: root.entryEnabled && (root.maxPinLength == -1 ||
173 pinentryField.text.length < root.maxPinLength ||
174 pinentryField.incorrectOverride)
177 pinentryField.appendNumber(index + 1)
182 height: numbersGrid.buttonHeight
183 width: numbersGrid.buttonWidth
187 height: numbersGrid.buttonHeight
188 width: numbersGrid.buttonWidth
189 enabled: root.entryEnabled && (root.maxPinLength == -1 ||
190 pinentryField.text.length < root.maxPinLength ||
191 pinentryField.incorrectOverride)
194 pinentryField.appendNumber(0)
198 height: numbersGrid.buttonHeight
199 width: numbersGrid.buttonWidth
203 height: units.gu(5) // visual spec has this row a little closer in
204 width: numbersGrid.buttonWidth
206 onClicked: root.cancel()
207 visible: root.showCancelButton
211 width: numbersGrid.buttonWidth
215 objectName: "confirmButton"
217 width: numbersGrid.buttonWidth
218 enabled: root.enabled && pinentryField.text.length >= root.minPinLength
219 visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
221 onClicked: root.entered(pinentryField.text)
224 WrongPasswordAnimation {
225 id: wrongPasswordAnimation
226 objectName: "wrongPasswordAnimation"
227 target: shakeContainer