diff --git a/ui (gen4)/features/filesystem.js b/ui (gen4)/features/filesystem.js index bde6121d..2f83e00a 100755 --- a/ui (gen4)/features/filesystem.js +++ b/ui (gen4)/features/filesystem.js @@ -8,15 +8,6 @@ define(function(require){ var module = {} //var DEBUG = DEBUG != null ? DEBUG : true -var util = require('lib/util') - -var actions = require('lib/actions') -var features = require('lib/features') - -var core = require('features/core') - -var overlay = require('lib/widget/overlay') - // XXX this should not be imported!!! // ...something wrong with requirejs(..) if(window.nodejs != null){ @@ -31,6 +22,16 @@ if(window.nodejs != null){ var browseWalk = require('lib/widget/browse-walk') } +var util = require('lib/util') + +var actions = require('lib/actions') +var features = require('lib/features') + +var core = require('features/core') + +var overlay = require('lib/widget/overlay') +var browse = require('lib/widget/browse') + /*********************************************************************/ diff --git a/ui (gen4)/features/meta.js b/ui (gen4)/features/meta.js index 3041e02a..2ba1ade3 100755 --- a/ui (gen4)/features/meta.js +++ b/ui (gen4)/features/meta.js @@ -63,6 +63,7 @@ core.ImageGridFeatures.Feature('viewer-testing', [ 'app-control', // chrome... + 'ui-direct-control', 'ui-animation', 'ui-bounds-indicators', 'ui-current-image-indicator', diff --git a/ui (gen4)/features/ui.js b/ui (gen4)/features/ui.js index 655bc260..c96468e7 100755 --- a/ui (gen4)/features/ui.js +++ b/ui (gen4)/features/ui.js @@ -2044,15 +2044,22 @@ var CurrentImageIndicatorActions = actions.Actions({ var ribbon_set = this.ribbons.getRibbonSet() if(ribbon_set.length == 0){ - return this + return } var scale = this.ribbons.getScale() var cur = this.ribbons.getImage(target) - var ribbon = this.ribbons.getRibbon(target) + // NOTE: cur may be unloaded... + var ribbon = this.ribbons.getRibbon(cur.length > 0 ? target : this.currentRibbon) var marker = ribbon.find('.current-marker') + // remove marker if current image is not loaded... + if(cur.length == 0){ + marker.remove() + return + } + // get config... var border = this.config['current-image-border'] var min_border = this.config['current-image-min-border'] @@ -2373,6 +2380,69 @@ module.AutoSingleImage = core.ImageGridFeatures.Feature({ +//--------------------------------------------------------------------- + +// XXX add tap/click to focus... +// XXX add pinch-zoom... +// XXX add vertical scroll... +// XXX BUG: current image indicator gets shown in random places... +var DirectControl = +module.DirectControl = core.ImageGridFeatures.Feature({ + title: '', + doc: '', + + tag: 'ui-direct-control', + depends: [ + 'ui', + // this is only used to trigger reoad... + //'ui-partial-ribbons', + ], + + /* + config: { + 'ui-direct-control-engines': [ + 'none', + 'jquery', + ], + 'ui-direct-control-engine': 'jquery', + }, + + actions: actions.Actions({ + toggleDirectControlEngine: ['Interface/', + base.makeConfigToggler('ui-direct-control-engine', + function(){ return this.config['ui-direct-control-engines'] })], + }), + */ + + handlers: [ + // XXX hide current image indicator as soon as the image is not visible... + // XXX inertia... + // XXX limit scroll to at least one image being on screen (center?)... + // XXX add setup/taredown... + ['updateRibbon', + function(_, target){ + var that = this + var r = this.ribbons.getRibbon(target) + + r.length > 0 + && !r.hasClass('ui-draggable') + && r.draggable({ + axis: 'x', + stop: function(){ + var c = that.ribbons.getImageByPosition('center', r) + that + .updateRibbon(c) + // XXX is this correct??? + //.updateCurrentImageIndicator() + } + }) + }], + ], +}) + + + + //--------------------------------------------------------------------- // XXX console / log / status bar diff --git a/ui (gen4)/index.html b/ui (gen4)/index.html index ae3bd613..06909fc5 100755 --- a/ui (gen4)/index.html +++ b/ui (gen4)/index.html @@ -175,6 +175,7 @@ typeof(require) != 'undefined' && require('nw.gui').Window.get().showDevTools() + diff --git a/ui (gen4)/lib/util.js b/ui (gen4)/lib/util.js index afd58147..9a3b424f 100755 --- a/ui (gen4)/lib/util.js +++ b/ui (gen4)/lib/util.js @@ -11,11 +11,41 @@ define(function(require){ var module = {} /*********************************************************************/ +// Quote a string and convert to RegExp to match self literally. +var quoteRegExp = +module.quoteRegExp = +function(str){ + return str.replace(/([\.\\\/\(\)\[\]\$\*\+\-\{\}\@\^\&\?\<\>])/g, '\\$1') +} + + +// XXX do we need to quote anything else??? +var path2url = +module.path2url = +function(path){ + // test if we have a schema, and if yes return as-is... + if(/^(http|https|file|[\w-]*):[\\\/]{2}/.test(path)){ + return path + } + // skip encoding windows drives... + var drive = path.split(/^([a-z]:[\\\/])/i) + path = drive.pop() + drive = drive.pop() || '' + return drive + (path + .split(/[\\\/]/g) + // XXX these are too aggressive... + //.map(encodeURI) + //.map(encodeURIComponent) + .join('/') + // NOTE: keep '%' the first... + .replace(/%/g, '%25') + .replace(/#/g, '%23') + .replace(/&/g, '%26')) +} + + // NOTE: we are not using node's path module as we need this to work in // all contexts, not only node... (???) -// XXX currently this is only used in node-specific modules and in -// images... -// XXX make this standard... var normalizePath = module.normalizePath = function(path){ @@ -37,8 +67,6 @@ function(path){ - - /********************************************************************** * vim:set ts=4 sw=4 : */ return module }) diff --git a/ui (gen4)/ribbons.js b/ui (gen4)/ribbons.js index 2f4bb8cf..1cc07005 100755 --- a/ui (gen4)/ribbons.js +++ b/ui (gen4)/ribbons.js @@ -12,6 +12,7 @@ define(function(require){ var module = {} // XXX is this correct... //require('ext-lib/jquery') +var util = require('lib/util') var object = require('lib/object') var data = require('data') @@ -22,24 +23,6 @@ var RIBBON = '.ribbon:not(.clone)' -/*********************************************************************/ - -function path2url(path){ - // test if we have a schema, and if yes return as-is... - if(/^(http|https|file|[\w-]*):[\\\/]{2}/.test(path)){ - return path - } - // skip encoding windows drives... - var drive = path.split(/^([a-z]:[\\\/])/i) - path = drive.pop() - drive = drive.pop() || '' - return drive + (path - .split(/[\\\/]/g) - .map(encodeURIComponent) - .join('/')) -} - - /*********************************************************************/ // @@ -1127,7 +1110,7 @@ var RibbonsPrototype = { return image }, _loadImagePreviewURL: function(image, url){ - url = path2url(url) + url = util.path2url(url) // pre-cache and load image... // NOTE: this will make images load without a blackout... var img = new Image() @@ -1265,7 +1248,7 @@ var RibbonsPrototype = { // the new preview (p_url) is different to current... // NOTE: this may not work correctly for relative urls... //|| image.css('background-image').indexOf(encodeURI(p_url)) < 0){ - || image.css('background-image').indexOf(path2url(p_url)) < 0){ + || image.css('background-image').indexOf(util.path2url(p_url)) < 0){ // sync load... if(sync){ that._loadImagePreviewURL(image, p_url) @@ -1372,7 +1355,7 @@ var RibbonsPrototype = { // remove everything in one go... $(unloaded) .detach() - .removeClass('moving') + .removeClass('moving current') // blank out images to prevent wrong image flashing... .css('background-image', 'none') // clear marks...