summaryrefslogtreecommitdiff
path: root/Event.qml
blob: 7bad6d5c19564a1bd6fc9bac6ec20227565175a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// SPDX-License-Identifier: Unlicense

import QtQuick 2.12
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.6

import 'util.js' as Util

// This is the delegate for event list items.
ItemDelegate {
    required property var model
    required property int index
    required property int time

    property alias fields: inputs.model // field definitions
    property bool editing: false

    clip: true
    padding: 2

    background: Rectangle {
        anchors.fill: parent
        color: highlighted ? Util.alphize(border.color, 0.1) :
            (index % 2 === 0 ? palette.base : palette.alternateBase)
        border {
            color: editing ? palette.highlight : palette.dark
            width: highlighted ? 1 : 0
        }
        radius: border.width
    }

    // Set inputs to current model values.
    function reset() {
        for (var i = 0; i < fields.length; i++) {
            const child = inputs.itemAt(i)
            if (child && child.item)
                child.item.set(model.values[fields[i].name])
        }
    }

    // Store current inputs in model.
    function store() {
        var values = {}
        for (var i = 0; i < fields.length; i++)
            values[fields[i].name] = inputs.itemAt(i).item.value
        model.values = values
    }

    Component.onCompleted: reset()
    onEditingChanged: {
        if (editing)
            forceActiveFocus()
    }

    // Try passing key to each field input in order.
    Keys.forwardTo: Array.from({ length: inputs.count }, (_, i) => inputs.itemAt(i).item)

    contentItem: ColumnLayout {
        anchors { left: parent.left; right: parent.right; margins: 5 }

        // Event time, tag and summary.
        RowLayout {
            Label {
                text: new Date(model.time).toISOString().substr(12, 9)
                font.pixelSize: 10
                Layout.alignment: Qt.AlignBaseline
            }
            Label {
                text: model.tag
                font.weight: Font.DemiBold
                Layout.alignment: Qt.AlignBaseline
            }
            Label {
                text: {
                    var str = ''
                    for (var i = 0; i < inputs.count; i++) {
                        const field = inputs.model[i]
                        const value = inputs.itemAt(i).item.value
                        if (value && field.type !== 'TextArea')
                            str += (field.type === 'Bool' ? field.name : value) + ' '
                    }
                    return str
                }
                elide: Text.ElideRight
                textFormat: Text.PlainText
                Layout.fillWidth: true
                Layout.alignment: Qt.AlignBaseline
            }
        }

        // Event‐specific input fields.
        GridLayout {
            flow: GridLayout.TopToBottom
            rows: inputs.count

            columnSpacing: 10
            visible: editing

            // Labels.
            Repeater {
                model: inputs.model
                delegate: Label {
                    text: Util.addShortcut(modelData.name, modelData.key)
                    Layout.alignment: Qt.AlignRight
                }
            }

            // Inputs.
            Repeater {
                id: inputs
                delegate: Loader {
                    source: 'qrc:/Fields/' + modelData.type + '.qml'
                    Layout.fillHeight: true
                    Layout.fillWidth: true
                    Binding {
                        target: item; property: 'model'
                        value: modelData
                    }
                }
            }
        }
    }
}