mirror of
https://github.com/monero-project/monero-gui.git
synced 2024-11-16 15:58:11 +00:00
History redesign
This commit is contained in:
parent
98a7a9e663
commit
7611e826aa
10 changed files with 1535 additions and 642 deletions
|
@ -464,7 +464,7 @@ Rectangle {
|
|||
id: historyButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("History") + translationManager.emptyString
|
||||
text: qsTr("Transactions") + translationManager.emptyString
|
||||
symbol: qsTr("H") + translationManager.emptyString
|
||||
dotColor: "#6B0072"
|
||||
onClicked: {
|
||||
|
|
|
@ -118,8 +118,7 @@ Rectangle {
|
|||
State {
|
||||
name: "History"
|
||||
PropertyChanges { target: root; currentView: historyView }
|
||||
PropertyChanges { target: historyView; model: appWindow.currentWallet ? appWindow.currentWallet.historyModel : null }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: historyView.tableHeight + 220 * scaleRatio }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: historyView.contentHeight + 100 * scaleRatio}
|
||||
}, State {
|
||||
name: "Transfer"
|
||||
PropertyChanges { target: root; currentView: transferView }
|
||||
|
@ -186,7 +185,13 @@ Rectangle {
|
|||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: currentView !== merchantView ? 20 * scaleRatio : 0
|
||||
anchors.margins: {
|
||||
if(currentView === merchantView || currentView === historyView)
|
||||
return 0;
|
||||
|
||||
return 20 * scaleRatio;
|
||||
}
|
||||
|
||||
anchors.topMargin: appWindow.persistentSettings.customDecorations ? 50 * scaleRatio : 0
|
||||
spacing: 0
|
||||
|
||||
|
|
|
@ -1,124 +0,0 @@
|
|||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Dialogs 1.2
|
||||
import moneroComponents.Clipboard 1.0
|
||||
import moneroComponents.PendingTransaction 1.0
|
||||
import moneroComponents.Wallet 1.0
|
||||
|
||||
import "." as MoneroComponents
|
||||
|
||||
|
||||
Rectangle{
|
||||
Clipboard { id: clipboard }
|
||||
|
||||
width: label1.width > label2.width ? label1.width : label2.width
|
||||
height: label1.height + label2.height
|
||||
color: "transparent"
|
||||
|
||||
property string copyValue: ""
|
||||
property string hashValue: ""
|
||||
property alias labelHeader: label1.text
|
||||
property alias labelValue: label2.text
|
||||
property alias labelHeaderIcon: icon
|
||||
property alias labelHeaderIconImageSource: icon.imageSource
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: 2 * scaleRatio
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
Text {
|
||||
id: label1
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
text: labelHeader
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
}
|
||||
|
||||
MoneroComponents.IconButton {
|
||||
id: icon
|
||||
visible: imageSource !== ""
|
||||
Layout.leftMargin: 8 * scaleRatio
|
||||
width: image.width
|
||||
height: image.height
|
||||
|
||||
onClicked: {
|
||||
editDescription(hashValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: label2
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
text: labelValue
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
|
||||
MouseArea {
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
|
||||
onEntered: {
|
||||
label1.color = MoneroComponents.Style.defaultFontColor;
|
||||
label2.color = MoneroComponents.Style.defaultFontColor;
|
||||
}
|
||||
|
||||
onExited: {
|
||||
label1.color = MoneroComponents.Style.dimmedFontColor;
|
||||
label2.color = MoneroComponents.Style.dimmedFontColor;
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
if(copyValue){
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(copyValue);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function editDescription(_hash){
|
||||
inputDialog.labelText = qsTr("Set description:") + translationManager.emptyString;
|
||||
inputDialog.onAcceptedCallback = function() {
|
||||
appWindow.currentWallet.setUserNote(_hash, inputDialog.inputText);
|
||||
appWindow.showStatusMessage(qsTr("Updated description."),3);
|
||||
middlePanel.historyView.update();
|
||||
}
|
||||
inputDialog.onRejectedCallback = null;
|
||||
inputDialog.open()
|
||||
}
|
||||
}
|
|
@ -1,222 +0,0 @@
|
|||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Layouts 1.1
|
||||
import moneroComponents.Clipboard 1.0
|
||||
import moneroComponents.AddressBookModel 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
ListView {
|
||||
id: listView
|
||||
clip: true
|
||||
boundsBehavior: ListView.StopAtBounds
|
||||
property var previousItem
|
||||
property var addressBookModel: null
|
||||
|
||||
function buildTxDetailsString(tx_id, paymentId, tx_key,tx_note, destinations, rings) {
|
||||
var trStart = '<tr><td width="85" style="padding-top:5px"><b>',
|
||||
trMiddle = '</b></td><td style="padding-left:10px;padding-top:5px;">',
|
||||
trEnd = "</td></tr>";
|
||||
|
||||
return '<table border="0">'
|
||||
+ (tx_id ? trStart + qsTr("Tx ID:") + trMiddle + tx_id + trEnd : "")
|
||||
+ (paymentId ? trStart + qsTr("Payment ID:") + trMiddle + paymentId + trEnd : "")
|
||||
+ (tx_key ? trStart + qsTr("Tx key:") + trMiddle + tx_key + trEnd : "")
|
||||
+ (tx_note ? trStart + qsTr("Tx note:") + trMiddle + tx_note + trEnd : "")
|
||||
+ (destinations ? trStart + qsTr("Destinations:") + trMiddle + destinations + trEnd : "")
|
||||
+ (rings ? trStart + qsTr("Rings:") + trMiddle + rings + trEnd : "")
|
||||
+ "</table>"
|
||||
+ translationManager.emptyString;
|
||||
}
|
||||
|
||||
function lookupPaymentID(paymentId) {
|
||||
if (!addressBookModel)
|
||||
return ""
|
||||
var idx = addressBookModel.lookupPaymentID(paymentId)
|
||||
if (idx < 0)
|
||||
return ""
|
||||
idx = addressBookModel.index(idx, 0)
|
||||
return addressBookModel.data(idx, AddressBookModel.AddressBookDescriptionRole)
|
||||
}
|
||||
|
||||
|
||||
footer: Rectangle {
|
||||
height: 127 * scaleRatio
|
||||
width: listView.width
|
||||
color: "transparent"
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: "#545454"
|
||||
text: qsTr("No more results") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
height: tableContent.height + 20 * scaleRatio
|
||||
width: listView.width
|
||||
color: "transparent"
|
||||
Layout.leftMargin: 10 * scaleRatio
|
||||
z: listView.count - index
|
||||
function collapseDropdown() { dropdown.expanded = false }
|
||||
|
||||
Rectangle{
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.top: parent.top
|
||||
width: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
height: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
var tx_key = currentWallet.getTxKey(hash)
|
||||
var tx_note = currentWallet.getUserNote(hash)
|
||||
var rings = currentWallet.getRings(hash)
|
||||
if (rings)
|
||||
rings = rings.replace(/\|/g, '\n')
|
||||
informationPopup.title = "Transaction details";
|
||||
informationPopup.text = buildTxDetailsString(hash,paymentId,tx_key,tx_note,destinations, rings);
|
||||
informationPopup.open();
|
||||
informationPopup.onCloseCallback = null
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 15 * scaleRatio
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: parent.height/2 - this.height/2
|
||||
width: 30 * scaleRatio; height: 30 * scaleRatio
|
||||
radius: 25
|
||||
color: "#404040"
|
||||
|
||||
Image {
|
||||
width: 20 * scaleRatio
|
||||
height: 20 * scaleRatio
|
||||
fillMode: Image.PreserveAspectFit
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:///images/nextPage.png"
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: tableContent
|
||||
// Date
|
||||
RowLayout {
|
||||
Layout.topMargin: 20 * scaleRatio
|
||||
Layout.leftMargin: 10 * scaleRatio
|
||||
Text {
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: date
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
text: time
|
||||
}
|
||||
|
||||
// Show confirmations
|
||||
Text {
|
||||
visible: confirmations < confirmationsRequired || isPending
|
||||
Layout.leftMargin: 5 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: (confirmations < confirmationsRequired)? "#FF6C3C" : "#545454"
|
||||
text: {
|
||||
if (!isPending)
|
||||
if(confirmations < confirmationsRequired)
|
||||
return qsTr("(%1/%2 confirmations)").arg(confirmations).arg(confirmationsRequired)
|
||||
if (!isOut)
|
||||
return qsTr("UNCONFIRMED") + translationManager.emptyString
|
||||
if (isFailed)
|
||||
return qsTr("FAILED") + translationManager.emptyString
|
||||
return qsTr("PENDING") + translationManager.emptyString
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Amount & confirmations
|
||||
RowLayout {
|
||||
Layout.leftMargin: 10 * scaleRatio
|
||||
spacing: 2
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: isOut ? MoneroComponents.Style.defaultFontColor : "#2eb358"
|
||||
text: isOut ? "↓" : "↑"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: amountText
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18 * scaleRatio
|
||||
color: isOut ? MoneroComponents.Style.defaultFontColor : "#2eb358"
|
||||
text: displayAmount
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: dropModel
|
||||
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
|
||||
ListElement { name: "<b>Add to address book</b>"; icon: "../images/dropdownAdd.png" }
|
||||
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
|
||||
ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
|
||||
}
|
||||
|
||||
Clipboard { id: clipboard }
|
||||
}
|
|
@ -32,6 +32,7 @@ import "../components" as MoneroComponents
|
|||
|
||||
Item {
|
||||
id: item
|
||||
property alias input: input
|
||||
property alias text: input.text
|
||||
|
||||
property alias placeholderText: placeholderLabel.text
|
||||
|
|
|
@ -42,6 +42,7 @@ Item {
|
|||
if(small) return 14 * scaleRatio;
|
||||
else return 16 * scaleRatio;
|
||||
}
|
||||
property alias label: label
|
||||
signal clicked()
|
||||
|
||||
height: small ? 30 * scaleRatio : 36 * scaleRatio
|
||||
|
|
27
js/Utils.js
27
js/Utils.js
|
@ -125,4 +125,31 @@ function isUpperLock(shift, letter){
|
|||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
function qmlEach(item, properties, ignoredObjectNames, arr){
|
||||
// Traverse QML object tree and return components that match
|
||||
// via property names. Similar to jQuery("myclass").each(...
|
||||
// item: root QML object
|
||||
// properties: list of strings
|
||||
// ignoredObjectNames: list of strings
|
||||
if(typeof(arr) == 'undefined') arr = [];
|
||||
if(item.hasOwnProperty('data') && item['data'].length > 0){
|
||||
for(var i = 0; i < item['data'].length; i += 1){
|
||||
arr = qmlEach(item['data'][i], properties, ignoredObjectNames, arr);
|
||||
}
|
||||
}
|
||||
|
||||
// ignore QML objects on .objectName
|
||||
for(var a = 0; a < ignoredObjectNames.length; a += 1){
|
||||
if(item.objectName === ignoredObjectNames[a]){
|
||||
return arr;
|
||||
}
|
||||
}
|
||||
|
||||
for(var u = 0; u < properties.length; u += 1){
|
||||
if(item.hasOwnProperty(properties[u])) arr.push(item);
|
||||
else break;
|
||||
}
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
|
18
main.qml
18
main.qml
|
@ -528,6 +528,9 @@ ApplicationWindow {
|
|||
currentWallet.history.refresh(currentWallet.currentSubaddressAccount)
|
||||
timeToUnlock = currentWallet.history.minutesToUnlock
|
||||
leftPanel.minutesToUnlockTxt = (timeToUnlock > 0)? (timeToUnlock == 20)? qsTr("Unlocked balance (waiting for block)") : qsTr("Unlocked balance (~%1 min)").arg(timeToUnlock) : qsTr("Unlocked balance");
|
||||
|
||||
if(middlePanel.state == "History")
|
||||
middlePanel.historyView.update();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -677,19 +680,28 @@ ApplicationWindow {
|
|||
// history refresh is handled by walletUpdated
|
||||
currentWallet.history.refresh(currentWallet.currentSubaddressAccount) // this will refresh model
|
||||
currentWallet.subaddress.refresh(currentWallet.currentSubaddressAccount)
|
||||
|
||||
if(middlePanel.state == "History")
|
||||
middlePanel.historyView.update();
|
||||
}
|
||||
|
||||
function onWalletUnconfirmedMoneyReceived(txId, amount) {
|
||||
// refresh history
|
||||
console.log("unconfirmed money found")
|
||||
currentWallet.history.refresh(currentWallet.currentSubaddressAccount)
|
||||
currentWallet.history.refresh(currentWallet.currentSubaddressAccount);
|
||||
|
||||
if(middlePanel.state == "History")
|
||||
middlePanel.historyView.update();
|
||||
}
|
||||
|
||||
function onWalletMoneySent(txId, amount) {
|
||||
// refresh transaction history here
|
||||
console.log("monero sent found")
|
||||
currentWallet.refresh()
|
||||
currentWallet.history.refresh(currentWallet.currentSubaddressAccount) // this will refresh model
|
||||
currentWallet.history.refresh(currentWallet.currentSubaddressAccount); // this will refresh model
|
||||
|
||||
if(middlePanel.state == "History")
|
||||
middlePanel.historyView.update();
|
||||
}
|
||||
|
||||
function walletsFound() {
|
||||
|
@ -1140,6 +1152,8 @@ ApplicationWindow {
|
|||
property string daemonPassword: ""
|
||||
property bool transferShowAdvanced: false
|
||||
property bool receiveShowAdvanced: false
|
||||
property bool historyShowAdvanced: false
|
||||
property bool historyHumanDates: true
|
||||
property string blockchainDataDir: ""
|
||||
property bool useRemoteNode: false
|
||||
property string remoteNodeAddress: ""
|
||||
|
|
1767
pages/History.qml
1767
pages/History.qml
File diff suppressed because it is too large
Load diff
4
qml.qrc
4
qml.qrc
|
@ -52,8 +52,7 @@
|
|||
<file>images/expandRightPanel.png</file>
|
||||
<file>images/dropdownCopy.png</file>
|
||||
<file>images/dropdownCopy@2x.png</file>
|
||||
<file>components/HistoryTable.qml</file>
|
||||
<file>components/HistoryTableMobile.qml</file>
|
||||
<file>images/dropdownDel.png</file>
|
||||
<file>images/moneroLogo2.png</file>
|
||||
<file>components/PrivacyLevelSmall.qml</file>
|
||||
<file>images/resize.png</file>
|
||||
|
@ -187,7 +186,6 @@
|
|||
<file>images/downArrow.png</file>
|
||||
<file>images/downArrow@2x.png</file>
|
||||
<file>images/historyBorderRadius.png</file>
|
||||
<file>components/HistoryTableInnerColumn.qml</file>
|
||||
<file>components/CheckBox2.qml</file>
|
||||
<file>js/TxUtils.js</file>
|
||||
<file>images/warning.png</file>
|
||||
|
|
Loading…
Reference in a new issue