feat(main.py): implement undo functionality for grading actions
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
__pycache__
|
45
main.py
45
main.py
@@ -76,6 +76,9 @@ class MediaGrader:
|
|||||||
self.window_width = 800
|
self.window_width = 800
|
||||||
self.window_height = 600
|
self.window_height = 600
|
||||||
|
|
||||||
|
# Undo functionality
|
||||||
|
self.undo_history = [] # List of (source_path, destination_path, original_index) tuples
|
||||||
|
|
||||||
def find_media_files(self) -> List[Path]:
|
def find_media_files(self) -> List[Path]:
|
||||||
"""Find all media files recursively in the directory"""
|
"""Find all media files recursively in the directory"""
|
||||||
media_files = []
|
media_files = []
|
||||||
@@ -365,6 +368,9 @@ class MediaGrader:
|
|||||||
shutil.move(str(current_file), str(destination))
|
shutil.move(str(current_file), str(destination))
|
||||||
print(f"Moved {current_file.name} to grade {grade}")
|
print(f"Moved {current_file.name} to grade {grade}")
|
||||||
|
|
||||||
|
# Track this move for undo functionality
|
||||||
|
self.undo_history.append((str(destination), str(current_file), self.current_index))
|
||||||
|
|
||||||
self.media_files.pop(self.current_index)
|
self.media_files.pop(self.current_index)
|
||||||
|
|
||||||
if self.current_index >= len(self.media_files):
|
if self.current_index >= len(self.media_files):
|
||||||
@@ -379,6 +385,40 @@ class MediaGrader:
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def undo_last_action(self):
|
||||||
|
"""Undo the last grading action by moving file back and restoring to media list"""
|
||||||
|
if not self.undo_history:
|
||||||
|
print("No actions to undo!")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Get the last action
|
||||||
|
moved_file_path, original_file_path, original_index = self.undo_history.pop()
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Move the file back to its original location
|
||||||
|
shutil.move(moved_file_path, original_file_path)
|
||||||
|
|
||||||
|
# Add the file back to the media list at its original position
|
||||||
|
original_file = Path(original_file_path)
|
||||||
|
|
||||||
|
# Insert the file back at the appropriate position
|
||||||
|
if original_index <= len(self.media_files):
|
||||||
|
self.media_files.insert(original_index, original_file)
|
||||||
|
else:
|
||||||
|
self.media_files.append(original_file)
|
||||||
|
|
||||||
|
# Navigate to the restored file
|
||||||
|
self.current_index = original_index
|
||||||
|
|
||||||
|
print(f"Undone: Moved {original_file.name} back from grade folder")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error undoing action: {e}")
|
||||||
|
# If undo failed, put the action back in history
|
||||||
|
self.undo_history.append((moved_file_path, original_file_path, original_index))
|
||||||
|
return False
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Main grading loop"""
|
"""Main grading loop"""
|
||||||
self.media_files = self.find_media_files()
|
self.media_files = self.find_media_files()
|
||||||
@@ -396,6 +436,7 @@ class MediaGrader:
|
|||||||
print(" 1-5: Grade and move file")
|
print(" 1-5: Grade and move file")
|
||||||
print(" N: Next file")
|
print(" N: Next file")
|
||||||
print(" P: Previous file")
|
print(" P: Previous file")
|
||||||
|
print(" U: Undo last grading action")
|
||||||
print(" Q/ESC: Quit")
|
print(" Q/ESC: Quit")
|
||||||
|
|
||||||
cv2.namedWindow("Media Grader", cv2.WINDOW_NORMAL)
|
cv2.namedWindow("Media Grader", cv2.WINDOW_NORMAL)
|
||||||
@@ -446,6 +487,10 @@ class MediaGrader:
|
|||||||
elif key == ord("p"):
|
elif key == ord("p"):
|
||||||
self.current_index = max(0, self.current_index - 1)
|
self.current_index = max(0, self.current_index - 1)
|
||||||
break
|
break
|
||||||
|
elif key == ord("u"):
|
||||||
|
if self.undo_last_action():
|
||||||
|
# File was restored, reload it
|
||||||
|
break
|
||||||
elif key in [ord("1"), ord("2"), ord("3"), ord("4"), ord("5")]:
|
elif key in [ord("1"), ord("2"), ord("3"), ord("4"), ord("5")]:
|
||||||
grade = int(chr(key))
|
grade = int(chr(key))
|
||||||
if not self.grade_media(grade):
|
if not self.grade_media(grade):
|
||||||
|
Reference in New Issue
Block a user