SettingsWallet: lock wallet on demand

This commit adds the ability to lock the wallet on demand instead
of waiting for the user inactivity time out. It is binded to the
hot keys Ctrl+L. Pressing cancel or the esc key will send the user
back to the wizard home for wallet selection. Incorrect password
returns the error message. Correct password will remove the
PasswordDialog allowing access. Add lock functionality in the
wallet settings section and title bar.
This commit is contained in:
reemuru 2022-03-12 19:24:08 -05:00
parent fd8983a7ff
commit 346913f3db
No known key found for this signature in database
GPG Key ID: 5EDBFEFFA9E9A7AB
5 changed files with 77 additions and 0 deletions

View File

@ -7,6 +7,7 @@ import "../components" as MoneroComponents
ColumnLayout { ColumnLayout {
id: settingsListItem id: settingsListItem
property alias iconText: iconLabel.text property alias iconText: iconLabel.text
property alias symbol: symbolText.text
property alias description: area.text property alias description: area.text
property alias title: header.text property alias title: header.text
property bool isLast: false property bool isLast: false
@ -114,5 +115,17 @@ ColumnLayout {
settingsListItem.clicked() settingsListItem.clicked()
} }
} }
MoneroComponents.TextPlain {
id: symbolText
anchors.right: parent.right
anchors.rightMargin: 44
anchors.verticalCenter: parent.verticalCenter
font.pixelSize: 12
font.bold: true
color: MoneroComponents.Style.menuButtonTextColor
visible: appWindow.ctrlPressed
themeTransition: false
}
} }
} }

View File

@ -57,6 +57,7 @@ Rectangle {
signal minimizeClicked signal minimizeClicked
signal languageClicked signal languageClicked
signal closeWalletClicked signal closeWalletClicked
signal lockWalletClicked
state: "default" state: "default"
states: [ states: [
@ -91,6 +92,46 @@ Rectangle {
spacing: 0 spacing: 0
anchors.fill: parent anchors.fill: parent
// lock wallet
Rectangle {
id: btnLockWallet
color: "transparent"
Layout.preferredWidth: parent.height
Layout.preferredHeight: parent.height
Text {
text: FontAwesome.lock
font.family: FontAwesome.fontFamilySolid
font.pixelSize: 16
color: MoneroComponents.Style.defaultFontColor
font.styleName: "Solid"
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
opacity: 0.75
}
MoneroComponents.Tooltip {
id: btnLockWalletTooltip
anchors.fill: parent
text: qsTr("Lock this wallet") + translationManager.emptyString
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onEntered: {
parent.color = MoneroComponents.Style.titleBarButtonHoverColor
btnLockWalletTooltip.tooltipPopup.open()
}
onExited: {
parent.color = "transparent"
btnLockWalletTooltip.tooltipPopup.close()
}
onClicked: root.lockWalletClicked(leftPanel.visible)
}
}
// collapse sidebar // collapse sidebar
Rectangle { Rectangle {
id: btnCloseWallet id: btnCloseWallet

View File

@ -53,6 +53,7 @@ Object {
property string info : "\uf129" property string info : "\uf129"
property string key : "\uf084" property string key : "\uf084"
property string language : "\uf1ab" property string language : "\uf1ab"
property string lock : "\uf023"
property string minus : "\uf068" property string minus : "\uf068"
property string minusCircle : "\uf056" property string minusCircle : "\uf056"
property string moonO : "\uf186" property string moonO : "\uf186"

View File

@ -131,6 +131,17 @@ ApplicationWindow {
leftPanel.selectItem(page) leftPanel.selectItem(page)
} }
function lock() {
passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); }
passwordDialog.onAcceptedCallback = function() {
if(walletPassword === passwordDialog.password)
passwordDialog.close();
else
passwordDialog.showError(qsTr("Wrong password") + translationManager.emptyString);
}
passwordDialog.open(usefulName(persistentSettings.wallet_path));
}
function sequencePressed(obj, seq) { function sequencePressed(obj, seq) {
if(seq === undefined || !leftPanel.enabled) if(seq === undefined || !leftPanel.enabled)
return return
@ -139,6 +150,8 @@ ApplicationWindow {
return return
} }
// lock wallet on demand
if(seq === "Ctrl+L" && !passwordDialog.visible) lock()
if(seq === "Ctrl+S") middlePanel.state = "Transfer" if(seq === "Ctrl+S") middlePanel.state = "Transfer"
else if(seq === "Ctrl+R") middlePanel.state = "Receive" else if(seq === "Ctrl+R") middlePanel.state = "Receive"
else if(seq === "Ctrl+H") middlePanel.state = "History" else if(seq === "Ctrl+H") middlePanel.state = "History"
@ -1923,6 +1936,7 @@ ApplicationWindow {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
onCloseClicked: appWindow.close(); onCloseClicked: appWindow.close();
onLockWalletClicked: appWindow.lock();
onLanguageClicked: appWindow.toggleLanguageView(); onLanguageClicked: appWindow.toggleLanguageView();
onCloseWalletClicked: appWindow.showWizard(); onCloseWalletClicked: appWindow.showWizard();
onMaximizeClicked: appWindow.visibility = appWindow.visibility !== Window.Maximized ? Window.Maximized : Window.Windowed onMaximizeClicked: appWindow.visibility = appWindow.visibility !== Window.Maximized ? Window.Maximized : Window.Windowed

View File

@ -50,6 +50,14 @@ Rectangle {
anchors.topMargin: 0 anchors.topMargin: 0
spacing: 0 spacing: 0
MoneroComponents.SettingsListItem {
iconText: FontAwesome.lock
description: qsTr("Locks the wallet on demand.") + translationManager.emptyString
title: qsTr("Lock this wallet") + translationManager.emptyString
symbol: (isMac ? "⌃" : qsTr("Ctrl+")) + "L" + translationManager.emptyString
onClicked: appWindow.lock();
}
MoneroComponents.SettingsListItem { MoneroComponents.SettingsListItem {
iconText: FontAwesome.signOutAlt iconText: FontAwesome.signOutAlt
description: qsTr("Logs out of this wallet.") + translationManager.emptyString description: qsTr("Logs out of this wallet.") + translationManager.emptyString