replaces constant resorting with careful positional insert for marks...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2013-12-18 06:06:34 +04:00
parent 5e4498ca79
commit bca0486319
3 changed files with 35 additions and 18 deletions

View File

@ -78,12 +78,15 @@ var toggleBookmark = makeMarkToggler(
// add a bookmark... // add a bookmark...
if(action == 'on'){ if(action == 'on'){
if(BOOKMARKS.indexOf(gid) == -1){ if(BOOKMARKS.indexOf(gid) == -1){
/*
BOOKMARKS.push(gid) BOOKMARKS.push(gid)
// XXX is this too expensive??? // XXX is this too expensive???
// ...a way to avoid sorting is to: // ...a way to avoid sorting is to:
// BOOKMARKS.splice( // BOOKMARKS.splice(
// getGIDBefore(gid, BOOKMARKS)+1, 0, gid) // getGIDBefore(gid, BOOKMARKS)+1, 0, gid)
BOOKMARKS.sort(imageOrderCmp) BOOKMARKS.sort(imageOrderCmp)
*/
insertGIDToPosition(gid, BOOKMARKS)
} }
// remove a bookmark... // remove a bookmark...

View File

@ -600,6 +600,30 @@ function getGIDOrder(gid){
} }
// Insert gid to it's position on list...
//
// This saves us from very expensive large list sorting via imageOrderCmp
//
// These are equivalent:
//
// insertGIDToPosition(gid, MARKED)
//
// and
//
// MARKED.push(gid)
// MARKED.sort(imageOrderCmp)
//
// NOTE: this positions the element via DATA.order.
function insertGIDToPosition(gid, lst, data){
data = data == null ? DATA : data
gid = gid == null ? getImageGID() : gid
var i = lst.indexOf(getGIDBefore(gid, lst, data))
i = i == null ? 0 : i+1
lst.splice(i, 0, gid)
return i
}
// Same as getImageBefore(...), but uses gids and searches in DATA... // Same as getImageBefore(...), but uses gids and searches in DATA...
// //
// Return: // Return:
@ -608,7 +632,7 @@ function getGIDOrder(gid){
// //
// NOTE: if gid is present in the searched ribbon this will return it. // NOTE: if gid is present in the searched ribbon this will return it.
// NOTE: this uses it's own predicate... // NOTE: this uses it's own predicate...
function getGIDBefore(gid, ribbon, search, data){ function getGIDBefore(gid, ribbon, data, search){
gid = gid == null ? getImageGID() : gid gid = gid == null ? getImageGID() : gid
data = data == null ? DATA : data data = data == null ? DATA : data
// XXX get a ribbon without getting into DOM... // XXX get a ribbon without getting into DOM...
@ -791,7 +815,7 @@ function getGIDsAround(count, gid, ribbon, data, force_count){
var ribbon_data = data.ribbons[ribbon] var ribbon_data = data.ribbons[ribbon]
// get a gid that's in the current ribbon... // get a gid that's in the current ribbon...
gid = ribbon_data.indexOf(gid) < 0 ? getGIDBefore(gid, ribbon, null, data) : gid gid = ribbon_data.indexOf(gid) < 0 ? getGIDBefore(gid, ribbon, data) : gid
// calculate the bounds... // calculate the bounds...
var i = ribbon_data.indexOf(gid) var i = ribbon_data.indexOf(gid)
@ -1329,7 +1353,7 @@ function splitData(data, gid1){
// XXX revise... // XXX revise...
for(var j=0; j<gids.length; j++){ for(var j=0; j<gids.length; j++){
var prev = cur var prev = cur
var gid = getGIDBefore(gids[j], i, null, data) var gid = getGIDBefore(gids[j], i, data)
if(gid == gids[j]){ if(gid == gids[j]){
var cur = r.indexOf(gid) var cur = r.indexOf(gid)
} else { } else {
@ -1686,7 +1710,7 @@ function loadImagesAround(count, gid, ribbon, data, force_count){
ribbon = typeof(ribbon) != typeof(123) ? getRibbonIndex(ribbon) : ribbon ribbon = typeof(ribbon) != typeof(123) ? getRibbonIndex(ribbon) : ribbon
count = count == null ? Math.round(CONFIG.load_screens * getScreenWidthInImages()) : count count = count == null ? Math.round(CONFIG.load_screens * getScreenWidthInImages()) : count
// get a gid that exists in the current ribbon... // get a gid that exists in the current ribbon...
gid = getGIDBefore(gid, ribbon, null, data) gid = getGIDBefore(gid, ribbon, data)
var ribbon_elem = getRibbon(ribbon) var ribbon_elem = getRibbon(ribbon)

View File

@ -221,7 +221,6 @@ var toggleMarkesView = createCSSClassToggler(
* Actions * Actions
*/ */
var toggleMark = makeMarkToggler( var toggleMark = makeMarkToggler(
'marked', 'marked',
'selected', 'selected',
@ -230,8 +229,7 @@ var toggleMark = makeMarkToggler(
// add marked image to list... // add marked image to list...
if(action == 'on'){ if(action == 'on'){
if(MARKED.indexOf(gid) == -1){ if(MARKED.indexOf(gid) == -1){
MARKED.push(gid) insertGIDToPosition(gid, MARKED)
MARKED.sort(imageOrderCmp)
} }
// remove marked image from list... // remove marked image from list...
@ -251,7 +249,7 @@ function toggleAllMarks(action, mode){
if(action == 'on'){ if(action == 'on'){
var _update = function(e){ var _update = function(e){
if(MARKED.indexOf(e) < 0){ if(MARKED.indexOf(e) < 0){
MARKED.push(e) insertGIDToPosition(e, MARKED)
updated.push(e) updated.push(e)
} }
} }
@ -276,10 +274,6 @@ function toggleAllMarks(action, mode){
res.forEach(_update) res.forEach(_update)
if(action == 'on'){
MARKED.sort(imageOrderCmp)
}
updateImages(updated) updateImages(updated)
$('.viewer').trigger('togglingMarks', [updated, action]) $('.viewer').trigger('togglingMarks', [updated, action])
@ -316,8 +310,7 @@ function invertImageMarks(){
var i = MARKED.indexOf(e) var i = MARKED.indexOf(e)
if(i == -1){ if(i == -1){
on.push(e) on.push(e)
MARKED.push(e) insertGIDToPosition(e, MARKED)
MARKED.sort(imageOrderCmp)
} else { } else {
off.push(e) off.push(e)
MARKED.splice(i, 1) MARKED.splice(i, 1)
@ -355,7 +348,7 @@ function toggleMarkBlock(image){
} }
// do the toggle... // do the toggle...
if(state){ if(state){
MARKED.push(e) insertGIDToPosition(e, MARKED)
} else { } else {
MARKED.splice(MARKED.indexOf(e), 1) MARKED.splice(MARKED.indexOf(e), 1)
} }
@ -372,9 +365,6 @@ function toggleMarkBlock(image){
$.each(right, _convert) $.each(right, _convert)
updateImages(updated) updateImages(updated)
if(state){
MARKED.sort(imageOrderCmp)
}
$('.viewer') $('.viewer')
.trigger('togglingImageBlockMarks', [image, updated, state]) .trigger('togglingImageBlockMarks', [image, updated, state])