mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-11-03 21:00:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			319 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			319 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
/**********************************************************************
 | 
						|
* 
 | 
						|
*
 | 
						|
*
 | 
						|
**********************************************************************/
 | 
						|
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
 | 
						|
(function(require){ var module={} // make module AMD/node compatible...
 | 
						|
/*********************************************************************/
 | 
						|
 | 
						|
if(typeof(process) != 'undefined'){
 | 
						|
	var pathlib = requirejs('path')
 | 
						|
}
 | 
						|
 | 
						|
var actions = require('lib/actions')
 | 
						|
var features = require('lib/features')
 | 
						|
var toggler = require('lib/toggler')
 | 
						|
 | 
						|
var core = require('features/core')
 | 
						|
var base = require('features/base')
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*********************************************************************/
 | 
						|
 | 
						|
var AppControlActions = actions.Actions({
 | 
						|
	config: {
 | 
						|
		//'window-title': 'ImageGrid.Viewer (${VERSION}): ${FILENAME}',
 | 
						|
		'window-title': '${FILENAME} - ImageGrid.Viewer (${VERSION})',
 | 
						|
 | 
						|
		'window-delay-initial-display': 200,
 | 
						|
	},
 | 
						|
 | 
						|
	// XXX revise these...
 | 
						|
	close: ['File|Window/Close viewer',
 | 
						|
		function(){ window.close() }],
 | 
						|
	storeWindowGeometry: ['- Window/Store window state',
 | 
						|
		function(){
 | 
						|
			// store window parameters (size, state)...
 | 
						|
			var win = nw.Window.get()
 | 
						|
 | 
						|
			// fullscreen...
 | 
						|
			// ...avoid overwriting size...
 | 
						|
			if(this.toggleFullScreen('?') == 'on'){
 | 
						|
				this.config.window = this.config.window || {}
 | 
						|
				this.config.window.fullscreen = true
 | 
						|
				this.config.window.zoom = win.zoomLevel 
 | 
						|
 | 
						|
			} else {
 | 
						|
				this.config.window = {
 | 
						|
					size: {
 | 
						|
						width: win.width,
 | 
						|
						height: win.height,
 | 
						|
					},
 | 
						|
					fullscreen: false,
 | 
						|
					zoom: win.zoomLevel ,
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}],
 | 
						|
	restoreWindowGeometry: ['- Window/Restore window state',
 | 
						|
		function(){
 | 
						|
			var that = this
 | 
						|
			// or global.window.nwDispatcher.requireNwGui()
 | 
						|
			// (see: https://github.com/rogerwang/node-webkit/issues/707)
 | 
						|
			var win = nw.Window.get()
 | 
						|
 | 
						|
			// XXX move this into .restoreWindowGeometry(..)
 | 
						|
			// get window state from config and load it...
 | 
						|
			var cfg = this.config.window
 | 
						|
			if(cfg != null){
 | 
						|
				var W = screen.width
 | 
						|
				var H = screen.height
 | 
						|
				var w = 800
 | 
						|
				var h = 600
 | 
						|
				var s = cfg.scale
 | 
						|
 | 
						|
				if(cfg.size){
 | 
						|
					w = win.width = Math.min(cfg.size.width, screen.width)
 | 
						|
					h = win.height = Math.min(cfg.size.height, screen.height)
 | 
						|
				}
 | 
						|
 | 
						|
				// place on center of the screen...
 | 
						|
				var x = win.x = Math.round((W - w)/2)
 | 
						|
				var y = win.y = Math.round((H - h)/2)
 | 
						|
 | 
						|
				if(s){
 | 
						|
					win.zoomLevel = s
 | 
						|
				}
 | 
						|
 | 
						|
				//console.log('GEOMETRY:', w, h, x, y)
 | 
						|
 | 
						|
				this.centerViewer()
 | 
						|
			}
 | 
						|
 | 
						|
			/* XXX still buggy....
 | 
						|
			// restore interface scale...
 | 
						|
			this.toggleInterfaceScale(
 | 
						|
				this.config['ui-scale-mode'] 
 | 
						|
				|| this.toggleInterfaceScale('??')[0])
 | 
						|
			*/
 | 
						|
 | 
						|
			// NOTE: we delay this to enable the browser time to render
 | 
						|
			// 		things before we show them to the user...
 | 
						|
			setTimeout(function(){
 | 
						|
				win.show()
 | 
						|
 | 
						|
				// XXX check if we are full screen...
 | 
						|
				if(cfg != null && cfg.fullscreen){
 | 
						|
					that.toggleFullScreen('on')
 | 
						|
				}
 | 
						|
 | 
						|
				// declare we are ready...
 | 
						|
				$(function(){ that.declareReady() })
 | 
						|
 | 
						|
			}, this.config['window-delay-initial-display'] || 0)
 | 
						|
		}],
 | 
						|
	
 | 
						|
	minimize: ['Window/Minimize',
 | 
						|
		function(){
 | 
						|
			nw.Window.get().minimize()
 | 
						|
		}],
 | 
						|
	toggleFullScreen: ['Window/Full screen mode',
 | 
						|
		toggler.CSSClassToggler(
 | 
						|
			function(){ return document.body }, 
 | 
						|
			'.full-screen-mode',
 | 
						|
			function(action){
 | 
						|
				var that = this
 | 
						|
				var w = nw.Window.get()
 | 
						|
 | 
						|
				// change the state only if the target state is not the same
 | 
						|
				// as the current state...
 | 
						|
				if((w.isFullscreen ? 'on' : 'off') != action){
 | 
						|
					this.ribbons.preventTransitions()
 | 
						|
 | 
						|
					// hide the viewer to hide any animation crimes...
 | 
						|
					this.ribbons.viewer[0].style.visibility = 'hidden'
 | 
						|
 | 
						|
					// XXX async...
 | 
						|
					// 		...this complicates things as we need to do the next
 | 
						|
					// 		bit AFTER the resize is done...
 | 
						|
					w.toggleFullscreen()
 | 
						|
 | 
						|
					setTimeout(function(){ 
 | 
						|
						that
 | 
						|
							.centerViewer()
 | 
						|
							.focusImage()
 | 
						|
							.ribbons
 | 
						|
								.restoreTransitions()
 | 
						|
 | 
						|
						that.ribbons.viewer[0].style.visibility = ''
 | 
						|
					}, 100)
 | 
						|
				}
 | 
						|
 | 
						|
				// NOTE: we delay this to account for window animation...
 | 
						|
				setTimeout(function(){ 
 | 
						|
					that.storeWindowGeometry() 
 | 
						|
				}, 500)
 | 
						|
			})],
 | 
						|
 | 
						|
	// XXX add ability to use devtools on background page (node context)...
 | 
						|
	showDevTools: ['Interface|Development/Show Dev Tools',
 | 
						|
		function(){
 | 
						|
			nw.Window.get().showDevTools &&
 | 
						|
				nw.Window.get().showDevTools()
 | 
						|
		}],
 | 
						|
 | 
						|
	// XXX should this be here???
 | 
						|
	showInFolder: ['File|Image/Show in folder',
 | 
						|
		function(image){
 | 
						|
			image = this.images[this.data.getImage(image)]
 | 
						|
 | 
						|
			var base = image.base_path || this.location.path
 | 
						|
			var filename = image.path
 | 
						|
 | 
						|
			path = pathlib.normalize(base + '/' + filename)
 | 
						|
 | 
						|
			nw.Shell.showItemInFolder(path)
 | 
						|
		}],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
// XXX this needs a better .isApplicable(..)
 | 
						|
// XXX store/load window state...
 | 
						|
// 		- size
 | 
						|
// 		- state (fullscreen/normal)
 | 
						|
var AppControl = 
 | 
						|
module.AppControl = core.ImageGridFeatures.Feature({
 | 
						|
	title: '',
 | 
						|
	doc: '',
 | 
						|
 | 
						|
	tag: 'ui-app-control',
 | 
						|
	depends: [
 | 
						|
		'ui',
 | 
						|
	],
 | 
						|
 | 
						|
	actions: AppControlActions,
 | 
						|
 | 
						|
	// XXX test if in:
 | 
						|
	// 	- chrome app
 | 
						|
	// 	- nw
 | 
						|
	// 	- mobile
 | 
						|
	isApplicable: function(){ return this.runtime == 'nw' },
 | 
						|
 | 
						|
	// XXX show main window...
 | 
						|
	handlers: [
 | 
						|
		['start.pre',
 | 
						|
			function(){ 
 | 
						|
				// we are going to declare ready ourselves...
 | 
						|
				this.requestReadyAnnounce()
 | 
						|
			}],
 | 
						|
		['start',
 | 
						|
			function(){ 
 | 
						|
				this.restoreWindowGeometry()
 | 
						|
			}],
 | 
						|
		[[
 | 
						|
			'close.pre',
 | 
						|
			'toggleFullScreen',
 | 
						|
		],
 | 
						|
			function(){ this.storeWindowGeometry() }],
 | 
						|
		['focusImage',
 | 
						|
			function(){
 | 
						|
				var win = nw.Window.get()
 | 
						|
 | 
						|
				if(this.images){
 | 
						|
					var img = this.images[this.current]
 | 
						|
					win.title = (this.config['window-title'] 
 | 
						|
							|| 'ImageGrid.Viewer (${VERSION}): ${FILENAME}')
 | 
						|
						// XXX get this from the viewer...
 | 
						|
						.replace('${VERSION}', this.version || 'gen4')
 | 
						|
						.replace('${FILENAME}', 
 | 
						|
							img ? 
 | 
						|
									(img.name || img.path.replace(/\.[\\\/]/, ''))
 | 
						|
								: '')
 | 
						|
						.replace('${PATH}', 
 | 
						|
							img ?
 | 
						|
									(img.base_path || '.') 
 | 
						|
										+'/'+ img.path.replace(/\.[\\\/]/, '')
 | 
						|
								: '')
 | 
						|
						/*
 | 
						|
						.replace('${DIR}', 
 | 
						|
							pathlib.dirname((img.base_path || '.') 
 | 
						|
								+'/'+ img.path.replace(/\.[\\\/]/, '')))
 | 
						|
						*/
 | 
						|
						// XXX add ...
 | 
						|
						
 | 
						|
				}
 | 
						|
			}],
 | 
						|
	],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
//---------------------------------------------------------------------
 | 
						|
// Fullscreen app control buttons...
 | 
						|
var AppButtonsActions = actions.Actions({
 | 
						|
	config: {
 | 
						|
		'app-buttons': {
 | 
						|
			// XXX not sure about this...
 | 
						|
			'⛭': ['ui-settings allways-shown', 
 | 
						|
				'browseActions: "Interface/" -- Interface settings...'],
 | 
						|
			'_': ['minimize', 
 | 
						|
				'minimize -- Minimize'],
 | 
						|
			'↙': ['fullscreen allways-shown', 
 | 
						|
				'toggleFullScreen -- Toggle fullscreen'],
 | 
						|
			'×': ['close', 
 | 
						|
				'close -- Quit'],
 | 
						|
		},
 | 
						|
	},
 | 
						|
})
 | 
						|
 | 
						|
var AppButtons = 
 | 
						|
module.AppButtons = core.ImageGridFeatures.Feature({
 | 
						|
	title: '',
 | 
						|
	doc: '',
 | 
						|
 | 
						|
	tag: 'ui-app-buttons',
 | 
						|
	depends: [
 | 
						|
		'ui-app-control',
 | 
						|
		'ui-buttons',
 | 
						|
	],
 | 
						|
	suggested: [
 | 
						|
		// needed for reporting info in .makeButtonControls(..)
 | 
						|
		'ui-status-bar',
 | 
						|
	],
 | 
						|
 | 
						|
	actions: AppButtonsActions,
 | 
						|
 | 
						|
	handlers: [
 | 
						|
		['start.pre', 
 | 
						|
			function(){
 | 
						|
				this.toggleAppButtons('on')
 | 
						|
			}],
 | 
						|
		['start toggleFullScreen', 
 | 
						|
			function(){
 | 
						|
				var fullscreen = this.toggleFullScreen('?')
 | 
						|
				var buttons = this.ribbons.viewer.find('.app-buttons')
 | 
						|
				
 | 
						|
				// fullscreen button...
 | 
						|
				buttons.find('.fullscreen.button')
 | 
						|
					.html(fullscreen == 'on' ? '↙' : '↗')
 | 
						|
					.attr('info', fullscreen == 'on' ? 'Exit fullscreen' : 'Fullscreen')
 | 
						|
 | 
						|
				// XXX should this be done by css???
 | 
						|
				if(fullscreen == 'on'){
 | 
						|
					buttons.find('.button:not(.allways-shown)').show()
 | 
						|
 | 
						|
				} else {
 | 
						|
					buttons.find('.button:not(.allways-shown)').hide()
 | 
						|
				}
 | 
						|
 | 
						|
				//this.toggleFullScreenControls(fullScreen)
 | 
						|
			}],
 | 
						|
	],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************************************************************
 | 
						|
* vim:set ts=4 sw=4 :                               */ return module })
 |