Compare commits

...

2 Commits

Author SHA1 Message Date
KRSHH 7b8d6171b7 Frame by Frame Navigation 2024-10-19 14:04:05 +05:30
KRSHH 6b86b0a72d Preview Window Slider 2024-10-19 13:58:55 +05:30
1 changed files with 58 additions and 22 deletions

View File

@ -842,6 +842,10 @@ def create_preview(parent: ctk.CTkToplevel) -> ctk.CTkToplevel:
) )
preview_slider.pack(fill="x", padx=20, pady=10) preview_slider.pack(fill="x", padx=20, pady=10)
# Add keyboard bindings for left and right arrow keys
preview.bind("<Left>", lambda event: navigate_frames(-1))
preview.bind("<Right>", lambda event: navigate_frames(1))
return preview return preview
@ -1027,36 +1031,77 @@ def toggle_preview() -> None:
if PREVIEW.state() == "normal": if PREVIEW.state() == "normal":
PREVIEW.withdraw() PREVIEW.withdraw()
elif modules.globals.source_path and modules.globals.target_path: elif modules.globals.source_path and modules.globals.target_path:
init_preview() try:
update_preview() init_preview()
update_preview()
except Exception as e:
print(f"Error initializing preview: {str(e)}")
# Optionally, show an error message to the user
update_status(f"Error initializing preview: {str(e)}")
def init_preview() -> None: def init_preview() -> None:
global preview_slider
if is_image(modules.globals.target_path): if is_image(modules.globals.target_path):
preview_slider.pack_forget() if hasattr(preview_slider, "pack_forget"):
if is_video(modules.globals.target_path): preview_slider.pack_forget()
elif is_video(modules.globals.target_path):
video_frame_total = get_video_frame_total(modules.globals.target_path) video_frame_total = get_video_frame_total(modules.globals.target_path)
preview_slider.configure(to=video_frame_total)
preview_slider.pack(fill="x") # Check if preview_slider exists and is a valid widget
preview_slider.set(0) if hasattr(preview_slider, "winfo_exists") and preview_slider.winfo_exists():
try:
preview_slider.configure(to=video_frame_total)
preview_slider.pack(fill="x")
preview_slider.set(0)
except tk.TclError:
print("Error: Preview slider widget not available. Recreating it.")
create_preview_slider()
else:
print("Preview slider not found. Creating a new one.")
create_preview_slider()
def create_preview_slider():
global preview_slider, PREVIEW
# Ensure PREVIEW window exists
if not hasattr(PREVIEW, "winfo_exists") or not PREVIEW.winfo_exists():
print("Error: Preview window does not exist.")
return
# Create a new slider
preview_slider = ctk.CTkSlider(
PREVIEW,
from_=0,
to=get_video_frame_total(modules.globals.target_path),
command=lambda frame_value: update_preview(int(frame_value)),
fg_color=("gray75", "gray25"),
progress_color=("DodgerBlue", "DodgerBlue"),
button_color=("DodgerBlue", "DodgerBlue"),
button_hover_color=("RoyalBlue", "RoyalBlue"),
)
preview_slider.pack(fill="x", padx=20, pady=10)
def navigate_frames(direction: int) -> None:
current_frame = int(preview_slider.get())
new_frame = max(0, min(current_frame + direction, int(preview_slider.cget("to"))))
preview_slider.set(new_frame)
update_preview(new_frame)
def update_preview(frame_number: int = 0) -> None: def update_preview(frame_number: int = 0) -> None:
if modules.globals.source_path and modules.globals.target_path: if modules.globals.source_path and modules.globals.target_path:
update_status("Processing...") update_status("Processing...")
# Debug: Print the target path and frame number
print(
f"Target path: {modules.globals.target_path}, Frame number: {frame_number}"
)
temp_frame = None temp_frame = None
if is_video(modules.globals.target_path): if is_video(modules.globals.target_path):
temp_frame = get_video_frame(modules.globals.target_path, frame_number) temp_frame = get_video_frame(modules.globals.target_path, frame_number)
elif is_image(modules.globals.target_path): elif is_image(modules.globals.target_path):
temp_frame = cv2.imread(modules.globals.target_path) temp_frame = cv2.imread(modules.globals.target_path)
# Debug: Check if temp_frame is None
if temp_frame is None: if temp_frame is None:
print("Error: temp_frame is None") print("Error: temp_frame is None")
update_status("Error: Could not read frame from video or image.") update_status("Error: Could not read frame from video or image.")
@ -1068,19 +1113,10 @@ def update_preview(frame_number: int = 0) -> None:
for frame_processor in get_frame_processors_modules( for frame_processor in get_frame_processors_modules(
modules.globals.frame_processors modules.globals.frame_processors
): ):
# Debug: Print the type of frame_processor
print(f"Processing frame with: {type(frame_processor).__name__}")
temp_frame = frame_processor.process_frame( temp_frame = frame_processor.process_frame(
get_one_face(cv2.imread(modules.globals.source_path)), temp_frame get_one_face(cv2.imread(modules.globals.source_path)), temp_frame
) )
# Debug: Check if temp_frame is None after processing
if temp_frame is None:
print("Error: temp_frame is None after processing")
update_status("Error: Frame processing failed.")
return
image = Image.fromarray(cv2.cvtColor(temp_frame, cv2.COLOR_BGR2RGB)) image = Image.fromarray(cv2.cvtColor(temp_frame, cv2.COLOR_BGR2RGB))
image = ImageOps.contain( image = ImageOps.contain(
image, (PREVIEW_MAX_WIDTH, PREVIEW_MAX_HEIGHT), Image.LANCZOS image, (PREVIEW_MAX_WIDTH, PREVIEW_MAX_HEIGHT), Image.LANCZOS