Files
neochat/src/messagecontent/ReplyMessageComponentChooser.qml
James Graham b4e1740cad Separate out a base MessageContentModel.
Separate out a base `MessageContentModel` that can be extended to get the component types from different places. This is used currently for `EventMessageContentModel` but will be used later as part of the rich chat bar.

All display text is now in the text component so it never needs special casing. This also cleans up some of the model parameters so more things come from attributes including location and file data (which was already a qvariantmap anyway).

Also cleaned up the itinerary and file enhancement views,
2025-08-01 12:15:51 +01:00

148 lines
3.8 KiB
QML

// SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
import QtQuick
import QtQuick.Layouts
import Qt.labs.qmlmodels
import org.kde.kirigami as Kirigami
import org.kde.neochat
/**
* @brief Select a message component based on a MessageComponentType.
*/
DelegateChooser {
id: root
/**
* @brief The reply has been clicked.
*/
signal replyClicked()
role: "componentType"
DelegateChoice {
roleValue: MessageComponentType.Author
delegate: ReplyAuthorComponent {}
}
DelegateChoice {
roleValue: MessageComponentType.Text
delegate: TextComponent {
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton
cursorShape: Qt.PointingHandCursor
onClicked: root.replyClicked()
}
}
}
DelegateChoice {
roleValue: MessageComponentType.Image
delegate: ImageComponent {
contentMaxHeight: Kirigami.Units.gridUnit * 5
}
}
DelegateChoice {
roleValue: MessageComponentType.Video
delegate: MimeComponent {
required property var componentAttributes
mimeIconSource: componentAttributes.mimeIcon
size: componentAttributes.size
duration: componentAttributes.duration
label: componentAttributes.filename
}
}
DelegateChoice {
roleValue: MessageComponentType.Code
delegate: CodeComponent {
Layout.maximumHeight: Kirigami.Units.gridUnit * 5
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton
cursorShape: Qt.PointingHandCursor
onClicked: root.replyClicked()
}
}
}
DelegateChoice {
roleValue: MessageComponentType.Quote
delegate: QuoteComponent {
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton
cursorShape: Qt.PointingHandCursor
onClicked: root.replyClicked()
}
}
}
DelegateChoice {
roleValue: MessageComponentType.Audio
delegate: MimeComponent {
required property string display
required property var componentAttributes
mimeIconSource: componentAttributes.mimeIcon
size: componentAttributes.size
duration: componentAttributes.duration
label: componentAttributes.filename
}
}
DelegateChoice {
roleValue: MessageComponentType.File
delegate: MimeComponent {
required property string display
required property var componentAttributes
mimeIconSource: componentAttributes.mimeIcon
size: componentAttributes.size
label: componentAttributes.filename
}
}
DelegateChoice {
roleValue: MessageComponentType.Poll
delegate: PollComponent {}
}
DelegateChoice {
roleValue: MessageComponentType.Location
delegate: MimeComponent {
mimeIconSource: "mark-location"
label: display
}
}
DelegateChoice {
roleValue: MessageComponentType.LiveLocation
delegate: MimeComponent {
mimeIconSource: "mark-location"
label: display
}
}
DelegateChoice {
roleValue: MessageComponentType.Encrypted
delegate: EncryptedComponent {}
}
DelegateChoice {
roleValue: MessageComponentType.Loading
delegate: LoadComponent {}
}
DelegateChoice {
roleValue: MessageComponentType.Other
delegate: Item {}
}
}