2020-07-14 11:40:58 +00:00
|
|
|
import QtQuick 2.13
|
2021-12-08 21:20:43 +00:00
|
|
|
import utils 1.0
|
2020-07-14 11:40:58 +00:00
|
|
|
|
|
|
|
Item {
|
|
|
|
id: component
|
|
|
|
property alias model: filterModel
|
|
|
|
|
2021-07-09 21:00:27 +00:00
|
|
|
property string formattedFilter
|
2020-07-14 11:40:58 +00:00
|
|
|
property QtObject sourceModel: undefined
|
|
|
|
property string filter: ""
|
2020-07-20 16:48:23 +00:00
|
|
|
property int cursorPosition: 0
|
|
|
|
property int lastAtPosition: 0
|
2021-07-07 20:23:05 +00:00
|
|
|
property var property: ([])
|
2020-07-14 11:40:58 +00:00
|
|
|
|
2021-09-24 11:40:02 +00:00
|
|
|
onFilterChanged: invalidateFilter()
|
|
|
|
onPropertyChanged: invalidateFilter()
|
|
|
|
onSourceModelChanged: invalidateFilter()
|
2020-07-14 11:40:58 +00:00
|
|
|
Component.onCompleted: invalidateFilter()
|
|
|
|
|
|
|
|
ListModel {
|
|
|
|
id: filterModel
|
|
|
|
}
|
|
|
|
|
|
|
|
function invalidateFilter() {
|
2021-09-24 11:40:02 +00:00
|
|
|
filterModel.clear()
|
2020-07-14 11:40:58 +00:00
|
|
|
|
|
|
|
if (!isFilteringPropertyOk())
|
|
|
|
return
|
|
|
|
|
2021-09-24 11:40:02 +00:00
|
|
|
let filter = getFilter()
|
|
|
|
if (filter === undefined)
|
|
|
|
return
|
|
|
|
|
|
|
|
this.lastAtPosition = -1
|
|
|
|
for (let c = cursorPosition; c >= 0; c--) {
|
|
|
|
if (filter.charAt(c) === "@") {
|
|
|
|
this.lastAtPosition = c
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (this.lastAtPosition === -1)
|
2021-08-30 09:49:13 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
const all = shouldShowAll(filter)
|
|
|
|
|
|
|
|
for (var i = 0; i < sourceModel.rowCount(); ++i) {
|
2021-08-24 09:10:26 +00:00
|
|
|
const publicKey = sourceModel.rowData(i, "publicKey");
|
2021-08-30 09:49:13 +00:00
|
|
|
const item = {
|
2021-08-24 09:10:26 +00:00
|
|
|
alias: sourceModel.rowData(i, "alias"),
|
|
|
|
userName: sourceModel.rowData(i, "userName"),
|
|
|
|
publicKey: publicKey,
|
2021-12-08 21:20:43 +00:00
|
|
|
identicon: Global.getProfileImage(publicKey, false, false) || sourceModel.rowData(i, "identicon"),
|
2021-08-24 09:10:26 +00:00
|
|
|
localName: sourceModel.rowData(i, "localName")
|
|
|
|
}
|
2021-08-30 09:49:13 +00:00
|
|
|
if (all || isAcceptedItem(filter, item)) {
|
2020-07-14 11:40:58 +00:00
|
|
|
filterModel.append(item)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-30 09:49:13 +00:00
|
|
|
function getFilter() {
|
|
|
|
if (this.filter.length === 0 || this.cursorPosition === 0) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-12-13 14:24:21 +00:00
|
|
|
// Not Refactored Yet
|
|
|
|
return ""
|
|
|
|
// return chatsModel.plainText(this.filter)
|
2021-08-30 09:49:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function shouldShowAll(filter) {
|
|
|
|
var cursorAtEnd = this.cursorPosition === filter.length;
|
|
|
|
var hasAtBeforeCursor = filter.charAt(this.cursorPosition - 1) === "@"
|
|
|
|
var hasWhiteSpaceBeforeAt = filter.charAt(this.cursorPosition - 2) === " " || filter.charAt(this.cursorPosition - 2) === "\n"
|
|
|
|
var hasWhiteSpaceAfterAt = filter.charAt(this.cursorPosition) === " "
|
|
|
|
|
|
|
|
if (filter === "@" ||
|
|
|
|
(hasAtBeforeCursor && hasWhiteSpaceBeforeAt && hasWhiteSpaceAfterAt) ||
|
|
|
|
(this.cursorPosition === 1 && hasAtBeforeCursor && hasWhiteSpaceAfterAt) ||
|
|
|
|
(cursorAtEnd && filter.endsWith("@") && hasWhiteSpaceBeforeAt)) {
|
|
|
|
return true
|
|
|
|
}
|
2020-07-14 11:40:58 +00:00
|
|
|
|
2021-08-30 09:49:13 +00:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
function isAcceptedItem(filter, item) {
|
2021-09-24 11:40:02 +00:00
|
|
|
let properties = this.property.filter(p => !!item[p])
|
2021-08-30 09:49:13 +00:00
|
|
|
if (properties.length === 0) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-09-24 11:40:02 +00:00
|
|
|
let filterWithoutAt = filter.substring(this.lastAtPosition + 1, this.cursorPosition)
|
2021-03-19 20:13:12 +00:00
|
|
|
filterWithoutAt = filterWithoutAt.replace(/\*/g, "")
|
2021-07-09 21:00:27 +00:00
|
|
|
component.formattedFilter = filterWithoutAt
|
2020-07-20 16:48:23 +00:00
|
|
|
|
|
|
|
return !properties.every(p => item[p].toLowerCase().match(filterWithoutAt.toLowerCase()) === null)
|
2020-07-14 11:40:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function isFilteringPropertyOk() {
|
2021-07-07 20:23:05 +00:00
|
|
|
if(this.property === undefined || this.property.length === 0) {
|
2020-07-14 11:40:58 +00:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|