Drag-n-Drop stack util function.
This commit is contained in:
parent
daf8214eda
commit
90eef110d1
|
|
@ -0,0 +1,13 @@
|
||||||
|
.*\.pyc$
|
||||||
|
.*\.swp$
|
||||||
|
.eggs
|
||||||
|
.hypothesis
|
||||||
|
.pytest_cache
|
||||||
|
.vscode
|
||||||
|
docs/.ipynb_checkpoints
|
||||||
|
test/*
|
||||||
|
venv
|
||||||
|
build
|
||||||
|
Thun.egg-info
|
||||||
|
dist
|
||||||
|
__pycache__
|
||||||
|
|
@ -174,6 +174,52 @@ def concat(quote, expression):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def dnd(stack, from_index, to_index):
|
||||||
|
'''
|
||||||
|
Given a stack and two indices return a rearranged stack.
|
||||||
|
First remove the item at from_index and then insert it at to_index,
|
||||||
|
the second index is relative to the stack after removal of the item
|
||||||
|
at from_index.
|
||||||
|
|
||||||
|
This function reuses all of the items and as much of the stack as it
|
||||||
|
can. It's meant to be used by remote clients to support drag-n-drop
|
||||||
|
rearranging of the stack from e.g. the StackListbox.
|
||||||
|
'''
|
||||||
|
assert 0 <= from_index
|
||||||
|
assert 0 <= to_index
|
||||||
|
if from_index == to_index:
|
||||||
|
return stack
|
||||||
|
head, n = [], from_index
|
||||||
|
while True:
|
||||||
|
item, stack = stack
|
||||||
|
n -= 1
|
||||||
|
if n < 0:
|
||||||
|
break
|
||||||
|
head.append(item)
|
||||||
|
assert len(head) == from_index
|
||||||
|
# now we have two cases:
|
||||||
|
diff = from_index - to_index
|
||||||
|
if diff < 0:
|
||||||
|
# from < to
|
||||||
|
# so the destination index is still in the stack
|
||||||
|
while diff:
|
||||||
|
h, stack = stack
|
||||||
|
head.append(h)
|
||||||
|
diff += 1
|
||||||
|
stack = item, stack
|
||||||
|
while head:
|
||||||
|
stack = head.pop(), stack
|
||||||
|
else:
|
||||||
|
# from > to
|
||||||
|
# so the destination is in the head list
|
||||||
|
while head:
|
||||||
|
stack = head.pop(), stack
|
||||||
|
from_index -= 1
|
||||||
|
if from_index == to_index:
|
||||||
|
stack = item, stack
|
||||||
|
return stack
|
||||||
|
|
||||||
|
|
||||||
def pick(stack, n):
|
def pick(stack, n):
|
||||||
'''
|
'''
|
||||||
Return the nth item on the stack.
|
Return the nth item on the stack.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue