diff --git a/modules/ui.py b/modules/ui.py index b0dcc6f..60279ed 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -1051,8 +1051,10 @@ def refresh_data(map: list): row_frame = ctk.CTkFrame(scrollable_frame) row_frame.pack(fill="x", pady=5) - source_button = ctk.CTkButton( + source_button = SourceMapperButton( # Use SourceMapperButton here row_frame, + map, + id, text="Select source image", command=lambda id=id: on_sbutton_click(map, id), width=DEFAULT_BUTTON_WIDTH, @@ -1063,6 +1065,14 @@ def refresh_data(map: list): ) source_button.pack(side="left", padx=(0, 10)) + source_image_label = ctk.CTkLabel( # Create a label for source image + row_frame, + text=f"S-{id}", + width=MAPPER_PREVIEW_MAX_WIDTH, + height=MAPPER_PREVIEW_MAX_HEIGHT, + ) + source_image_label.pack(side="left", padx=(0, 10)) + if "source" in item: image = Image.fromarray( cv2.cvtColor(item["source"]["cv2"], cv2.COLOR_BGR2RGB) @@ -1071,16 +1081,38 @@ def refresh_data(map: list): (MAPPER_PREVIEW_MAX_WIDTH, MAPPER_PREVIEW_MAX_HEIGHT), Image.LANCZOS ) tk_image = ctk.CTkImage(image, size=image.size) + source_image_label.configure(image=tk_image) - source_image = ctk.CTkLabel( - row_frame, - scrollable_frame, - text=f"S-{id}", - width=MAPPER_PREVIEW_MAX_WIDTH, - height=MAPPER_PREVIEW_MAX_HEIGHT, - ) - source_image.grid(row=id, column=1, padx=10, pady=10) - source_image.configure(image=tk_image) + x_label = ctk.CTkLabel( + row_frame, + text=f"X", + width=30, + ) + x_label.pack(side="left", padx=(0, 10)) + + target_button = DragDropButton( # Use DragDropButton for target + row_frame, + text="Select target image", + command=lambda id=id: on_tbutton_click(map, id), + width=DEFAULT_BUTTON_WIDTH, + height=DEFAULT_BUTTON_HEIGHT, + fg_color=("gray75", "gray25"), + hover_color=("gray85", "gray35"), + corner_radius=10, + ) + + target_button.handle_drop = lambda file_path, id=id: update_webcam_target( + scrollable_frame, map, id, file_path + ) # Add handle_drop for drag and drop + target_button.pack(side="left", padx=(0, 10)) + + target_image_label = ctk.CTkLabel( # Create a label for target image + row_frame, + text=f"T-{id}", + width=MAPPER_PREVIEW_MAX_WIDTH, + height=MAPPER_PREVIEW_MAX_HEIGHT, + ) + target_image_label.pack(side="left") if "target" in item: image = Image.fromarray( @@ -1090,15 +1122,7 @@ def refresh_data(map: list): (MAPPER_PREVIEW_MAX_WIDTH, MAPPER_PREVIEW_MAX_HEIGHT), Image.LANCZOS ) tk_image = ctk.CTkImage(image, size=image.size) - - target_image = ctk.CTkLabel( - scrollable_frame, - text=f"T-{id}", - width=MAPPER_PREVIEW_MAX_WIDTH, - height=MAPPER_PREVIEW_MAX_HEIGHT, - ) - target_image.grid(row=id, column=4, padx=20, pady=10) - target_image.configure(image=tk_image) + target_image_label.configure(image=tk_image) def update_webcam_source( @@ -1140,30 +1164,31 @@ def update_webcam_source( ) tk_image = ctk.CTkImage(image, size=image.size) - source_image = ctk.CTkLabel( - scrollable_frame, - text=f"S-{button_num}", - width=MAPPER_PREVIEW_MAX_WIDTH, - height=MAPPER_PREVIEW_MAX_HEIGHT, - ) - source_image.grid(row=button_num, column=1, padx=10, pady=10) - source_image.configure(image=tk_image) - source_label_dict_live[button_num] = source_image + # Find the source image label in the row frame + row_frame = scrollable_frame.winfo_children()[button_num] + source_image_label = row_frame.winfo_children()[1] + + source_image_label.configure(image=tk_image) + source_label_dict_live[button_num] = source_image_label else: update_pop_live_status("Face could not be detected in last upload!") return map def update_webcam_target( - scrollable_frame: ctk.CTkScrollableFrame, map: list, button_num: int + scrollable_frame: ctk.CTkScrollableFrame, + map: list, + button_num: int, + target_path: str = None, ) -> list: global target_label_dict_live - target_path = ctk.filedialog.askopenfilename( - title="select an target image", - initialdir=RECENT_DIRECTORY_SOURCE, - filetypes=[img_ft], - ) + if target_path is None: + target_path = ctk.filedialog.askopenfilename( + title="select an target image", + initialdir=RECENT_DIRECTORY_SOURCE, + filetypes=[img_ft], + ) if "target" in map[button_num]: map[button_num].pop("target") @@ -1193,15 +1218,12 @@ def update_webcam_target( ) tk_image = ctk.CTkImage(image, size=image.size) - target_image = ctk.CTkLabel( - scrollable_frame, - text=f"T-{button_num}", - width=MAPPER_PREVIEW_MAX_WIDTH, - height=MAPPER_PREVIEW_MAX_HEIGHT, - ) - target_image.grid(row=button_num, column=4, padx=20, pady=10) - target_image.configure(image=tk_image) - target_label_dict_live[button_num] = target_image + # Find the target image label in the row frame + row_frame = scrollable_frame.winfo_children()[button_num] + target_image_label = row_frame.winfo_children()[4] + + target_image_label.configure(image=tk_image) + target_label_dict_live[button_num] = target_image_label else: update_pop_live_status("Face could not be detected in last upload!") return map