2023-06-22 10:32:43 +00:00
|
|
|
import QtQuick 2.14
|
|
|
|
import QtQuick.Layouts 1.14
|
|
|
|
|
|
|
|
import StatusQ.Controls 0.1
|
|
|
|
import StatusQ.Components 0.1
|
|
|
|
import StatusQ.Core 0.1
|
|
|
|
import StatusQ.Core.Theme 0.1
|
2023-07-13 13:58:48 +00:00
|
|
|
import StatusQ.Popups 0.1
|
2023-06-22 10:32:43 +00:00
|
|
|
|
|
|
|
import utils 1.0
|
|
|
|
|
|
|
|
Rectangle {
|
|
|
|
id: root
|
|
|
|
|
|
|
|
property string chainShortNames
|
|
|
|
property string userProfilePublicKey
|
2023-06-26 15:57:16 +00:00
|
|
|
property bool includeWatchOnlyAccount
|
2023-06-22 10:32:43 +00:00
|
|
|
|
|
|
|
signal goToAccountView(var account)
|
2023-06-26 15:57:16 +00:00
|
|
|
signal toggleIncludeWatchOnlyAccount()
|
2023-07-13 13:58:48 +00:00
|
|
|
signal runRenameKeypairFlow()
|
2023-06-22 10:32:43 +00:00
|
|
|
|
|
|
|
QtObject {
|
|
|
|
id: d
|
|
|
|
readonly property var relatedAccounts: model.keyPair.accounts
|
|
|
|
readonly property bool isWatchOnly: model.keyPair.pairType === Constants.keycard.keyPairType.watchOnly
|
|
|
|
readonly property bool isPrivateKeyImport: model.keyPair.pairType === Constants.keycard.keyPairType.privateKeyImport
|
|
|
|
readonly property bool isProfileKeypair: model.keyPair.pairType === Constants.keycard.keyPairType.profile
|
|
|
|
readonly property string locationInfo: model.keyPair.migratedToKeycard ? qsTr("On Keycard"): qsTr("On device")
|
|
|
|
}
|
|
|
|
|
|
|
|
implicitHeight: layout.height
|
|
|
|
color: Theme.palette.baseColor4
|
|
|
|
radius: 8
|
|
|
|
|
|
|
|
ColumnLayout {
|
|
|
|
id: layout
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
width: parent.width
|
|
|
|
StatusListItem {
|
|
|
|
Layout.fillWidth: true
|
|
|
|
title: d.isWatchOnly ? qsTr("Watch only") : model.keyPair.name
|
|
|
|
statusListItemSubTitle.textFormat: Qt.RichText
|
|
|
|
titleTextIcon: model.keyPair.migratedToKeycard ? "keycard": ""
|
|
|
|
subTitle: d.isWatchOnly ? "" : d.isProfileKeypair ?
|
|
|
|
Utils.getElidedCompressedPk(model.keyPair.pubKey) + Constants.settingsSection.dotSepString + d.locationInfo : d.locationInfo
|
|
|
|
color: Theme.palette.transparent
|
|
|
|
ringSettings {
|
|
|
|
ringSpecModel: d.isProfileKeypair ? Utils.getColorHashAsJson(root.userProfilePublicKey) : []
|
|
|
|
ringPxSize: Math.max(asset.width / 24.0)
|
|
|
|
}
|
|
|
|
asset {
|
|
|
|
width: model.keyPair.icon ? 24 : 40
|
|
|
|
height: model.keyPair.icon ? 24 : 40
|
|
|
|
name: model.keyPair.image ? model.keyPair.image : model.keyPair.icon
|
|
|
|
isImage: !!model.keyPair.image
|
|
|
|
color: d.isProfileKeypair ? Utils.colorForPubkey(root.userProfilePublicKey) : Theme.palette.primaryColor1
|
|
|
|
letterSize: Math.max(4, asset.width / 2.4)
|
|
|
|
charactersLen: 2
|
|
|
|
isLetterIdenticon: !model.keyPair.icon && !asset.name.toString()
|
|
|
|
}
|
|
|
|
components: [
|
|
|
|
StatusFlatRoundButton {
|
|
|
|
icon.name: "more"
|
|
|
|
icon.color: Theme.palette.directColor1
|
|
|
|
visible: !d.isWatchOnly
|
2023-07-13 13:58:48 +00:00
|
|
|
highlighted: menuLoader.item && menuLoader.item.opened
|
|
|
|
onClicked: {
|
|
|
|
menuLoader.active = true
|
|
|
|
menuLoader.item.popup(0, height)
|
|
|
|
}
|
|
|
|
|
|
|
|
Loader {
|
|
|
|
id: menuLoader
|
|
|
|
active: false
|
|
|
|
sourceComponent: StatusMenu {
|
|
|
|
onClosed: {
|
|
|
|
menuLoader.active = false
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusAction {
|
|
|
|
text: enabled? qsTr("Show encrypted QR of keys on device") : ""
|
|
|
|
enabled: !d.isProfileKeypair
|
|
|
|
icon.name: "qr"
|
|
|
|
icon.color: Theme.palette.primaryColor1
|
|
|
|
onTriggered: {
|
|
|
|
console.warn("TODO: show encrypted QR")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
StatusAction {
|
|
|
|
text: model.keyPair.migratedToKeycard? qsTr("Stop using Keycard") : qsTr("Move keys to a Keycard")
|
|
|
|
icon.name: model.keyPair.migratedToKeycard? "keycard-crossed" : "keycard"
|
|
|
|
icon.color: Theme.palette.primaryColor1
|
|
|
|
onTriggered: {
|
|
|
|
if (model.keyPair.migratedToKeycard)
|
|
|
|
console.warn("TODO: stop using Keycard")
|
|
|
|
else
|
|
|
|
console.warn("TODO: move keys to a Keycard")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusAction {
|
|
|
|
text: enabled? qsTr("Rename keypair") : ""
|
|
|
|
enabled: !d.isProfileKeypair
|
|
|
|
icon.name: "edit"
|
|
|
|
icon.color: Theme.palette.primaryColor1
|
|
|
|
onTriggered: {
|
|
|
|
root.runRenameKeypairFlow()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusMenuSeparator {
|
|
|
|
visible: !d.isProfileKeypair
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusAction {
|
|
|
|
text: enabled? qsTr("Remove master keys and associated accounts") : ""
|
|
|
|
enabled: !d.isProfileKeypair
|
|
|
|
type: StatusAction.Type.Danger
|
|
|
|
icon.name: "delete"
|
|
|
|
icon.color: Theme.palette.dangerColor1
|
|
|
|
onTriggered: {
|
|
|
|
console.warn("TODO: remove master keys and associated accounts")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-06-22 10:32:43 +00:00
|
|
|
},
|
|
|
|
StatusBaseText {
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
text: qsTr("Include in total balance")
|
|
|
|
visible: d.isWatchOnly
|
|
|
|
},
|
|
|
|
StatusSwitch {
|
|
|
|
visible: d.isWatchOnly
|
2023-06-26 15:57:16 +00:00
|
|
|
checked: root.includeWatchOnlyAccount
|
|
|
|
onClicked: root.toggleIncludeWatchOnlyAccount()
|
2023-06-22 10:32:43 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
StatusListView {
|
|
|
|
Layout.fillWidth: true
|
|
|
|
Layout.preferredHeight: childrenRect.height
|
|
|
|
Layout.leftMargin: 16
|
|
|
|
Layout.rightMargin: 16
|
|
|
|
spacing: 1
|
|
|
|
model: d.relatedAccounts
|
|
|
|
delegate: WalletAccountDelegate {
|
|
|
|
width: ListView.view.width
|
|
|
|
account: model.account
|
|
|
|
totalCount: ListView.view.count
|
|
|
|
chainShortNames: root.chainShortNames
|
|
|
|
onGoToAccountView: root.goToAccountView(model.account)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|