From 425389051aa182799a72ee52b6550185b7758101 Mon Sep 17 00:00:00 2001 From: Dennis Ploeger Date: Wed, 2 Jan 2019 15:19:19 +0100 Subject: [PATCH] Implemented an auto save feature that periodically saves all files Changed the label for the old "auto save feature" to make it more distinct from the new feature Removed the setting from view for non-desktop users, because it wasn't supported there anyway Fixes #745 --- app/scripts/locales/base.json | 5 ++++- app/scripts/models/app-settings-model.js | 1 + app/scripts/models/file-model.js | 1 + app/scripts/views/app-view.js | 14 +++++++++++++ .../views/settings/settings-general-view.js | 8 +++++++ app/templates/settings/settings-general.hbs | 21 ++++++++++++++++++- 6 files changed, 48 insertions(+), 2 deletions(-) diff --git a/app/scripts/locales/base.json b/app/scripts/locales/base.json index 5daf88ed..8d609461 100644 --- a/app/scripts/locales/base.json +++ b/app/scripts/locales/base.json @@ -354,7 +354,10 @@ "setGenTableView": "Entries list table view", "setGenColorfulIcons": "Colorful custom icons in list", "setGenFunction": "Function", - "setGenAutoSync": "Automatically save and sync", + "setGenAutoSyncOnClose": "Automatically save and sync on close", + "setGenAutoSyncTimer": "Automatically save and sync periodically", + "setGenAutoSyncTimerOff": "Disabled", + "setGenAutoSyncTimerInterval": "Every {} minute(s)", "setGenRememberKeyFiles": "Remember key files", "setGenNoRememberKeyFiles": "Don't remember", "setGenRememberKeyFilesData": "Store in the internal app storage", diff --git a/app/scripts/models/app-settings-model.js b/app/scripts/models/app-settings-model.js index 54ac7070..0534add5 100644 --- a/app/scripts/models/app-settings-model.js +++ b/app/scripts/models/app-settings-model.js @@ -12,6 +12,7 @@ const AppSettingsModel = Backbone.Model.extend({ autoUpdate: 'install', clipboardSeconds: 0, autoSave: true, + autoSaveInterval: 0, rememberKeyFiles: false, idleMinutes: 15, minimizeOnClose: false, diff --git a/app/scripts/models/file-model.js b/app/scripts/models/file-model.js index 2a831f21..ce8517f2 100644 --- a/app/scripts/models/file-model.js +++ b/app/scripts/models/file-model.js @@ -360,6 +360,7 @@ const FileModel = Backbone.Model.extend({ setModified: function() { if (!this.get('demo')) { this.set({ modified: true, dirty: true }); + Backbone.trigger('file-modified'); } }, diff --git a/app/scripts/views/app-view.js b/app/scripts/views/app-view.js index f3225c1f..8d0e7468 100644 --- a/app/scripts/views/app-view.js +++ b/app/scripts/views/app-view.js @@ -84,6 +84,7 @@ const AppView = Backbone.View.extend({ this.listenTo(Backbone, 'app-minimized', this.appMinimized); this.listenTo(Backbone, 'show-context-menu', this.showContextMenu); this.listenTo(Backbone, 'second-instance', this.showSingleInstanceAlert); + this.listenTo(Backbone, 'file-modified', this.handleAutoSaveTimer); this.listenTo(UpdateModel.instance, 'change:updateReady', this.updateApp); @@ -476,6 +477,19 @@ const AppView = Backbone.View.extend({ } }, + handleAutoSaveTimer: function () { + if (this.model.settings.get('autoSaveInterval') !== 0) { + // trigger periodical auto save + if (this.autoSaveTimeoutId) { + clearTimeout(this.autoSaveTimeoutId); + } + this.autoSaveTimeoutId = setTimeout( + this.saveAll.bind(this), + this.model.settings.get('autoSaveInterval') * 1000 * 60 + ); + } + }, + saveAndLock: function(complete) { let pendingCallbacks = 0; const errorFiles = []; diff --git a/app/scripts/views/settings/settings-general-view.js b/app/scripts/views/settings/settings-general-view.js index 5eeebf71..a5339b9a 100644 --- a/app/scripts/views/settings/settings-general-view.js +++ b/app/scripts/views/settings/settings-general-view.js @@ -28,6 +28,7 @@ const SettingsGeneralView = Backbone.View.extend({ 'change .settings__general-idle-minutes': 'changeIdleMinutes', 'change .settings__general-clipboard': 'changeClipboard', 'change .settings__general-auto-save': 'changeAutoSave', + 'change .settings__general-auto-save-interval': 'changeAutoSaveInterval', 'change .settings__general-remember-key-files': 'changeRememberKeyFiles', 'change .settings__general-minimize': 'changeMinimize', 'change .settings__general-lock-on-minimize': 'changeLockOnMinimize', @@ -74,10 +75,12 @@ const SettingsGeneralView = Backbone.View.extend({ rememberKeyFiles: AppSettingsModel.instance.get('rememberKeyFiles'), supportFiles: !!Launcher, autoSave: AppSettingsModel.instance.get('autoSave'), + autoSaveInterval: AppSettingsModel.instance.get('autoSaveInterval'), idleMinutes: AppSettingsModel.instance.get('idleMinutes'), minimizeOnClose: AppSettingsModel.instance.get('minimizeOnClose'), devTools: Launcher && Launcher.devTools, canAutoUpdate: Updater.enabled, + canAutoSaveOnClose: Launcher, canMinimize: Launcher && Launcher.canMinimize(), canDetectMinimize: !!Launcher, canDetectOsSleep: Launcher && Launcher.canDetectOsSleep(), @@ -224,6 +227,11 @@ const SettingsGeneralView = Backbone.View.extend({ AppSettingsModel.instance.set('autoSave', autoSave); }, + changeAutoSaveInterval: function(e) { + const autoSaveInterval = Number(e.target.value) || 0; + AppSettingsModel.instance.set('autoSaveInterval', autoSaveInterval); + }, + changeRememberKeyFiles: function(e) { const rememberKeyFiles = e.target.value || false; AppSettingsModel.instance.set('rememberKeyFiles', rememberKeyFiles); diff --git a/app/templates/settings/settings-general.hbs b/app/templates/settings/settings-general.hbs index 0eda3455..a018eb7d 100644 --- a/app/templates/settings/settings-general.hbs +++ b/app/templates/settings/settings-general.hbs @@ -90,10 +90,29 @@

{{res 'setGenFunction'}}

+ {{#if canAutoSaveOnClose}}
- + +
+ {{/if}} +
+ +