Browse Source

add (today, yesterday, last week, last month, older) sections to history

patch-4
Sander van Grieken 3 years ago
parent
commit
5c7060fffb
  1. 67
      electrum/gui/qml/components/History.qml
  2. 38
      electrum/gui/qml/qetransactionlistmodel.py

67
electrum/gui/qml/components/History.qml

@ -2,6 +2,7 @@ import QtQuick 2.6
import QtQuick.Layouts 1.0 import QtQuick.Layouts 1.0
import QtQuick.Controls 2.0 import QtQuick.Controls 2.0
import QtQuick.Controls.Material 2.0 import QtQuick.Controls.Material 2.0
import QtQml.Models 2.2
import org.electrum 1.0 import org.electrum 1.0
@ -15,8 +16,42 @@ Pane {
width: parent.width width: parent.width
height: parent.height height: parent.height
model: visualModel
section.property: 'section'
section.criteria: ViewSection.FullString
section.delegate: RowLayout {
width: ListView.view.width
required property string section
Label {
text: section == 'today'
? qsTr('Today')
: section == 'yesterday'
? qsTr('Yesterday')
: section == 'lastweek'
? qsTr('Last week')
: section == 'lastmonth'
? qsTr('Last month')
: qsTr('Older')
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: constants.paddingLarge
font.pixelSize: constants.fontSizeLarge
color: constants.mutedForeground
}
}
DelegateModel {
id: visualModel
model: Daemon.currentWallet.historyModel 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: Item { delegate: Item {
id: delegate id: delegate
width: ListView.view.width width: ListView.view.width
@ -27,14 +62,6 @@ Pane {
width: parent.width width: parent.width
spacing: 0 spacing: 0
Rectangle {
visible: index > 0
Layout.fillWidth: true
Layout.preferredHeight: constants.paddingSmall
color: Qt.rgba(0,0,0,0.10)
}
ItemDelegate { ItemDelegate {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: txinfo.height Layout.preferredHeight: txinfo.height
@ -78,6 +105,7 @@ Pane {
id: valueLabel id: valueLabel
font.family: FixedFont font.family: FixedFont
font.pixelSize: constants.fontSizeMedium font.pixelSize: constants.fontSizeMedium
Layout.alignment: Qt.AlignRight
text: Config.formatSats(model.bc_value) text: Config.formatSats(model.bc_value)
font.bold: true font.bold: true
color: model.incoming ? constants.colorCredit : constants.colorDebit color: model.incoming ? constants.colorCredit : constants.colorDebit
@ -94,6 +122,14 @@ Pane {
Item { Layout.columnSpan: 3; Layout.preferredWidth: 1; Layout.preferredHeight: 1 } Item { Layout.columnSpan: 3; Layout.preferredWidth: 1; Layout.preferredHeight: 1 }
} }
} }
Rectangle {
visible: delegate.ListView.section == delegate.ListView.nextSection
Layout.fillWidth: true
Layout.preferredHeight: constants.paddingTiny
color: Qt.rgba(0,0,0,0.10)
}
} }
// as the items in the model are not bindings to QObjects, // as the items in the model are not bindings to QObjects,
// hook up events that might change the appearance // hook up events that might change the appearance
@ -107,7 +143,22 @@ Pane {
} }
} }
Component.onCompleted: {
if (model.section == 'today') {
delegate.DelegateModel.inToday = true
} else if (model.section == 'yesterday') {
delegate.DelegateModel.inYesterday = true
} else if (model.section == 'lastweek') {
delegate.DelegateModel.inLastweek = true
} else if (model.section == 'lastmonth') {
delegate.DelegateModel.inLastmonth = true
} else if (model.section == 'older') {
delegate.DelegateModel.inOlder = true
}
}
} // delegate } // delegate
}
ScrollIndicator.vertical: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator { }

38
electrum/gui/qml/qetransactionlistmodel.py

@ -1,4 +1,4 @@
from datetime import datetime from datetime import datetime, timedelta
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject
from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex
@ -17,7 +17,7 @@ class QETransactionListModel(QAbstractListModel):
# define listmodel rolemap # define listmodel rolemap
_ROLE_NAMES=('txid','fee_sat','height','confirmations','timestamp','monotonic_timestamp', _ROLE_NAMES=('txid','fee_sat','height','confirmations','timestamp','monotonic_timestamp',
'incoming','bc_value','bc_balance','date','label','txpos_in_block','fee', 'incoming','bc_value','bc_balance','date','label','txpos_in_block','fee',
'inputs','outputs') 'inputs','outputs','section')
_ROLE_KEYS = range(Qt.UserRole + 1, Qt.UserRole + 1 + len(_ROLE_NAMES)) _ROLE_KEYS = range(Qt.UserRole + 1, Qt.UserRole + 1 + len(_ROLE_NAMES))
_ROLE_MAP = dict(zip(_ROLE_KEYS, [bytearray(x.encode()) for x in _ROLE_NAMES])) _ROLE_MAP = dict(zip(_ROLE_KEYS, [bytearray(x.encode()) for x in _ROLE_NAMES]))
_ROLE_RMAP = dict(zip(_ROLE_NAMES, _ROLE_KEYS)) _ROLE_RMAP = dict(zip(_ROLE_NAMES, _ROLE_KEYS))
@ -43,14 +43,38 @@ class QETransactionListModel(QAbstractListModel):
self.tx_history = [] self.tx_history = []
self.endResetModel() self.endResetModel()
def tx_to_model(self, tx):
item = tx
for output in item['outputs']:
output['value'] = output['value'].value
# newly arriving txs have no (block) timestamp
# TODO?
if not item['timestamp']:
item['timestamp'] = datetime.timestamp(datetime.now())
txts = datetime.fromtimestamp(item['timestamp'])
today = datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
if (txts > today):
item['section'] = 'today'
elif (txts > today - timedelta(days=1)):
item['section'] = 'yesterday'
elif (txts > today - timedelta(days=7)):
item['section'] = 'lastweek'
elif (txts > today - timedelta(days=31)):
item['section'] = 'lastmonth'
else:
item['section'] = 'older'
return item
# initial model data # initial model data
def init_model(self): def init_model(self):
history = self.wallet.get_detailed_history(show_addresses = True) history = self.wallet.get_detailed_history(show_addresses = True)
txs = history['transactions'] txs = []
# use primitives for tx in history['transactions']:
for tx in txs: txs.append(self.tx_to_model(tx))
for output in tx['outputs']:
output['value'] = output['value'].value
self.clear() self.clear()
self.beginInsertRows(QModelIndex(), 0, len(txs) - 1) self.beginInsertRows(QModelIndex(), 0, len(txs) - 1)

Loading…
Cancel
Save