Implement filter

Add a proxy model class with filter logic, and use it as the model for
events ListView.
This commit is contained in:
Timotej Lazar 2021-09-05 21:16:46 +02:00
parent cb76fedcbc
commit 8d44150598
No known key found for this signature in database
GPG key ID: B6F38793D143456F
6 changed files with 144 additions and 12 deletions

View file

@ -20,6 +20,11 @@ Page {
onRowsRemoved: modified = true
}
EventFilter {
id: eventFilter
sourceModel: eventList
}
FileDialog {
id: videoDialog
title: qsTr('Open video')
@ -122,7 +127,24 @@ Page {
// Events list.
ColumnLayout {
spacing: 0
Label { text: qsTr('Events') }
RowLayout {
Label {
text: qsTr('Events')
Layout.fillWidth: true
}
Label { text: qsTr('🔍') }
TapHandler { onTapped: filter.visible = !filter.visible }
}
TextField {
id: filter
Layout.fillWidth: true
placeholderText: qsTr('Filter…')
visible: false
onTextChanged: eventFilter.setFilter(text)
}
Frame {
padding: 1
Layout.fillWidth: true
@ -133,7 +155,7 @@ Page {
anchors.fill: parent
focus: true
model: eventList
model: eventFilter
tags: eventList.tags
onEditingChanged: video.pause(editing)
@ -168,7 +190,7 @@ Page {
break
case Qt.Key_Delete:
editing = false
eventList.removeRows(currentIndex)
eventFilter.remove(currentIndex)
break
case Qt.Key_Tab:
case Qt.Key_Backtab:
@ -212,9 +234,15 @@ Page {
model: eventList.tagsOrder.map(tag => eventList.tags[tag])
enabled: video.loaded && !events.editing
onClicked: {
events.currentIndex = eventList.insert(video.time)
const index = eventList.insert(tag, video.time)
// Reset filter if new event doesnt match.
var row = eventFilter.mapFromSource(eventList.index(index, 0)).row
if (eventFilter.mapFromSource(eventList.index(index, 0)).row === -1) {
filter.text = ''
row = index
}
events.currentIndex = row
const event = events.currentItem
event.model.tag = tag
if (event.fields.length > 0)
events.editing = true
}