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