mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 11:20:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			423 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			HTML
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			423 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			HTML
		
	
	
		
			Executable File
		
	
	
	
	
| <html>
 | |
| <head>
 | |
| <title>ImageGrid.Viewer</title>
 | |
| 
 | |
| 
 | |
| <style>
 | |
| 
 | |
| /* 
 | |
| * XXX move the CSS to a separate file...
 | |
| * XXX split-off styling/coloring from layout...
 | |
| */
 | |
| 
 | |
| body {
 | |
| 	font-family: sans-serif;
 | |
| 	padding: 0px;
 | |
| 	margin: 0px;
 | |
| }
 | |
| 
 | |
| .viewer {
 | |
| 	position: relative;
 | |
| 	width: 100%;
 | |
| 	height: 100%;
 | |
| 	overflow: hidden;
 | |
| 
 | |
| 	/*border: solid blue 1px;*/
 | |
| 	box-sizing: border-box;
 | |
| 
 | |
| 	-moz-user-select: none;
 | |
| 	-webkit-user-select: none;
 | |
| 	-o-user-select: none;
 | |
| 	-ms-user-select: none;
 | |
| 	user-select: none;
 | |
| }
 | |
| 
 | |
| 
 | |
| .ribbon-set {
 | |
| 	position: absolute;
 | |
| 	display: block;
 | |
| 
 | |
| 	/* NOTE: this needs for scaling/zooming to behave correctly and not 
 | |
| 			shift the element, when its dimensions change... 
 | |
| 			...this is because .ribbon-set will both be used for scaling 
 | |
| 			and aligning... */
 | |
| 	transform-origin: top left;
 | |
| 	-ms-transform-origin: top left;
 | |
| 	-webkit-transform-origin: top left; /* Safari and Chrome */
 | |
| }
 | |
| .ribbon-set:empty:after {
 | |
| 	display: block;
 | |
| 	top: 0px;
 | |
| 	left: 0px;
 | |
| 	width: 100%;
 | |
| 	height: 100%;
 | |
| 	content: "Empty";
 | |
| 	text-align: center;
 | |
| }
 | |
| 
 | |
| 
 | |
| .ribbon {
 | |
| 	position: relative;
 | |
| 	display: block;
 | |
| 	height: auto;
 | |
| 	min-width: 0px;
 | |
| 	overflow: visible;
 | |
| 	white-space: nowrap;
 | |
| 	font-size: 0;
 | |
| 
 | |
| 	margin-top: 20px;
 | |
| 	margin-bottom: 20px;
 | |
| }
 | |
| .ribbon:empty {
 | |
| 	display: none;
 | |
| }
 | |
| .ribbon:first-child {
 | |
| 	margin-top: 0px;
 | |
| }
 | |
| .ribbon:last-child {
 | |
| 	margin-bottom: 0px;
 | |
| }
 | |
| 
 | |
| .image {
 | |
| 	position: relative;
 | |
| 	display: inline-block;
 | |
| 	vertical-align: middle;
 | |
| 	text-align:left;
 | |
| 	width: 300px;
 | |
| 	height: 300px;
 | |
| 	font-size: 12pt;
 | |
| 	overflow: hidden;
 | |
| 
 | |
| 	box-sizing: border-box;
 | |
| 	color: white;
 | |
| 
 | |
| 	text-shadow: black 0.1em 0.1em 0.4em, black 0.1em 0.1em;
 | |
| 
 | |
| 	background: no-repeat 50% black;
 | |
| 	background-size: contain;
 | |
| 	/* XXX do we need this? */
 | |
| 	border: solid black 5px;
 | |
| }
 | |
| .current.image {
 | |
| 	background: no-repeat 50% black;
 | |
| 	background-size: contain;
 | |
| 
 | |
| 	/* XXX remove this... */
 | |
| 	border: solid red 5px;
 | |
| }
 | |
| 
 | |
| /* dot mark... */
 | |
| .marks-visible.viewer .marked.image:after {
 | |
| 	display: block;
 | |
| 	position: absolute;
 | |
| 	content: "";
 | |
| 	font-size: 0pt;
 | |
| 	border: none;
 | |
| 
 | |
| 	width: 15px;
 | |
| 	height: 15px;
 | |
| 
 | |
| 	bottom: 5px;
 | |
| 	right: 5px;
 | |
| 
 | |
| 	border-radius: 50%;
 | |
| 	background: blue;
 | |
| }
 | |
| 
 | |
| /* corner mark... (a-la bookmarks in PortableMag) */
 | |
| /*
 | |
| .marked.image:after {
 | |
| 	display: block;
 | |
| 	position: absolute;
 | |
| 	content: "";
 | |
| 	font-size: 0pt;
 | |
| 	border: none;
 | |
| 
 | |
| 	width: 30px;
 | |
| 	height: 30px;
 | |
| 
 | |
| 	top: -15px;
 | |
| 	right: -15px;
 | |
| 
 | |
| 	background: blue;
 | |
| 
 | |
| 	-webkit-transform: rotate(45deg);
 | |
| 	-moz-transform: rotate(45deg);
 | |
| 	-o-transform: rotate(45deg);
 | |
| 	-ms-transform: rotate(45deg);
 | |
| 	transform: rotate(45deg);
 | |
| }
 | |
| */
 | |
| 
 | |
| 
 | |
| .marks-visible.viewer:after {
 | |
| 	display: block;
 | |
| 	position: absolute;
 | |
| 	content: "Marks visible";
 | |
| 	font-size: 11pt;
 | |
| 	border: none;
 | |
| 	color: blue;
 | |
| 	width: auto;
 | |
| 	height: auto;
 | |
| 
 | |
| 	top: 10px;
 | |
| 	right: 10px;
 | |
| 
 | |
| }
 | |
| .marked-only-view.viewer:after {
 | |
| 	display: block;
 | |
| 	position: absolute;
 | |
| 	content: "Showing marked images only";
 | |
| 	font-size: 11pt;
 | |
| 	border: none;
 | |
| 	color: blue;
 | |
| 	width: auto;
 | |
| 	height: auto;
 | |
| 
 | |
| 	top: 10px;
 | |
| 	right: 10px;
 | |
| 
 | |
| }
 | |
| .marked-only-view.marks-visible.viewer:after {
 | |
| 	content: "Showing marked images only (marks visible)";
 | |
| }
 | |
| 
 | |
| /* XXX should we use opacity??? */
 | |
| .marked-only-view.viewer:not(.marks-visible) .image:not(.marked) {
 | |
| 	opacity: 0.3;
 | |
| }
 | |
| 
 | |
| 
 | |
| .up-indicator,
 | |
| .down-indicator,
 | |
| .start-indicator,
 | |
| .end-indicator {
 | |
| 	display: block;
 | |
| 	position: absolute;
 | |
| 	content: "";
 | |
| 	top: 0px;
 | |
| 	left: 50%;
 | |
| 	height: 50px;
 | |
| 	width: 100px;
 | |
| 	margin-left: -50px;
 | |
| 
 | |
| 	overflow: hidden;
 | |
| 
 | |
| 	cursor: hand;
 | |
| }
 | |
| .up-indicator:after,
 | |
| .down-indicator:after {
 | |
| 	display: inline-block;
 | |
| 	position: absolute;
 | |
| 	content: "";
 | |
| 	width: 50px;
 | |
| 	height: 50px;
 | |
| 
 | |
| 	bottom: -25px;
 | |
| 	left: 25px;
 | |
| 
 | |
| 	background: yellow;
 | |
| 
 | |
| 	-webkit-transform: rotate(45deg);
 | |
| 	-moz-transform: rotate(45deg);
 | |
| 	-o-transform: rotate(45deg);
 | |
| 	-ms-transform: rotate(45deg);
 | |
| 	transform: rotate(45deg);
 | |
| }
 | |
| .down-indicator {
 | |
| 	top: auto;
 | |
| 	bottom: 0px;
 | |
| }
 | |
| .down-indicator:after {
 | |
| 	top: -25px;
 | |
| 	bottom: auto;
 | |
| }
 | |
| .start-indicator,
 | |
| .end-indicator {
 | |
| 	left: 0px;
 | |
| 	width: 10px;
 | |
| 	height: 100%;
 | |
| 	margin: 0px;
 | |
| 
 | |
| 	background: yellow;
 | |
| }
 | |
| .end-indicator {
 | |
| 	left: auto;
 | |
| 	right: 0px;
 | |
| }
 | |
| /* default state */
 | |
| .up-indicator,
 | |
| .down-indicator,
 | |
| .start-indicator,
 | |
| .end-indicator {
 | |
| 	display: none;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| .single-image-mode.viewer .image {
 | |
| 	background-color: transparent;
 | |
| 	/* NOTE: need to keep a distance from screen borders... */
 | |
| 	border: solid transparent 2px;
 | |
| }
 | |
| .single-image-mode.viewer .image:not(.current) {
 | |
| 	/* XXX for some reason this breaks the alignment on large magnifications...
 | |
| 	display: none;
 | |
| 	*/
 | |
| 	/* XXX this makes images pass through the :visible filter...
 | |
| 	opacity: 0;
 | |
| 	*/
 | |
| 	visibility: hidden;
 | |
| }
 | |
| 
 | |
| /* XXX this is by no means final... */
 | |
| .viewer,
 | |
| .light.viewer {
 | |
| 	background: white;
 | |
| }
 | |
| 
 | |
| .gray.viewer {
 | |
| 	background: #333;
 | |
| }
 | |
| 
 | |
| .dark.viewer {
 | |
| 	background: black;
 | |
| }
 | |
| 
 | |
| 
 | |
| </style>
 | |
| 
 | |
| 
 | |
| 
 | |
| <script src="jquery.js"></script>
 | |
| 
 | |
| <script src="lib/jli.js"></script>
 | |
| <script src="lib/keyboard.js"></script>
 | |
| 
 | |
| <script src="base.js"></script>
 | |
| <script src="modes.js"></script>
 | |
| <script src="marks.js"></script>
 | |
| <script src="data.js"></script>
 | |
| <script src="ui.js"></script>
 | |
| <script src="keybindings3.js"></script>
 | |
| 
 | |
| 
 | |
| <!-- XXX STUB -->
 | |
| <script src="images.js"></script>
 | |
| 
 | |
| 
 | |
| <script>
 | |
| 
 | |
| //DEBUG = true
 | |
| 
 | |
| 
 | |
| // setup...
 | |
| $(function(){
 | |
| 
 | |
| 	toggleTheme('gray')
 | |
| 
 | |
| 	//setElementOrigin($('.ribbon-set'), 'top', 'left')
 | |
| 
 | |
| 	// we have an image file...
 | |
| 	if((DATA_ATTR + '_IMAGES_FILE') in localStorage){
 | |
| 		loadFileImages(localStorage[DATA_ATTR + '_IMAGES_FILE'])
 | |
| 		DATA = loadLocalStorageData()
 | |
| 		loadData()
 | |
| 
 | |
| 	// everything is in localStorage...
 | |
| 	} else if('DATA' in localStorage){
 | |
| 		loadLocalStorage()
 | |
| 
 | |
| 	// legacy default data...
 | |
| 	} else {
 | |
| 		DATA = convertDataGen1(image_list)
 | |
| 		DATA = DATA.data
 | |
| 		IMAGES = DATA.images
 | |
| 		loadData()
 | |
| 	}
 | |
| 
 | |
| 	// XXX this will reload everything...
 | |
| 	if('MARKED' in localStorage){
 | |
| 		loadLocalStorageMarks()
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	// NOTE: this is global so as to not to add any extra complexity to 
 | |
| 	//		the internal workings...
 | |
| 	$('.viewer')
 | |
| 		.click(clickHandler)
 | |
| 		// XXX for some reason this messes up alignment on initial view...
 | |
| 		//.dblclick(dblClickHandler)
 | |
| 
 | |
| 	$(window)
 | |
| 		.resize(function() {
 | |
| 			// XXX should this be animated or not?
 | |
| 			centerView()
 | |
| 		})
 | |
| 		
 | |
| 	$(document)
 | |
| 		.keydown(makeKeyboardHandler(
 | |
| 			KEYBOARD_CONFIG,
 | |
| 			function(k){
 | |
| 				window.DEBUG && console.log(k)
 | |
| 			}))
 | |
| 
 | |
| 	setupDataBindings()
 | |
| 
 | |
| 	// XXX stub...
 | |
| 	//centerView(focusImage($('.image').first()), 'css')
 | |
| 	updateImages()
 | |
| 
 | |
| })
 | |
| 
 | |
| 
 | |
| </script>
 | |
| 
 | |
| </head>
 | |
| <body>
 | |
| 
 | |
| <!-- This is the basic viewer structure...
 | |
| 
 | |
| Unpopulated
 | |
| NOTE: there can be only .ribbon-set element.
 | |
| 
 | |
| <div class="viewer">
 | |
| 	<div class="ribbon-set"></div>
 | |
| </div>
 | |
| 
 | |
| 
 | |
| Populated
 | |
| 
 | |
| <div class="viewer">
 | |
| 	<div class="ribbon-set">
 | |
| 		<div class="ribbon">
 | |
| 			<div class="image"></div>
 | |
| 			<div class="image"></div>
 | |
| 		</div>
 | |
| 		<div class="ribbon">
 | |
| 			<div class="image"></div>
 | |
| 			<div class="current image"></div>
 | |
| 			<div class="image"></div>
 | |
| 			<div class="image"></div>
 | |
| 		</div>
 | |
| 	</div>
 | |
| </div>
 | |
| -->
 | |
| 
 | |
| <div class="viewer">
 | |
| 
 | |
| 	<div class="ribbon-set"></div>
 | |
| 
 | |
| 
 | |
| 	<!-- XXX should these be here??? -->
 | |
| 	<div class="up-indicator"></div>
 | |
| 	<div class="down-indicator"></div>
 | |
| 	<div class="start-indicator"></div>
 | |
| 	<div class="end-indicator"></div>
 | |
| </div>
 | |
| 
 | |
| 
 | |
| <!-- vim:set ts=4 sw=4 spell : -->
 | |
| </body>
 | |
| </html>
 |