monero-gui/LeftPanel.qml

557 lines
22 KiB
QML
Raw Permalink Normal View History

2024-01-27 20:12:09 +01:00
// Copyright (c) 2014-2024, The Monero Project
2015-04-01 10:56:05 +02:00
//
// 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.
2019-04-11 03:17:29 +02:00
import QtQuick 2.9
2018-03-24 20:48:19 +01:00
import QtQuick.Layouts 1.1
import QtGraphicalEffects 1.0
import moneroComponents.Wallet 1.0
2018-03-05 17:19:45 +01:00
import moneroComponents.NetworkType 1.0
import moneroComponents.Clipboard 1.0
import FontAwesome 1.0
2019-04-11 03:17:29 +02:00
import "components" as MoneroComponents
2019-04-11 03:17:29 +02:00
import "components/effects/" as MoneroEffects
2014-07-07 19:08:30 +02:00
Rectangle {
id: panel
property int currentAccountIndex
property alias currentAccountLabel: accountLabel.text
2019-09-06 15:52:45 +02:00
property string balanceString: "?.??"
property string balanceUnlockedString: "?.??"
property string balanceFiatString: "?.??"
property string minutesToUnlock: ""
property bool isSyncing: false
property alias networkStatus : networkStatus
2016-12-14 13:48:12 +01:00
property alias progressBar : progressBar
property alias daemonProgressBar : daemonProgressBar
2019-09-06 15:52:45 +02:00
property int titleBarHeight: 50
property string copyValue: ""
Clipboard { id: clipboard }
2014-07-07 19:08:30 +02:00
signal historyClicked()
signal transferClicked()
signal receiveClicked()
signal advancedClicked()
2014-07-07 19:08:30 +02:00
signal settingsClicked()
signal addressBookClicked()
signal accountClicked()
2014-07-07 19:08:30 +02:00
2014-07-09 18:03:37 +02:00
function selectItem(pos) {
menuColumn.previousButton.checked = false
if(pos === "History") menuColumn.previousButton = historyButton
2014-07-09 18:03:37 +02:00
else if(pos === "Transfer") menuColumn.previousButton = transferButton
else if(pos === "Receive") menuColumn.previousButton = receiveButton
2014-07-09 18:03:37 +02:00
else if(pos === "AddressBook") menuColumn.previousButton = addressBookButton
else if(pos === "Settings") menuColumn.previousButton = settingsButton
2017-01-17 22:59:40 +01:00
else if(pos === "Advanced") menuColumn.previousButton = advancedButton
else if(pos === "Account") menuColumn.previousButton = accountButton
2014-07-09 18:03:37 +02:00
menuColumn.previousButton.checked = true
}
2019-09-06 00:11:12 +02:00
width: 300
2017-11-22 00:14:38 +01:00
color: "transparent"
2017-08-07 12:14:37 +02:00
anchors.bottom: parent.bottom
anchors.top: parent.top
2014-07-07 19:08:30 +02:00
2019-04-11 03:17:29 +02:00
MoneroEffects.GradientBackground {
anchors.fill: parent
fallBackColor: MoneroComponents.Style.middlePanelBackgroundColor
initialStartColor: MoneroComponents.Style.leftPanelBackgroundGradientStart
initialStopColor: MoneroComponents.Style.leftPanelBackgroundGradientStop
blackColorStart: MoneroComponents.Style._b_leftPanelBackgroundGradientStart
blackColorStop: MoneroComponents.Style._b_leftPanelBackgroundGradientStop
whiteColorStart: MoneroComponents.Style._w_leftPanelBackgroundGradientStart
whiteColorStop: MoneroComponents.Style._w_leftPanelBackgroundGradientStop
posStart: 0.6
start: Qt.point(0, 0)
end: Qt.point(height, width)
2017-11-22 00:14:38 +01:00
}
2017-11-12 18:46:00 +01:00
// card with monero logo
2014-07-07 19:08:30 +02:00
Column {
2017-11-12 18:46:00 +01:00
visible: true
2017-11-22 00:14:38 +01:00
z: 2
2014-07-07 19:08:30 +02:00
id: column1
2019-09-06 15:52:45 +02:00
height: 175
2014-07-07 19:08:30 +02:00
anchors.left: parent.left
anchors.right: parent.right
2017-11-12 18:46:00 +01:00
anchors.top: parent.top
anchors.topMargin: (persistentSettings.customDecorations)? 50 : 0
2019-07-21 21:51:47 +02:00
Item {
2014-07-07 19:08:30 +02:00
Item {
2017-11-12 18:46:00 +01:00
anchors.left: parent.left
anchors.top: parent.top
anchors.topMargin: 20
2017-11-12 18:46:00 +01:00
anchors.leftMargin: 20
2019-04-25 21:09:23 +02:00
height: 490
width: 260
2014-07-07 19:08:30 +02:00
Image {
2019-04-11 03:17:29 +02:00
id: card
visible: !isOpenGL || MoneroComponents.Style.blackTheme
width: 260
2019-09-06 15:52:45 +02:00
height: 135
2017-11-12 18:46:00 +01:00
fillMode: Image.PreserveAspectFit
source: MoneroComponents.Style.blackTheme ? "qrc:///images/card-background-black" + (currentAccountIndex % MoneroComponents.Style.accountColors.length) + ".png" : "qrc:///images/card-background-white.png"
2014-07-07 19:08:30 +02:00
}
2017-11-18 16:18:05 +01:00
2019-04-11 03:17:29 +02:00
DropShadow {
visible: isOpenGL && !MoneroComponents.Style.blackTheme
anchors.fill: card
horizontalOffset: 3
verticalOffset: 3
radius: 10.0
samples: 15
color: "#3B000000"
source: card
cached: true
}
MoneroComponents.TextPlain {
2017-11-18 16:18:05 +01:00
id: testnetLabel
2018-03-27 20:41:15 +02:00
visible: persistentSettings.nettype != NetworkType.MAINNET
text: (persistentSettings.nettype == NetworkType.TESTNET ? qsTr("Testnet") : qsTr("Stagenet")) + translationManager.emptyString
2017-11-18 16:18:05 +01:00
anchors.top: parent.top
anchors.topMargin: 8
anchors.left: parent.left
anchors.leftMargin: 192
2017-11-18 16:18:05 +01:00
font.bold: true
font.pixelSize: 12
2018-01-12 01:17:20 +01:00
color: "#f33434"
2019-04-11 03:17:29 +02:00
themeTransition: false
2017-11-18 16:18:05 +01:00
}
2019-04-11 03:17:29 +02:00
MoneroComponents.TextPlain {
2018-01-12 01:17:20 +01:00
id: viewOnlyLabel
visible: viewOnly
text: qsTr("View Only") + translationManager.emptyString
anchors.top: parent.top
anchors.topMargin: 8
anchors.right: testnetLabel.visible ? testnetLabel.left : parent.right
anchors.rightMargin: 8
font.pixelSize: 12
font.bold: true
color: "#ff9323"
2019-04-11 03:17:29 +02:00
themeTransition: false
2018-01-12 01:17:20 +01:00
}
}
Item {
anchors.left: parent.left
anchors.top: parent.top
anchors.topMargin: 20
anchors.leftMargin: 20
2019-04-25 21:09:23 +02:00
height: 490
width: 50
2014-07-07 19:08:30 +02:00
2019-09-06 15:52:45 +02:00
MoneroComponents.Label {
fontSize: 12
id: accountIndex
text: qsTr("Account") + translationManager.emptyString + " #" + currentAccountIndex
2019-09-06 15:52:45 +02:00
color: MoneroComponents.Style.blackTheme ? "white" : "black"
2017-11-12 18:46:00 +01:00
anchors.left: parent.left
2019-09-06 15:52:45 +02:00
anchors.leftMargin: 60
2017-11-12 18:46:00 +01:00
anchors.top: parent.top
2019-09-06 15:52:45 +02:00
anchors.topMargin: 23
themeTransition: false
MouseArea{
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: appWindow.showPageRequest("Account")
2016-12-31 11:22:23 +01:00
}
2019-09-06 15:52:45 +02:00
}
MoneroComponents.Label {
fontSize: 16
id: accountLabel
textWidth: 170
color: MoneroComponents.Style.blackTheme ? "white" : "black"
anchors.left: parent.left
anchors.leftMargin: 60
anchors.top: parent.top
anchors.topMargin: 36
themeTransition: false
elide: Text.ElideRight
MouseArea {
hoverEnabled: true
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
2019-09-06 15:52:45 +02:00
onClicked: appWindow.showPageRequest("Account")
}
2016-12-31 11:22:23 +01:00
}
2014-07-07 19:08:30 +02:00
2019-09-06 15:52:45 +02:00
MoneroComponents.Label {
fontSize: 16
visible: isSyncing
2020-09-29 15:18:48 +02:00
text: qsTr("Syncing...") + translationManager.emptyString
2019-09-06 15:52:45 +02:00
color: MoneroComponents.Style.blackTheme ? "white" : "black"
anchors.left: parent.left
anchors.leftMargin: 20
anchors.bottom: currencyLabel.top
anchors.bottomMargin: 15
themeTransition: false
2019-09-06 15:52:45 +02:00
}
MoneroComponents.TextPlain {
id: currencyLabel
font.pixelSize: 16
text: {
if (persistentSettings.fiatPriceEnabled && persistentSettings.fiatPriceToggle) {
return appWindow.fiatApiCurrencySymbol();
2019-09-06 15:52:45 +02:00
} else {
return "XMR"
}
}
color: MoneroComponents.Style.blackTheme ? "white" : "black"
anchors.left: parent.left
anchors.leftMargin: 20
anchors.top: parent.top
2019-09-06 15:52:45 +02:00
anchors.topMargin: 100
themeTransition: false
MouseArea {
hoverEnabled: true
anchors.fill: parent
2019-09-06 15:52:45 +02:00
visible: persistentSettings.fiatPriceEnabled
cursorShape: Qt.PointingHandCursor
2019-09-06 15:52:45 +02:00
onClicked: persistentSettings.fiatPriceToggle = !persistentSettings.fiatPriceToggle
}
}
2019-04-11 03:17:29 +02:00
MoneroComponents.TextPlain {
2019-09-06 15:52:45 +02:00
id: balancePart1
2019-04-11 03:17:29 +02:00
themeTransition: false
2017-11-12 18:46:00 +01:00
anchors.left: parent.left
2019-09-06 15:52:45 +02:00
anchors.leftMargin: 58
anchors.baseline: currencyLabel.baseline
color: MoneroComponents.Style.blackTheme ? "white" : "black"
2020-06-13 03:34:16 +02:00
Binding on color {
when: balancePart1MouseArea.containsMouse || balancePart2MouseArea.containsMouse
value: MoneroComponents.Style.orange
}
2019-09-06 15:52:45 +02:00
text: {
if (persistentSettings.fiatPriceEnabled && persistentSettings.fiatPriceToggle) {
return balanceFiatString.split('.')[0] + "."
} else {
return balanceString.split('.')[0] + "."
}
2019-09-06 15:52:45 +02:00
}
font.pixelSize: {
var defaultSize = 29;
var digits = (balancePart1.text.length - 1)
if (digits > 2 && !(persistentSettings.fiatPriceEnabled && persistentSettings.fiatPriceToggle)) {
return defaultSize - 1.1 * digits
} else {
return defaultSize
2017-11-12 18:46:00 +01:00
}
}
MouseArea {
2019-09-06 15:52:45 +02:00
id: balancePart1MouseArea
hoverEnabled: true
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
console.log("Copied to clipboard");
2019-09-06 15:52:45 +02:00
clipboard.setText(balancePart1.text + balancePart2.text);
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
}
}
}
MoneroComponents.TextPlain {
2019-09-06 15:52:45 +02:00
id: balancePart2
themeTransition: false
2019-09-06 15:52:45 +02:00
anchors.left: balancePart1.right
anchors.leftMargin: 2
anchors.baseline: currencyLabel.baseline
2020-06-13 03:34:16 +02:00
color: balancePart1.color
2019-09-06 15:52:45 +02:00
text: {
if (persistentSettings.fiatPriceEnabled && persistentSettings.fiatPriceToggle) {
return balanceFiatString.split('.')[1]
} else {
return balanceString.split('.')[1]
}
}
font.pixelSize: 16
MouseArea {
2020-06-13 03:34:16 +02:00
id: balancePart2MouseArea
hoverEnabled: true
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
2019-09-06 15:52:45 +02:00
onClicked: balancePart1MouseArea.clicked(mouse)
}
2017-11-12 18:46:00 +01:00
}
2017-11-18 16:18:05 +01:00
2017-11-12 18:46:00 +01:00
Item { //separator
anchors.left: parent.left
anchors.right: parent.right
height: 1
}
2016-12-31 11:22:23 +01:00
}
2014-07-07 19:08:30 +02:00
}
}
Rectangle {
id: menuRect
2017-11-22 00:14:38 +01:00
z: 2
2014-07-07 19:08:30 +02:00
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
2019-09-06 00:11:12 +02:00
anchors.top: column1.bottom
2017-11-22 00:14:38 +01:00
color: "transparent"
2014-07-07 19:08:30 +02:00
2017-04-03 18:51:55 +02:00
Flickable {
2017-08-07 12:14:37 +02:00
id:flicker
contentHeight: menuColumn.height
anchors.top: parent.top
anchors.bottom: progressBar.visible ? progressBar.top : networkStatus.top
width: parent.width
boundsBehavior: isMac ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds
2017-04-03 18:51:55 +02:00
clip: true
2014-07-07 19:08:30 +02:00
Column {
2014-07-09 18:03:37 +02:00
id: menuColumn
2014-07-07 19:08:30 +02:00
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
2017-08-07 12:14:37 +02:00
clip: true
property var previousButton: transferButton
// top border
2019-04-11 03:17:29 +02:00
MoneroComponents.MenuButtonDivider {
anchors.left: parent.left
anchors.right: parent.right
2019-12-15 22:38:19 +01:00
anchors.leftMargin: 20
}
2014-07-07 19:08:30 +02:00
// ------------- Account tab ---------------
MoneroComponents.MenuButton {
id: accountButton
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Account") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "T" + translationManager.emptyString
onClicked: {
parent.previousButton.checked = false
parent.previousButton = accountButton
panel.accountClicked()
}
}
2019-04-11 03:17:29 +02:00
MoneroComponents.MenuButtonDivider {
visible: accountButton.present
anchors.left: parent.left
anchors.right: parent.right
2019-12-15 22:38:19 +01:00
anchors.leftMargin: 20
}
// ------------- Transfer tab ---------------
MoneroComponents.MenuButton {
2014-07-07 19:08:30 +02:00
id: transferButton
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Send") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "S" + translationManager.emptyString
2014-07-07 19:08:30 +02:00
onClicked: {
parent.previousButton.checked = false
parent.previousButton = transferButton
panel.transferClicked()
}
}
2019-04-11 03:17:29 +02:00
MoneroComponents.MenuButtonDivider {
2017-01-17 22:59:40 +01:00
visible: transferButton.present
2014-07-07 19:08:30 +02:00
anchors.left: parent.left
anchors.right: parent.right
2019-12-15 22:38:19 +01:00
anchors.leftMargin: 20
2014-07-07 19:08:30 +02:00
}
// ------------- AddressBook tab ---------------
MoneroComponents.MenuButton {
id: addressBookButton
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Address book") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "B" + translationManager.emptyString
under: transferButton
onClicked: {
parent.previousButton.checked = false
parent.previousButton = addressBookButton
panel.addressBookClicked()
}
}
2019-04-11 03:17:29 +02:00
MoneroComponents.MenuButtonDivider {
2017-01-01 16:56:39 +01:00
visible: addressBookButton.present
2016-11-23 20:00:19 +01:00
anchors.left: parent.left
anchors.right: parent.right
2019-12-15 22:38:19 +01:00
anchors.leftMargin: 20
2016-11-23 20:00:19 +01:00
}
// ------------- Receive tab ---------------
MoneroComponents.MenuButton {
id: receiveButton
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Receive") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "R" + translationManager.emptyString
onClicked: {
parent.previousButton.checked = false
parent.previousButton = receiveButton
panel.receiveClicked()
}
}
2019-04-11 03:17:29 +02:00
MoneroComponents.MenuButtonDivider {
2017-01-17 22:59:40 +01:00
visible: receiveButton.present
anchors.left: parent.left
anchors.right: parent.right
2019-12-15 22:38:19 +01:00
anchors.leftMargin: 20
}
// ------------- History tab ---------------
MoneroComponents.MenuButton {
2014-07-07 19:08:30 +02:00
id: historyButton
anchors.left: parent.left
anchors.right: parent.right
2019-03-18 00:12:51 +01:00
text: qsTr("Transactions") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "H" + translationManager.emptyString
2014-07-07 19:08:30 +02:00
onClicked: {
parent.previousButton.checked = false
parent.previousButton = historyButton
panel.historyClicked()
}
}
2019-04-11 03:17:29 +02:00
MoneroComponents.MenuButtonDivider {
2017-01-17 22:59:40 +01:00
visible: historyButton.present
2016-11-23 20:00:19 +01:00
anchors.left: parent.left
anchors.right: parent.right
2019-12-15 22:38:19 +01:00
anchors.leftMargin: 20
2016-11-23 20:00:19 +01:00
}
2016-12-10 02:01:04 +01:00
// ------------- Advanced tab ---------------
MoneroComponents.MenuButton {
id: advancedButton
2019-01-14 01:02:44 +01:00
visible: appWindow.walletMode >= 2
2014-07-07 19:08:30 +02:00
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Advanced") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "D" + translationManager.emptyString
2014-07-07 19:08:30 +02:00
onClicked: {
parent.previousButton.checked = false
parent.previousButton = advancedButton
panel.advancedClicked()
2014-07-07 19:08:30 +02:00
}
}
2019-01-14 01:02:44 +01:00
2019-04-11 03:17:29 +02:00
MoneroComponents.MenuButtonDivider {
2019-01-14 01:02:44 +01:00
visible: advancedButton.present && appWindow.walletMode >= 2
anchors.left: parent.left
anchors.right: parent.right
2019-12-15 22:38:19 +01:00
anchors.leftMargin: 20
}
// ------------- Settings tab ---------------
MoneroComponents.MenuButton {
2014-07-07 19:08:30 +02:00
id: settingsButton
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Settings") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "E" + translationManager.emptyString
2014-07-07 19:08:30 +02:00
onClicked: {
parent.previousButton.checked = false
parent.previousButton = settingsButton
panel.settingsClicked()
}
}
2019-04-11 03:17:29 +02:00
MoneroComponents.MenuButtonDivider {
visible: settingsButton.present
anchors.left: parent.left
anchors.right: parent.right
2019-12-15 22:38:19 +01:00
anchors.leftMargin: 20
}
2019-04-11 03:17:29 +02:00
2017-08-07 10:48:13 +02:00
} // Column
2014-07-07 19:08:30 +02:00
2017-08-07 10:48:13 +02:00
} // Flickable
2017-04-03 18:51:55 +02:00
2018-04-13 21:43:15 +02:00
Rectangle {
id: separator
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 0
anchors.rightMargin: 0
anchors.bottom: progressBar.visible ? progressBar.top : networkStatus.top
2019-04-25 21:09:23 +02:00
height: 10
2018-04-30 00:52:48 +02:00
color: "transparent"
2018-04-13 21:43:15 +02:00
}
MoneroComponents.ProgressBar {
2016-12-14 13:48:12 +01:00
id: progressBar
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: daemonProgressBar.top
2019-04-25 21:09:23 +02:00
height: 48
syncType: qsTr("Wallet") + translationManager.emptyString
visible: !appWindow.disconnected
}
MoneroComponents.ProgressBar {
id: daemonProgressBar
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: networkStatus.top
syncType: qsTr("Daemon") + translationManager.emptyString
visible: !appWindow.disconnected
2019-04-25 21:09:23 +02:00
height: 62
}
MoneroComponents.NetworkStatusItem {
id: networkStatus
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 5
anchors.rightMargin: 0
anchors.bottom: parent.bottom
anchors.bottomMargin: 5
connected: Wallet.ConnectionStatus_Disconnected
height: 48
}
2019-04-11 03:17:29 +02:00
}
2014-07-07 19:08:30 +02:00
}