81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			QML
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			QML
		
	
	
	
	
	
| // Copyright 2019 miruka
 | |
| // This file is part of harmonyqml, licensed under LGPLv3.
 | |
| 
 | |
| import QtQuick 2.12
 | |
| import QtQuick.Layouts 1.12
 | |
| import "../Base"
 | |
| 
 | |
| HRectangle {
 | |
|     function setFocus() { textArea.forceActiveFocus() }
 | |
| 
 | |
|     id: sendBox
 | |
|     Layout.fillWidth: true
 | |
|     Layout.minimumHeight: theme.baseElementsHeight
 | |
|     Layout.preferredHeight: textArea.implicitHeight
 | |
|     // parent.height / 2 causes binding loop?
 | |
|     Layout.maximumHeight: pageStack.height / 2
 | |
|     color: theme.chat.sendBox.background
 | |
| 
 | |
|     HRowLayout {
 | |
|         anchors.fill: parent
 | |
| 
 | |
|         HUserAvatar {
 | |
|             id: avatar
 | |
|             userId: chatPage.userId
 | |
|         }
 | |
| 
 | |
|         HScrollableTextArea {
 | |
|             Layout.fillHeight: true
 | |
|             Layout.fillWidth: true
 | |
|             Layout.topMargin: Math.max(0, sendBox.Layout.minimumHeight - 34)
 | |
| 
 | |
|             id: textArea
 | |
|             placeholderText: qsTr("Type a message...")
 | |
|             backgroundColor: "transparent"
 | |
|             area.focus: true
 | |
| 
 | |
|             property bool textChangedSinceLostFocus: false
 | |
| 
 | |
|             function setTyping(typing) {
 | |
|                 py.callClientCoro(
 | |
|                     chatPage.userId,
 | |
|                     "room_typing",
 | |
|                     [chatPage.roomId, typing, 5000]
 | |
|                 )
 | |
|             }
 | |
| 
 | |
|             onTextChanged: {
 | |
|                 setTyping(Boolean(text))
 | |
|                 textChangedSinceLostFocus = true
 | |
|             }
 | |
|             area.onEditingFinished: {  // when lost focus
 | |
|                 if (text && textChangedSinceLostFocus) {
 | |
|                     setTyping(false)
 | |
|                     textChangedSinceLostFocus = false
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             Component.onCompleted: {
 | |
|                 area.Keys.onReturnPressed.connect(event => {
 | |
|                     event.accepted = true
 | |
| 
 | |
|                     if (event.modifiers & Qt.ShiftModifier ||
 | |
|                         event.modifiers & Qt.ControlModifier ||
 | |
|                         event.modifiers & Qt.AltModifier) {
 | |
|                         textArea.insert(textArea.cursorPosition, "\n")
 | |
|                         return
 | |
|                     }
 | |
| 
 | |
|                     if (textArea.text === "") { return }
 | |
| 
 | |
|                     var args = [chatPage.roomId, textArea.text]
 | |
|                     py.callClientCoro(chatPage.userId, "send_markdown", args)
 | |
|                     area.clear()
 | |
|                 })
 | |
| 
 | |
|                 area.Keys.onEnterPressed.connect(area.Keys.onReturnPressed)
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | 
