linphone-desktop/Linphone/view/Control/Input/TextField.qml
Julien Wadel c908f0d42c Fix blinkink text fields.
Remove storing core from GUI on fields. Core should never be stored in GUI because they are managed by CPP and not QML.
Fix crashes on account settings.
Add missing exception verbosing.
2024-12-18 18:44:14 +01:00

181 lines
4.9 KiB
QML

import QtQuick
import QtQuick.Controls.Basic as Control
import QtQuick.Layouts
import Linphone
Control.TextField {
id: mainItem
property var customWidth
width: (customWidth ? customWidth - 1 : 360) * DefaultStyle.dp
height: 49 * DefaultStyle.dp
leftPadding: 15 * DefaultStyle.dp
rightPadding: eyeButton.visible ? 5 * DefaultStyle.dp + eyeButton.width + eyeButton.rightMargin : 15 * DefaultStyle.dp
echoMode: (hidden && !eyeButton.checked) ? TextInput.Password : TextInput.Normal
verticalAlignment: TextInput.AlignVCenter
color: isError ? DefaultStyle.danger_500main : DefaultStyle.main2_600
placeholderTextColor: DefaultStyle.placeholders
font {
family: DefaultStyle.defaultFont
pixelSize: 14 * DefaultStyle.dp
weight: 400 * DefaultStyle.dp
}
selectByMouse: true
activeFocusOnTab: true
KeyNavigation.right: eyeButton
text: initialText
property bool controlIsDown: false
property bool hidden: false
property bool isError: false
property bool backgroundVisible: true
property color backgroundColor: DefaultStyle.grey_100
property color disabledBackgroundColor: DefaultStyle.grey_200
property color backgroundBorderColor: DefaultStyle.grey_200
property string initialText
property int pixelSize: 14 * DefaultStyle.dp
property int weight: 400 * DefaultStyle.dp
// fill propertyName and propertyOwner to check text validity
property string propertyName
property var propertyOwner
property var propertyOwnerGui
property var initialReading: true
property var isValid: function(text) {
return true
}
property bool toValidate: false
property int idleTimeOut: 200
property bool empty: propertyOwnerGui ? mainItem.propertyOwnerGui.core != undefined && mainItem.propertyOwnerGui.core[mainItem.propertyName]?.length == 0
: mainItem.propertyOwner != undefined && mainItem.propertyOwner[mainItem.propertyName]?.length == 0
property bool canBeEmpty: true
signal validationChecked(bool valid)
function resetText() {
text = initialText
}
signal enterPressed()
onAccepted: {// No need to process changing focus because of TextEdited callback.
idleTimer.stop()
updateText()
}
onTextEdited: {
if(mainItem.toValidate) {
idleTimer.restart()
}
}
function updateText() {
mainItem.empty = text.length == 0
if (initialReading) {
initialReading = false
}
if (mainItem.empty && !mainItem.canBeEmpty) {
mainItem.validationChecked(false)
return
}
if (mainItem.propertyName && isValid(text)) {
if(mainItem.propertyOwnerGui){
if (mainItem.propertyOwnerGui.core[mainItem.propertyName] != text)
mainItem.propertyOwnerGui.core[mainItem.propertyName] = text
}else{
if (mainItem.propertyOwner[mainItem.propertyName] != text)
mainItem.propertyOwner[mainItem.propertyName] = text
}
mainItem.validationChecked(true)
} else mainItem.validationChecked(false)
}
// Validation textfield functions
Timer {
id: idleTimer
running: false
interval: mainItem.idleTimeOut
repeat: false
onTriggered: {
mainItem.accepted()
}
}
background: Rectangle {
id: inputBackground
visible: mainItem.backgroundVisible
anchors.fill: parent
radius: 79 * DefaultStyle.dp
color: mainItem.enabled ? mainItem.backgroundColor : mainItem.disabledBackgroundColor
border.color: mainItem.isError
? DefaultStyle.danger_500main
: mainItem.activeFocus
? DefaultStyle.main1_500_main
: mainItem.backgroundBorderColor
}
cursorDelegate: Rectangle {
id: cursor
color: DefaultStyle.main1_500_main
width: 1 * DefaultStyle.dp
anchors.verticalCenter: mainItem.verticalCenter
SequentialAnimation {
loops: Animation.Infinite
running: mainItem.cursorVisible
PropertyAction {
target: cursor
property: 'visible'
value: true
}
PauseAnimation {
duration: 600
}
PropertyAction {
target: cursor
property: 'visible'
value: false
}
PauseAnimation {
duration: 600
}
onStopped: {
cursor.visible = false
}
}
}
Keys.onPressed: (event) => {
if (event.key == Qt.Key_Control) mainItem.controlIsDown = true
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
enterPressed()
if (mainItem.controlIsDown) {
}
}
}
Keys.onReleased: (event) => {
if (event.jey == Qt.Key_Control) mainItem.controlIsDown = false
}
Button {
id: eyeButton
KeyNavigation.left: mainItem
property int rightMargin: 15 * DefaultStyle.dp
z: 1
visible: mainItem.hidden
checkable: true
background: Rectangle {
color: "transparent"
}
icon.source: eyeButton.checked ? AppIcons.eyeShow : AppIcons.eyeHide
width: 20 * DefaultStyle.dp
height: 20 * DefaultStyle.dp
icon.width: width
icon.height: height
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: rightMargin
}
}