wiki/list-editor/cursor.js
Peter Stuifzand 5f375992b4
All checks were successful
continuous-integration/drone/push Build is passing
Don't move cursor after remove
2020-10-31 14:55:34 +01:00

80 lines
2.2 KiB
JavaScript

function createCursor(start) {
let cursor = start;
let lastMovement = 0;
return {
get() {
return cursor;
},
set(newPosition) {
cursor = newPosition;
},
getId(store) {
return store.currentID(cursor)
},
atFirst() {
return cursor === 0;
},
atPosition(other) {
return cursor === other;
},
atEnd(store) {
return cursor === store.length()
},
hasMoved(saved) {
return cursor !== saved.get()
},
getCurrent(store) {
let id = store.currentID(cursor)
return store.value(id)
},
getCurrentElement(elements) {
return elements.slice(cursor, cursor + 1);
},
save() {
return createCursor(cursor);
},
moveUp(store) {
cursor = store.prevCursorPosition(cursor)
lastMovement = -1
},
moveDown(store) {
cursor = store.nextCursorPosition(cursor, true)
lastMovement = 1
},
remove(store) {
let id = store.currentID(cursor)
let item = store.value(id)
store.remove(cursor)
if (cursor >= store.length()) {
cursor = store.length() - 1
}
},
insertAbove(store, item) {
store.insertBefore(store.currentID(cursor), item)
},
insertBelow(store, item) {
let currentID = store.currentID(cursor)
let currentItem = store.value(currentID)
if (currentItem.fold !== 'open') {
cursor = store.lastHigherIndented(cursor)
item.indented = currentItem.indented
cursor--
}
let id = store.insertAfter(store.currentID(cursor), item)
cursor = store.index(id)
},
forwardToNextVisible(store) {
cursor = store.nextCursorPosition(cursor, false)
},
lastDir() {
return lastMovement
},
resetLastMove() {
lastMovement = 0
}
};
}
export default createCursor;