From b669fa97a0d6c7bb7cfc89b9be08ba0e0c079772 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Mon, 20 Apr 2015 21:05:28 +0200 Subject: [PATCH] better answer/hangup ui --- dialer/contents/ui/Call/AnswerSwipe.qml | 77 +++++++++++++++++++++++++ dialer/contents/ui/Call/CallPage.qml | 58 ++++++++++++++----- dialer/contents/ui/main.qml | 44 +++++++------- 3 files changed, 140 insertions(+), 39 deletions(-) create mode 100644 dialer/contents/ui/Call/AnswerSwipe.qml diff --git a/dialer/contents/ui/Call/AnswerSwipe.qml b/dialer/contents/ui/Call/AnswerSwipe.qml new file mode 100644 index 00000000..92fb1474 --- /dev/null +++ b/dialer/contents/ui/Call/AnswerSwipe.qml @@ -0,0 +1,77 @@ +/* + * Copyright 2014 Aaron Seigo + * Copyright 2014 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * This program 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.4 +import QtQuick.Layouts 1.1 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents +import org.nemomobile.voicecall 1.0 + +MouseArea { + id: root + + signal accepted + signal rejected + + Layout.minimumHeight: units.gridUnit * 5 + Layout.fillWidth: true + property int handlePosition: (answerHandle.x + answerHandle.width/2) + drag { + target: answerHandle + axis: Drag.XAxis + minimumX: 0 + maximumX: width - answerHandle.width + } + Rectangle { + anchors.fill: parent + radius: height + color: Qt.rgba((handlePosition > root.width/2 ? 0.6 : 0)+0.2, (handlePosition < root.width/2 ? 0.6 : 0)+0.2, 0.2, Math.abs(handlePosition - (root.width/2)) / answerHandle.width/2); + Rectangle { + id: answerHandle + x: parent.width/2 - width/2 + height: parent.height + width: height + radius: width + color: Qt.rgba(0.2, 0.8, 0.2, 1) + PlasmaCore.IconItem { + source: "call-start" + width: parent.width * 0.7 + height: width + anchors.centerIn: parent + } + Behavior on x { + enabled: root.pressed + XAnimator { + duration: units.longDuration + easing.type: Easing.InOutQuad + } + } + } + } + onReleased: { + if (answerHandle.x <= answerHandle.width) { + root.accepted(); + } else if (answerHandle.x + answerHandle.width >= root.width - answerHandle.width) { + root.rejected(); + } + + answerHandle.x = width/2 - answerHandle.width/2 + } +} diff --git a/dialer/contents/ui/Call/CallPage.qml b/dialer/contents/ui/Call/CallPage.qml index f43e1c1b..3710905f 100644 --- a/dialer/contents/ui/Call/CallPage.qml +++ b/dialer/contents/ui/Call/CallPage.qml @@ -28,8 +28,9 @@ Item { id: callPage state: voiceCallmanager.activeVoiceCall ? voiceCallmanager.activeVoiceCall.statusText : "disconnected" + property int status: voiceCallmanager.activeVoiceCall ? voiceCallmanager.activeVoiceCall.status : 0 + property color textColor: "white" - property bool enableButtons: calling property string providerId: voiceCallmanager.providers.id(0) @@ -78,7 +79,7 @@ Item { Layout.minimumHeight: implicitHeight horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter - font.pixelSize: one.font.pixelSize + font.pixelSize: theme.defaultFont.pixelSize * 2 color: textColor text: voiceCallmanager.activeVoiceCall ? voiceCallmanager.activeVoiceCall.lineId : "" } @@ -87,11 +88,20 @@ Item { Layout.minimumHeight: implicitHeight horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter - font.pixelSize: theme.smallestFont.pixelSize color: textColor - text: voiceCallmanager.activeVoiceCall ? secondsToTimeString(voiceCallmanager.activeVoiceCall.duration) : '' + text: { + if (!voiceCallmanager.activeVoiceCall) { + return ''; + //STATUS_DIALING + } else if (voiceCallmanager.activeVoiceCall.status == 3) { + return i18n("Calling..."); + } else { + return secondsToTimeString(voiceCallmanager.activeVoiceCall.duration); + } + } } PlasmaComponents.ButtonRow { + opacity: status == 1 ? 1 : 0 exclusive: false spacing: 0 Layout.alignment: Qt.AlignHCenter @@ -114,21 +124,37 @@ Item { } + Item { + Layout.minimumHeight: units.gridUnit * 5 + Layout.fillWidth: true - //TODO: swipe thing instead - PlasmaComponents.Button { - text: "Answer" - onClicked: { - if (voiceCallmanager.activeVoiceCall) { - voiceCallmanager.activeVoiceCall.answer(); + AnswerSwipe { + anchors.fill: parent + //STATUS_INCOMING + visible: status == 5 + onAccepted: { + if (voiceCallmanager.activeVoiceCall) { + voiceCallmanager.activeVoiceCall.answer(); + } + } + onRejected: { + if (voiceCallmanager.activeVoiceCall) { + voiceCallmanager.activeVoiceCall.hangup(); + } } } - } - PlasmaComponents.Button { - text: "Hangup" - onClicked: { - if (voiceCallmanager.activeVoiceCall) { - voiceCallmanager.activeVoiceCall.hangup(); + + PlasmaComponents.Button { + anchors.fill: parent + //STATUS_INCOMING + visible: status != 5 + iconSource: "call-stop" + Layout.fillWidth: true + text: i18n("End Call") + onClicked: { + if (voiceCallmanager.activeVoiceCall) { + voiceCallmanager.activeVoiceCall.hangup(); + } } } } diff --git a/dialer/contents/ui/main.qml b/dialer/contents/ui/main.qml index 9bf85b0a..8b7feec8 100644 --- a/dialer/contents/ui/main.qml +++ b/dialer/contents/ui/main.qml @@ -22,24 +22,21 @@ import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 import org.nemomobile.voicecall 1.0 import MeeGo.QOfono 0.2 +import org.kde.plasma.extras 2.0 as PlasmaExtras ApplicationWindow { id: root + +//BEGIN PROPERTIES width: 600 height: 800 visible: true color: Qt.rgba(0, 0, 0, 0.9) property int status: voiceCallmanager.activeVoiceCall ? voiceCallmanager.activeVoiceCall.status : 0 +//END PROPERTIES - onStatusChanged: { - if (status > 0) { - stackView.push(Qt.resolvedUrl("Call/CallPage.qml")); - } else { - stackView.pop(); - } - } - +//BEGIN MODELS OfonoManager { id: ofonoManager onAvailableChanged: { @@ -91,15 +88,7 @@ ApplicationWindow { OfonoNetworkOperator { id: netop } -Button { - z: 99 - text: "bah" - onClicked: { - print(voiceCallmanager.activeVoiceCall) - print(voiceCallmanager.voiceCalls.count) - print(voiceCallmanager.activeVoiceCall.status) - } -} + VoiceCallManager { id: voiceCallmanager @@ -119,18 +108,27 @@ Button { console.log('*** QML *** VCM ERROR: ' + message); } } +//END MODELS - StackView { - id: stackView +//BEGIN UI + PlasmaExtras.ConditionalLoader { anchors.fill: parent + when: root.visible && root.status == 0 + source: Qt.resolvedUrl("Dialer.qml") + opacity: root.status == 0 ? 1 : 0 } + PlasmaExtras.ConditionalLoader { + anchors.fill: parent + when: root.status > 0 + source: Qt.resolvedUrl("Call/CallPage.qml") + opacity: root.status > 0 ? 1 : 0 + } + +//END UI Component.onCompleted: { - //HACK: make sure activeVoiceCall is the proper one + //HACK: make sure activeVoiceCall is loaded if already existing voiceCallmanager.voiceCalls.onVoiceCallsChanged(); voiceCallmanager.onActiveVoiceCallChanged(); - - //start with the dialer view - stackView.push(Qt.resolvedUrl("Dialer.qml")); } }