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 } }