idle locking; visual lock idea

This commit is contained in:
Antelle 2015-11-18 00:49:12 +03:00
parent ae29852b60
commit 87944b33b4
7 changed files with 67 additions and 14 deletions

View File

@ -3,6 +3,7 @@
var AppModel = require('./models/app-model'),
AppView = require('./views/app-view'),
KeyHandler = require('./comp/key-handler'),
IdleTracker = require('./comp/idle-tracker'),
Alerts = require('./comp/alerts'),
DropboxLink = require('./comp/dropbox-link'),
Updater = require('./comp/updater'),
@ -17,6 +18,7 @@ $(function() {
return;
}
KeyHandler.init();
IdleTracker.init();
var appModel = new AppModel();
if (appModel.settings.get('theme')) {

View File

@ -0,0 +1,21 @@
'use strict';
var Backbone = require('backbone'),
AppSettingsModel = require('../models/app-settings-model');
var IdleTracker = {
idleMinutes: 0,
init: function() {
setInterval(this.minuteTick.bind(this), 1000 * 60);
},
minuteTick: function() {
if (++this.idleMinutes === AppSettingsModel.instance.get('idleMinutes')) {
Backbone.trigger('user-idle');
}
},
regUserAction: function() {
this.idleMinutes = 0;
}
};
module.exports = IdleTracker;

View File

@ -1,7 +1,8 @@
'use strict';
var Backbone = require('backbone'),
Keys = require('../const/keys');
Keys = require('../const/keys'),
IdleTracker = require('../comp/idle-tracker');
var shortcutKeyProp = navigator.platform.indexOf('Mac') >= 0 ? 'metaKey' : 'ctrlKey';
@ -11,6 +12,7 @@ var KeyHandler = {
shortcuts: {},
modal: false,
init: function() {
$(document).bind('keypress', this.keypress.bind(this));
$(document).bind('keydown', this.keydown.bind(this));
@ -36,6 +38,7 @@ var KeyHandler = {
return e[shortcutKeyProp];
},
keydown: function(e) {
IdleTracker.regUserAction();
var code = e.keyCode || e.which;
var keyShortcuts = this.shortcuts[code];
if (keyShortcuts && keyShortcuts.length) {
@ -72,6 +75,9 @@ var KeyHandler = {
!e.altKey && !e.ctrlKey && !e.metaKey) {
this.trigger('keypress', e);
}
},
reg: function() {
IdleTracker.regUserAction();
}
};

View File

@ -14,7 +14,8 @@ var AppSettingsModel = Backbone.Model.extend({
tagsViewHeight: null,
autoUpdate: 'install',
clipboardSeconds: 0,
autoSave: false
autoSave: false,
idleMinutes: 15
},
initialize: function() {

View File

@ -12,6 +12,7 @@ var Backbone = require('backbone'),
Alerts = require('../comp/alerts'),
Keys = require('../const/keys'),
KeyHandler = require('../comp/key-handler'),
IdleTracker = require('../comp/idle-tracker'),
Launcher = require('../comp/launcher'),
ThemeChanger = require('../util/theme-changer'),
UpdateModel = require('../models/update-model');
@ -25,7 +26,8 @@ var AppView = Backbone.View.extend({
'contextmenu': 'contextmenu',
'drop': 'drop',
'dragover': 'dragover',
'click a[target=_blank]': 'extLinkClick'
'click a[target=_blank]': 'extLinkClick',
'mousedown': 'bodyClick'
},
views: null,
@ -59,6 +61,7 @@ var AppView = Backbone.View.extend({
this.listenTo(Backbone, 'toggle-details', this.toggleDetails);
this.listenTo(Backbone, 'edit-group', this.editGroup);
this.listenTo(Backbone, 'launcher-open-file', this.launcherOpenFile);
this.listenTo(Backbone, 'user-idle', this.userIdle);
this.listenTo(UpdateModel.instance, 'change:updateReady', this.updateApp);
@ -250,12 +253,16 @@ var AppView = Backbone.View.extend({
}
},
lockWorkspace: function() {
lockWorkspace: function(autoInit) {
var that = this;
if (this.model.files.hasUnsavedFiles()) {
if (this.model.settings.get('autoSave')) {
this.saveAndLock();
this.saveAndLock(autoInit);
} else {
if (autoInit) {
this.visualLock();
return;
}
Alerts.alert({
icon: 'lock',
header: 'Lock',
@ -283,15 +290,16 @@ var AppView = Backbone.View.extend({
}
},
saveAndLock: function() {
visualLock: function() {
// TODO: think and implement
},
saveAndLock: function(autoInit) {
var pendingCallbacks = 0,
errorFiles = [],
that = this;
if (this.model.files.some(function(file) { return file.get('modified') && !file.get('path'); })) {
Alerts.error({
header: 'Cannot auto-save',
body: 'Some opened files cannot be saved automatically. To enable auto-save, you can sync them to Dropbox.'
});
this.visualLock();
return;
}
this.model.files.forEach(function(file) {
@ -316,10 +324,14 @@ var AppView = Backbone.View.extend({
}
if (--pendingCallbacks === 0) {
if (errorFiles.length) {
Alerts.error({
header: 'Save Error',
body: 'Failed to auto-save file' + (errorFiles.length > 1 ? 's: ' : '') + ' ' + errorFiles.join(', ')
});
if (autoInit) {
that.visualLock();
} else {
Alerts.error({
header: 'Save Error',
body: 'Failed to auto-save file' + (errorFiles.length > 1 ? 's: ' : '') + ' ' + errorFiles.join(', ')
});
}
} else {
that.closeAllFilesAndShowFirst();
}
@ -354,6 +366,10 @@ var AppView = Backbone.View.extend({
}
},
userIdle: function() {
this.lockWorkspace(true);
},
toggleSettings: function(page) {
var menuItem = page ? this.model.menu[page + 'Section'] : null;
if (menuItem) {
@ -420,6 +436,10 @@ var AppView = Backbone.View.extend({
e.preventDefault();
Launcher.openLink(e.target.href);
}
},
bodyClick: function() {
IdleTracker.regUserAction();
}
});

View File

@ -384,6 +384,7 @@ var DetailsView = Backbone.View.extend({
},
titleInputKeydown: function(e) {
KeyHandler.reg();
e.stopPropagation();
var code = e.keyCode || e.which;
if (code === Keys.DOM_VK_RETURN) {

View File

@ -2,6 +2,7 @@
var FieldView = require('./field-view'),
GeneratorView = require('../generator-view'),
KeyHandler = require('../../comp/key-handler'),
Keys = require('../../const/keys'),
PasswordGenerator = require('../../util/password-generator'),
kdbxweb = require('kdbxweb');
@ -111,6 +112,7 @@ var FieldViewText = FieldView.extend({
},
fieldValueKeydown: function(e) {
KeyHandler.reg();
e.stopPropagation();
var code = e.keyCode || e.which;
if (code === Keys.DOM_VK_RETURN) {