id2posUpdate = {}
pos2idUpdate = {}
- # moved before the firt item position
if targetPos < minMovedPos :
+ # selection moved before the first item position
for i, id in enumerate(ids) :
pos = i + targetPos + 1
id2posUpdate[id] = pos
pos2idUpdate[pos] = id
- for id in IndexIterator(pos2id, maxMovedPos, start=targetPos+1):
+ for id in IndexIterator(pos2id, targetPos+1, maxMovedPos):
pos = pos + 1
id2posUpdate[id] = pos
pos2idUpdate[pos] = id
elif targetPos > minMovedPos and targetPos < maxMovedPos :
- print minMovedPos, maxMovedPos, targetPos
- print "déposé entre la première et la dernière de la sélection"
- raise NotImplementedError()
+ # selection moved between the first and last item positions
+ pos = minMovedPos
+ # move items placed between the first item position and the target position
+ for id in IndexIterator(pos2id, minMovedPos+1, targetPos) :
+ id2posUpdate[id] = pos
+ pos2idUpdate[pos] = id
+ pos += 1
+ # move selected items
+ for id in ids :
+ id2posUpdate[id] = pos
+ pos2idUpdate[pos] = id
+ pos += 1
+ # move items positioned between the target position and the moved item max position
+ for id in IndexIterator(pos2id, targetPos+1, maxMovedPos) :
+ id2posUpdate[id] = pos
+ pos2idUpdate[pos] = id
+ pos += 1
+
else :
- print minMovedPos, maxMovedPos, targetPos
- print "déposé après la dernière"
- raise NotImplementedError()
+ # selection moved after the last item position
+ pos = minMovedPos
+ for id in IndexIterator(pos2id, minMovedPos+1, targetPos) :
+ id2posUpdate[id] = pos
+ pos2idUpdate[pos] = id
+ pos += 1
+
+ pos = targetPos - len(ids) + 1
+ for id in ids :
+ id2posUpdate[id] = pos
+ pos2idUpdate[pos] = id
+ pos +=1
id2pos.update(id2posUpdate)
pos2id.update(pos2idUpdate)
-
- # just for debug
- for pos in xrange(len(self)) :
- assert pos2id.has_key(pos)
- assert id2pos.has_key(pos2id[pos])
+
if not suppress_events :
for id, pos in id2posUpdate.items() :
notify(ObjectPositionModified(self[id], self, pos))
class IndexIterator :
- def __init__(self, d, maxPos, start=0, length=None) :
+ def __init__(self, d, start, stop) :
self.d = d
self.pos = start
- self.maxPos = maxPos
- self.length = length
- self.fetchedValuesCpt = 0
+ self.stop = stop
def __iter__(self) :
return self
def next(self) :
try :
- if self.pos > self.maxPos or \
- self.fetchedValuesCpt == self.length:
+ if self.pos > self.stop :
raise StopIteration
v = self.d[self.pos]
self.pos = self.pos + 1
- self.fetchedValuesCpt = self.fetchedValuesCpt + 1
return v
except KeyError :
self.pos = self.pos + 1