fix(Accounts): Avoid model reset on every account change
This fixes the issues where the accounts model gets reset on every minor model change triggering full UI refresh. This is not fixing the root cause, but the symptoms in the upper-most level I could find in order to keep the regression risk to a low level.
This commit is contained in:
parent
186b5f8798
commit
99a209635b
|
@ -1,4 +1,4 @@
|
|||
import NimQml, Tables, strutils, stew/shims/strformat
|
||||
import NimQml, Tables, strutils, stew/shims/strformat, std/sequtils
|
||||
|
||||
import ./item
|
||||
import ../../../shared_models/currency_amount
|
||||
|
@ -75,11 +75,55 @@ QtObject:
|
|||
ModelRole.CanSend.int: "canSend"
|
||||
}.toTable
|
||||
|
||||
proc removeItemWithIndex(self: Model, index: int) =
|
||||
if (index < 0 or index >= self.items.len):
|
||||
return
|
||||
let parentModelIndex = newQModelIndex()
|
||||
defer: parentModelIndex.delete
|
||||
self.beginRemoveRows(parentModelIndex, index, index)
|
||||
self.items.delete(index)
|
||||
self.endRemoveRows()
|
||||
|
||||
proc insertItem(self: Model, item: Item, index: int) =
|
||||
if (index < 0 or index > self.items.len):
|
||||
return
|
||||
let parentModelIndex = newQModelIndex()
|
||||
defer: parentModelIndex.delete
|
||||
self.beginInsertRows(parentModelIndex, index, index)
|
||||
self.items.insert(item, index)
|
||||
self.endInsertRows()
|
||||
|
||||
proc findAccountIndex(self: Model, account: Item): int =
|
||||
for i in 0 ..< self.items.len:
|
||||
if self.items[i].address() == account.address():
|
||||
return i
|
||||
return -1
|
||||
|
||||
proc setItems*(self: Model, items: seq[Item]) =
|
||||
self.beginResetModel()
|
||||
self.items = items
|
||||
self.endResetModel()
|
||||
var indexesToRemove: seq[int]
|
||||
|
||||
#remove
|
||||
for i in 0 ..< self.items.len:
|
||||
if not items.anyIt(it.address() == self.items[i].address()):
|
||||
indexesToRemove.add(i)
|
||||
|
||||
while indexesToRemove.len > 0:
|
||||
let index = pop(indexesToRemove)
|
||||
self.removeItemWithIndex(index)
|
||||
|
||||
# Update or insert
|
||||
for i in 0 ..< items.len:
|
||||
var account = items[i]
|
||||
let index = self.findAccountIndex(account)
|
||||
if index >= 0:
|
||||
let qIndex = self.createIndex(i, 0, nil)
|
||||
defer: qIndex.delete
|
||||
|
||||
self.items[index] = account
|
||||
self.dataChanged(qIndex, qIndex)
|
||||
continue
|
||||
self.insertItem(account, i)
|
||||
|
||||
self.countChanged()
|
||||
|
||||
for item in items:
|
||||
|
|
Loading…
Reference in New Issue