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...
if(action == 'on'){
if(BOOKMARKS.indexOf(gid) == -1){
/*
BOOKMARKS.push(gid)
// XXX is this too expensive???
// ...a way to avoid sorting is to:
// BOOKMARKS.splice(
// getGIDBefore(gid, BOOKMARKS)+1, 0, gid)
BOOKMARKS.sort(imageOrderCmp)
*/
insertGIDToPosition(gid, BOOKMARKS)
}
// 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...
//
// Return:
@ -608,7 +632,7 @@ function getGIDOrder(gid){
//
// NOTE: if gid is present in the searched ribbon this will return it.
// NOTE: this uses it's own predicate...
function getGIDBefore(gid, ribbon, search, data){
function getGIDBefore(gid, ribbon, data, search){
gid = gid == null ? getImageGID() : gid
data = data == null ? DATA : data
// 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]
// 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...
var i = ribbon_data.indexOf(gid)
@ -1329,7 +1353,7 @@ function splitData(data, gid1){
// XXX revise...
for(var j=0; j<gids.length; j++){
var prev = cur
var gid = getGIDBefore(gids[j], i, null, data)
var gid = getGIDBefore(gids[j], i, data)
if(gid == gids[j]){
var cur = r.indexOf(gid)
} else {
@ -1686,7 +1710,7 @@ function loadImagesAround(count, gid, ribbon, data, force_count){
ribbon = typeof(ribbon) != typeof(123) ? getRibbonIndex(ribbon) : ribbon
count = count == null ? Math.round(CONFIG.load_screens * getScreenWidthInImages()) : count
// 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)

View File

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