Files
pay/desktop/WalletTransactionDetails.qml
T
tomFlowee 569dd5c3db Cleanup 'moved' and show fees when we can.
In the overview panel we now show fees when the transaction is created
by us.
This also makes the comment for 'moved' transactions a burden, so remove
that and clean it up.
2021-12-04 20:09:43 +01:00

253 lines
9.7 KiB
QML

/*
* This file is part of the Flowee project
* Copyright (C) 2020-2021 Tom Zander <tom@flowee.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.11
import QtQuick.Controls 2.11
import QtQuick.Layouts 1.11
import "widgets" as Flowee
GridLayout {
id: root
property QtObject infoObject: null
columns: 2
Flowee.LabelWithClipboard {
menuText: qsTr("Copy transaction-ID")
Layout.columnSpan: 2
text: model.txid
font.pointSize: 7
}
Label {
text: qsTr("Status") + ":"
}
Flowee.LabelWithClipboard {
id: rightColumn
Layout.fillWidth: true
text: {
if (txRoot.isRejected)
return qsTr("rejected")
if (typeof model.date === "undefined")
return qsTr("unconfirmed")
var confirmations = Pay.headerChainHeight - model.height + 1;
return qsTr("%1 confirmations (mined in block %2)", "", confirmations)
.arg(confirmations).arg(model.height);
}
clipboardText: model.height
}
Label {
id: paymentTypeLabel
visible: {
let diff = model.fundsOut - model.fundsIn;
if (diff < 0 && diff > -1000) // this is our heuristic to mark it as 'moved'
return false;
return true;
}
text: mainLabel.text + ":"
}
Flowee.BitcoinAmountLabel {
visible: paymentTypeLabel.visible
value: model.fundsOut - model.fundsIn
}
Label {
id: feesLabel
visible: infoObject.createdByUs
text: qsTr("Fees") + ":"
}
Flowee.BitcoinAmountLabel {
visible: feesLabel.visible
value: {
if (!infoObject.createdByUs)
return 0;
var amount = model.fundsIn;
var outputs = infoObject.outputs
for (var i in outputs) {
amount -= outputs[i].value
}
return amount
}
colorize: false
}
Label {
text: qsTr("Size") + ":"
}
Label {
text: qsTr("%1 bytes", "", infoObject.size).arg(infoObject.size)
}
Label {
text: qsTr("Inputs") + ":"
Layout.alignment: Qt.AlignTop
}
Column {
Layout.fillWidth: true
Repeater {
model: infoObject.inputs
delegate:
Item {
width: rightColumn.width
height: modelData === null ? 8 : (10 + inAddress.height)
Flowee.ArrowPoint {
id: arrowPoint
anchors.bottom: parent.bottom
color: arrowLine.color
}
Rectangle {
id: arrowLine
color: modelData === null ? "grey" : "#c5c537"
anchors.left: arrowPoint.right
anchors.leftMargin: -2 // overlap the line and the arrow
anchors.bottom: arrowPoint.bottom
anchors.bottomMargin: 9
anchors.right: parent.horizontalCenter
height: 3
}
Label {
id: inIndex
text: index
visible: modelData !== null
anchors.left: arrowPoint.right
anchors.leftMargin: 10
anchors.bottom: arrowLine.top
}
Rectangle {
color: Pay.useDarkSkin ? "#4fb2e7" : "yellow"
visible: inAddress.visible
x: inAddress.x - 3
y: inAddress.y -3
height: inAddress.height + 6
width: Math.min(inAddress.width, inAddress.contentWidth) + 6
radius: height / 3
opacity: 0.2
}
Flowee.LabelWithClipboard {
id: inAddress
menuText: qsTr("Copy Address")
text: {
if (modelData === null)
return "";
var cloaked = modelData.cloakedAddress
if (cloaked !== "")
return cloaked;
return modelData.address;
}
clipboardText: modelData === null ? "" : modelData.address
visible: modelData !== null
anchors.bottom: arrowLine.top
anchors.left: inIndex.right
anchors.leftMargin: 10
anchors.right: amount.left
anchors.rightMargin: 20
}
Flowee.BitcoinAmountLabel {
id: amount
visible: modelData !== null
value: modelData === null ? 0 : (-1 * modelData.value)
fontPtSize: date.font.pointSize
anchors.right: parent.right
anchors.bottom: arrowLine.top
}
}
}
}
Label {
text: qsTr("Outputs") + ":"
Layout.alignment: Qt.AlignTop
}
Column {
Layout.fillWidth: true
Repeater {
model: infoObject.outputs
delegate:
Item {
width: rightColumn.width
height: modelData === null ? 12 : (10 + outAddress.height)
Rectangle {
id: outArrowLine
/*
* There can be a nullptr, which means there is no info about this output.
* Then we have a bool 'forMe' which indicates the money goes to me or to
* someone else. Lets make the 'me' one the most visible one.
*/
color: modelData === null ? "grey" : (modelData.forMe ? "#c5c537" : "#67671d")
anchors.left: parent.horizontalCenter
anchors.bottom: outArrowPoint.bottom
anchors.bottomMargin: 9
anchors.right: outArrowPoint.right
anchors.rightMargin: -2 // overlap the line and the arrow
height: 3
}
Flowee.ArrowPoint {
id: outArrowPoint
anchors.bottom: parent.bottom
anchors.right: parent.right
color: outArrowLine.color
}
Label {
id: outIndex
visible: modelData !== null
text: index
anchors.left: parent.left
anchors.leftMargin: 10
anchors.bottom: outArrowLine.top
}
Rectangle {
color: Pay.useDarkSkin ? "#4fb2e7" : "yellow"
visible: modelData !== null && modelData.forMe
x: outAddress.x - 3
y: outAddress.y -3
height: outAddress.height + 6
width: Math.min(outAddress.width, outAddress.contentWidth) + 6
radius: height / 3
opacity: 0.2
}
Flowee.LabelWithClipboard {
id: outAddress
visible: modelData !== null
elide: Text.ElideMiddle
menuText: qsTr("Copy Address")
text: {
if (modelData === null)
return "";
var cloaked = modelData.cloakedAddress
if (cloaked !== "")
return cloaked;
return modelData.address;
}
clipboardText: modelData === null ? "" : modelData.address
anchors.left: outIndex.right
anchors.leftMargin: 10
anchors.rightMargin: 20
anchors.right: outAmount.left
anchors.bottom: outArrowLine.top
}
Flowee.BitcoinAmountLabel {
id: outAmount
visible: modelData !== null
value: modelData === null ? 0 : modelData.value
colorize: modelData !== null && modelData.forMe
fontPtSize: date.font.pointSize
anchors.right: outArrowPoint.left
anchors.rightMargin: 4
anchors.bottom: outArrowLine.top
anchors.bottomMargin: 10
}
}
}
}
}