Warning, /utilities/alpaka/src/apps/qml/ChatView.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2023 Loren Burkholder <computersemiexpert@outlook.com> 0002 // SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com> 0003 // 0004 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 0006 import QtQuick 0007 import QtQuick.Controls as Controls 0008 import QtQuick.Layouts 0009 import org.kde.kirigami as Kirigami 0010 import org.kde.coreaddons as KCoreAddons 0011 import org.kde.kirigamiaddons.components as KirigamiComponents 0012 import org.kde.alpaka 0013 0014 Kirigami.Page { 0015 title: i18n("Alpaka") 0016 actions: [ 0017 Kirigami.Action { 0018 text: i18n("Start over") 0019 icon.name: "view-refresh" 0020 onTriggered: chat.resetConversation() 0021 }, 0022 Kirigami.Action { 0023 text: i18n("Settings") 0024 icon.name: "settings-configure" 0025 onTriggered: pageStack.pushDialogLayer(settingsPage) 0026 } 0027 ] 0028 0029 header: KirigamiComponents.Banner { 0030 id: errorBanner 0031 0032 visible: chat.llm.hasError 0033 type: Kirigami.MessageType.Error 0034 width: parent.width 0035 actions: [ 0036 Kirigami.Action { 0037 text: i18n("Try again") 0038 icon.name: "view-refresh" 0039 onTriggered: chat.llm.reload() 0040 } 0041 ] 0042 } 0043 0044 Kirigami.PlaceholderMessage { 0045 anchors.centerIn: parent 0046 0047 text: i18n("Waiting for interface") 0048 visible: !chat.llm.ready 0049 } 0050 0051 ColumnLayout { 0052 spacing: 10 0053 anchors.fill: parent 0054 0055 Controls.ScrollView { 0056 Layout.fillWidth: true 0057 Layout.fillHeight: true 0058 0059 ListView { 0060 id: chatView 0061 spacing: 10 0062 model: chat 0063 clip: true 0064 0065 delegate: RowLayout { 0066 id: messageDelegate 0067 0068 required property string message 0069 required property var sender 0070 required property bool finished 0071 0072 width: chatView.width 0073 height: messageBubble.height 0074 0075 Rectangle { 0076 id: messageBubble 0077 0078 radius: 5 0079 color: palette.alternateBase 0080 Layout.preferredWidth: messageLayout.implicitWidth + 20 0081 Layout.preferredHeight: messageLayout.implicitHeight + 20 0082 Layout.maximumWidth: chatView.width * 0.75 0083 Layout.alignment: messageDelegate.sender === ChatModel.LLM ? Qt.AlignLeft : Qt.AlignRight 0084 border { 0085 width: 1 0086 color: palette.highlight 0087 } 0088 0089 ColumnLayout { 0090 id: messageLayout 0091 0092 anchors.fill: parent 0093 anchors.margins: 10 0094 spacing: 10 0095 0096 RowLayout { 0097 Layout.fillWidth: true 0098 spacing: 10 0099 0100 KirigamiComponents.Avatar { 0101 source: messageDelegate.sender === ChatModel.User ? localUser.faceIconUrl + "?timestamp=" + Date.now() : "" 0102 Layout.preferredHeight: userName.height + 15 0103 Layout.preferredWidth: height 0104 } 0105 0106 Controls.Label { 0107 id: userName 0108 0109 text: messageDelegate.sender === ChatModel.LLM ? i18n("Alpaka") : localUser.fullName 0110 font.bold: true 0111 font.pixelSize: 15 0112 } 0113 0114 TypingIndicator { 0115 visible: !messageDelegate.finished 0116 } 0117 } 0118 0119 Controls.Label { 0120 text: messageDelegate.message 0121 wrapMode: Controls.Label.WordWrap 0122 Layout.fillWidth: true 0123 textFormat: Controls.Label.MarkdownText 0124 } 0125 } 0126 } 0127 } 0128 } 0129 } 0130 0131 Controls.TextField { 0132 id: messageInput 0133 0134 placeholderText: i18n("Enter a message") 0135 enabled: chat.llm.ready && !chat.replyInProgress 0136 Layout.fillWidth: true 0137 focus: true 0138 onAccepted: { 0139 chat.sendMessage(messageInput.text); 0140 messageInput.text = ""; 0141 } 0142 } 0143 } 0144 }