Warning, /education/kalgebra/mobile/content/ui/controls/ExpressionInput.qml is written in an unsupported language. File is not indexed.
0001 /************************************************************************************* 0002 * Copyright (C) 2015 by Aleix Pol <aleixpol@kde.org> * 0003 * * 0004 * This program is free software; you can redistribute it and/or * 0005 * modify it under the terms of the GNU General Public License * 0006 * as published by the Free Software Foundation; either version 2 * 0007 * of the License, or (at your option) any later version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, * 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0012 * GNU General Public License for more details. * 0013 * * 0014 * You should have received a copy of the GNU General Public License * 0015 * along with this program; if not, write to the Free Software * 0016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 0017 *************************************************************************************/ 0018 0019 import QtQuick 0020 import QtQuick.Window 0021 import QtQuick.Controls as QQC2 0022 import org.kde.kirigami as Kirigami 0023 import org.kde.kirigamiaddons.delegates as Delegates 0024 import org.kde.analitza 0025 import QtQuick.Layouts 0026 import org.kde.kalgebra.mobile 0027 0028 ColumnLayout { 0029 spacing: 0 0030 0031 property alias text: field.text 0032 0033 signal addOperation(operation: string) 0034 0035 function selectAll(): void { 0036 field.selectAll(); 0037 } 0038 0039 function remove(start: int, end: int): void { 0040 field.remove(start, end); 0041 } 0042 0043 function insert(start: int, text: string): void { 0044 field.insert(start, text); 0045 } 0046 0047 Kirigami.Separator { 0048 Layout.fillWidth: true 0049 } 0050 0051 ListView { 0052 id: view 0053 currentIndex: -1 0054 keyNavigationWraps: true 0055 Layout.fillWidth: true 0056 Layout.preferredHeight: Math.min(contentHeight, Kirigami.Units.gridUnit * 10) 0057 clip: true 0058 model: field.currentWord.length > 0 ? filterModel : [] 0059 0060 QSortFilterProxyModel { 0061 id: filterModel 0062 sourceModel: OperatorsModel { id: operators } 0063 filterRegularExpression: new RegExp("^" + field.currentWord) 0064 filterCaseSensitivity: Qt.CaseInsensitive 0065 } 0066 0067 delegate: Delegates.RoundedItemDelegate { 0068 required property int index 0069 required property string description 0070 required property string name 0071 required property bool isVariable 0072 0073 text: name + " - " + description 0074 highlighted: view.currentIndex === index 0075 width: ListView.view.width 0076 0077 function complete() { 0078 let toInsert = name.substr(field.currentWord.length); 0079 if(isVariable) 0080 toInsert += '('; 0081 field.insert(field.cursorPosition, toInsert) 0082 } 0083 0084 onClicked: complete() 0085 Keys.onReturnPressed: complete() 0086 } 0087 } 0088 0089 Kirigami.Separator { 0090 Layout.fillWidth: true 0091 visible: view.count > 0 0092 } 0093 0094 QQC2.TextField { 0095 id: field 0096 0097 focus: true 0098 0099 readonly property string currentWord: operators.lastWord(field.cursorPosition, field.text) 0100 0101 Layout.minimumWidth: parent.width 0102 Layout.preferredHeight: Kirigami.Units.gridUnit * 2 0103 0104 background: null 0105 0106 placeholderText: i18n("Expression to calculate...") 0107 inputMethodHints: /*Qt.ImhPreferNumbers |*/ Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase 0108 0109 Keys.forwardTo: view.visible && view.currentIndex >= 0 ? [ view.currentItem ] : null 0110 Keys.onTabPressed: view.incrementCurrentIndex() 0111 Keys.onUpPressed: view.decrementCurrentIndex() 0112 Keys.onDownPressed: view.incrementCurrentIndex() 0113 Keys.onReturnPressed: { 0114 view.currentIndex = -1; 0115 addOperation(text); 0116 field.text = ''; 0117 } 0118 } 0119 } 0120