// SPDX-FileCopyrightText: 2024 James Graham // 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 maximum width that the bubble's content can be. */ property real maxContentWidth: -1 /** * @brief The reply has been clicked. */ signal replyClicked() role: "componentType" DelegateChoice { roleValue: MessageComponentType.Author delegate: ReplyAuthorComponent { maxContentWidth: root.maxContentWidth } } DelegateChoice { roleValue: MessageComponentType.Text delegate: TextComponent { maxContentWidth: root.maxContentWidth MouseArea { anchors.fill: parent acceptedButtons: Qt.LeftButton cursorShape: Qt.PointingHandCursor onClicked: root.replyClicked() } } } DelegateChoice { roleValue: MessageComponentType.Image delegate: Image { id: image required property var mediaInfo Layout.maximumWidth: mediaSizeHelper.currentSize.width Layout.maximumHeight: mediaSizeHelper.currentSize.height source: image.mediaInfo.source MediaSizeHelper { id: mediaSizeHelper contentMaxWidth: root.maxContentWidth contentMaxHeight: Kirigami.Units.gridUnit * 5 mediaWidth: image.mediaInfo.width ?? 0 mediaHeight: image.mediaInfo.height ?? 0 } } } DelegateChoice { roleValue: MessageComponentType.Video delegate: MimeComponent { required property var mediaInfo mimeIconSource: mediaInfo.mimeIcon size: mediaInfo.size duration: mediaInfo.duration label: mediaInfo.filename } } DelegateChoice { roleValue: MessageComponentType.Code delegate: CodeComponent { Layout.maximumHeight: Kirigami.Units.gridUnit * 5 maxContentWidth: root.maxContentWidth MouseArea { anchors.fill: parent acceptedButtons: Qt.LeftButton cursorShape: Qt.PointingHandCursor onClicked: root.replyClicked() } } } DelegateChoice { roleValue: MessageComponentType.Quote delegate: QuoteComponent { maxContentWidth: root.maxContentWidth 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 mediaInfo mimeIconSource: mediaInfo.mimeIcon size: mediaInfo.size duration: mediaInfo.duration label: mediaInfo.filename } } DelegateChoice { roleValue: MessageComponentType.File delegate: MimeComponent { required property string display required property var mediaInfo mimeIconSource: mediaInfo.mimeIcon size: mediaInfo.size label: mediaInfo.filename } } DelegateChoice { roleValue: MessageComponentType.Poll delegate: PollComponent { room: root.room maxContentWidth: root.maxContentWidth } } 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 { maxContentWidth: root.maxContentWidth } } DelegateChoice { roleValue: MessageComponentType.Loading delegate: LoadComponent { maxContentWidth: root.maxContentWidth } } DelegateChoice { roleValue: MessageComponentType.Other delegate: Item {} } }