diff --git a/components/Slider.qml b/components/Slider.qml new file mode 100644 index 00000000..451aa7a9 --- /dev/null +++ b/components/Slider.qml @@ -0,0 +1,68 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.0 as QtQuickControls +import QtQuick.Layouts 1.1 + +import "../components" as MoneroComponents + +ColumnLayout { + property alias from: slider.from + property alias stepSize: slider.stepSize + property alias to: slider.to + property alias value: slider.value + + property alias text: label.text + + signal moved() + + spacing: 0 + + Text { + id: label + color: MoneroComponents.Style.defaultFontColor + font.pixelSize: 14 + Layout.fillWidth: true + } + + QtQuickControls.Slider { + id: slider + leftPadding: 0 + snapMode: QtQuickControls.Slider.SnapAlways + + background: Rectangle { + x: parent.leftPadding + y: parent.topPadding + parent.availableHeight / 2 - height / 2 + implicitWidth: 200 + implicitHeight: 4 + width: parent.availableWidth + height: implicitHeight + radius: 2 + color: MoneroComponents.Style.progressBarBackgroundColor + + Rectangle { + width: parent.visualPosition * parent.width + height: parent.height + color: MoneroComponents.Style.green + radius: 2 + } + } + + handle: Rectangle { + x: parent.leftPadding + parent.visualPosition * (parent.availableWidth - width) + y: parent.topPadding + parent.availableHeight / 2 - height / 2 + implicitWidth: 18 + implicitHeight: 18 + radius: 8 + color: parent.pressed ? "#f0f0f0" : "#f6f6f6" + border.color: MoneroComponents.Style.grey + } + + onMoved: parent.moved() + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.NoButton + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + } + } +} diff --git a/main.qml b/main.qml index 5c7b62c9..b311e510 100644 --- a/main.qml +++ b/main.qml @@ -1370,6 +1370,8 @@ ApplicationWindow { property int lockOnUserInActivityInterval: 10 // minutes property bool blackTheme: true property bool checkForUpdates: true + property bool autosave: true + property int autosaveMinutes: 10 property bool fiatPriceEnabled: false property bool fiatPriceToggle: false @@ -1811,6 +1813,24 @@ ApplicationWindow { } } + Timer { + id: autosaveTimer + interval: persistentSettings.autosaveMinutes * 60 * 1000 + repeat: true + running: persistentSettings.autosave + onTriggered: { + if (currentWallet) { + currentWallet.storeAsync(function(success) { + if (success) { + appWindow.showStatusMessage(qsTr("Autosaved the wallet"), 3); + } else { + appWindow.showStatusMessage(qsTr("Failed to autosave the wallet"), 3); + } + }); + } + } + } + // TODO: Make the callback dynamic Timer { id: statusMessageTimer diff --git a/pages/settings/SettingsLayout.qml b/pages/settings/SettingsLayout.qml index 4d338045..f6032e32 100644 --- a/pages/settings/SettingsLayout.qml +++ b/pages/settings/SettingsLayout.qml @@ -94,6 +94,25 @@ Rectangle { text: qsTr("Ask for password before sending a transaction") + translationManager.emptyString } + MoneroComponents.CheckBox { + checked: persistentSettings.autosave + onClicked: persistentSettings.autosave = !persistentSettings.autosave + text: qsTr("Autosave") + translationManager.emptyString + } + + MoneroComponents.Slider { + Layout.fillWidth: true + Layout.leftMargin: 35 + Layout.topMargin: 6 + visible: persistentSettings.autosave + from: 1 + stepSize: 1 + to: 60 + value: persistentSettings.autosaveMinutes + text: "%1 %2 %3".arg(qsTr("Every")).arg(value).arg(qsTr("minute(s)")) + translationManager.emptyString + onMoved: persistentSettings.autosaveMinutes = value + } + MoneroComponents.CheckBox { id: userInActivityCheckbox checked: persistentSettings.lockOnUserInActivity @@ -101,70 +120,20 @@ Rectangle { text: qsTr("Lock wallet on inactivity") + translationManager.emptyString } - ColumnLayout { + MoneroComponents.Slider { visible: userInActivityCheckbox.checked Layout.fillWidth: true Layout.topMargin: 6 - Layout.leftMargin: 42 - spacing: 0 - - Text { - color: MoneroComponents.Style.defaultFontColor - font.pixelSize: 14 - Layout.fillWidth: true - text: { - var val = userInactivitySlider.value; - var minutes = val > 1 ? qsTr("minutes") : qsTr("minute"); - - qsTr("After ") + val + " " + minutes + translationManager.emptyString; - } - } - - Slider { - id: userInactivitySlider - from: 1 - value: persistentSettings.lockOnUserInActivityInterval - to: 60 - leftPadding: 0 - stepSize: 1 - snapMode: Slider.SnapAlways - - background: Rectangle { - x: parent.leftPadding - y: parent.topPadding + parent.availableHeight / 2 - height / 2 - implicitWidth: 200 - implicitHeight: 4 - width: parent.availableWidth - height: implicitHeight - radius: 2 - color: MoneroComponents.Style.progressBarBackgroundColor - - Rectangle { - width: parent.visualPosition * parent.width - height: parent.height - color: MoneroComponents.Style.green - radius: 2 - } - } - - handle: Rectangle { - x: parent.leftPadding + parent.visualPosition * (parent.availableWidth - width) - y: parent.topPadding + parent.availableHeight / 2 - height / 2 - implicitWidth: 18 - implicitHeight: 18 - radius: 8 - color: parent.pressed ? "#f0f0f0" : "#f6f6f6" - border.color: MoneroComponents.Style.grey - } - - onMoved: persistentSettings.lockOnUserInActivityInterval = userInactivitySlider.value; - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.NoButton - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - } + Layout.leftMargin: 35 + from: 1 + stepSize: 1 + to: 60 + value: persistentSettings.lockOnUserInActivityInterval + text: { + var minutes = value > 1 ? qsTr("minutes") : qsTr("minute"); + return qsTr("After ") + value + " " + minutes + translationManager.emptyString; } + onMoved: persistentSettings.lockOnUserInActivityInterval = value } //! Manage pricing diff --git a/qml.qrc b/qml.qrc index 404de207..eb24cc20 100644 --- a/qml.qrc +++ b/qml.qrc @@ -5,6 +5,7 @@ MiddlePanel.qml components/Label.qml components/SettingsListItem.qml + components/Slider.qml components/UpdateDialog.qml images/whatIsIcon.png images/whatIsIcon@2x.png