diff --git a/ui (gen4)/Makefile b/ui (gen4)/Makefile index 5e002f15..0513151f 100755 --- a/ui (gen4)/Makefile +++ b/ui (gen4)/Makefile @@ -71,6 +71,7 @@ APP_DATE=$(BUILD_DIR)/DATE APP_NODE=$(BUILD_DIR)/NODE APP_ZIP=$(BUILD_DIR)/package.nw +APP_ASAR=$(BUILD_DIR)/app.asar @@ -130,6 +131,16 @@ $(APP_ZIP): $(CSS_FILES) $(BUILD_DIR) $(NODE_DIR) $(NW_PROJECT_FILE) \ zip: $(APP_ZIP) +# XXX add a asar build rool -- see electron docs... +# asar pack ... +# ...this will also need an appropriate loader or config as I see +# no way to make this transparent... +$(APP_ASAR): $(CSS_FILES) $(BUILD_DIR) $(NODE_DIR) $(NW_PROJECT_FILE) \ + $(JS_FILES) $(CSS_FILES) $(HTML_FILES) $(APP_DATE) $(APP_NODE) + +asar: $(APP_ASAR) + + #********************************************************************** # dev env... diff --git a/ui (gen4)/features/keyboard.js b/ui (gen4)/features/keyboard.js index 3ffdec98..5ff9f253 100755 --- a/ui (gen4)/features/keyboard.js +++ b/ui (gen4)/features/keyboard.js @@ -34,13 +34,14 @@ module.GLOBAL_KEYBOARD = { 'Slideshow': { pattern: '.slideshow-running', drop: [ + 'Space', 'Backspace', 'Esc', 'Up', 'Down', 'Enter', 'R', 'L', 'G', 'T', ], Esc: 'toggleSlideshow: "off" -- Exit slideshow', - Space: 'Esc', + Space: 'toggleSlideshowTimer', Enter: 'slideshowDialog', Left: 'resetSlideshowTimer', diff --git a/ui (gen4)/features/ui-slideshow.js b/ui (gen4)/features/ui-slideshow.js index 4acde582..5ed62ba1 100755 --- a/ui (gen4)/features/ui-slideshow.js +++ b/ui (gen4)/features/ui-slideshow.js @@ -57,10 +57,10 @@ var SlideshowActions = actions.Actions({ // reset the timer... // NOTE: this means we were in a slideshow mode so we do not // need to prepare... - if(this.__slideshouw_timer){ - this.__slideshouw_timer != 'suspended' - && clearInterval(this.__slideshouw_timer) - delete this.__slideshouw_timer + if(this.__slideshow_timer){ + this.__slideshow_timer != 'suspended' + && clearInterval(this.__slideshow_timer) + delete this.__slideshow_timer // prepare for the slideshow... } else { @@ -90,7 +90,7 @@ var SlideshowActions = actions.Actions({ } // start the timer... - this.__slideshouw_timer = setInterval(function(){ + this.__slideshow_timer = setInterval(function(){ var cur = that.current // next step... @@ -116,9 +116,9 @@ var SlideshowActions = actions.Actions({ // stop... } else { // stop timer... - this.__slideshouw_timer - && clearInterval(this.__slideshouw_timer) - delete this.__slideshouw_timer + this.__slideshow_timer + && clearInterval(this.__slideshow_timer) + delete this.__slideshow_timer // restore the original workspace... this.popWorkspace() @@ -130,7 +130,7 @@ var SlideshowActions = actions.Actions({ var that = this // suspend the timer if it's not suspended outside... - var suspended_timer = this.__slideshouw_timer == 'suspended' + var suspended_timer = this.__slideshow_timer == 'suspended' suspended_timer || this.suspendSlideshowTimer() // XXX might be a good idea to make this generic... @@ -196,12 +196,12 @@ var SlideshowActions = actions.Actions({ }) .on('start', function(){ // suspend the timer if it's not suspended outside... - this.__slideshouw_timer == 'suspended' + this.__slideshow_timer == 'suspended' || this.suspendSlideshowTimer() }) .on('close', function(){ // reset the timer if it was not suspended outside... - this.__slideshouw_timer == 'suspended' + this.__slideshow_timer == 'suspended' || that.resetSlideshowTimer() if(parent){ @@ -224,15 +224,48 @@ var SlideshowActions = actions.Actions({ // NOTE: these can be used as pause and resume... resetSlideshowTimer: ['- Slideshow/Reset slideshow timer', function(){ - this.__slideshouw_timer && this.toggleSlideshow('on') + this.__slideshow_timer && this.toggleSlideshow('on') }], suspendSlideshowTimer: ['- Slideshow/Suspend slideshow timer', function(){ - if(this.__slideshouw_timer){ - clearInterval(this.__slideshouw_timer) - this.__slideshouw_timer = 'suspended' + if(this.__slideshow_timer){ + clearInterval(this.__slideshow_timer) + this.__slideshow_timer = 'suspended' } }], + toggleSlideshowTimer:['Slideshow/Pause or resume running slideshow', + core.doc` + + NOTE: this will have no effect if the slideshow is not running... + `, + {browseMode: function(){ return this.toggleSlideshow('?') == 'off' && 'disabled' }}, + toggler.Toggler(null, + function(_, state){ + if(state == null){ + return this.__slideshow_timer == 'suspended' ? 'paused' + : !!this.__slideshow_timer ? 'running' + : 'off' + } + + if(this.toggleSlideshow('?') != 'on'){ + return + } + + // handle state changing... + if(state == 'paused' || state == 'off'){ + this.suspendSlideshowTimer() + return 'paused' + + } else { + this.resetSlideshowTimer() + return 'running' + } + }, + // XXX should we return different sets of states when + // slideshow is running and when not? + // ...the problem is what to return when slideshow is + // not running??? + ['paused', 'running', 'off'])], resetSlideshowWorkspace: ['Slideshow/Reset workspace', function(){ delete this.workspaces['slideshow'] }], diff --git a/ui (gen4)/package-lock.json b/ui (gen4)/package-lock.json index 109080ef..c729b1da 100755 --- a/ui (gen4)/package-lock.json +++ b/ui (gen4)/package-lock.json @@ -145,7 +145,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "1.1.8" @@ -200,7 +200,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "1.1.8" @@ -2377,7 +2377,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "1.1.8" @@ -2548,6 +2548,13 @@ "resolved": "https://registry.npmjs.org/ig-object/-/ig-object-1.0.2.tgz", "integrity": "sha512-odO47fivzFu9cwJIDEm4dH2KTC9YiBKIl+iQWht5IkOFw5bqO+q0kFO9lFBGYUGSraJFV4RCxV+vnWGiMsX4HA==" }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, "indexof": { "version": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", @@ -2847,6 +2854,219 @@ "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" } }, + "less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "dev": true, + "requires": { + "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "image-size": "0.5.5", + "mime": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", + "request": "2.81.0", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "har-schema": "1.0.5" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz" + } + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true, + "optional": true + } + } + }, "load-json-file": { "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", @@ -6096,7 +6316,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "1.1.8"