1
0
Files
electrum/electrum/gui/qml/components/Addresses.qml
2023-11-07 10:17:08 +01:00

301 lines
12 KiB
QML

import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Controls.Material
import QtQml.Models
import org.electrum 1.0
import "controls"
Pane {
id: rootItem
objectName: 'Addresses'
padding: 0
ColumnLayout {
anchors.fill: parent
spacing: 0
ColumnLayout {
id: layout
Layout.fillWidth: true
Layout.fillHeight: true
Pane {
id: filtersPane
Layout.fillWidth: true
GridLayout {
columns: 3
width: parent.width
CheckBox {
id: showUsed
text: qsTr('Show Used')
enabled: listview.filterModel.showAddressesCoins != 2
onCheckedChanged: {
listview.filterModel.showUsed = checked
if (activeFocus) {
Config.addresslistShowUsed = checked
}
}
Component.onCompleted: {
checked = Config.addresslistShowUsed
listview.filterModel.showUsed = checked
}
}
RowLayout {
Layout.columnSpan: 2
Layout.fillWidth: true
Layout.alignment: Qt.AlignRight
Label {
text: qsTr('Show')
}
ElComboBox {
id: showCoinsAddresses
textRole: 'text'
valueRole: 'value'
model: ListModel {
id: showCoinsAddressesModel
Component.onCompleted: {
// we need to fill the model like this, as ListElement can't evaluate script
showCoinsAddressesModel.append({'text': qsTr('Addresses'), 'value': 1})
showCoinsAddressesModel.append({'text': qsTr('Coins'), 'value': 2})
showCoinsAddressesModel.append({'text': qsTr('Both'), 'value': 3})
listview.filterModel.showAddressesCoins = Config.addresslistShowType
for (let i=0; i < showCoinsAddressesModel.count; i++) {
if (showCoinsAddressesModel.get(i).value == listview.filterModel.showAddressesCoins) {
showCoinsAddresses.currentIndex = i
break
}
}
}
}
onCurrentValueChanged: {
if (activeFocus && currentValue) {
listview.filterModel.showAddressesCoins = currentValue
Config.addresslistShowType = currentValue
}
}
}
}
TextField {
id: searchEdit
Layout.fillWidth: true
Layout.columnSpan: 3
placeholderText: qsTr('search')
onTextChanged: listview.filterModel.filterText = text
Image {
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
source: Qt.resolvedUrl('../../icons/zoom.png')
sourceSize.width: constants.iconSizeMedium
sourceSize.height: constants.iconSizeMedium
}
}
}
}
Frame {
id: channelsFrame
Layout.fillWidth: true
Layout.fillHeight: true
verticalPadding: 0
horizontalPadding: 0
background: PaneInsetBackground {}
ElListView {
id: listview
anchors.fill: parent
clip: true
property QtObject backingModel: Daemon.currentWallet.addressCoinModel
property QtObject filterModel: Daemon.currentWallet.addressCoinModel.filterModel
property bool selectMode: false
property bool freeze: true
model: visualModel
currentIndex: -1
section.property: 'type'
section.criteria: ViewSection.FullString
section.delegate: sectionDelegate
function getSelectedItems() {
var items = []
for (let i = 0; i < selectedGroup.count; i++) {
let modelitem = selectedGroup.get(i).model
if (modelitem.outpoint)
items.push(modelitem.outpoint)
else
items.push(modelitem.address)
}
return items
}
DelegateModel {
id: visualModel
model: listview.filterModel
groups: [
DelegateModelGroup {
id: selectedGroup;
name: 'selected'
onCountChanged: {
if (count == 0)
listview.selectMode = false
}
}
]
delegate: Loader {
id: loader
width: parent.width
sourceComponent: model.outpoint ? _coinDelegate : _addressDelegate
function toggle() {
loader.DelegateModel.inSelected = !loader.DelegateModel.inSelected
}
Component {
id: _addressDelegate
AddressDelegate {
id: addressDelegate
width: parent.width
property bool selected: loader.DelegateModel.inSelected
highlighted: selected
onClicked: {
if (!listview.selectMode) {
var page = app.stack.push(Qt.resolvedUrl('AddressDetails.qml'), {
address: model.address
})
page.addressDetailsChanged.connect(function() {
// update listmodel when details change
listview.backingModel.updateAddress(model.address)
})
} else {
loader.toggle()
}
}
onPressAndHold: {
loader.toggle()
if (!listview.selectMode && selectedGroup.count > 0)
listview.selectMode = true
}
}
}
Component {
id: _coinDelegate
Pane {
height: coinDelegate.height
padding: 0
background: Rectangle {
color: Qt.darker(constants.darkerBackground, 1.10)
}
CoinDelegate {
id: coinDelegate
width: parent.width
property bool selected: loader.DelegateModel.inSelected
highlighted: selected
indent: listview.filterModel.showAddressesCoins == 2 ? 0 : constants.paddingLarge * 2
onClicked: {
if (!listview.selectMode) {
var page = app.stack.push(Qt.resolvedUrl('TxDetails.qml'), {
txid: model.txid
})
} else {
loader.toggle()
}
}
onPressAndHold: {
loader.toggle()
if (!listview.selectMode && selectedGroup.count > 0)
listview.selectMode = true
}
}
}
}
}
}
add: Transition {
NumberAnimation { properties: "opacity"; from: 0.0; to: 1.0; duration: 300
easing.type: Easing.OutQuad
}
}
onSelectModeChanged: {
if (selectMode) {
listview.freeze = !selectedGroup.get(0).model.held
}
}
ScrollIndicator.vertical: ScrollIndicator { }
}
}
}
ButtonContainer {
Layout.fillWidth: true
FlatButton {
Layout.fillWidth: true
Layout.preferredWidth: 1
text: listview.freeze ? qsTr('Freeze') : qsTr('Unfreeze')
icon.source: '../../icons/freeze.png'
visible: listview.selectMode
onClicked: {
var items = listview.getSelectedItems()
listview.backingModel.setFrozenForItems(listview.freeze, items)
selectedGroup.remove(0, selectedGroup.count)
}
}
// FlatButton {
// Layout.fillWidth: true
// Layout.preferredWidth: 1
// text: qsTr('Pay from...')
// icon.source: '../../icons/tab_send.png'
// visible: listview.selectMode
// enabled: false // TODO
// onClicked: {
// //
// }
// }
}
}
Component {
id: sectionDelegate
Item {
id: root
width: ListView.view.width
height: childrenRect.height
required property string section
property string section_label: section == 'receive'
? qsTr('receive addresses')
: section == 'change'
? qsTr('change addresses')
: section == 'imported'
? qsTr('imported addresses')
: section + ' ' + qsTr('addresses')
ColumnLayout {
width: parent.width
Heading {
Layout.leftMargin: constants.paddingLarge
Layout.rightMargin: constants.paddingLarge
text: root.section_label
}
}
}
}
Component.onCompleted: {
Daemon.currentWallet.addressCoinModel.initModel()
}
}