mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-11-01 03:40:09 +00:00
411 lines
7.4 KiB
HTML
Executable File
411 lines
7.4 KiB
HTML
Executable File
<html>
|
|
<head>
|
|
<title>ImageGrid.Viewer</title>
|
|
|
|
|
|
<style>
|
|
|
|
.viewer {
|
|
position: relative;
|
|
width: 800px;
|
|
height: 600px;
|
|
overflow: hidden;
|
|
|
|
border: solid blue 1px;
|
|
}
|
|
|
|
|
|
.ribbon-set {
|
|
position: absolute;
|
|
}
|
|
.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;
|
|
|
|
background: black;
|
|
box-sizing: border-box;
|
|
border: solid gray 1px;
|
|
color: white;
|
|
}
|
|
.current.image {
|
|
background: red;
|
|
}
|
|
|
|
/* dot mark... */
|
|
.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);
|
|
}
|
|
*/
|
|
|
|
|
|
.marked-only.viewer:after {
|
|
display: block;
|
|
position: absolute;
|
|
content: "Showing marked images only";
|
|
font-size: 14pt;
|
|
border: none;
|
|
color: blue;
|
|
width: auto;
|
|
height: auto;
|
|
|
|
top: 10px;
|
|
right: 10px;
|
|
|
|
}
|
|
.marked-only .image:not(.marked) {
|
|
display: none;
|
|
}
|
|
.marked-only .marked.image:after {
|
|
display: none;
|
|
}
|
|
|
|
|
|
.up-indicator,
|
|
.down-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;
|
|
}
|
|
/* default state */
|
|
.up-indicator,
|
|
.down-indicator {
|
|
display: none
|
|
}
|
|
|
|
|
|
</style>
|
|
|
|
|
|
|
|
<script src="jquery.js"></script>
|
|
|
|
<script src="lib/jli.js"></script>
|
|
<script src="lib/keyboard.js"></script>
|
|
|
|
<script src="ImageGrid.js"></script>
|
|
|
|
<script>
|
|
|
|
/**********************************************************************
|
|
* Keyboard configuration...
|
|
*
|
|
* XXX move this out to a separate file...
|
|
*/
|
|
|
|
var STEPS_TO_CHANGE_DIRECTION = 2
|
|
var _STEPS_LEFT_TO_CHANGE_DIRECTION = STEPS_TO_CHANGE_DIRECTION
|
|
// XXX code related to this needs testing...
|
|
var DIRECTION = 'next'
|
|
|
|
|
|
var KEYBOARD_CONFIG = {
|
|
// general setup...
|
|
'.viewer': {
|
|
Up: {
|
|
default: function(){ prevRibbon(DIRECTION) },
|
|
shift: function(){ shiftImageUp() },
|
|
},
|
|
Down: {
|
|
default: function(){ nextRibbon(DIRECTION) },
|
|
shift: function(){ shiftImageDown() },
|
|
},
|
|
|
|
// XXX need to cancel the animation of the prev action...
|
|
Left: {
|
|
default: function(){
|
|
if(DIRECTION != 'prev'){
|
|
_STEPS_LEFT_TO_CHANGE_DIRECTION--
|
|
if(_STEPS_LEFT_TO_CHANGE_DIRECTION == 0){
|
|
DIRECTION = 'prev'
|
|
_STEPS_LEFT_TO_CHANGE_DIRECTION = 2
|
|
}
|
|
} else {
|
|
_STEPS_LEFT_TO_CHANGE_DIRECTION = 2
|
|
}
|
|
prevImage()
|
|
},
|
|
// XXX prevScreenImages...
|
|
ctrl: function(){
|
|
console.log('NotImplemented: screen images back.')
|
|
},
|
|
// XXX need to keep shift explicitly clear for editor...
|
|
/*
|
|
shift: function(){
|
|
toggleImageMark()
|
|
prevImage()
|
|
},
|
|
// XXX mark screen images...
|
|
'ctrl+shift': function(){
|
|
console.log('NotImplemented: mark screen images back.')
|
|
}
|
|
*/
|
|
},
|
|
Right: {
|
|
default: function(){
|
|
if(DIRECTION != 'next'){
|
|
_STEPS_LEFT_TO_CHANGE_DIRECTION--
|
|
if(_STEPS_LEFT_TO_CHANGE_DIRECTION == 0){
|
|
DIRECTION = 'next'
|
|
_STEPS_LEFT_TO_CHANGE_DIRECTION = 2
|
|
}
|
|
} else {
|
|
_STEPS_LEFT_TO_CHANGE_DIRECTION = 2
|
|
}
|
|
nextImage()
|
|
},
|
|
// XXX nextScreenImages...
|
|
ctrl: function(){
|
|
console.log('NotImplemented: screen images forward.')
|
|
},
|
|
// XXX need to keep shift explicitly clear for editor...
|
|
/*
|
|
shift: function(){
|
|
toggleImageMark()
|
|
nextImage()
|
|
},
|
|
// XXX mark screen images...
|
|
'ctrl+shift': function(){
|
|
console.log('NotImplemented: mark screen images forward.')
|
|
}
|
|
*/
|
|
},
|
|
Space: {
|
|
default: 'Right',
|
|
shift: 'Left',
|
|
},
|
|
|
|
Home: function(){
|
|
firstImage()
|
|
},
|
|
End: function(){
|
|
lastImage()
|
|
},
|
|
|
|
// zooming...
|
|
'1': function(){ fitNImages(1) },
|
|
'2': function(){ fitNImages(2) },
|
|
'3': function(){ fitNImages(3) },
|
|
'4': function(){ fitNImages(4) },
|
|
'5': function(){ fitNImages(5) },
|
|
'6': function(){ fitNImages(6) },
|
|
'7': function(){ fitNImages(7) },
|
|
'8': function(){ fitNImages(8) },
|
|
'9': function(){ fitNImages(9) },
|
|
|
|
// XXX this is temporary, combine this with single image mode...
|
|
F: function(){ toggleImageProportions() },
|
|
|
|
// XXX not final, think of a better way to do this...
|
|
I: {
|
|
shift: function(){ invertImageMarks() },
|
|
},
|
|
A: {
|
|
shift: function(){ toggleImageMarkBlock() },
|
|
ctrl: function(){ markAll('ribbon') },
|
|
},
|
|
M: {
|
|
default: function(){ toggleImageMark() },
|
|
shift: function(){ toggleMarkedOnlyView() },
|
|
},
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
// setup...
|
|
$(function(){
|
|
|
|
// populate the viewer...
|
|
var r = createRibbon()
|
|
var images = []
|
|
for(var i=0; i < 40; i++){
|
|
images.push(createImage().text(i)[0])
|
|
}
|
|
r.append($(images))
|
|
var rr = r.clone()
|
|
var rrr = r.clone()
|
|
|
|
$('.ribbon-set')
|
|
.append(r)
|
|
.append(rr)
|
|
.append(rrr)
|
|
|
|
// NOTE: this is global so as to not to add any extra complexity to
|
|
// the internal workings...
|
|
$('.viewer').click(clickHandler)
|
|
|
|
$(document)
|
|
.keydown(makeKeyboardHandler(
|
|
KEYBOARD_CONFIG,
|
|
function(k){console.log(k)}))
|
|
|
|
|
|
// XXX stub...
|
|
centerImage(focusImage($('.image').first()), 'css')
|
|
|
|
|
|
})
|
|
|
|
|
|
</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>
|
|
|
|
|
|
<!-- vim:set ts=4 sw=4 spell : -->
|
|
</body>
|
|
</html>
|