116 lines
2.5 KiB
QML
116 lines
2.5 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import ZShell.Config
|
|
import ZShell.Components
|
|
import ZShell.Llm
|
|
import qs.Components
|
|
import qs.Services
|
|
|
|
Item {
|
|
id: root
|
|
|
|
required property ChatGeneration current
|
|
required property TextEdit edit
|
|
required property bool hovered
|
|
required property bool isUser
|
|
required property ChatMessage message
|
|
required property LlmSegment segment
|
|
|
|
implicitHeight: editButton.implicitHeight
|
|
implicitWidth: generationTools.implicitWidth + editTools.implicitWidth + Tokens.spacing.small
|
|
|
|
ButtonRow {
|
|
id: generationTools
|
|
|
|
enabled: visible
|
|
visible: !root.isUser
|
|
|
|
IconButton {
|
|
enabled: root.message.generationCount > 1 && root.message.activeGenerationIndex !== 0
|
|
icon: "chevron_left"
|
|
type: IconButton.Tonal
|
|
|
|
onClicked: {
|
|
if (!root.edit.readOnly)
|
|
root.edit.readOnly = true;
|
|
root.message.setActiveGeneration(root.message.activeGenerationIndex - 1);
|
|
}
|
|
}
|
|
|
|
IconButton {
|
|
enabled: false
|
|
icon: `${root.message.activeGenerationIndex + 1}`
|
|
label.font.family: Config.appearance.font.family.sans
|
|
label.font.pointSize: Tokens.font.size.small
|
|
type: IconButton.Text
|
|
}
|
|
|
|
IconButton {
|
|
enabled: root.message.generationCount > 1 && root.message.activeGenerationIndex !== root.message.generationCount - 1
|
|
icon: "chevron_right"
|
|
type: IconButton.Tonal
|
|
|
|
onClicked: {
|
|
if (!root.edit.readOnly)
|
|
root.edit.readOnly = true;
|
|
root.message.setActiveGeneration(root.message.activeGenerationIndex + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
ButtonRow {
|
|
id: editTools
|
|
|
|
anchors.right: parent.right
|
|
opacity: !root.current.streaming && root.hovered ? 1 : 0
|
|
spacing: Tokens.spacing.small
|
|
visible: opacity > 0
|
|
|
|
Behavior on opacity {
|
|
Anim {}
|
|
}
|
|
|
|
IconButton {
|
|
icon: "refresh"
|
|
inactiveColor: Colors.palette.m3secondary
|
|
inactiveOnColor: Colors.palette.m3onSecondary
|
|
scale: root.edit.readOnly ? 1 : 0
|
|
visible: !root.isUser
|
|
|
|
Behavior on scale {
|
|
Anim {}
|
|
}
|
|
|
|
onClicked: {
|
|
root.message.retry();
|
|
}
|
|
}
|
|
|
|
IconButton {
|
|
icon: "content_copy"
|
|
inactiveColor: Colors.palette.m3secondary
|
|
inactiveOnColor: Colors.palette.m3onSecondary
|
|
scale: root.edit.readOnly ? 1 : 0
|
|
|
|
Behavior on scale {
|
|
Anim {}
|
|
}
|
|
|
|
onClicked: Quickshell.clipboardText = root.current.content
|
|
}
|
|
|
|
IconButton {
|
|
id: editButton
|
|
|
|
icon: root.edit.readOnly ? "edit" : "check"
|
|
inactiveColor: Colors.palette.m3tertiary
|
|
inactiveOnColor: Colors.palette.m3onTertiary
|
|
visible: root.isUser
|
|
|
|
onClicked: {
|
|
root.edit.readOnly = !root.edit.readOnly;
|
|
}
|
|
}
|
|
}
|
|
}
|