mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 18:30:09 +00:00
added page up/down actions + tweaks and fixes...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
29f2639000
commit
877740182b
@ -684,6 +684,10 @@ var BaseBrowserPrototype = {
|
|||||||
// count to the path...
|
// count to the path...
|
||||||
// This will also make re-generating the indexes and searching
|
// This will also make re-generating the indexes and searching
|
||||||
// stable...
|
// stable...
|
||||||
|
//
|
||||||
|
// XXX for some odd reason this is sorted wrong...
|
||||||
|
// ...keys that are numbers for some reason are first and sorted
|
||||||
|
// by value and not by position...
|
||||||
__item_index_cache: null,
|
__item_index_cache: null,
|
||||||
get index(){
|
get index(){
|
||||||
return (this.__item_index_cache =
|
return (this.__item_index_cache =
|
||||||
@ -2749,6 +2753,25 @@ var getElem = function(elem){
|
|||||||
: elem }
|
: elem }
|
||||||
|
|
||||||
|
|
||||||
|
var focusPage = function(direction){
|
||||||
|
var d = direction == 'up' ?
|
||||||
|
'pagetop'
|
||||||
|
: direction == 'down' ?
|
||||||
|
'pagebottom'
|
||||||
|
: null
|
||||||
|
if(d == null){
|
||||||
|
throw new Error('focusPage(..): unknown direction: '+ direction)
|
||||||
|
}
|
||||||
|
return function(){
|
||||||
|
var target = this.get(d)
|
||||||
|
return this.focused === target ?
|
||||||
|
// scroll one page up and focus page top...
|
||||||
|
this.focus(this.get(d, 1))
|
||||||
|
// focus top of current page...
|
||||||
|
: this.focus(target) } }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
var BrowserClassPrototype = {
|
var BrowserClassPrototype = {
|
||||||
@ -2770,6 +2793,12 @@ var BrowserPrototype = {
|
|||||||
options: {
|
options: {
|
||||||
__proto__: BaseBrowser.prototype.options,
|
__proto__: BaseBrowser.prototype.options,
|
||||||
|
|
||||||
|
// for more docs see:
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
|
||||||
|
//
|
||||||
|
// XXX 'smooth' value yields odd results...
|
||||||
|
//scrollBehavior: 'auto',
|
||||||
|
|
||||||
hideListHeader: false,
|
hideListHeader: false,
|
||||||
|
|
||||||
renderHidden: false,
|
renderHidden: false,
|
||||||
@ -2853,8 +2882,8 @@ var BrowserPrototype = {
|
|||||||
End: 'focus: "last"',
|
End: 'focus: "last"',
|
||||||
|
|
||||||
// XXX screen navigation...
|
// XXX screen navigation...
|
||||||
PgUp: 'pageUp',
|
PgUp: 'pageUp!',
|
||||||
PgDown: 'pageDown',
|
PgDown: 'pageDown!',
|
||||||
|
|
||||||
Enter: 'open',
|
Enter: 'open',
|
||||||
|
|
||||||
@ -2924,28 +2953,70 @@ var BrowserPrototype = {
|
|||||||
// XXX currently direct match only...
|
// XXX currently direct match only...
|
||||||
// ...should we add containment search -- match closest item containing obj...
|
// ...should we add containment search -- match closest item containing obj...
|
||||||
//
|
//
|
||||||
|
//
|
||||||
|
// .get('pagetop'[, offset] ..)
|
||||||
|
//
|
||||||
|
// .get('pagebottom'[, offset] ..)
|
||||||
|
//
|
||||||
|
//
|
||||||
// XXX add support for pixel offset...
|
// XXX add support for pixel offset...
|
||||||
// XXX
|
// XXX
|
||||||
get: function(pattern){
|
get: function(pattern){
|
||||||
|
var args = [...arguments].slice(1)
|
||||||
var p = pattern
|
var p = pattern
|
||||||
|
|
||||||
|
// XXX skip detached elements...
|
||||||
|
var getAtPagePosition = function(pos, offset){
|
||||||
|
pos = pos || 'top'
|
||||||
|
var lst = this.dom.querySelector('.list')
|
||||||
|
offset = lst.offsetHeight * (offset || 0)
|
||||||
|
var st = lst.scrollTop
|
||||||
|
var H = pos == 'bottom' ?
|
||||||
|
lst.offsetHeight
|
||||||
|
: 0
|
||||||
|
return this.search(true,
|
||||||
|
function(e, i, p, stop){
|
||||||
|
var edom = getElem(e)
|
||||||
|
// first below upper border...
|
||||||
|
pos == 'top'
|
||||||
|
&& Math.round(edom.offsetTop
|
||||||
|
- Math.max(0, st - offset)) >= 0
|
||||||
|
&& stop(e)
|
||||||
|
// last above lower border...
|
||||||
|
pos == 'bottom'
|
||||||
|
&& Math.round(edom.offsetTop + edom.offsetHeight)
|
||||||
|
- Math.max(0, st + H + offset) <= 0
|
||||||
|
&& stop(e) },
|
||||||
|
{ reverse: pos == 'bottom' ?
|
||||||
|
'flat'
|
||||||
|
: false })
|
||||||
|
.run(function(){
|
||||||
|
return this instanceof Array ?
|
||||||
|
undefined
|
||||||
|
: this }) }.bind(this)
|
||||||
|
|
||||||
pattern = arguments[0] =
|
pattern = arguments[0] =
|
||||||
// DOM element...
|
// DOM element...
|
||||||
// XXX should we also check for content???
|
|
||||||
pattern instanceof HTMLElement ?
|
pattern instanceof HTMLElement ?
|
||||||
function(e){ return e.dom === p }
|
function(e){ return e.dom === p || getElem(e) === p }
|
||||||
// jQuery object...
|
// jQuery object...
|
||||||
// XXX should we also check for content???
|
|
||||||
: (typeof(jQuery) != 'undefined' && pattern instanceof jQuery) ?
|
: (typeof(jQuery) != 'undefined' && pattern instanceof jQuery) ?
|
||||||
function(e){ return p.is(e.dom) }
|
function(e){ return p.is(e.dom) || p.is(getElem(e)) }
|
||||||
: pattern
|
// pagetop + offset...
|
||||||
return pattern == 'pagetop' ?
|
: pattern == 'pagetop' ?
|
||||||
// XXX
|
getAtPagePosition('top',
|
||||||
false
|
// page offset...
|
||||||
|
typeof(args[0]) == typeof(123) ? args.shift() : 0)
|
||||||
|
// pagebottom + offset...
|
||||||
: pattern == 'pagebottom' ?
|
: pattern == 'pagebottom' ?
|
||||||
// XXX
|
getAtPagePosition('bottom',
|
||||||
false
|
// page offset...
|
||||||
|
typeof(args[0]) == typeof(123) ? args.shift() : 0)
|
||||||
|
// other...
|
||||||
|
: pattern
|
||||||
|
|
||||||
// call parent...
|
// call parent...
|
||||||
: object.parent(BrowserPrototype.get, this).call(this, ...arguments) },
|
return object.parent(BrowserPrototype.get, this).call(this, pattern, ...args) },
|
||||||
|
|
||||||
|
|
||||||
// Element renderers...
|
// Element renderers...
|
||||||
@ -2991,10 +3062,12 @@ var BrowserPrototype = {
|
|||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
d.focus()
|
d.focus()
|
||||||
})
|
})
|
||||||
|
/* XXX this messes up scrollbar...
|
||||||
d.addEventListener('focus',
|
d.addEventListener('focus',
|
||||||
function(){
|
function(){
|
||||||
that.focused
|
that.focused
|
||||||
&& getElem(that.focused).focus() })
|
&& getElem(that.focused).focus() })
|
||||||
|
//*/
|
||||||
|
|
||||||
this.dom = d
|
this.dom = d
|
||||||
|
|
||||||
@ -3021,11 +3094,7 @@ var BrowserPrototype = {
|
|||||||
// </div>
|
// </div>
|
||||||
// </div>
|
// </div>
|
||||||
//
|
//
|
||||||
// XXX instrument interactions...
|
// XXX the way focus management is done here feels hack-ish...
|
||||||
// XXX register event handlers...
|
|
||||||
// XXX HANCK: preventing scrollbar from grabbing focus -- there is
|
|
||||||
// definitely a better solution implemented in browse.js + ImageGrid
|
|
||||||
// (the effect seems to be originating out of ImageGrid...)
|
|
||||||
renderList: function(items, context){
|
renderList: function(items, context){
|
||||||
var that = this
|
var that = this
|
||||||
var options = context.options || this.options
|
var options = context.options || this.options
|
||||||
@ -3034,6 +3103,9 @@ var BrowserPrototype = {
|
|||||||
var dialog = document.createElement('div')
|
var dialog = document.createElement('div')
|
||||||
dialog.classList.add('browse-widget')
|
dialog.classList.add('browse-widget')
|
||||||
dialog.setAttribute('tabindex', '0')
|
dialog.setAttribute('tabindex', '0')
|
||||||
|
// HACK?: prevent dialog from grabbing focus from item...
|
||||||
|
dialog.addEventListener('mousedown',
|
||||||
|
function(evt){ evt.stopPropagation() })
|
||||||
|
|
||||||
// header...
|
// header...
|
||||||
options.hideListHeader
|
options.hideListHeader
|
||||||
@ -3042,13 +3114,9 @@ var BrowserPrototype = {
|
|||||||
// list...
|
// list...
|
||||||
var list = document.createElement('div')
|
var list = document.createElement('div')
|
||||||
list.classList.add('list', 'v-block')
|
list.classList.add('list', 'v-block')
|
||||||
// XXX HACK: prevent scrollbar from grabbing focus...
|
// HACK?: prevent scrollbar from grabbing focus...
|
||||||
list.addEventListener('mousedown',
|
list.addEventListener('mousedown',
|
||||||
function(){
|
function(evt){ evt.stopPropagation() })
|
||||||
setTimeout(function(){
|
|
||||||
that.focused
|
|
||||||
&& !list.querySelector(':focus')
|
|
||||||
&& that.focused.dom.focus() }, 0) })
|
|
||||||
items
|
items
|
||||||
.forEach(function(item){
|
.forEach(function(item){
|
||||||
list.appendChild(item instanceof Array ?
|
list.appendChild(item instanceof Array ?
|
||||||
@ -3318,11 +3386,14 @@ var BrowserPrototype = {
|
|||||||
|
|
||||||
|
|
||||||
// scroll...
|
// scroll...
|
||||||
// XXX add target posotion (top/bottom/center) -- where to place the item...
|
// XXX do we need this???
|
||||||
scrollTo: function(pattern){
|
scrollTo: function(pattern, position){
|
||||||
},
|
var target = this.get(pattern)
|
||||||
center: function(pattern){
|
target
|
||||||
return this.scrollTo(pattern, 'center', ...[...arguments].slice(1)) },
|
&& getElem(target).scrollIntoView({
|
||||||
|
behavior: (this.options || {}).scrollBehavior || 'auto',
|
||||||
|
block: position || 'center',
|
||||||
|
}) },
|
||||||
|
|
||||||
|
|
||||||
// Custom events handlers...
|
// Custom events handlers...
|
||||||
@ -3346,7 +3417,7 @@ var BrowserPrototype = {
|
|||||||
this.classList.add('focused')
|
this.classList.add('focused')
|
||||||
|
|
||||||
this.scrollIntoView({
|
this.scrollIntoView({
|
||||||
behavior: 'auto',
|
behavior: (that.options || {}).scrollBehavior || 'auto',
|
||||||
block: 'nearest',
|
block: 'nearest',
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -3429,17 +3500,10 @@ var BrowserPrototype = {
|
|||||||
.expand()
|
.expand()
|
||||||
: this.next() },
|
: this.next() },
|
||||||
|
|
||||||
// navigation relative to page...
|
// XXX should these focus the top/bottom element or and element at
|
||||||
pageTop: function(){
|
// offset from top/bottom???
|
||||||
this.focus(this.get('pagetop')) },
|
pageUp: focusPage('up'),
|
||||||
pageBottom: function(){
|
pageDown: focusPage('down'),
|
||||||
this.focus(this.get('pagebottom')) },
|
|
||||||
// XXX
|
|
||||||
pageUp: function(){
|
|
||||||
this.scrollTo(this.get('pagetop'), 'bottom') },
|
|
||||||
// XXX should we scroll to the bottom elem (current behavior) or to the one after it???
|
|
||||||
pageDown: function(){
|
|
||||||
this.scrollTo(this.get('pagebottom'), 'top') },
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user