Move Qt/Tauri/full Web SPA under archive/, ship hermit as CLI/TUI plus libcstcore and cst-webui/1 HTTP+SSE (turn lifecycle hooks, capabilities). Co-authored-by: Cursor <cursoragent@cursor.com>
62 lines
1.8 KiB
QML
62 lines
1.8 KiB
QML
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
|
|
// The engine's todo list (on_todo), rendered as a small checklist. The text
|
|
// is markdown-ish: "- [x] thing" lines.
|
|
ColumnLayout {
|
|
id: panel
|
|
property string text: ""
|
|
|
|
function entries() {
|
|
return text.split("\n")
|
|
.map(function (l) { return l.trim() })
|
|
.filter(function (l) { return l.length > 0 })
|
|
.map(function (l) {
|
|
const done = /^[-*]\s*\[[xX]\]/.test(l) || /^\[[xX]\]/.test(l)
|
|
const open = /^[-*]\s*\[\s*\]/.test(l) || /^\[\s*\]/.test(l)
|
|
return { done: done, todo: open, label: l.replace(/^[-*]?\s*\[[xX ]?\]\s*/, "").replace(/^[-*]\s*/, "") }
|
|
})
|
|
}
|
|
|
|
spacing: 6
|
|
|
|
Text {
|
|
text: "Plan"
|
|
color: Theme.textDim
|
|
font.pixelSize: Theme.smallSize
|
|
font.bold: true
|
|
}
|
|
|
|
Repeater {
|
|
model: panel.entries()
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
spacing: Theme.gap
|
|
ThemeIcon {
|
|
Layout.alignment: Qt.AlignTop
|
|
name: modelData.done ? "task-complete" : "box"
|
|
glyph: modelData.done ? "✓" : "○"
|
|
size: Theme.smallSize + 2
|
|
color: modelData.done ? Theme.ok : Theme.textFaint
|
|
}
|
|
Text {
|
|
Layout.fillWidth: true
|
|
text: modelData.label
|
|
color: modelData.done ? Theme.textFaint : Theme.textDim
|
|
font.pixelSize: Theme.smallSize
|
|
font.strikeout: modelData.done
|
|
wrapMode: Text.Wrap
|
|
}
|
|
}
|
|
}
|
|
|
|
Text {
|
|
Layout.fillWidth: true
|
|
visible: panel.entries().length === 0
|
|
text: "no plan yet"
|
|
color: Theme.textFaint
|
|
font.pixelSize: Theme.smallSize
|
|
}
|
|
}
|