@@ -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