mirror of
https://github.com/danbulant/dots-hyprland
synced 2026-05-24 12:22:09 +00:00
180 lines
No EOL
6.9 KiB
QML
180 lines
No EOL
6.9 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import "root:/"
|
|
import "root:/services"
|
|
import "root:/modules/common/"
|
|
import "root:/modules/common/widgets"
|
|
import "../"
|
|
import "root:/modules/common/functions/string_utils.js" as StringUtils
|
|
import "root:/modules/common/functions/color_utils.js" as ColorUtils
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
import Quickshell.Io
|
|
import Quickshell
|
|
import Quickshell.Widgets
|
|
import Quickshell.Hyprland
|
|
import Qt5Compat.GraphicalEffects
|
|
|
|
Item {
|
|
id: root
|
|
// These are needed on the parent loader
|
|
property bool editing: parent?.editing ?? false
|
|
property bool renderMarkdown: parent?.renderMarkdown ?? true
|
|
property bool enableMouseSelection: parent?.enableMouseSelection ?? false
|
|
property string segmentContent: parent?.segmentContent ?? ({})
|
|
property var messageData: parent?.messageData ?? {}
|
|
property bool done: parent?.done ?? true
|
|
property bool completed: parent?.completed ?? false
|
|
|
|
property real thinkBlockBackgroundRounding: Appearance.rounding.small
|
|
property real thinkBlockHeaderPaddingVertical: 3
|
|
property real thinkBlockHeaderPaddingHorizontal: 10
|
|
property real thinkBlockComponentSpacing: 2
|
|
|
|
property var collapseAnimation: messageTextBlock.implicitHeight > 40 ? Appearance.animation.elementMoveEnter : Appearance.animation.elementMoveFast
|
|
property bool collapsed: true /* should be root.completed but its kinda buggy rn so nope */
|
|
|
|
Layout.fillWidth: true
|
|
implicitHeight: collapsed ? header.implicitHeight : columnLayout.implicitHeight
|
|
layer.enabled: true
|
|
layer.effect: OpacityMask {
|
|
maskSource: Rectangle {
|
|
width: root.width
|
|
height: root.height
|
|
radius: thinkBlockBackgroundRounding
|
|
}
|
|
}
|
|
|
|
Behavior on implicitHeight {
|
|
enabled: root.completed ?? false
|
|
NumberAnimation {
|
|
duration: collapseAnimation.duration
|
|
easing.type: collapseAnimation.type
|
|
easing.bezierCurve: collapseAnimation.bezierCurve
|
|
}
|
|
}
|
|
|
|
ColumnLayout {
|
|
id: columnLayout
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
spacing: 0
|
|
|
|
Rectangle { // Header background
|
|
id: header
|
|
color: Appearance.colors.colSurfaceContainerHighest
|
|
Layout.fillWidth: true
|
|
implicitHeight: thinkBlockTitleBarRowLayout.implicitHeight + thinkBlockHeaderPaddingVertical * 2
|
|
|
|
MouseArea { // Click to reveal
|
|
id: headerMouseArea
|
|
enabled: root.completed
|
|
anchors.fill: parent
|
|
cursorShape: Qt.PointingHandCursor
|
|
hoverEnabled: true
|
|
onClicked: {
|
|
root.collapsed = !root.collapsed
|
|
}
|
|
}
|
|
|
|
RowLayout { // Header content
|
|
id: thinkBlockTitleBarRowLayout
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.leftMargin: thinkBlockHeaderPaddingHorizontal
|
|
anchors.rightMargin: thinkBlockHeaderPaddingHorizontal
|
|
spacing: 10
|
|
|
|
MaterialSymbol {
|
|
Layout.fillWidth: false
|
|
Layout.topMargin: 7
|
|
Layout.bottomMargin: 7
|
|
Layout.leftMargin: 3
|
|
text: "linked_services"
|
|
}
|
|
StyledText {
|
|
id: thinkBlockLanguage
|
|
Layout.fillWidth: false
|
|
Layout.alignment: Qt.AlignLeft
|
|
text: root.completed ? qsTr("Chain of Thought") : (qsTr("Thinking") + ".".repeat(Math.random() * 4))
|
|
}
|
|
Item { Layout.fillWidth: true }
|
|
RippleButton { // Expand button
|
|
id: expandButton
|
|
visible: root.completed
|
|
implicitWidth: 22
|
|
implicitHeight: 22
|
|
colBackground: headerMouseArea.containsMouse ? Appearance.colors.colLayer2Hover
|
|
: ColorUtils.transparentize(Appearance.colors.colLayer2, 1)
|
|
colBackgroundHover: Appearance.colors.colLayer2Hover
|
|
colRipple: Appearance.colors.colLayer2Active
|
|
|
|
onClicked: { root.collapsed = !root.collapsed }
|
|
|
|
contentItem: MaterialSymbol {
|
|
anchors.centerIn: parent
|
|
text: "keyboard_arrow_down"
|
|
horizontalAlignment: Text.AlignHCenter
|
|
verticalAlignment: Text.AlignVCenter
|
|
iconSize: Appearance.font.pixelSize.normal
|
|
color: Appearance.colors.colOnLayer2
|
|
rotation: root.collapsed ? 0 : 180
|
|
Behavior on rotation {
|
|
NumberAnimation {
|
|
duration: Appearance.animation.elementMoveFast.duration
|
|
easing.type: Appearance.animation.elementMoveFast.type
|
|
easing.bezierCurve: Appearance.animation.elementMoveFast.bezierCurve
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Item {
|
|
id: content
|
|
Layout.fillWidth: true
|
|
implicitHeight: collapsed ? 0 : contentBackground.implicitHeight + thinkBlockComponentSpacing
|
|
clip: true
|
|
|
|
Behavior on implicitHeight {
|
|
enabled: root.completed ?? false
|
|
NumberAnimation {
|
|
duration: collapseAnimation.duration
|
|
easing.type: collapseAnimation.easing
|
|
easing.bezierCurve: collapseAnimation.bezierCurve
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: contentBackground
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.bottom: parent.bottom
|
|
implicitHeight: messageTextBlock.implicitHeight
|
|
color: Appearance.colors.colLayer2
|
|
|
|
// Load data for the message at the correct scope
|
|
property bool editing: root.editing
|
|
property bool renderMarkdown: root.renderMarkdown
|
|
property bool enableMouseSelection: root.enableMouseSelection
|
|
property string segmentContent: root.segmentContent
|
|
property var messageData: root.messageData
|
|
property bool done: root.done
|
|
|
|
MessageTextBlock {
|
|
id: messageTextBlock
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.bottom: parent.bottom
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |