From 59d64d4b6a7b741dca115ec7e5cb9260f2bc260f Mon Sep 17 00:00:00 2001
From: Makaru <kierpestanislao@gmail.com>
Date: Mon, 13 Jan 2025 01:23:58 +0800
Subject: [PATCH] Added dropdown transparency

---
 modules/processors/frame/face_swapper.py |  4 +++-
 modules/ui.py                            | 26 +++++++++++++++++++++---
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/modules/processors/frame/face_swapper.py b/modules/processors/frame/face_swapper.py
index c188393..7c23775 100644
--- a/modules/processors/frame/face_swapper.py
+++ b/modules/processors/frame/face_swapper.py
@@ -25,7 +25,6 @@ models_dir = os.path.join(
     os.path.dirname(os.path.dirname(os.path.dirname(abs_dir))), "models"
 )
 
-
 def pre_check() -> bool:
     download_directory_path = abs_dir
     conditional_download(
@@ -93,6 +92,9 @@ def swap_face(source_face: Face, target_face: Face, temp_frame: Frame) -> Frame:
             swapped_frame = draw_mouth_mask_visualization(
                 swapped_frame, target_face, mouth_mask_data
             )
+    opacity = getattr(modules.globals, "opacity", 1.0)
+    swapped_frame = cv2.addWeighted(temp_frame, 1 - opacity, swapped_frame, opacity, 0)
+
 
     return swapped_frame
 
diff --git a/modules/ui.py b/modules/ui.py
index 8eb9289..d3feee9 100644
--- a/modules/ui.py
+++ b/modules/ui.py
@@ -160,12 +160,12 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C
     select_face_button = ctk.CTkButton(
         root, text=_("Select a face"), cursor="hand2", command=lambda: select_source_path()
     )
-    select_face_button.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)
+    select_face_button.place(relx=0.1, rely=0.375, relwidth=0.3, relheight=0.1)
 
     swap_faces_button = ctk.CTkButton(
         root, text="↔", cursor="hand2", command=lambda: swap_faces_paths()
     )
-    swap_faces_button.place(relx=0.45, rely=0.4, relwidth=0.1, relheight=0.1)
+    swap_faces_button.place(relx=0.45, rely=0.375, relwidth=0.1, relheight=0.1)
 
     select_target_button = ctk.CTkButton(
         root,
@@ -173,7 +173,27 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C
         cursor="hand2",
         command=lambda: select_target_path(),
     )
-    select_target_button.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
+    select_target_button.place(relx=0.6, rely=0.375, relwidth=0.3, relheight=0.1)
+
+    transparency_values = ["25%", "50%", "75%", "100%"]
+    transparency_var = ctk.StringVar(value="100%")  # Default to 100%
+
+    def on_transparency_change(value: str):
+        percentage = int(value.strip('%'))
+        opacity = percentage / 100.0
+        modules.globals.opacity = opacity  # Save opacity globally for real-time updates
+        update_status(f"Transparency set to {value}")
+
+    transparency_label = ctk.CTkLabel(root, text="Transparency:")
+    transparency_label.place(relx=0.1, rely=0.5, relwidth=0.2, relheight=0.05)
+
+    transparency_dropdown = ctk.CTkOptionMenu(
+        root,
+        values=transparency_values,
+        variable=transparency_var,
+        command=on_transparency_change,
+    )
+    transparency_dropdown.place(relx=0.35, rely=0.5, relwidth=0.25, relheight=0.05)
 
     keep_fps_value = ctk.BooleanVar(value=modules.globals.keep_fps)
     keep_fps_checkbox = ctk.CTkSwitch(