Keep a {id: item} cache for ModelStore models

Accelerates the ModelStore ListView find() function,
which now just has to get an object key instead of looping through the
whole model.
This commit is contained in:
miruka
2020-09-02 13:38:11 -04:00
parent b1398e5dbf
commit f5cb3ecaa0
5 changed files with 40 additions and 41 deletions

View File

@@ -13,6 +13,7 @@ QtObject {
readonly property Component model: Component {
ListModel {
property var modelId
property var idToItems: ({})
// Used by HFilterModel
signal fieldsChanged(int index, var changes)
@@ -25,10 +26,7 @@ QtObject {
}
function find(id, default_=null) {
for (let i = 0; i < count; i++)
if (get(i).id === id) return get(i)
return default_
return idToItems[id] || default_
}
}
}

View File

@@ -12,8 +12,8 @@ Item {
property string userId
property string roomId
property QtObject userInfo: null
property QtObject roomInfo: null
property QtObject userInfo: ModelStore.get("accounts").find(userId)
property QtObject roomInfo: ModelStore.get(userId, "rooms").find(roomId)
property bool ready: Boolean(userInfo && roomInfo)
property bool longLoading: false
@@ -58,22 +58,6 @@ Item {
)
}
Timer {
interval: 100
running: ! userInfo
repeat: true
triggeredOnStart: true
onTriggered: userInfo = ModelStore.get("accounts").find(userId)
}
Timer {
interval: 100
running: ! roomInfo
repeat: true
triggeredOnStart: true
onTriggered: roomInfo = ModelStore.get(userId, "rooms").find(roomId)
}
Timer {
interval: 300
running: ! ready

View File

@@ -51,16 +51,19 @@ QtObject {
py.showError(type, traceback, message)
}
function onModelItemSet(syncId, indexThen, indexNow, changedFields){
function onModelItemSet(syncId, indexThen, indexNow, changedFields) {
const model = ModelStore.get(syncId)
if (indexThen === undefined) {
// print("insert", syncId, indexThen, indexNow,
// JSON.stringify(changedFields))
ModelStore.get(syncId).insert(indexNow, changedFields)
model.insert(indexNow, changedFields)
model.idToItems[changedFields.id] = model.get(indexNow)
model.idToItemsChanged()
} else {
// print("set", syncId, indexThen, indexNow,
// JSON.stringify(changedFields))
const model = ModelStore.get(syncId)
model.set(indexThen, changedFields)
if (indexThen !== indexNow) model.move(indexThen, indexNow, 1)
@@ -69,14 +72,22 @@ QtObject {
}
}
function onModelItemDeleted(syncId, index, count=1) {
// print("delete", syncId, index, count)
ModelStore.get(syncId).remove(index, count)
function onModelItemDeleted(syncId, index, count=1, ids=[]) {
// print("delete", syncId, index, count, ids)
const model = ModelStore.get(syncId)
model.remove(index, count)
for (let i = 0; i < ids.length; i++) {
delete model.idToItems[ids[i]]
}
if (ids.length) model.idToItemsChanged()
}
function onModelCleared(syncId) {
// print("clear", syncId)
ModelStore.get(syncId).clear()
model.idToItems = {}
}
function onDevicesUpdated(forAccount) {