summaryrefslogtreecommitdiff
path: root/Events.qml
diff options
context:
space:
mode:
authorTimotej Lazar <timotej.lazar@araneo.si>2021-06-14 19:09:53 +0200
committerTimotej Lazar <timotej.lazar@araneo.si>2021-06-14 19:13:14 +0200
commit8d57bfb1aef3b71557bc408154ee028751fd688e (patch)
tree22ee6eaa22a3cfc7dfd4f938be16a6e28d7eaf1f /Events.qml
First commit
There was history before but now there is no more.
Diffstat (limited to 'Events.qml')
-rw-r--r--Events.qml155
1 files changed, 155 insertions, 0 deletions
diff --git a/Events.qml b/Events.qml
new file mode 100644
index 0000000..8853f90
--- /dev/null
+++ b/Events.qml
@@ -0,0 +1,155 @@
+// SPDX-License-Identifier: Unlicense
+
+import QtQuick 2.12
+import QtQuick.Controls 2.13
+import QtQuick.Layouts 1.6
+import QtQml.Models 2.1
+
+import 'util.js' as Util
+
+ListView {
+ id: control
+
+ property bool editing: false
+ property var tags: []
+
+ signal changed
+
+ clip: true
+ focus: true
+ keyNavigationEnabled: true
+ highlightMoveDuration: 0
+ highlightResizeDuration: 0
+ ScrollBar.vertical: ScrollBar { anchors.right: parent.right }
+
+ // Create a new blank event, insert it and start editing.
+ function create(time, tag, fields) {
+ const index = Util.find(list, 'time', time)
+ list.insert(index, {
+ 'time': time,
+ 'tag': tag,
+ 'fields': fields,
+ })
+ currentIndex = index
+ if (fields.length > 0)
+ editing = true
+ changed()
+ }
+
+ function clear() {
+ list.clear()
+ }
+
+ function load(json) {
+ // Return list of fields for the given tag.
+ function getFields(name) {
+ for (var i = 0; i < tags.length; i++)
+ if (tags[i].tag === name)
+ return tags[i].fields
+ return []
+ }
+
+ for (var i = 0; i < json.length; i++) {
+ const event = json[i]
+ var fields = getFields(event.tag)
+ for (var j = 0; j < fields.length; j++)
+ fields[j].value = event.fields[fields[j].name]
+ list.append({ 'time': event.time, 'tag': event.tag, 'fields': fields })
+ }
+ forceActiveFocus()
+ }
+
+ function save() {
+ var data = []
+ for (var i = 0; i < list.count; i++) {
+ const event = list.get(i)
+ var fields = {}
+ for (var j = 0; j < event.fields.count; j++) {
+ const field = event.fields.get(j)
+ fields[field.name] = field.value
+ }
+ data.push({ 'time': event.time, 'tag': event.tag, 'fields': fields })
+ }
+ return data
+ }
+
+ onCurrentIndexChanged: editing = false
+
+ Keys.onPressed: {
+ switch (event.key) {
+ case Qt.Key_Enter:
+ case Qt.Key_Return:
+ if (editing) {
+ currentItem.store()
+ changed()
+ editing = false
+ } else {
+ if (currentItem.fields.count > 0)
+ editing = true
+ }
+ break
+ case Qt.Key_Escape:
+ if (editing) {
+ currentItem.reset()
+ editing = false
+ }
+ break
+ case Qt.Key_Delete:
+ editing = false
+ if (currentIndex >= 0 && currentIndex < list.count) {
+ list.remove(currentIndex)
+ changed()
+ }
+ break
+ case Qt.Key_Tab:
+ case Qt.Key_Backtab:
+ // swallow tabs so we don’t lose focus when editing
+ break
+ default:
+ return
+ }
+ event.accepted = true
+ }
+
+ model: ListModel {
+ id: list
+ dynamicRoles: true
+ }
+
+ delegate: Event {
+ id: item
+
+ time: model.time
+ tag: model.tag
+ fields: model.fields
+
+ width: control.width
+ editing: control.editing && ListView.isCurrentItem
+
+ background: Rectangle {
+ anchors.fill: parent
+ color: border.width > 0 ? Util.alphize(border.color, 0.1) :
+ (index % 2 === 0 ? palette.base : palette.alternateBase)
+ border {
+ color: editing ? palette.highlight : palette.dark
+ width: item.ListView.isCurrentItem ? 1 : 0
+ }
+ radius: border.width
+ }
+
+ Connections {
+ enabled: ListView.currentIndex === index
+ function onHeightChanged() {
+ control.positionViewAtIndex(index, ListView.Contain)
+ }
+ }
+ onEditingChanged: {
+ reset()
+ if (editing)
+ forceActiveFocus()
+ }
+ onRemove: {
+ list.remove(ObjectModel.index)
+ }
+ }
+}