Warning, /network/kdeconnect-kde/smsapp/qml/SendingArea.qml is written in an unsupported language. File is not indexed.

0001 /**
0002  * SPDX-FileCopyrightText: 2020 Aniket Kumar <anikketkumar786@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 import QtQuick
0008 import QtCore
0009 import QtQuick.Controls as Controls
0010 import QtQuick.Layouts
0011 import org.kde.kirigami as Kirigami
0012 import Qt5Compat.GraphicalEffects
0013 import QtQuick.Dialogs
0014 import org.kde.kdeconnect.sms
0015 
0016 ColumnLayout {
0017     id: root
0018     property var addresses
0019     property var selectedFileUrls: []
0020     readonly property int maxMessageSize: 600000
0021     property alias text: messageField.text
0022 
0023     MessageDialog {
0024         id: messageDialog
0025         title: i18nd("kdeconnect-sms", "Failed to send")
0026         text: i18nd("kdeconnect-sms", "Max message size limit exceeded.")
0027 
0028         onAccepted: {
0029             messageDialog.close()
0030         }
0031     }
0032 
0033     FileDialog {
0034         id: fileDialog
0035         currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
0036         fileMode: FileDialog.OpenFiles
0037 
0038         onAccepted: {
0039             root.selectedFileUrls = fileDialog.fileUrls
0040             fileDialog.close()
0041         }
0042     }
0043 
0044     Controls.Pane {
0045         id: sendingArea
0046         enabled: page.deviceConnected
0047         layer.enabled: sendingArea.enabled
0048         layer.effect: DropShadow {
0049             verticalOffset: 1
0050             color: Kirigami.Theme.disabledTextColor
0051             samples: 20
0052             spread: 0.3
0053         }
0054         Layout.fillWidth: true
0055         padding: 0
0056         wheelEnabled: true
0057         background: Rectangle {
0058             color: Kirigami.Theme.backgroundColor
0059         }
0060 
0061         RowLayout {
0062             anchors.fill: parent
0063 
0064             Controls.ScrollView {
0065                 Layout.fillWidth: true
0066                 Layout.maximumHeight: page.height > 300 ? page.height / 3 : 2 * page.height / 3
0067                 contentWidth: page.width - sendButtonArea.width
0068                 clip: true
0069                 Controls.ScrollBar.horizontal.policy: Controls.ScrollBar.AlwaysOff
0070 
0071                 Controls.TextArea {
0072                     width: parent.width
0073                     id: messageField
0074                     placeholderText: i18nd("kdeconnect-sms", "Compose message")
0075                     wrapMode: TextEdit.Wrap
0076                     topPadding: Kirigami.Units.gridUnit * 0.5
0077                     bottomPadding: topPadding
0078                     selectByMouse: true
0079                     hoverEnabled: true
0080                     background: MouseArea {
0081                         hoverEnabled: true
0082                         acceptedButtons: Qt.NoButton
0083                         cursorShape: Qt.IBeamCursor
0084                         z: 1
0085                     }
0086                     Keys.onReturnPressed: {
0087                         if (event.key === Qt.Key_Return) {
0088                             if (event.modifiers & Qt.ShiftModifier) {
0089                                 messageField.append("")
0090                             } else {
0091                                 sendButton.clicked()
0092                                 event.accepted = true
0093                             }
0094                         }
0095                     }
0096                 }
0097             }
0098 
0099             ColumnLayout {
0100                 id: sendButtonArea
0101                 Layout.alignment: Qt.AlignBottom
0102 
0103                 RowLayout {
0104                     Controls.ToolButton {
0105                         id: attachFilesButton
0106                         enabled: true
0107                         Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0108                         Layout.preferredHeight: Kirigami.Units.gridUnit * 2
0109                         padding: 0
0110                         Text {
0111                             id: attachedFilesCount
0112                             text: selectedFileUrls.length
0113                             color: "red"
0114                             visible: selectedFileUrls.length > 0
0115                         }
0116                         Kirigami.Icon {
0117                             source: "insert-image"
0118                             isMask: true
0119                             smooth: true
0120                             anchors.centerIn: parent
0121                             width: Kirigami.Units.gridUnit * 1.5
0122                             height: width
0123                         }
0124 
0125                         onClicked: {
0126                             fileDialog.open()
0127                         }
0128                     }
0129 
0130                     Controls.ToolButton {
0131                         id: clearAttachmentButton
0132                         visible: selectedFileUrls.length > 0
0133                         Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0134                         Layout.preferredHeight: Kirigami.Units.gridUnit * 2
0135                         padding: 0
0136                         Kirigami.Icon {
0137                             id: cancelIcon
0138                             source: "edit-clear"
0139                             isMask: true
0140                             smooth: true
0141                             anchors.centerIn: parent
0142                             width: Kirigami.Units.gridUnit * 1.5
0143                             height: width
0144                         }
0145 
0146                         onClicked: {
0147                             selectedFileUrls = []
0148                         }
0149                     }
0150 
0151                     Controls.ToolButton {
0152                         property bool isSendingInProcess: false
0153 
0154                         id: sendButton
0155                         enabled: (messageField.text.length || selectedFileUrls.length) && !isSendingInProcess
0156                         Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0157                         Layout.preferredHeight: Kirigami.Units.gridUnit * 2
0158                         padding: 0
0159                         Kirigami.Icon {
0160                             source: "document-send"
0161                             enabled: sendButton.enabled
0162                             isMask: true
0163                             smooth: true
0164                             anchors.centerIn: parent
0165                             width: Kirigami.Units.gridUnit * 1.5
0166                             height: width
0167                         }
0168 
0169                         property bool messageSent: false
0170 
0171                         onClicked: {
0172 
0173                             // prevent sending the same message several times
0174                             // and don't touch enabled property
0175                             if (isSendingInProcess){
0176                                 return;
0177                             }
0178                             isSendingInProcess = true
0179 
0180                             if (SmsHelper.totalMessageSize(selectedFileUrls, messageField.text) > maxMessageSize) {
0181                                 messageDialog.visible = true
0182                             } else if (page.conversationId === page.invalidId) {
0183                                 messageSent = conversationModel.startNewConversation(messageField.text, addresses, selectedFileUrls)
0184                             } else {
0185                                 messageSent = conversationModel.sendReplyToConversation(messageField.text, selectedFileUrls)
0186                             }
0187 
0188                             if (messageSent) {
0189                                 messageField.text = ""
0190                                 selectedFileUrls = []
0191                             }
0192                             isSendingInProcess = false
0193                         }
0194                     }
0195                 }
0196 
0197                 Controls.Label {
0198                     id: charCount
0199                     text: conversationModel.getCharCountInfo(messageField.text)
0200                     visible: text.length > 0
0201                     Layout.minimumWidth: Math.max(Layout.minimumWidth, width) // Make this label only grow, never shrink
0202                 }
0203             }
0204         }
0205     }
0206 }