ImageGrid/ui/index.html

411 lines
7.4 KiB
HTML
Raw Normal View History

<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>