/* * Copyright (C) 2022-2023 Savoir-faire Linux Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick import net.jami.Adapters 1.1 import net.jami.Constants 1.1 // This component is used to display and edit a value. Loader { id: root property string prefixIconSrc: JamiResources.round_edit_24dp_svg property color prefixIconColor: JamiTheme.editLineColor property string suffixIconSrc: "" property color suffixIconColor: JamiTheme.buttonTintedBlue property string suffixBisIconSrc: "" property color suffixBisIconColor: JamiTheme.buttonTintedBlue property color textColor: JamiTheme.textColor required property string placeholderText property string staticText: "" property string dynamicText property bool inputIsValid: true property string infoTipText property string infoTipLineText property bool isPersistent: true property string elidedText: "" property int maxCharacters property real fontPixelSize: JamiTheme.materialLineEditPixelSize property bool fontBold: false property int echoMode: TextInput.Normal property QtObject textValidator: RegularExpressionValidator { id: defaultValidator } property var icon property bool isSettings property bool isSwarmDetail property bool readOnly: false property bool isEditing: false onStatusChanged: { if (status == Loader.Ready && icon) root.item.icon = icon; } // Always start with the static text component displayed first. property bool editMode: true // Emitted when the editor has been accepted. signal accepted signal keyPressed signal activeChanged(bool active) // Always give up focus when accepted. onAccepted: focus = false // Needed to give proper focus to loaded item onFocusChanged: { if (item && root.focus && root.isPersistent) { item.forceActiveFocus(); } isEditing = !isEditing; } // This is used when the user is not editing the text. Component { id: displayComp MaterialTextField { id: displayCompField font.pixelSize: root.fontPixelSize readOnly: root.readOnly text: elidedText != "" ? elidedText : staticText horizontalAlignment: elidedText != "" ? TextEdit.AlignLeft : TextEdit.AlignHCenter isSwarmDetail: root.isSwarmDetail isSettings: root.isSettings textColor: root.textColor placeholderText: root.placeholderText prefixIconSrc: isSwarmDetail ? "" : root.prefixIconSrc prefixIconColor: root.prefixIconColor } } // This is used when the user is editing the text. Component { id: editComp MaterialTextField { id: editCompField focus: true infoTipText: root.infoTipText infoTipLineText: root.infoTipLineText prefixIconSrc: root.prefixIconSrc prefixIconColor: root.prefixIconColor suffixIconSrc: root.suffixIconSrc suffixIconColor: root.suffixIconColor suffixBisIconSrc: root.suffixBisIconSrc suffixBisIconColor: root.suffixBisIconColor textColor: root.textColor font.pixelSize: root.fontPixelSize font.bold: root.fontBold echoMode: root.echoMode placeholderText: root.placeholderText onAccepted: root.accepted() onKeyPressed: root.keyPressed() onTextChanged: dynamicText = text text: staticText inputIsValid: root.inputIsValid onFocusChanged: { if (!focus && root.editMode) { root.editMode = isPersistent; } activeChanged(root.editMode); } onIsActiveChanged: activeChanged(isActive) validator: root.textValidator isSettings: root.isSettings isSwarmDetail: root.isSwarmDetail readOnly: root.readOnly maxCharacters: root.maxCharacters } } // We use a loader to switch between the two components depending on the // editMode property. sourceComponent: { editMode || isPersistent ? editComp : displayComp; } }