basic bookmarks now working...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2013-12-13 03:39:23 +04:00
parent a455e55b4d
commit ee31fa70c5
7 changed files with 131 additions and 54 deletions

View File

@ -146,9 +146,6 @@ var IMAGES_FILE_DEFAULT = 'images.json'
var IMAGES_FILE_PATTERN = /^[0-9]*-images.json$/ var IMAGES_FILE_PATTERN = /^[0-9]*-images.json$/
var IMAGES_DIFF_FILE_PATTERN = /^[0-9]*-images-diff.json$/ var IMAGES_DIFF_FILE_PATTERN = /^[0-9]*-images-diff.json$/
var MARKED_FILE_DEFAULT = 'marked.json'
var MARKED_FILE_PATTERN = /^[0-9]*-marked.json$/
var DATA_FILE_DEFAULT = 'data.json' var DATA_FILE_DEFAULT = 'data.json'
var DATA_FILE_PATTERN = /^[0-9]*-data.json$/ var DATA_FILE_PATTERN = /^[0-9]*-data.json$/
@ -170,6 +167,8 @@ var SYNC_IMG_LOADER = false
// //
var SETUP_BINDINGS = [] var SETUP_BINDINGS = []
var IMAGE_UPDATERS = []
/********************************************************************** /**********************************************************************
@ -508,9 +507,12 @@ function getGIDBefore(gid, ribbon, search, data){
// XXX get a ribbon without getting into DOM... // XXX get a ribbon without getting into DOM...
// ...dependency leek... // ...dependency leek...
ribbon = ribbon == null ? getGIDRibbonIndex(gid, data) : ribbon ribbon = ribbon == null ? getGIDRibbonIndex(gid, data) : ribbon
search = search == null ? binSearch : search
//search = search == null ? match2(linSearch, binSearch) : search
ribbon = typeof(ribbon) == typeof(123) ? data.ribbons[ribbon] : ribbon ribbon = typeof(ribbon) == typeof(123) ? data.ribbons[ribbon] : ribbon
// get the current ribbon if gid is not in any of the loaded
// ribbons (crop mode)...
ribbon = ribbon == null ? data.ribbons[getGIDRibbonIndex(null, data)] : ribbon
//search = search == null ? match2(linSearch, binSearch) : search
search = search == null ? binSearch : search
var order = data.order var order = data.order
var target = order.indexOf(gid) var target = order.indexOf(gid)
@ -1128,16 +1130,9 @@ function updateImageIndicators(gid, image){
gid = gid == null ? getImageGID() : gid gid = gid == null ? getImageGID() : gid
image = image == null ? getImage() : $(image) image = image == null ? getImage() : $(image)
// marks... IMAGE_UPDATERS.forEach(function(update){
if(MARKED.indexOf(gid) != -1){ update(gid, image)
image.addClass('marked') })
// XXX
_addMark('selected', gid, image)
} else {
image.removeClass('marked')
// XXX
_removeMark('selected', gid, image)
}
return image return image
} }
@ -1732,6 +1727,7 @@ function showImage(gid){
// target is already loaded... // target is already loaded...
} else { } else {
// XXX this does not load images correctly at times...
centerView(focusImage(img)) centerView(focusImage(img))
centerRibbons() centerRibbons()
} }

View File

@ -318,51 +318,76 @@ function saveFileImages(name){
} }
function makeBasicLoader(title, file_dfl, file_pattern, finalize){
return function(path){
var res = $.Deferred()
// default locations...
if(path == null){
var base = normalizePath(CACHE_DIR_VAR)
var loader = loadLatestFile(base,
file_dfl,
file_pattern,
null,
[])
// explicit path...
// XXX need to account for paths without a CACHE_DIR
} else {
path = normalizePath(path)
var base = path.split(CACHE_DIR)[0]
//base = normalizePath(path +'/'+ CACHE_DIR_VAR)
base = path +'/'+ CACHE_DIR
// XXX is this correct???
var loader = loadLatestFile(base,
path.split(base)[0],
RegExp(path.split(base)[0]),
null,
[])
}
bubbleProgress(title, loader, res)
res.done(finalize)
return res
}
}
// Load image marks form file // Load image marks form file
// //
// NOTE: if no marks are found then set them to [] // NOTE: if no marks are found then set them to []
function loadFileMarks(path){ var loadFileMarks = makeBasicLoader(
var res = $.Deferred() 'Marks',
// default locations... MARKED_FILE_DEFAULT,
if(path == null){ MARKED_FILE_PATTERN,
var base = normalizePath(CACHE_DIR_VAR) function(data){
var loader = loadLatestFile(base, MARKED = data
MARKED_FILE_DEFAULT, })
MARKED_FILE_PATTERN,
null,
[])
// explicit path...
// XXX need to account for paths without a CACHE_DIR
} else {
path = normalizePath(path)
var base = path.split(CACHE_DIR)[0]
//base = normalizePath(path +'/'+ CACHE_DIR_VAR)
base = path +'/'+ CACHE_DIR
// XXX is this correct???
var loader = loadLatestFile(base,
path.split(base)[0],
RegExp(path.split(base)[0]),
null,
[])
}
bubbleProgress('Marks', loader, res)
res.done(function(images){
MARKED = images
})
return res
}
// Save image marks to file // Save image marks to file
function saveFileMarks(name){ function saveFileMarks(name){
name = name == null ? normalizePath(CACHE_DIR_VAR +'/'+ Date.timeStamp()) : name name = name == null ? normalizePath(CACHE_DIR_VAR +'/'+ Date.timeStamp()) : name
dumpJSON(name + '-marked.json', MARKED) dumpJSON(name + '-' + MARKED_FILE_DEFAULT, MARKED)
}
var loadFileBookmarks = makeBasicLoader(
'Bookmarks',
BOOKMARKS_FILE_DEFAULT,
BOOKMARKS_FILE_PATTERN,
function(data){
BOOKMARKS = data[0] == null ? [] : data[0]
BOOKMARKS_DATA = data[1] == null ? {} : data[1]
})
function saveFileBookmarks(name){
name = name == null ? normalizePath(CACHE_DIR_VAR +'/'+ Date.timeStamp()) : name
dumpJSON(name + '-' + BOOKMARKS_FILE_DEFAULT, [BOOKMARKS, BOOKMARKS_DATA])
} }
@ -414,7 +439,9 @@ function loadFileState(path, prefix){
// : null), res, true), // : null), res, true),
// load marks if available... // load marks if available...
bubbleProgress(prefix, bubbleProgress(prefix,
loadFileMarks(), res, true)) loadFileMarks(), res, true),
bubbleProgress(prefix,
loadFileBookmarks(), res, true))
.done(function(){ .done(function(){
reloadViewer() reloadViewer()
res.resolve() res.resolve()
@ -458,6 +485,7 @@ function saveFileState(name, no_normalize_path){
dumpJSON(name + '-data.json', data) dumpJSON(name + '-data.json', data)
// XXX do we need to do this??? // XXX do we need to do this???
saveFileMarks(name) saveFileMarks(name)
saveFileBookmarks(name)
// save the updated images... // save the updated images...
if(IMAGES_UPDATED.length > 0){ if(IMAGES_UPDATED.length > 0){

View File

@ -194,6 +194,7 @@ $(function(){
*/ */
updateImages() updateImages()
toggleMarkesView('on')
SCROLLER.start() SCROLLER.start()

View File

@ -578,7 +578,14 @@ var KEYBOARD_CONFIG = {
Enter: doc('Toggle single image view', Enter: doc('Toggle single image view',
function(){ toggleSingleImageMode() }), function(){ toggleSingleImageMode() }),
B: doc('Toggle theme', function(){ toggleTheme() }), B: {
default: doc('Toggle theme',
function(){ toggleTheme() }),
ctrl: doc('Toggle bookmark',
function(){ toggleBookmark() }),
},
'[': doc('Previous bookmarked image', prevBookmark),
']': doc('Next bookmarked image', nextBookmark),
S: { S: {
default: doc('Start slideshow', default: doc('Start slideshow',

View File

@ -604,12 +604,14 @@ button:hover {
.viewer:not(.marks-visible) .mark { .viewer:not(.marks-visible) .mark {
display: none; display: none;
} }
.mark.bookmark,
.mark.selected { .mark.selected {
width: 0px; width: 0px;
margin-left: 0px; margin-left: 0px;
border: none; border: none;
overflow: visible; overflow: visible;
} }
.mark.bookmark:after,
.mark.selected:after { .mark.selected:after {
display: block; display: block;
position: absolute; position: absolute;
@ -631,6 +633,10 @@ button:hover {
.marks-visible.single-image-mode.viewer .mark:after { .marks-visible.single-image-mode.viewer .mark:after {
display: none; display: none;
} }
.mark.bookmark:after {
background: yellow;
left: -25;
}
/****************************************************** Image info ***/ /****************************************************** Image info ***/
.inline-image-info { .inline-image-info {
display: none; display: none;

View File

@ -678,12 +678,14 @@ button:hover {
display: none; display: none;
} }
.mark.bookmark,
.mark.selected { .mark.selected {
width: 0px; width: 0px;
margin-left: 0px; margin-left: 0px;
border: none; border: none;
overflow: visible; overflow: visible;
} }
.mark.bookmark:after,
.mark.selected:after { .mark.selected:after {
display: block; display: block;
position: absolute; position: absolute;
@ -712,6 +714,11 @@ button:hover {
display: none; display: none;
} }
.mark.bookmark:after {
background: yellow;
left: -25;
}
/****************************************************** Image info ***/ /****************************************************** Image info ***/

View File

@ -6,6 +6,9 @@
//var DEBUG = DEBUG != null ? DEBUG : true //var DEBUG = DEBUG != null ? DEBUG : true
var MARKED_FILE_DEFAULT = 'marked.json'
var MARKED_FILE_PATTERN = /^[0-9]*-marked.json$/
/********************************************************************** /**********************************************************************
@ -19,8 +22,9 @@ function _addMark(cls, gid, image){
var mark = $('.mark.'+cls+'.'+gid) var mark = $('.mark.'+cls+'.'+gid)
if(mark.length == 0){ if(mark.length == 0){
mark = $('<div class="mark selected"/>') mark = $('<div class="mark"/>')
.addClass(gid) .addClass(gid)
.addClass(cls)
.insertAfter(image) .insertAfter(image)
} }
return mark return mark
@ -76,6 +80,34 @@ function makeMarkToggler(img_class, mark_class, evt_name){
} }
function makeMarkUpdater(img_class, mark_class, test){
return function(gid, image){
// marks...
if(test(gid)){
image.addClass(img_class)
_addMark(mark_class, gid, image)
} else {
image.removeClass(img_class)
_removeMark(mark_class, gid, image)
}
return image
}
}
/**********************************************************************
* Basic marks...
*/
var updateSelectedImageMark = makeMarkUpdater(
'marked',
'selected',
function(gid){
return MARKED.indexOf(gid) > -1
})
IMAGE_UPDATERS.push(updateSelectedImageMark)
// NOTE: to disable MARKED cleanout set no_cleanout_marks to true. // NOTE: to disable MARKED cleanout set no_cleanout_marks to true.
// NOTE: MARKED may contain both gids that are not loaded and that do // 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 // not exist, as there is no way to distinguish between the two