feat(main.py): add feedback message system for operations and update UI rendering
This commit is contained in:
@@ -125,6 +125,11 @@ class VideoEditor:
|
|||||||
self.progress_bar_text = ""
|
self.progress_bar_text = ""
|
||||||
self.progress_bar_fps = 0.0 # Current rendering FPS
|
self.progress_bar_fps = 0.0 # Current rendering FPS
|
||||||
|
|
||||||
|
# Feedback message state
|
||||||
|
self.feedback_message = ""
|
||||||
|
self.feedback_message_time = None
|
||||||
|
self.feedback_message_duration = 0.7 # seconds to show message
|
||||||
|
|
||||||
# Crop adjustment settings
|
# Crop adjustment settings
|
||||||
self.crop_size_step = self.CROP_SIZE_STEP
|
self.crop_size_step = self.CROP_SIZE_STEP
|
||||||
|
|
||||||
@@ -208,12 +213,15 @@ class VideoEditor:
|
|||||||
success = cv2.imwrite(str(screenshot_path), processed_frame)
|
success = cv2.imwrite(str(screenshot_path), processed_frame)
|
||||||
if success:
|
if success:
|
||||||
print(f"Screenshot saved: {screenshot_name}")
|
print(f"Screenshot saved: {screenshot_name}")
|
||||||
|
self.show_feedback_message(f"Screenshot saved: {screenshot_name}")
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
print(f"Error: Could not save screenshot to {screenshot_path}")
|
print(f"Error: Could not save screenshot to {screenshot_path}")
|
||||||
|
self.show_feedback_message("Error: Could not save screenshot")
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
print("Error: Could not process frame for screenshot")
|
print("Error: Could not process frame for screenshot")
|
||||||
|
self.show_feedback_message("Error: Could not process frame")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _get_media_files_from_directory(self, directory: Path) -> List[Path]:
|
def _get_media_files_from_directory(self, directory: Path) -> List[Path]:
|
||||||
@@ -578,6 +586,52 @@ class VideoEditor:
|
|||||||
self.progress_bar_complete_time = None
|
self.progress_bar_complete_time = None
|
||||||
self.progress_bar_fps = 0.0
|
self.progress_bar_fps = 0.0
|
||||||
|
|
||||||
|
def show_feedback_message(self, message: str):
|
||||||
|
"""Show a feedback message on screen for a few seconds"""
|
||||||
|
self.feedback_message = message
|
||||||
|
self.feedback_message_time = time.time()
|
||||||
|
|
||||||
|
def draw_feedback_message(self, frame):
|
||||||
|
"""Draw feedback message on frame if visible"""
|
||||||
|
if not self.feedback_message or not self.feedback_message_time:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Check if message should still be shown
|
||||||
|
elapsed = time.time() - self.feedback_message_time
|
||||||
|
if elapsed > self.feedback_message_duration:
|
||||||
|
self.feedback_message = ""
|
||||||
|
self.feedback_message_time = None
|
||||||
|
return
|
||||||
|
|
||||||
|
height, width = frame.shape[:2]
|
||||||
|
|
||||||
|
# Calculate message position (center of frame)
|
||||||
|
font = cv2.FONT_HERSHEY_SIMPLEX
|
||||||
|
font_scale = 1.0
|
||||||
|
thickness = 2
|
||||||
|
|
||||||
|
# Get text size
|
||||||
|
text_size = cv2.getTextSize(self.feedback_message, font, font_scale, thickness)[0]
|
||||||
|
text_x = (width - text_size[0]) // 2
|
||||||
|
text_y = (height + text_size[1]) // 2
|
||||||
|
|
||||||
|
# Draw background rectangle
|
||||||
|
padding = 10
|
||||||
|
rect_x1 = text_x - padding
|
||||||
|
rect_y1 = text_y - text_size[1] - padding
|
||||||
|
rect_x2 = text_x + text_size[0] + padding
|
||||||
|
rect_y2 = text_y + padding
|
||||||
|
|
||||||
|
# Semi-transparent background
|
||||||
|
overlay = frame.copy()
|
||||||
|
cv2.rectangle(overlay, (rect_x1, rect_y1), (rect_x2, rect_y2), (0, 0, 0), -1)
|
||||||
|
alpha = 0.7
|
||||||
|
cv2.addWeighted(overlay, alpha, frame, 1 - alpha, 0, frame)
|
||||||
|
|
||||||
|
# Draw text with shadow
|
||||||
|
cv2.putText(frame, self.feedback_message, (text_x + 2, text_y + 2), font, font_scale, (0, 0, 0), thickness + 1)
|
||||||
|
cv2.putText(frame, self.feedback_message, (text_x, text_y), font, font_scale, (255, 255, 255), thickness)
|
||||||
|
|
||||||
def draw_progress_bar(self, frame):
|
def draw_progress_bar(self, frame):
|
||||||
"""Draw progress bar on frame if visible - positioned at top with full width"""
|
"""Draw progress bar on frame if visible - positioned at top with full width"""
|
||||||
if not self.progress_bar_visible:
|
if not self.progress_bar_visible:
|
||||||
@@ -980,6 +1034,9 @@ class VideoEditor:
|
|||||||
# Draw progress bar (if visible)
|
# Draw progress bar (if visible)
|
||||||
self.draw_progress_bar(canvas)
|
self.draw_progress_bar(canvas)
|
||||||
|
|
||||||
|
# Draw feedback message (if visible)
|
||||||
|
self.draw_feedback_message(canvas)
|
||||||
|
|
||||||
window_title = "Image Editor" if self.is_image_mode else "Video Editor"
|
window_title = "Image Editor" if self.is_image_mode else "Video Editor"
|
||||||
cv2.imshow(window_title, canvas)
|
cv2.imshow(window_title, canvas)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user