moment/src/gui/Pages/Chat/Composer/Composer.qml
2022-08-10 11:59:09 +02:00

161 lines
5.0 KiB
QML

// Copyright Mirage authors & contributors <https://github.com/mirukana/mirage>
// SPDX-License-Identifier: LGPL-3.0-or-later
import QtQuick 2.12
import QtQuick.Layouts 1.12
import "../../.."
import "../../../Base"
import "../../../Base/Buttons"
import "../AutoCompletion"
Rectangle {
id: root
property UserAutoCompletion userCompletion
property alias eventList: messageArea.eventList
readonly property bool widthStarved: width < 384 * theme.uiScale
readonly property bool parted: chat.roomInfo.left
readonly property string inviterId: chat.roomInfo.inviter_id
readonly property string inviterColoredName:
utils.coloredNameHtml(chat.roomInfo.inviter_name, inviterId)
readonly property bool hasFocus:
messageArea.activeFocus ||
joinButton.activeFocus ||
exitButton.activeFocus
readonly property alias messageArea: messageArea
function takeFocus() {
joinButton.visible ? joinButton.forceActiveFocus() :
exitButton.visible ? exitButton.forceActiveFocus() :
messageArea.forceActiveFocus()
}
implicitHeight: Math.max(theme.baseElementsHeight, row.implicitHeight)
color: theme.chat.composer.background
HRowLayout {
id: row
anchors.fill: parent
HUserAvatar {
id: avatar
readonly property QtObject writerInfo:
ModelStore.get("accounts").find(clientUserId)
clientUserId: messageArea.writerId
userId: clientUserId
mxc: writerInfo ? writerInfo.avatar_url : ""
displayName: writerInfo ? writerInfo.display_name : ""
radius: 0
}
HScrollView {
enabled: visible
visible: ! root.inviterId && ! root.parted
onVisibleChanged: if (root.hasFocus) root.takeFocus()
Layout.fillHeight: true
Layout.fillWidth: true
MessageArea {
id: messageArea
autoCompletionOpen: userCompletion.open && userCompletion.count
usersCompleted: userCompletion.usersCompleted
onAutoCompletePrevious: userCompletion.previous()
onAutoCompleteNext: userCompletion.next()
onCancelAutoCompletion: userCompletion.cancel()
onAcceptAutoCompletion:
! userCompletion.autoOpen ||
userCompletion.autoOpenCompleted ?
userCompletion.accept() :
null
}
}
UploadButton {
visible: ! root.inviterId && ! root.parted
onVisibleChanged: if (root.hasFocus) root.takeFocus()
Layout.fillHeight: true
}
HLabel {
textFormat: Text.StyledText
wrapMode: HLabel.Wrap
visible: root.inviterId || root.parted
verticalAlignment: HLabel.AlignVCenter
text:
root.parted && root.inviterId ?
qsTr("Declined %1's invite").arg(root.inviterColoredName) :
root.parted ?
qsTr("No longer part of this room") :
qsTr("Invited by %1").arg(root.inviterColoredName)
leftPadding: theme.spacing
rightPadding: leftPadding
topPadding: theme.spacing / 2
bottomPadding: topPadding
onVisibleChanged: if (root.hasFocus) root.takeFocus()
Layout.fillWidth: true
Layout.fillHeight: true
}
ApplyButton {
id: joinButton
icon.name: "invite-accept"
text: widthStarved ? "" : qsTr("Join")
visible: root.inviterId && ! root.parted
onVisibleChanged: if (root.hasFocus) root.takeFocus()
onClicked: {
loading = true
function callback() { joinButton.loading = false }
py.callClientCoro(chat.userId, "join", [chat.roomId], callback)
}
Layout.fillWidth: false
Layout.fillHeight: true
}
CancelButton {
id: exitButton
icon.name: root.parted ? "room-forget" : "invite-decline"
visible: root.inviterId || root.parted
text:
widthStarved ? "" :
root.parted ? qsTr("Forget") :
qsTr("Decline")
onVisibleChanged: if (root.hasFocus) root.takeFocus()
onClicked: {
loading = true
window.makePopup("Popups/LeaveRoomPopup.qml", {
userId: chat.userId,
roomId: chat.roomId,
roomName: chat.roomInfo.display_name,
inviterId: root.inviterId,
left: root.parted,
doneCallback: () => { exitButton.loading = false },
})
}
Layout.fillWidth: false
Layout.fillHeight: true
Behavior on implicitWidth { HNumberAnimation {} }
}
}
}