1
0
Files
electrum/electrum/gui/qml/components/History.qml
2024-01-18 00:28:02 +01:00

161 lines
4.9 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
visible: Daemon.currentWallet
padding: 0
clip: true
background: Rectangle {
color: constants.darkerBackground
}
ElListView {
id: listview
width: parent.width
height: parent.height
boundsBehavior: Flickable.StopAtBounds
model: visualModel
header: Item {
width: parent.width
height: headerLayout.height
ColumnLayout {
id: headerLayout
anchors.centerIn: parent
BalanceSummary {
Layout.topMargin: constants.paddingXLarge
Layout.bottomMargin: constants.paddingXLarge
}
}
}
headerPositioning: ListView.InlineHeader
readonly property variant sectionLabels: {
'local': qsTr('Local'),
'mempool': qsTr('Mempool'),
'today': qsTr('Today'),
'yesterday': qsTr('Yesterday'),
'lastweek': qsTr('Last week'),
'lastmonth': qsTr('Last month'),
'older': qsTr('Older')
}
section.property: 'section'
section.criteria: ViewSection.FullString
section.delegate: RowLayout {
width: ListView.view.width
required property string section
Label {
text: listview.sectionLabels[section]
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: constants.paddingLarge
font.pixelSize: constants.fontSizeMedium
color: Material.accentColor
}
}
DelegateModel {
id: visualModel
model: Daemon.currentWallet.historyModel
groups: [
DelegateModelGroup { name: 'today'; includeByDefault: false },
DelegateModelGroup { name: 'yesterday'; includeByDefault: false },
DelegateModelGroup { name: 'lastweek'; includeByDefault: false },
DelegateModelGroup { name: 'lastmonth'; includeByDefault: false },
DelegateModelGroup { name: 'older'; includeByDefault: false }
]
delegate: HistoryItemDelegate { }
}
ScrollIndicator.vertical: ScrollIndicator { }
Label {
visible: Daemon.currentWallet.historyModel.count == 0 && !Daemon.currentWallet.synchronizing
anchors.centerIn: parent
width: listview.width * 4/5
font.pixelSize: constants.fontSizeXXLarge
color: constants.mutedForeground
text: qsTr('No transactions in this wallet yet')
wrapMode: Text.Wrap
horizontalAlignment: Text.AlignHCenter
}
}
MouseArea {
id: vdragscroll
anchors {
top: listview.top
right: listview.right
bottom: listview.bottom
}
width: constants.fingerWidth
drag.target: dragb
onPressedChanged: if (pressed) {
dragb.y = mouseY + listview.y - dragb.height/2
}
}
Rectangle {
id: dragb
anchors.right: vdragscroll.left
width: postext.width + constants.paddingXXLarge
height: postext.height + constants.paddingXXLarge
radius: constants.paddingXSmall
color: constants.colorAlpha(Material.accentColor, 0.33)
border.color: Material.accentColor
opacity : vdragscroll.drag.active ? 1 : 0
Behavior on opacity { NumberAnimation { duration: 300 } }
onYChanged: {
if (vdragscroll.drag.active) {
listview.contentY =
Math.max(listview.originY,
Math.min(listview.contentHeight - listview.height + listview.originY,
((y-listview.y)/(listview.height - dragb.height)) * (listview.contentHeight - listview.height + listview.originY) ))
}
}
Label {
id: postext
anchors.centerIn: parent
text: dragb.opacity
? listview.itemAt(0,listview.contentY + (dragb.y + dragb.height/2)).delegateModel.date
: ''
font.pixelSize: constants.fontSizeLarge
}
}
Connections {
target: Network
function onHeightChanged(height) {
Daemon.currentWallet.historyModel.updateBlockchainHeight(height)
}
}
Connections {
target: Daemon
function onWalletLoaded() {
listview.positionViewAtBeginning()
}
}
StackView.onVisibleChanged: {
// refresh model if History becomes visible and the model is dirty.
if (StackView.visible) {
Daemon.currentWallet.historyModel.initModel(false)
}
}
}