mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-11-02 20:30:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			271 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			271 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
/**********************************************************************
 | 
						|
* 
 | 
						|
*
 | 
						|
*
 | 
						|
**********************************************************************/
 | 
						|
 | 
						|
//var DEBUG = DEBUG != null ? DEBUG : true
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************************************************************
 | 
						|
* helpers...
 | 
						|
*/
 | 
						|
 | 
						|
// NOTE: to disable MARKED cleanout set no_cleanout_marks to true.
 | 
						|
// NOTE: MARKED may contain both gids that are not loaded and that do 
 | 
						|
// 		not exist, as there is no way to distinguish between the two 
 | 
						|
// 		situations the cleanup is optional...
 | 
						|
function loadMarkedOnlyData(cmp, no_cleanout_marks){
 | 
						|
	cmp = cmp == null ? imageOrderCmp : cmp
 | 
						|
	var cur = DATA.current
 | 
						|
	var marked = MARKED.slice().sort(cmp)
 | 
						|
	// this will ignore any gid in marks that is not in IMAGES...
 | 
						|
	// NOTE: if IMAGES contains only part of the data loadable this will 
 | 
						|
	// 		be wrong...
 | 
						|
	if(!no_cleanout_marks){
 | 
						|
		for(var i=0; i < marked.length;){
 | 
						|
			if(marked[i] in IMAGES){
 | 
						|
				i++
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			// NOTE: we do not need to advance i here...
 | 
						|
			marked.splice(i, 1)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	ALL_DATA = cropDataToGIDs(marked)
 | 
						|
 | 
						|
	return DATA
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// XXX name this in a better way...
 | 
						|
function loadAllImages(){
 | 
						|
	var cur = DATA.current
 | 
						|
	DATA = ALL_DATA
 | 
						|
	// NOTE: if we do not do this the user will lose context every time
 | 
						|
	// 		returning from marks only view...
 | 
						|
	DATA.current = cur
 | 
						|
	reloadViewer()
 | 
						|
	// XXX FIX: for some reason not all previews get updated to the 
 | 
						|
	// 		right size...
 | 
						|
	updateImages()
 | 
						|
	return DATA
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************************************************************
 | 
						|
* Modes
 | 
						|
*/
 | 
						|
 | 
						|
var toggleMarkedOnlyView = createCSSClassToggler(
 | 
						|
		'.viewer', 
 | 
						|
		'marked-only-view cropped-mode',
 | 
						|
		function(action){
 | 
						|
			// prevent reentering...
 | 
						|
			if(action == 'on' && $('.viewer').hasClass('cropped-mode')
 | 
						|
					|| action == toggleMarkedOnlyView('?')){
 | 
						|
				return false
 | 
						|
			}
 | 
						|
		},
 | 
						|
		function(action){
 | 
						|
			if(action == 'on'){
 | 
						|
				loadMarkedOnlyData()
 | 
						|
			} else {
 | 
						|
				loadAllImages()
 | 
						|
			}
 | 
						|
		})
 | 
						|
 | 
						|
 | 
						|
// XXX shifting images and unmarking in this mode do not work correctly...
 | 
						|
var toggleMarkesView = createCSSClassToggler(
 | 
						|
	'.viewer', 
 | 
						|
	'marks-visible',
 | 
						|
	function(){
 | 
						|
		var cur = getImage()
 | 
						|
		// current is marked...
 | 
						|
		if(cur.hasClass('marked')){
 | 
						|
			centerView(null, 'css')
 | 
						|
			return
 | 
						|
		} 
 | 
						|
		// there is a marked image in this ribbon...
 | 
						|
		var target = getImageBefore(cur, null)
 | 
						|
		if(target.length > 0){
 | 
						|
			centerView(focusImage(target), 'css')
 | 
						|
			return
 | 
						|
		}
 | 
						|
		// get marked image from other ribbons...
 | 
						|
		prevRibbon()
 | 
						|
		if(getImage().hasClass('marked')){
 | 
						|
			return
 | 
						|
		}
 | 
						|
		nextRibbon()
 | 
						|
	})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************************************************************
 | 
						|
* Actions
 | 
						|
*/
 | 
						|
 | 
						|
var toggleImageMark = createCSSClassToggler(
 | 
						|
	'.current.image', 
 | 
						|
	'marked',
 | 
						|
	function(action){
 | 
						|
		toggleMarkesView('on')
 | 
						|
		$('.viewer').trigger('togglingMark', [getImage(), action])
 | 
						|
	})
 | 
						|
 | 
						|
 | 
						|
// mode can be:
 | 
						|
//	- 'ribbon'
 | 
						|
//	- 'all'
 | 
						|
function removeImageMarks(mode){
 | 
						|
	// remove marks from current ribbon (default)...
 | 
						|
	if(mode == 'ribbon' || mode == null){
 | 
						|
		var ribbon = getRibbon()
 | 
						|
		var res = ribbon
 | 
						|
			.find('.marked')
 | 
						|
				.removeClass('marked')
 | 
						|
		$('.viewer').trigger('removeingRibbonMarks', [ribbon])
 | 
						|
 | 
						|
	// remove all marks...
 | 
						|
	} else if(mode == 'all'){
 | 
						|
		var res = $('.marked')
 | 
						|
			.removeClass('marked')
 | 
						|
		$('.viewer').trigger('removeingAllMarks')
 | 
						|
	} 
 | 
						|
	return res
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
function markAll(mode){
 | 
						|
	// remove marks from current ribbon (default)...
 | 
						|
	if(mode == 'ribbon' || mode == null){
 | 
						|
		var ribbon = getRibbon()
 | 
						|
		var res = ribbon
 | 
						|
			.find('.image:not(.marked)')
 | 
						|
				.addClass('marked')
 | 
						|
		$('.viewer').trigger('markingRibbon', [ribbon])
 | 
						|
 | 
						|
	} else if(mode == 'all'){
 | 
						|
		var res = $('.image:not(.marked)').addClass('marked')
 | 
						|
		$('.viewer').trigger('markingAll')
 | 
						|
	}
 | 
						|
	return res
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// NOTE: this only does it's work in the current ribbon...
 | 
						|
function invertImageMarks(){
 | 
						|
	var ribbon = getRibbon()
 | 
						|
	var res = ribbon
 | 
						|
		.find('.image')
 | 
						|
			.toggleClass('marked')
 | 
						|
	$('.viewer').trigger('invertingMarks', [ribbon])
 | 
						|
	return res
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// Toggle marks in the current continuous section of marked or unmarked
 | 
						|
// images...
 | 
						|
// XXX need to make this dynamic data compatible...
 | 
						|
function toggleImageMarkBlock(image){
 | 
						|
	if(image == null){
 | 
						|
		image = getImage()
 | 
						|
	}
 | 
						|
	//$('.viewer').trigger('togglingImageBlockMarks', [image])
 | 
						|
	// we need to invert this...
 | 
						|
	var state = toggleImageMark()
 | 
						|
	var _convert = function(){
 | 
						|
		if(toggleImageMark(this, '?') == state){
 | 
						|
			return false
 | 
						|
		}
 | 
						|
		toggleImageMark(this, state)
 | 
						|
	}
 | 
						|
	image.nextAll('.image').each(_convert)
 | 
						|
	image.prevAll('.image').each(_convert)
 | 
						|
	return state
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// XXX need to account for empty ribbons...
 | 
						|
function shiftMarkedImages(direction, mode, new_ribbon){
 | 
						|
	mode = mode == null ? 'ribbon' : mode
 | 
						|
	var cur = getRibbonIndex()
 | 
						|
 | 
						|
	// ribbon only...
 | 
						|
	if(mode == 'ribbon'){
 | 
						|
		var ribbon = DATA.ribbons[cur]
 | 
						|
		// remove all the marked images form current ribbon...
 | 
						|
		var marked = $.map(MARKED, function(e){
 | 
						|
			var i = ribbon.indexOf(e)
 | 
						|
			if(i >= 0){
 | 
						|
				ribbon.splice(i, 1)
 | 
						|
				return e
 | 
						|
			}
 | 
						|
			return null
 | 
						|
		})
 | 
						|
 | 
						|
	// shift all marked images...
 | 
						|
	} else {
 | 
						|
		var marked = MARKED.slice()
 | 
						|
		// remove all the marked images form all the ribbons...
 | 
						|
		$.each(DATA.ribbons, function(ribbon){
 | 
						|
			$.each(marked, function(e){
 | 
						|
				var i = ribbon.indexOf(e)
 | 
						|
				i >= 0 ? ribbon.splice(i, 1) : null
 | 
						|
			})
 | 
						|
		})
 | 
						|
	}
 | 
						|
 | 
						|
	// if we are at the top or bottom ribbons we need to create a new 
 | 
						|
	// ribbon regardless...
 | 
						|
	if((cur == 0 && direction == 'prev') 
 | 
						|
			|| (cur == DATA.ribbons.length-1 && direction == 'next')){
 | 
						|
		new_ribbon = true
 | 
						|
	}
 | 
						|
 | 
						|
	// add marked to new ribbon...
 | 
						|
	if(new_ribbon){
 | 
						|
		cur += direction == 'next' ? 1 : 0
 | 
						|
		DATA.ribbons.splice(cur, 0, marked)
 | 
						|
	
 | 
						|
	// add marked to existing ribbon...
 | 
						|
	} else {
 | 
						|
		cur += direction == 'next' ? 1 : -1
 | 
						|
		DATA.ribbons[cur] = DATA.ribbons[cur].concat(marked).sort(cmp)
 | 
						|
	}
 | 
						|
	
 | 
						|
	// remove empty ribbons...
 | 
						|
	DATA.ribbons = DATA.ribbons.filter(function(e){ return e.length > 0 ? true : false })
 | 
						|
 | 
						|
	updateRibbonOrder()
 | 
						|
}
 | 
						|
function shiftMarkedImagesUp(mode, new_ribbon){
 | 
						|
	return shiftMarkedImages('prev', mode, new_ribbon)
 | 
						|
}
 | 
						|
function shiftMarkedImagesDown(mode, new_ribbon){
 | 
						|
	return shiftMarkedImages('next', mode, new_ribbon)
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// XXX these are ribbon wise only (???)
 | 
						|
// XXX this on first step this must pack all marked images
 | 
						|
function horizontalShiftMarkedImages(direction){
 | 
						|
	// XXX
 | 
						|
}
 | 
						|
function shiftMarkedImagesLeft(){
 | 
						|
	return shiftMarkedImages('prev')
 | 
						|
}
 | 
						|
function shiftMarkedImagesRight(){
 | 
						|
	return shiftMarkedImages('next')
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************************************************************
 | 
						|
* vim:set ts=4 sw=4 :                                                */
 |