Skip to content

Commit 9189cf1

Browse files
committed
Naive undo/redo for row deletion
1 parent 6b3baa2 commit 9189cf1

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

tabview/tabview.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,15 @@ def delete_cell(self):
338338
self.data[yp][xp] = ''
339339
self.set_term_title(True)
340340

341+
def delete_row(self):
342+
yp = self.y + self.win_y
343+
344+
undo_op = (yp, True, self.data.pop(yp))
345+
if not self.undo_buffer or self.undo_buffer[0] != undo_op:
346+
self.undo_buffer.insert(0, undo_op)
347+
348+
self.set_term_title(True)
349+
341350
def _edit_validator(self, ch):
342351
"""Fix Enter and backspace for textbox.
343352
@@ -398,9 +407,19 @@ def undo_redo(self, undo=True):
398407

399408
if len(from_buffer):
400409
yp, xp, value = from_buffer.pop(0)
401-
to_buffer.insert(0, (yp, xp, self.data[yp][xp]))
402-
403-
self.data[yp][xp] = value
410+
# FIXME: Undo/redo for row deletion is unstable (deleting multiple rows)
411+
if xp is True:
412+
# Row deletion - undo by reinserting row
413+
insert_index = min(yp, len(self.data))
414+
self.data.insert(insert_index, value)
415+
to_buffer.insert(0, (insert_index, False, value))
416+
elif xp is False:
417+
# Row insertion - undo by deleting row
418+
to_buffer.insert(0, (yp, True, value))
419+
self.data.pop(yp)
420+
else:
421+
to_buffer.insert(0, (yp, xp, self.data[yp][xp]))
422+
self.data[yp][xp] = value
404423
self.set_term_title(True)
405424

406425
def duplicate_row(self):
@@ -807,7 +826,7 @@ def define_keys(self):
807826
curses.KEY_NPAGE: self.page_down,
808827
curses.KEY_IC: self.mark,
809828
curses.KEY_ENTER: self.show_cell,
810-
curses.KEY_DC: self.delete_cell,
829+
curses.KEY_DC: self.delete_row,
811830
KEY_CTRL('a'): self.line_home,
812831
KEY_CTRL('e'): self.line_end,
813832
KEY_CTRL('l'): self.scr.redrawwin,

0 commit comments

Comments
 (0)