linphone-desktop/Linphone/view/Control/Input/NumericPad.qml

232 lines
6.7 KiB
QML

import QtQuick
import QtQuick.Controls.Basic as Control
import QtQuick.Layouts as Layout
import QtQuick.Effects
import Linphone
import UtilsCpp
import 'qrc:/qt/qml/Linphone/view/Style/buttonStyle.js' as ButtonStyle
FocusScope {
id: mainItem
width: numPadGrid.width
height: numPadGrid.height
property var currentCall
property bool lastRowVisible: true
onButtonPressed: (text) => {
if (currentCall) currentCall.core.lSendDtmf(text)
else UtilsCpp.playDtmf(text)
}
signal buttonPressed(string text)
signal launchCall()
signal wipe()
function keypadKeyPressedAtIndex(index) {
var button = numPadGrid.getButtonAt(index)
button.shadowEnabled = true
button.clicked()
removeButtonsShadow.restart()
}
Timer {
id: removeButtonsShadow
interval: 250
repeat: false
onTriggered: {
for (var i = 0; i < 12; i++) {
numPadGrid.getButtonAt(i).shadowEnabled = false
}
}
}
Keys.onPressed: (event) => {
if (event.modifiers & Qt.KeypadModifier) {
if (event.key === Qt.Key_0) {
keypadKeyPressedAtIndex(10)
}
if (event.key === Qt.Key_1) {
keypadKeyPressedAtIndex(0)
}
if (event.key === Qt.Key_2) {
keypadKeyPressedAtIndex(1)
}
if (event.key === Qt.Key_3) {
keypadKeyPressedAtIndex(2)
}
if (event.key === Qt.Key_4) {
keypadKeyPressedAtIndex(3)
}
if (event.key === Qt.Key_5) {
keypadKeyPressedAtIndex(4)
}
if (event.key === Qt.Key_6) {
keypadKeyPressedAtIndex(5)
}
if (event.key === Qt.Key_7) {
keypadKeyPressedAtIndex(6)
}
if (event.key === Qt.Key_8) {
keypadKeyPressedAtIndex(7)
}
if (event.key === Qt.Key_9) {
keypadKeyPressedAtIndex(8)
}
if (event.key === Qt.Key_Asterisk) {
keypadKeyPressedAtIndex(9)
}
if (event.key === Qt.Key_Plus) {
mainItem.buttonPressed("+")
}
if (event.key === Qt.Key_Enter) {
mainItem.launchCall()
}
}
if (event.key === Qt.Key_Backspace) {
mainItem.wipe()
}
}
Layout.GridLayout {
id: numPadGrid
columns: 3
columnSpacing: Math.round(40 * DefaultStyle.dp)
rowSpacing: Math.round(10 * DefaultStyle.dp)
function getButtonAt(index){
index = (index+15) % 15
if(index >= 0){
if( index < 9){
return numPadRepeater.itemAt(index)
}else if( index < 12){
return digitRepeater.itemAt(index-9)
}else if (index < 14){
return launchCallButton
}else if( index < 15){
return eraseButton
}
}
}
Repeater {
id: numPadRepeater
model: 9
BigButton {
id: numPadButton
Layout.Layout.alignment: Qt.AlignHCenter
required property int index
implicitWidth: Math.round(60 * DefaultStyle.dp)
implicitHeight: Math.round(60 * DefaultStyle.dp)
onClicked: {
mainItem.buttonPressed(text)
}
KeyNavigation.left: numPadGrid.getButtonAt(index - 1)
KeyNavigation.right: numPadGrid.getButtonAt(index + 1)
KeyNavigation.up: numPadGrid.getButtonAt(index - 3)
KeyNavigation.down: numPadGrid.getButtonAt(index + 3)
style: ButtonStyle.numericPad
radius: Math.round(71 * DefaultStyle.dp)
text: index + 1
textSize: Math.round(32 * DefaultStyle.dp)
textWeight: Math.round(400 * DefaultStyle.dp)
}
}
Repeater {
id: digitRepeater
model: [
{pressText: "*"},
{pressText: "0", longPressText: "+"},
{pressText: "#"}
]
BigButton {
id: digitButton
Layout.Layout.alignment: Qt.AlignHCenter
implicitWidth: Math.round(60 * DefaultStyle.dp)
implicitHeight: Math.round(60 * DefaultStyle.dp)
onClicked: mainItem.buttonPressed(pressText.text)
onPressAndHold: mainItem.buttonPressed(longPressText.text)
KeyNavigation.left: numPadGrid.getButtonAt((index - 1)+9)
KeyNavigation.right: numPadGrid.getButtonAt((index + 1)+9)
KeyNavigation.up: numPadGrid.getButtonAt((index - 3)+9)
KeyNavigation.down: numPadGrid.getButtonAt((index + 3)+9)
radius: Math.round(71 * DefaultStyle.dp)
style: ButtonStyle.numericPad
contentItem: Item {
anchors.fill: parent
Text {
id: pressText
color: digitButton.pressed ? digitButton.pressedTextColor : digitButton.textColor
height: contentHeight
anchors.left: parent.left
anchors.right: parent.right
horizontalAlignment: Text.AlignHCenter
Component.onCompleted: {if (modelData.longPressText === undefined) anchors.centerIn= parent}
text: modelData.pressText
font.pixelSize: Math.round(32 * DefaultStyle.dp)
}
Text {
id: longPressText
height: contentHeight
anchors.left: parent.left
anchors.right: parent.right
color: digitButton.pressed ? digitButton.pressedTextColor : digitButton.textColor
y: digitButton.height/2
horizontalAlignment: Text.AlignHCenter
visible: modelData.longPressText ? modelData.longPressText.length > 0 : false
text: modelData.longPressText ? modelData.longPressText : ""
font.pixelSize: Math.round(22 * DefaultStyle.dp)
}
}
}
}
Item {
visible: mainItem.lastRowVisible
// Invisible item to move the last two buttons to the right
}
Button {
id: launchCallButton
visible: mainItem.lastRowVisible
implicitWidth: Math.round(75 * DefaultStyle.dp)
implicitHeight: Math.round(55 * DefaultStyle.dp)
Layout.Layout.alignment: Qt.AlignHCenter
icon.width: Math.round(32 * DefaultStyle.dp)
icon.height: Math.round(32 * DefaultStyle.dp)
radius: Math.round(71 * DefaultStyle.dp)
style: ButtonStyle.phoneGreen
onClicked: mainItem.launchCall()
KeyNavigation.left: eraseButton
KeyNavigation.right: eraseButton
KeyNavigation.up: numPadGrid.getButtonAt(10)
KeyNavigation.down: numPadGrid.getButtonAt(1)
}
Button {
id: eraseButton
visible: mainItem.lastRowVisible
leftPadding: Math.round(5 * DefaultStyle.dp)
rightPadding: Math.round(5 * DefaultStyle.dp)
topPadding: Math.round(5 * DefaultStyle.dp)
bottomPadding: Math.round(5 * DefaultStyle.dp)
Layout.Layout.alignment: Qt.AlignHCenter
icon.source: AppIcons.backspaceFill
style: ButtonStyle.noBackground
icon.width: Math.round(38 * DefaultStyle.dp)
icon.height: Math.round(38 * DefaultStyle.dp)
Layout.Layout.preferredWidth: Math.round(38 * DefaultStyle.dp)
Layout.Layout.preferredHeight: Math.round(38 * DefaultStyle.dp)
onClicked: mainItem.wipe()
KeyNavigation.left: launchCallButton
KeyNavigation.right: launchCallButton
KeyNavigation.up: numPadGrid.getButtonAt(11)
KeyNavigation.down: numPadGrid.getButtonAt(1)
background: Item {
visible: false
}
}
}
}