feat(SharedAddressesAccountSelector): update account sorting

- implement sorting of the wallet accounts by the number of tokens (aka tags) and
then by alphabet
- due to the delegate complexity here and usage of nested models, keep
track of the tags count separately and outside of the model
- this will be improved later on as part of the complete sort/order
design described in https://github.com/status-im/status-desktop/issues/14192

Fixes #14101
This commit is contained in:
Lukáš Tinkl 2024-04-01 16:24:18 +02:00 committed by Lukáš Tinkl
parent 8704cb19a4
commit cb6c633e69
4 changed files with 58 additions and 29 deletions

View File

@ -170,6 +170,7 @@ StatusListView {
spacing: Style.current.halfPadding spacing: Style.current.halfPadding
delegate: StatusListItem { delegate: StatusListItem {
readonly property string address: model.address.toLowerCase() readonly property string address: model.address.toLowerCase()
readonly property int tokenCount: tagsCount
id: listItem id: listItem
width: ListView.view.width - ListView.view.leftMargin - ListView.view.rightMargin width: ListView.view.width - ListView.view.leftMargin - ListView.view.rightMargin
@ -231,9 +232,11 @@ StatusListView {
inverted: true inverted: true
} }
sorters: RoleSorter { sorters: [
roleName: "symbol" RoleSorter {
} roleName: "symbol"
}
]
} }
SortFilterProxyModel { SortFilterProxyModel {

View File

@ -4,6 +4,7 @@ import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15 import QtQuick.Layouts 1.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import StatusQ 0.1
import StatusQ.Core 0.1 import StatusQ.Core 0.1
import StatusQ.Components 0.1 import StatusQ.Components 0.1
import StatusQ.Controls 0.1 import StatusQ.Controls 0.1
@ -42,7 +43,7 @@ Control {
required property var walletAssetsModel required property var walletAssetsModel
required property var walletCollectiblesModel required property var walletCollectiblesModel
required property var walletAccountsModel // name, address, emoji, colorId, assets required property var walletAccountsModel // name, address, emoji, colorId
required property var permissionsModel // id, key, permissionType, holdingsListModel, channelsListModel, isPrivate, tokenCriteriaMet required property var permissionsModel // id, key, permissionType, holdingsListModel, channelsListModel, isPrivate, tokenCriteriaMet
required property var assetsModel required property var assetsModel
@ -83,6 +84,13 @@ Control {
return false return false
} }
property var tokenCountMap: new Map()
function getTokenCount(address) {
if (d.tokenCountMap.has(address))
return d.tokenCountMap.get(address)
return 0
}
// warning states // warning states
readonly property bool lostCommunityPermission: root.isEditMode && permissionsView.lostPermissionToJoin readonly property bool lostCommunityPermission: root.isEditMode && permissionsView.lostPermissionToJoin
readonly property bool lostChannelPermissions: root.isEditMode && permissionsView.lostChannelPermissions readonly property bool lostChannelPermissions: root.isEditMode && permissionsView.lostChannelPermissions
@ -197,6 +205,7 @@ Control {
Layout.preferredHeight: contentHeight + topMargin + bottomMargin Layout.preferredHeight: contentHeight + topMargin + bottomMargin
Layout.maximumHeight: hasPermissions ? permissionsView.implicitHeight > root.availableHeight / 2 ? root.availableHeight / 2 : root.availableHeight : -1 Layout.maximumHeight: hasPermissions ? permissionsView.implicitHeight > root.availableHeight / 2 ? root.availableHeight / 2 : root.availableHeight : -1
Layout.fillHeight: !hasPermissions Layout.fillHeight: !hasPermissions
implicitHeight: contentHeight
uniquePermissionAssetsKeys: uniquePermissionAssetsKeys:
PermissionsHelpers.getUniquePermissionTokenKeys( PermissionsHelpers.getUniquePermissionTokenKeys(
@ -206,7 +215,28 @@ Control {
PermissionsHelpers.getUniquePermissionTokenKeys( PermissionsHelpers.getUniquePermissionTokenKeys(
root.permissionsModel, Constants.TokenType.ERC721) root.permissionsModel, Constants.TokenType.ERC721)
model: root.walletAccountsModel model: SortFilterProxyModel {
sourceModel: root.walletAccountsModel
proxyRoles: FastExpressionRole {
name: "tokenCount"
expression: {
d.tokenCountMap
return d.getTokenCount(model.address.toLowerCase())
}
expectedRoles: ["address"]
}
sorters: [
// FIXME add sort token-relevant accounts first; https://github.com/status-im/status-desktop/issues/14192
RoleSorter {
roleName: "tokenCount"
sortOrder: Qt.DescendingOrder
},
RoleSorter {
roleName: "name"
}
]
}
walletAssetsModel: root.walletAssetsModel walletAssetsModel: root.walletAssetsModel
walletCollectiblesModel: root.walletCollectiblesModel walletCollectiblesModel: root.walletCollectiblesModel
@ -226,6 +256,17 @@ Control {
getCurrencyAmount: function (balance, symbol) { getCurrencyAmount: function (balance, symbol) {
return root.getCurrencyAmount(balance, symbol) return root.getCurrencyAmount(balance, symbol)
} }
Component.onCompleted: {
const tmpTokenCountMap = new Map()
for (let i = 0; i < accountSelector.count; i++) {
const item = accountSelector.itemAtIndex(i)
if (!!item) {
tmpTokenCountMap.set(item.address.toLowerCase(), item.tokenCount)
}
}
d.tokenCountMap = tmpTokenCountMap
}
} }
// divider with top rounded corners + drop shadow // divider with top rounded corners + drop shadow

View File

@ -2,6 +2,8 @@ import QtQuick 2.13
import utils 1.0 import utils 1.0
import StatusQ 0.1
import SortFilterProxyModel 0.2 import SortFilterProxyModel 0.2
import AppLayouts.Wallet.stores 1.0 as WalletStore import AppLayouts.Wallet.stores 1.0 as WalletStore
@ -62,24 +64,26 @@ QtObject {
readonly property var globalAssetsModel: SortFilterProxyModel { readonly property var globalAssetsModel: SortFilterProxyModel {
sourceModel: communitiesModuleInst.tokenList sourceModel: communitiesModuleInst.tokenList
proxyRoles: ExpressionRole { proxyRoles: FastExpressionRole {
function tokenIcon(symbol) { function tokenIcon(symbol) {
return Constants.tokenIcon(symbol) return Constants.tokenIcon(symbol)
} }
name: "iconSource" name: "iconSource"
expression: !!model.icon ? model.icon : tokenIcon(model.symbol) expression: !!model.icon ? model.icon : tokenIcon(model.symbol)
expectedRoles: ["icon", "symbol"]
} }
} }
readonly property var globalCollectiblesModel: SortFilterProxyModel { readonly property var globalCollectiblesModel: SortFilterProxyModel {
sourceModel: communitiesModuleInst.collectiblesModel sourceModel: communitiesModuleInst.collectiblesModel
proxyRoles: ExpressionRole { proxyRoles: FastExpressionRole {
function icon(icon) { function collectibleIcon(icon) {
return !!icon ? icon : Style.png("tokens/DEFAULT-TOKEN") return !!icon ? icon : Style.png("tokens/DEFAULT-TOKEN")
} }
name: "iconSource" name: "iconSource"
expression: icon(model.icon) expression: collectibleIcon(model.icon)
expectedRoles: ["icon"]
} }
} }

View File

@ -183,27 +183,8 @@ StatusStackModal {
} }
} }
property var initialAddressesModel: SortFilterProxyModel { readonly property var initialAddressesModel: SortFilterProxyModel {
sourceModel: root.walletAccountsModel sourceModel: root.walletAccountsModel
sorters: [
FastExpressionSorter {
function sortPredicate(lhs, rhs) {
if (lhs.walletType === rhs.walletType) return 0
return lhs.walletType === Constants.generatedWalletType ? -1 : 1
}
expression: {
return sortPredicate(modelLeft, modelRight)
}
expectedRoles: ["walletType"]
},
RoleSorter {
roleName: "position"
},
RoleSorter {
roleName: "name"
}
]
} }
function proceedToSigningOrSubmitRequest(uidOfComponentThisFunctionIsCalledFrom) { function proceedToSigningOrSubmitRequest(uidOfComponentThisFunctionIsCalledFrom) {