ImageGrid/ui/bookmarks.js
Alex A. Naanou f5a6fc8c87 make the bookmarks sparse...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-01-16 15:43:30 +04:00

188 lines
4.5 KiB
JavaScript
Executable File

/**********************************************************************
*
*
*
**********************************************************************/
// list of bookmarked gids...
//
// NOTE: this must be sorted in the same order as DATA.order
var BOOKMARKS = []
// bookmark data
//
// NOTE: elements are added here only when some data is set, use
// BOOKMARKS, as the main structure.
var BOOKMARKS_DATA = {}
var BOOKMARKS_FILE_DEFAULT = 'bookmarked.json'
var BOOKMARKS_FILE_PATTERN = /^[0-9]*-bookmarked.json$/
/**********************************************************************
* Helpers
*/
var getBookmarked = makeMarkedLister(function(){ return BOOKMARKS })
var getUnbookmarked = makeUnmarkedSparseLister(function(){ return BOOKMARKS })
var getBookmarkedGIDBefore = makeGIDBeforeGetterFromList(
function(){
return compactSparceList(BOOKMARKS)
})
/*********************************************************************/
function cropBookmarkedImages(cmp, keep_ribbons, keep_unloaded_gids){
cropDataTo(BOOKMARKS.slice(), keep_ribbons, keep_unloaded_gids)
return DATA
}
// update image bookmark state...
var updateBookmarkedImageMark = makeMarkUpdater(
'bookmarked',
'bookmark',
function(gid){
return BOOKMARKS.indexOf(gid) > -1
})
/*********************************************************************/
// XXX not sure that these should be modes...
var toggleBookmarkedOnlyView = makeCropModeToggler(
'bookmarked-only-view',
cropBookmarkedImages)
var toggleBookmarkedOnlyWithRibbonsView = makeCropModeToggler(
'bookmarked-only-view',
function(){
cropBookmarkedImages(null, true)
})
/**********************************************************************
* Actions
*/
// NOTE: this can be called without arguments (affects current image) or
// passed either an image object or a gid...
var toggleBookmark = makeMarkToggler(
'bookmarked',
'bookmark',
'togglingBookmark',
function(gid, action){
// add a bookmark...
if(action == 'on'){
if(BOOKMARKS.indexOf(gid) == -1){
//insertGIDToPosition(gid, BOOKMARKS)
BOOKMARKS[DATA.order.indexOf(gid)] = gid
}
// remove a bookmark...
} else {
//BOOKMARKS.splice(BOOKMARKS.indexOf(gid), 1)
delete BOOKMARKED[BOOKMARKED.indexOf(gid)]
}
bookmarksUpdated()
})
// focus next/prev bookmark...
//
var nextBookmark = makeNextFromListAction(
getBookmarkedGIDBefore,
function(){ return compactSparceList(BOOKMARKS) })
var prevBookmark = makePrevFromListAction(
getBookmarkedGIDBefore,
function(){ return compactSparceList(BOOKMARKS) })
/**********************************************************************
* Files...
*/
var loadFileBookmarks = makeFileLoader(
'Bookmarks',
BOOKMARKS_FILE_DEFAULT,
BOOKMARKS_FILE_PATTERN,
[[], {}],
function(data){
BOOKMARKS = populateSparceGIDList(data[0])
BOOKMARKS_DATA = data[1]
})
var saveFileBookmarks = makeFileSaver(
'Bookmarks',
BOOKMARKS_FILE_DEFAULT,
function(){
return [
compactSparceList(BOOKMARKS),
BOOKMARKS_DATA
]
})
function bookmarksUpdated(){
fileUpdated('Bookmarks')
$('.viewer').trigger('bookmarksUpdated')
}
/**********************************************************************
* Setup...
*/
// setup event handlers for the bookmark framework...
//
function setupBookmarks(viewer){
console.log('Bookmarks: setup...')
// XXX make this viewer specific...
makeContextIndicatorUpdater('bookmarked')
// XXX make this viewer specific...
showContextIndicator(
'current-image-bookmarked',
'Bookmarked (ctrl-B)')
.click(function(){ toggleBookmark() })
return viewer
.on('sortedImages', function(){
BOOKMARKS = populateSparceGIDList(BOOKMARKS)
bookmarksUpdated()
})
.on('horizontalShiftedImage', function(evt, gid, direction){
var n = DATA.order.indexOf(gid)
var o = BOOKMARKS.indexOf(gid)
// move the marked gid...
BOOKMARKS.splice(o, 1)
BOOKMARKS.splice(n, 0, gid)
// test if there are any marked images between n and o...
var shift = compactSparceList(BOOKMARKS.slice(Math.min(n, o)+1, Math.max(n, o)))
if(shift.length > 0){
marksUpdated()
}
})
}
SETUP_BINDINGS.push(setupBookmarks)
/**********************************************************************
* vim:set ts=4 sw=4 : */