Warning, /education/kalgebra/mobile/content/ui/Console.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2015 by Aleix Pol <aleixpol@kde.org>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003
0004 import QtCore
0005 import QtQuick
0006 import QtQuick.Layouts
0007 import QtQuick.Controls as QQC2
0008 import QtQml.Models
0009 import QtQuick.Dialogs
0010 import org.kde.kirigami as Kirigami
0011 import org.kde.kirigamiaddons.delegates as Delegates
0012 import org.kde.kirigamiaddons.formcard as FormCard
0013 import org.kde.analitza
0014 import org.kde.kalgebra.mobile
0015
0016 Kirigami.ScrollablePage {
0017 id: page
0018
0019 title: i18n("Calculator")
0020 ListModel { id: itemModel }
0021
0022 // This content is only available in the desktop version of Kalgebra.
0023 // Don't put any information here that can't be accessed by another
0024 // part of Kalgebra.
0025 readonly property Item drawerContent : ColumnLayout {
0026 visible: true
0027 width: 300
0028 spacing: 0
0029
0030 QQC2.ToolBar {
0031 Layout.fillWidth: true
0032 Layout.preferredHeight: applicationWindow().pageStack.globalToolBar.preferredHeight
0033
0034 leftPadding: Kirigami.Units.smallSpacing
0035 rightPadding: Kirigami.Units.smallSpacing
0036 topPadding: Kirigami.Units.smallSpacing
0037 bottomPadding: Kirigami.Units.smallSpacing
0038
0039 contentItem: Kirigami.Heading {
0040 text: i18n("KAlgebra")
0041 }
0042 }
0043
0044 QQC2.ScrollView {
0045 Layout.fillWidth: true
0046 Layout.fillHeight: true
0047
0048 ListView {
0049 model: VariablesModel { variables: App.variables }
0050 delegate: Delegates.RoundedItemDelegate {
0051 required property string whatsThis
0052 required property int index
0053
0054 text: whatsThis
0055 }
0056 }
0057 }
0058 }
0059
0060 actions: [
0061 Kirigami.Action {
0062 text: i18nc("@action:button", "Load Script")
0063 onTriggered: {
0064 fileDialog.title = text
0065 fileDialog.proceed = function() { consoleModel.loadScript(fileDialog.fileUrl) }
0066 fileDialog.nameFilters = [ i18n("Script (*.kal)") ]
0067 fileDialog.fileMode = FileDialog.OpenFile
0068 fileDialog.open()
0069 }
0070 },
0071 Kirigami.Action {
0072 text: i18nc("@action:button", "Save Script")
0073 onTriggered: {
0074 fileDialog.title = text
0075 fileDialog.proceed = function() { consoleModel.saveScript(fileDialog.fileUrl) }
0076 fileDialog.nameFilters = [ i18n("Script (*.kal)") ]
0077 fileDialog.fileMode = FileDialog.SaveFile
0078 fileDialog.open()
0079 }
0080 },
0081 //TODO: Recent scripts
0082 Kirigami.Action {
0083 text: i18nc("@action:button", "Export Log")
0084 onTriggered: {
0085 fileDialog.title = text
0086 fileDialog.proceed = function() { consoleModel.saveLog(fileDialog.fileUrl) }
0087 fileDialog.nameFilters = [ i18n("HTML (*.html)") ]
0088 fileDialog.fileMode = FileDialog.SaveFile
0089 fileDialog.open()
0090 }
0091 },
0092 // --
0093 Kirigami.Action {
0094 text: consoleModel.mode === 1 ? i18nc("@action:button", "Evaluate") : i18nc("@action:button", "Calculate")
0095 onTriggered: consoleModel.mode = consoleModel.mode === 1 ? 0 : 1
0096 },
0097 // --
0098 Kirigami.Action {
0099 icon.name: "edit-clear-history"
0100 text: i18nc("@action:button", "Clear Log")
0101 onTriggered: itemModel.clear()
0102 enabled: itemModel.count !== 0
0103 }
0104 ]
0105
0106 ListView {
0107 id: view
0108 model: itemModel
0109
0110 bottomMargin: Kirigami.Units.largeSpacing
0111 topMargin: Kirigami.Units.largeSpacing
0112 spacing: Kirigami.Units.largeSpacing
0113
0114 delegate: FormCard.FormCard {
0115 width: ListView.view.width
0116 FormCard.AbstractFormDelegate {
0117 background: null
0118 contentItem: RowLayout {
0119 QQC2.Label {
0120 text: model.result
0121 onLinkActivated: {
0122 input.remove(input.selectionStart, input.selectionEnd)
0123 input.insert(input.cursorPosition, consoleModel.readContent(link))
0124 }
0125
0126 Layout.fillWidth: true
0127 }
0128
0129 QQC2.ToolButton {
0130 visible: App.functionsModel().canAddFunction(expression, 2, App.variables)
0131 text: i18n("2D Plot")
0132 onClicked: {
0133 App.functionsModel().addFunction(expression, 2, App.variables)
0134 show2dPlotAction.trigger();
0135 }
0136 }
0137
0138 QQC2.ToolButton {
0139 visible: App.functionsModel().canAddFunction(expression, 4, App.variables)
0140 text: i18n("3D Plot")
0141 onClicked: {
0142 App.functionsModel().addFunction(expression, 4, App.variables)
0143 show3dPlotAction.trigger();
0144 }
0145 }
0146
0147 QQC2.ToolButton {
0148 readonly property string value: result.replace(/<[^>]*>/g, '');
0149 text: i18n("Copy \"%1\"", value)
0150 icon.name: "edit-copy"
0151 display: QQC2.ToolButton.IconOnly
0152 onClicked: {
0153 clipboard.content = value
0154 }
0155
0156 QQC2.ToolTip.text: text
0157 QQC2.ToolTip.visible: hovered
0158 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0159 }
0160 }
0161 }
0162 }
0163 Clipboard {
0164 id: clipboard
0165 }
0166
0167 ConsoleModel {
0168 id: consoleModel
0169 variables: App.variables
0170 onMessage: (msg, operation, result) => {
0171 itemModel.append({ result: msg, expression: result.toString() })
0172 input.selectAll()
0173 view.currentIndex = view.count-1
0174 view.positionViewAtIndex(view.currentIndex, ListView.Contain)
0175 }
0176 }
0177
0178 FileDialog {
0179 id: fileDialog
0180 currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
0181 onAccepted: proceed()
0182
0183 property var proceed
0184 }
0185
0186 Kirigami.PlaceholderMessage {
0187 text: i18nc("@info", "Empty console history")
0188 visible: view.count === 0
0189 anchors.centerIn: parent
0190 width: parent.width - Kirigami.Units.gridUnit * 4
0191 }
0192 }
0193
0194 footer: ExpressionInput {
0195 id: input
0196 focus: true
0197
0198 width: page.width
0199
0200 onAddOperation: (content) => {
0201 consoleModel.addOperation(content)
0202 }
0203 }
0204 }