diff --git a/shorts_generator2.py b/shorts_generator2.py index 028924b..a7ebe03 100644 --- a/shorts_generator2.py +++ b/shorts_generator2.py @@ -1764,7 +1764,7 @@ class VideoEditor: # Post-Generation Editing Interface class ShortsEditorGUI: - """Interface for editing generated shorts""" + """Interface for editing generated shorts with modern design""" def __init__(self, parent, shorts_folder="shorts"): self.parent = parent @@ -1773,6 +1773,48 @@ class ShortsEditorGUI: self.video_info = None self.editor_window = None + # Modern color scheme + self.colors = { + 'bg_primary': '#1a1a1a', # Dark background + 'bg_secondary': '#2d2d2d', # Medium dark + 'bg_tertiary': '#3d3d3d', # Lighter dark + 'text_primary': '#ffffff', # White text + 'text_secondary': '#cccccc', # Light gray text + 'text_muted': '#888888', # Muted gray text + 'accent_blue': '#4a9eff', # Blue accent + 'accent_green': '#4CAF50', # Green accent + 'accent_orange': '#ff9800', # Orange accent + 'accent_red': '#f44336', # Red accent + 'accent_purple': '#9c27b0', # Purple accent + 'hover': '#4a4a4a', # Hover state + 'border': '#555555' # Border color + } + + # Modern fonts + self.fonts = { + 'heading': ('Segoe UI', 16, 'bold'), + 'subheading': ('Segoe UI', 12, 'bold'), + 'body': ('Segoe UI', 10), + 'caption': ('Segoe UI', 9), + 'mono': ('Consolas', 9) + } + + def add_hover_effect(self, button, hover_color=None): + """Add hover effect to buttons""" + if hover_color is None: + hover_color = self.colors['hover'] + + original_color = button.cget('bg') + + def on_enter(e): + button.config(bg=hover_color) + + def on_leave(e): + button.config(bg=original_color) + + button.bind("", on_enter) + button.bind("", on_leave) + def open_editor(self): """Open the shorts editing interface""" # Find available shorts @@ -1783,13 +1825,14 @@ class ShortsEditorGUI: f"No video files found in '{self.shorts_folder}' folder.\nGenerate some shorts first!") return - # Create editor window + # Create modern editor window self.editor_window = tk.Toplevel(self.parent) self.editor_window.title("đŸŽŦ Shorts Editor - Professional Video Editing") self.editor_window.geometry("1200x800") # Increased width to show all panels self.editor_window.minsize(1000, 700) # Increased minimum size self.editor_window.resizable(True, True) self.editor_window.transient(self.parent) + self.editor_window.configure(bg=self.colors['bg_primary']) # Modern dark background # Make window responsive self.editor_window.rowconfigure(1, weight=1) @@ -1818,40 +1861,66 @@ class ShortsEditorGUI: pass def create_editor_interface(self, shorts_files): - """Create the main editor interface with video player""" - # Title - title_frame = tk.Frame(self.editor_window) + """Create the main editor interface with modern video player""" + # Modern title section + title_frame = tk.Frame(self.editor_window, bg=self.colors['bg_primary']) title_frame.pack(fill="x", padx=20, pady=10) - tk.Label(title_frame, text="đŸŽŦ Professional Shorts Editor", - font=("Arial", 16, "bold")).pack() - tk.Label(title_frame, text="Select and edit your generated shorts with professional tools + Real-time Preview", - font=("Arial", 10), fg="gray").pack() + title_label = tk.Label(title_frame, text="đŸŽŦ Professional Shorts Editor", + font=self.fonts['heading'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary']) + title_label.pack() - # Main content frame - main_frame = tk.Frame(self.editor_window) + subtitle_label = tk.Label(title_frame, + text="Select and edit your generated shorts with professional tools + Real-time Preview", + font=self.fonts['body'], bg=self.colors['bg_primary'], + fg=self.colors['text_secondary']) + subtitle_label.pack() + + # Modern main content frame + main_frame = tk.Frame(self.editor_window, bg=self.colors['bg_primary']) main_frame.pack(fill="both", expand=True, padx=20, pady=10) - # Left panel - Video selection and info - left_panel = tk.Frame(main_frame) + # Modern left panel - Video selection and info + left_panel = tk.Frame(main_frame, bg=self.colors['bg_primary']) left_panel.pack(side="left", fill="y", padx=(0, 10)) - # Video selection frame - selection_frame = tk.LabelFrame(left_panel, text="📁 Select Short to Edit", padx=10, pady=10) + # Modern video selection frame + selection_frame = tk.LabelFrame(left_panel, text="📁 Select Short to Edit", + font=self.fonts['subheading'], + bg=self.colors['bg_secondary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=10) selection_frame.pack(fill="x", pady=(0, 10)) - # Video list with preview info - list_frame = tk.Frame(selection_frame) + # Modern video list container + list_frame = tk.Frame(selection_frame, bg=self.colors['bg_secondary']) list_frame.pack(fill="x") - tk.Label(list_frame, text="Available Shorts:", font=("Arial", 10, "bold")).pack(anchor="w") + list_title = tk.Label(list_frame, text="Available Shorts:", + font=self.fonts['body'], bg=self.colors['bg_secondary'], + fg=self.colors['text_primary']) + list_title.pack(anchor="w") - # Listbox with scrollbar - list_container = tk.Frame(list_frame) + # Modern listbox with scrollbar + list_container = tk.Frame(list_frame, bg=self.colors['bg_secondary']) list_container.pack(fill="x", pady=5) - self.video_listbox = tk.Listbox(list_container, height=4, font=("Courier", 9), width=50) - scrollbar = tk.Scrollbar(list_container, orient="vertical") + self.video_listbox = tk.Listbox(list_container, height=4, + font=self.fonts['mono'], width=50, + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + selectbackground=self.colors['accent_blue'], + selectforeground=self.colors['text_primary'], + bd=0, highlightthickness=1, + highlightcolor=self.colors['accent_blue'], + relief="flat") + + scrollbar = tk.Scrollbar(list_container, orient="vertical", + bg=self.colors['bg_tertiary'], + activebackground=self.colors['accent_blue'], + troughcolor=self.colors['bg_primary']) self.video_listbox.config(yscrollcommand=scrollbar.set) scrollbar.config(command=self.video_listbox.yview) @@ -1883,104 +1952,175 @@ class ShortsEditorGUI: self.video_listbox.bind("<>", on_video_select) - # Current video info - self.info_frame = tk.LabelFrame(left_panel, text="📊 Video Information", padx=10, pady=10) + # Modern video info section + self.info_frame = tk.LabelFrame(left_panel, text="📊 Video Information", + font=self.fonts['subheading'], + bg=self.colors['bg_secondary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=10) self.info_frame.pack(fill="x", pady=(0, 10)) self.info_label = tk.Label(self.info_frame, text="Select a video to see details", - font=("Courier", 9), justify="left") + font=self.fonts['mono'], justify="left", + bg=self.colors['bg_secondary'], + fg=self.colors['text_secondary']) self.info_label.pack(anchor="w") - # Video player frame (center) - player_frame = tk.Frame(main_frame) + # Modern video player frame (center) + player_frame = tk.Frame(main_frame, bg=self.colors['bg_primary']) player_frame.pack(side="left", fill="both", expand=True, padx=10) - # Video player + # Create modern video player self.create_video_player(player_frame) # Editing tools frame (right panel) - Fixed width to ensure visibility - self.tools_frame = tk.LabelFrame(main_frame, text="īŋŊī¸ Professional Editing Tools", padx=10, pady=10) + self.tools_frame = tk.LabelFrame(main_frame, text="đŸ› ī¸ Professional Editing Tools", + font=self.fonts['subheading'], + bg=self.colors['bg_secondary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=10) self.tools_frame.pack(side="right", fill="both", padx=(10, 0), ipadx=10) self.tools_frame.config(width=300) # Set minimum width for tools panel self.create_editing_tools() - # Output and action buttons - action_frame = tk.Frame(self.editor_window) + # Modern output and action buttons + action_frame = tk.Frame(self.editor_window, bg=self.colors['bg_primary']) action_frame.pack(fill="x", padx=20, pady=10) - # Output folder selection - output_folder_frame = tk.Frame(action_frame) + # Modern output folder selection + output_folder_frame = tk.Frame(action_frame, bg=self.colors['bg_primary']) output_folder_frame.pack(fill="x", pady=5) - tk.Label(output_folder_frame, text="Output Folder:", font=("Arial", 9, "bold")).pack(side="left") + output_label = tk.Label(output_folder_frame, text="Output Folder:", + font=self.fonts['body'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary']) + output_label.pack(side="left") + self.output_folder = tk.StringVar(value=os.path.join(self.shorts_folder, "edited")) - output_entry = tk.Entry(output_folder_frame, textvariable=self.output_folder, width=40) + output_entry = tk.Entry(output_folder_frame, textvariable=self.output_folder, width=40, + font=self.fonts['body'], bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], insertbackground=self.colors['text_primary'], + bd=0, relief="flat") output_entry.pack(side="left", padx=(10, 5)) - tk.Button(output_folder_frame, text="Browse", - command=self.select_output_folder).pack(side="left") + browse_btn = tk.Button(output_folder_frame, text="Browse", + command=self.select_output_folder, + font=self.fonts['body'], bg=self.colors['accent_blue'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=15, pady=5) + browse_btn.pack(side="left") + self.add_hover_effect(browse_btn) - # Action buttons - button_frame = tk.Frame(action_frame) + # Modern action buttons + button_frame = tk.Frame(action_frame, bg=self.colors['bg_primary']) button_frame.pack(fill="x", pady=15) # Increased padding for better visibility - tk.Button(button_frame, text="🔄 Refresh List", - command=self.refresh_video_list, bg="#2196F3", fg="white", - font=("Arial", 10), pady=5).pack(side="left", padx=8) + # Refresh button + refresh_btn = tk.Button(button_frame, text="🔄 Refresh List", + command=self.refresh_video_list, + bg=self.colors['accent_blue'], fg=self.colors['text_primary'], + font=self.fonts['body'], bd=0, relief="flat", + padx=15, pady=8) + refresh_btn.pack(side="left", padx=8) + self.add_hover_effect(refresh_btn) - tk.Button(button_frame, text="📂 Open Shorts Folder", - command=self.open_shorts_folder, bg="#FF9800", fg="white", - font=("Arial", 10), pady=5).pack(side="left", padx=8) + # Open folder button + folder_btn = tk.Button(button_frame, text="📂 Open Shorts Folder", + command=self.open_shorts_folder, + bg=self.colors['accent_orange'], fg=self.colors['text_primary'], + font=self.fonts['body'], bd=0, relief="flat", + padx=15, pady=8) + folder_btn.pack(side="left", padx=8) + self.add_hover_effect(folder_btn) - tk.Button(button_frame, text="❌ Close Editor", - command=self.close_editor, bg="#F44336", fg="white", - font=("Arial", 10), pady=5).pack(side="right", padx=8) + # Close button + close_btn = tk.Button(button_frame, text="❌ Close Editor", + command=self.close_editor, + bg=self.colors['accent_red'], fg=self.colors['text_primary'], + font=self.fonts['body'], bd=0, relief="flat", + padx=15, pady=8) + close_btn.pack(side="right", padx=8) + self.add_hover_effect(close_btn) def create_video_player(self, parent_frame): - """Create the video player with timeline controls""" - player_label_frame = tk.LabelFrame(parent_frame, text="đŸŽĨ Real-time Video Player", padx=10, pady=10) + """Create the modern video player with timeline controls""" + player_label_frame = tk.LabelFrame(parent_frame, text="đŸŽĨ Real-time Video Player", + font=self.fonts['subheading'], + bg=self.colors['bg_secondary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=10) player_label_frame.pack(fill="both", expand=True) - # Video display canvas - self.video_canvas = tk.Canvas(player_label_frame, width=400, height=300, bg="black", relief="sunken", bd=2) + # Modern video display canvas + self.video_canvas = tk.Canvas(player_label_frame, width=400, height=300, + bg=self.colors['bg_primary'], relief="flat", bd=0, + highlightthickness=1, highlightcolor=self.colors['border']) self.video_canvas.pack(pady=10) - # Player controls frame - controls_frame = tk.Frame(player_label_frame) + # Modern player controls frame + controls_frame = tk.Frame(player_label_frame, bg=self.colors['bg_secondary']) controls_frame.pack(fill="x", pady=5) - # Timeline slider - timeline_frame = tk.Frame(controls_frame) + # Modern timeline slider + timeline_frame = tk.Frame(controls_frame, bg=self.colors['bg_secondary']) timeline_frame.pack(fill="x", pady=5) - tk.Label(timeline_frame, text="Timeline:", font=("Arial", 9, "bold")).pack(anchor="w") + timeline_label = tk.Label(timeline_frame, text="Timeline:", + font=self.fonts['body'], bg=self.colors['bg_secondary'], + fg=self.colors['text_primary']) + timeline_label.pack(anchor="w") self.timeline_var = tk.DoubleVar() self.timeline_slider = tk.Scale(timeline_frame, from_=0, to=100, orient="horizontal", variable=self.timeline_var, command=self.on_timeline_change, - length=380, resolution=0.1) + length=380, resolution=0.1, + bg=self.colors['bg_secondary'], + fg=self.colors['text_primary'], + activebackground=self.colors['accent_blue'], + troughcolor=self.colors['bg_tertiary'], + highlightthickness=0, bd=0, relief="flat") self.timeline_slider.pack(fill="x") - # Play controls - play_controls_frame = tk.Frame(controls_frame) + # Modern play controls + play_controls_frame = tk.Frame(controls_frame, bg=self.colors['bg_secondary']) play_controls_frame.pack(pady=5) self.play_button = tk.Button(play_controls_frame, text="â–ļī¸ Play", command=self.toggle_play, - font=("Arial", 10, "bold"), bg="#4CAF50", fg="white") + font=self.fonts['body'], bg=self.colors['accent_green'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=15, pady=5) self.play_button.pack(side="left", padx=5) + self.add_hover_effect(self.play_button) - tk.Button(play_controls_frame, text="âšī¸ Stop", command=self.stop_video, - font=("Arial", 10, "bold"), bg="#F44336", fg="white").pack(side="left", padx=5) + stop_btn = tk.Button(play_controls_frame, text="âšī¸ Stop", command=self.stop_video, + font=self.fonts['body'], bg=self.colors['accent_red'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=15, pady=5) + stop_btn.pack(side="left", padx=5) + self.add_hover_effect(stop_btn) - tk.Button(play_controls_frame, text="âĒ -5s", command=lambda: self.seek_relative(-5), - font=("Arial", 9), bg="#FF9800", fg="white").pack(side="left", padx=2) + seek_back_btn = tk.Button(play_controls_frame, text="âĒ -5s", command=lambda: self.seek_relative(-5), + font=self.fonts['caption'], bg=self.colors['accent_orange'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=5) + seek_back_btn.pack(side="left", padx=2) + self.add_hover_effect(seek_back_btn) - tk.Button(play_controls_frame, text="⏊ +5s", command=lambda: self.seek_relative(5), - font=("Arial", 9), bg="#FF9800", fg="white").pack(side="left", padx=2) + seek_forward_btn = tk.Button(play_controls_frame, text="⏊ +5s", command=lambda: self.seek_relative(5), + font=self.fonts['caption'], bg=self.colors['accent_orange'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=5) + seek_forward_btn.pack(side="left", padx=2) + self.add_hover_effect(seek_forward_btn) - # Time display - self.time_label = tk.Label(controls_frame, text="00:00 / 00:00", font=("Arial", 10, "bold")) + # Modern time display + self.time_label = tk.Label(controls_frame, text="00:00 / 00:00", + font=self.fonts['body'], bg=self.colors['bg_secondary'], + fg=self.colors['text_primary']) self.time_label.pack(pady=5) # Player state variables @@ -2181,307 +2321,578 @@ class ShortsEditorGUI: def create_editing_tools(self): """Create the professional editing tools interface""" - # Create notebook for organized tools - notebook = ttk.Notebook(self.tools_frame) + # Create modern notebook for organized tools + style = ttk.Style() + style.theme_use('clam') + + # Configure modern notebook styling + style.configure('Modern.TNotebook', + background=self.colors['bg_secondary'], + borderwidth=0) + style.configure('Modern.TNotebook.Tab', + background=self.colors['bg_tertiary'], + foreground=self.colors['text_primary'], + padding=[8, 4], + borderwidth=0) + style.map('Modern.TNotebook.Tab', + background=[('selected', self.colors['accent_blue']), + ('active', self.colors['hover'])]) + + notebook = ttk.Notebook(self.tools_frame, style='Modern.TNotebook') notebook.pack(fill="both", expand=True) - # Basic Editing Tab - basic_frame = ttk.Frame(notebook) + # Modern Basic Editing Tab + basic_frame = tk.Frame(notebook, bg=self.colors['bg_secondary']) notebook.add(basic_frame, text="âœ‚ī¸ Basic Editing") - # Trim Tool - trim_frame = tk.LabelFrame(basic_frame, text="âœ‚ī¸ Trim Video", padx=10, pady=5) + # Modern Trim Tool + trim_frame = tk.LabelFrame(basic_frame, text="âœ‚ī¸ Trim Video", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) trim_frame.pack(fill="x", padx=10, pady=5) - trim_controls = tk.Frame(trim_frame) + trim_controls = tk.Frame(trim_frame, bg=self.colors['bg_tertiary']) trim_controls.pack(fill="x") - tk.Label(trim_controls, text="Start:").pack(side="left") + # Start time control + start_label = tk.Label(trim_controls, text="Start:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + start_label.pack(side="left") + self.trim_start = tk.DoubleVar(value=0.0) - tk.Spinbox(trim_controls, from_=0, to=120, increment=0.1, width=8, - textvariable=self.trim_start, format="%.1f").pack(side="left", padx=5) + start_spinbox = tk.Spinbox(trim_controls, from_=0, to=120, increment=0.1, width=8, + textvariable=self.trim_start, format="%.1f", + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + start_spinbox.pack(side="left", padx=5) + + # End time control + end_label = tk.Label(trim_controls, text="End:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + end_label.pack(side="left", padx=(10, 0)) - tk.Label(trim_controls, text="End:").pack(side="left", padx=(10, 0)) self.trim_end = tk.DoubleVar(value=5.0) - tk.Spinbox(trim_controls, from_=0, to=120, increment=0.1, width=8, - textvariable=self.trim_end, format="%.1f").pack(side="left", padx=5) + end_spinbox = tk.Spinbox(trim_controls, from_=0, to=120, increment=0.1, width=8, + textvariable=self.trim_end, format="%.1f", + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + end_spinbox.pack(side="left", padx=5) - tk.Button(trim_controls, text="âœ‚ī¸ Trim Video", - command=self.trim_video, bg="#4CAF50", fg="white").pack(side="right", padx=10) + # Modern trim button + trim_btn = tk.Button(trim_controls, text="âœ‚ī¸ Trim Video", + command=self.trim_video, + font=self.fonts['caption'], bg=self.colors['accent_green'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + trim_btn.pack(side="right", padx=10) + self.add_hover_effect(trim_btn) - # Speed Tool - speed_frame = tk.LabelFrame(basic_frame, text="⚡ Speed Control", padx=10, pady=5) + # Modern Speed Tool + speed_frame = tk.LabelFrame(basic_frame, text="⚡ Speed Control", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) speed_frame.pack(fill="x", padx=10, pady=5) - speed_controls = tk.Frame(speed_frame) + speed_controls = tk.Frame(speed_frame, bg=self.colors['bg_tertiary']) speed_controls.pack(fill="x") - tk.Label(speed_controls, text="Speed:").pack(side="left") + # Speed control + speed_label = tk.Label(speed_controls, text="Speed:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + speed_label.pack(side="left") + self.speed_factor = tk.DoubleVar(value=1.0) speed_spinbox = tk.Spinbox(speed_controls, from_=0.1, to=5.0, increment=0.1, width=8, - textvariable=self.speed_factor, format="%.1f") + textvariable=self.speed_factor, format="%.1f", + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") speed_spinbox.pack(side="left", padx=5) - tk.Label(speed_controls, text="(0.5=slow, 1.0=normal, 2.0=fast)").pack(side="left", padx=5) - tk.Button(speed_controls, text="⚡ Apply Speed", - command=self.adjust_speed, bg="#FF9800", fg="white").pack(side="right", padx=10) + # Speed hint + speed_hint = tk.Label(speed_controls, text="(0.5=slow, 1.0=normal, 2.0=fast)", + font=('Segoe UI', 7), bg=self.colors['bg_tertiary'], + fg=self.colors['text_muted']) + speed_hint.pack(side="left", padx=5) - # Effects Tab - effects_frame = ttk.Frame(notebook) + # Modern speed button + speed_btn = tk.Button(speed_controls, text="⚡ Apply Speed", + command=self.adjust_speed, + font=self.fonts['caption'], bg=self.colors['accent_orange'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + speed_btn.pack(side="right", padx=10) + self.add_hover_effect(speed_btn) + + # Modern Effects Tab + effects_frame = tk.Frame(notebook, bg=self.colors['bg_secondary']) notebook.add(effects_frame, text="✨ Effects") - # Fade Effects - fade_frame = tk.LabelFrame(effects_frame, text="🌅 Fade Effects", padx=10, pady=5) + # Modern Fade Effects + fade_frame = tk.LabelFrame(effects_frame, text="🌅 Fade Effects", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) fade_frame.pack(fill="x", padx=10, pady=5) - fade_controls = tk.Frame(fade_frame) + fade_controls = tk.Frame(fade_frame, bg=self.colors['bg_tertiary']) fade_controls.pack(fill="x") - tk.Label(fade_controls, text="Fade In:").pack(side="left") + # Fade in control + fade_in_label = tk.Label(fade_controls, text="Fade In:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + fade_in_label.pack(side="left") + self.fade_in = tk.DoubleVar(value=0.5) - tk.Spinbox(fade_controls, from_=0, to=5, increment=0.1, width=6, - textvariable=self.fade_in, format="%.1f").pack(side="left", padx=5) + fade_in_spinbox = tk.Spinbox(fade_controls, from_=0, to=5, increment=0.1, width=6, + textvariable=self.fade_in, format="%.1f", + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + fade_in_spinbox.pack(side="left", padx=5) + + # Fade out control + fade_out_label = tk.Label(fade_controls, text="Fade Out:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + fade_out_label.pack(side="left", padx=(10, 0)) - tk.Label(fade_controls, text="Fade Out:").pack(side="left", padx=(10, 0)) self.fade_out = tk.DoubleVar(value=0.5) - tk.Spinbox(fade_controls, from_=0, to=5, increment=0.1, width=6, - textvariable=self.fade_out, format="%.1f").pack(side="left", padx=5) + fade_out_spinbox = tk.Spinbox(fade_controls, from_=0, to=5, increment=0.1, width=6, + textvariable=self.fade_out, format="%.1f", + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + fade_out_spinbox.pack(side="left", padx=5) - tk.Button(fade_controls, text="🌅 Add Fades", - command=self.add_fades, bg="#9C27B0", fg="white").pack(side="right", padx=10) + # Modern fade button + fade_btn = tk.Button(fade_controls, text="🌅 Add Fades", + command=self.add_fades, + font=self.fonts['caption'], bg=self.colors['accent_purple'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + fade_btn.pack(side="right", padx=10) + self.add_hover_effect(fade_btn) - # Volume Control - volume_frame = tk.LabelFrame(effects_frame, text="🔊 Volume Control", padx=10, pady=5) + # Modern Volume Control + volume_frame = tk.LabelFrame(effects_frame, text="🔊 Volume Control", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) volume_frame.pack(fill="x", padx=10, pady=5) - volume_controls = tk.Frame(volume_frame) + volume_controls = tk.Frame(volume_frame, bg=self.colors['bg_tertiary']) volume_controls.pack(fill="x") - tk.Label(volume_controls, text="Volume:").pack(side="left") + # Volume control + volume_label = tk.Label(volume_controls, text="Volume:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + volume_label.pack(side="left") + self.volume_factor = tk.DoubleVar(value=1.0) - tk.Spinbox(volume_controls, from_=0, to=3, increment=0.1, width=6, - textvariable=self.volume_factor, format="%.1f").pack(side="left", padx=5) + volume_spinbox = tk.Spinbox(volume_controls, from_=0, to=3, increment=0.1, width=6, + textvariable=self.volume_factor, format="%.1f", + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + volume_spinbox.pack(side="left", padx=5) - tk.Label(volume_controls, text="(0.0=mute, 1.0=normal, 2.0=loud)").pack(side="left", padx=5) - tk.Button(volume_controls, text="🔊 Adjust Volume", - command=self.adjust_volume, bg="#3F51B5", fg="white").pack(side="right", padx=10) + # Volume hint + volume_hint = tk.Label(volume_controls, text="(0.0=mute, 1.0=normal, 2.0=loud)", + font=('Segoe UI', 7), bg=self.colors['bg_tertiary'], + fg=self.colors['text_muted']) + volume_hint.pack(side="left", padx=5) - # Transform Tab - transform_frame = ttk.Frame(notebook) + # Modern volume button + volume_btn = tk.Button(volume_controls, text="🔊 Adjust Volume", + command=self.adjust_volume, + font=self.fonts['caption'], bg=self.colors['accent_blue'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + volume_btn.pack(side="right", padx=10) + self.add_hover_effect(volume_btn) + + # Modern Transform Tab + transform_frame = tk.Frame(notebook, bg=self.colors['bg_secondary']) notebook.add(transform_frame, text="🔄 Transform") - # Resize Tool - resize_frame = tk.LabelFrame(transform_frame, text="📐 Resize Video", padx=10, pady=5) + # Modern Resize Tool + resize_frame = tk.LabelFrame(transform_frame, text="📐 Resize Video", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) resize_frame.pack(fill="x", padx=10, pady=5) - resize_controls = tk.Frame(resize_frame) + resize_controls = tk.Frame(resize_frame, bg=self.colors['bg_tertiary']) resize_controls.pack(fill="x") - tk.Label(resize_controls, text="Width:").pack(side="left") + # Width control + width_label = tk.Label(resize_controls, text="Width:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + width_label.pack(side="left") + self.resize_width = tk.IntVar(value=1080) - tk.Spinbox(resize_controls, from_=240, to=4320, increment=120, width=6, - textvariable=self.resize_width).pack(side="left", padx=5) + width_spinbox = tk.Spinbox(resize_controls, from_=240, to=4320, increment=120, width=6, + textvariable=self.resize_width, + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + width_spinbox.pack(side="left", padx=5) + + # Height control + height_label = tk.Label(resize_controls, text="Height:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + height_label.pack(side="left", padx=(10, 0)) - tk.Label(resize_controls, text="Height:").pack(side="left", padx=(10, 0)) self.resize_height = tk.IntVar(value=1920) - tk.Spinbox(resize_controls, from_=240, to=4320, increment=120, width=6, - textvariable=self.resize_height).pack(side="left", padx=5) + height_spinbox = tk.Spinbox(resize_controls, from_=240, to=4320, increment=120, width=6, + textvariable=self.resize_height, + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + height_spinbox.pack(side="left", padx=5) - tk.Button(resize_controls, text="📐 Resize", - command=self.resize_video, bg="#607D8B", fg="white").pack(side="right", padx=10) + # Modern resize button + resize_btn = tk.Button(resize_controls, text="📐 Resize", + command=self.resize_video, + font=self.fonts['caption'], bg=self.colors['accent_green'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + resize_btn.pack(side="right", padx=10) + self.add_hover_effect(resize_btn) - # Text Overlay Tab - text_frame = ttk.Frame(notebook) + # Modern Text Overlay Tab + text_frame = tk.Frame(notebook, bg=self.colors['bg_secondary']) notebook.add(text_frame, text="📝 Text Overlay") - text_overlay_frame = tk.LabelFrame(text_frame, text="📝 Add Text Overlay", padx=10, pady=5) + text_overlay_frame = tk.LabelFrame(text_frame, text="📝 Add Text Overlay", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) text_overlay_frame.pack(fill="x", padx=10, pady=5) - # Text input - text_input_frame = tk.Frame(text_overlay_frame) + # Modern text input + text_input_frame = tk.Frame(text_overlay_frame, bg=self.colors['bg_tertiary']) text_input_frame.pack(fill="x", pady=5) - tk.Label(text_input_frame, text="Text:").pack(side="left") - self.overlay_text = tk.StringVar(value="Your Text Here") - tk.Entry(text_input_frame, textvariable=self.overlay_text, width=30).pack(side="left", padx=5) + text_label = tk.Label(text_input_frame, text="Text:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + text_label.pack(side="left") - # Text settings - text_settings_frame = tk.Frame(text_overlay_frame) + self.overlay_text = tk.StringVar(value="Your Text Here") + text_entry = tk.Entry(text_input_frame, textvariable=self.overlay_text, width=30, + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + text_entry.pack(side="left", padx=5) + + # Modern text settings + text_settings_frame = tk.Frame(text_overlay_frame, bg=self.colors['bg_tertiary']) text_settings_frame.pack(fill="x", pady=5) - tk.Label(text_settings_frame, text="Size:").pack(side="left") - self.text_size = tk.IntVar(value=50) - tk.Spinbox(text_settings_frame, from_=20, to=150, width=6, - textvariable=self.text_size).pack(side="left", padx=5) + # Text size control + size_label = tk.Label(text_settings_frame, text="Size:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + size_label.pack(side="left") + + self.text_size = tk.IntVar(value=50) + size_spinbox = tk.Spinbox(text_settings_frame, from_=20, to=150, width=6, + textvariable=self.text_size, + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + size_spinbox.pack(side="left", padx=5) + + # Text position control + position_label = tk.Label(text_settings_frame, text="Position:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + position_label.pack(side="left", padx=(10, 0)) - tk.Label(text_settings_frame, text="Position:").pack(side="left", padx=(10, 0)) self.text_position = tk.StringVar(value="center,bottom") position_combo = ttk.Combobox(text_settings_frame, textvariable=self.text_position, width=15, values=["center,top", "center,center", "center,bottom", "left,top", "right,top", "left,bottom", "right,bottom"], - state="readonly") + state="readonly", font=self.fonts['caption']) position_combo.pack(side="left", padx=5) - # Speed/Quality options - speed_frame = tk.Frame(text_overlay_frame) + # Modern speed/quality options + speed_frame = tk.Frame(text_overlay_frame, bg=self.colors['bg_tertiary']) speed_frame.pack(fill="x", pady=5) - tk.Label(speed_frame, text="Processing Method:", font=("Arial", 9, "bold")).pack(side="left") + method_label = tk.Label(speed_frame, text="Processing Method:", font=self.fonts['subheading'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + method_label.pack(side="left") + self.text_method = tk.StringVar(value="fast") - method_frame = tk.Frame(speed_frame) + method_frame = tk.Frame(speed_frame, bg=self.colors['bg_tertiary']) method_frame.pack(side="left", padx=10) - tk.Radiobutton(method_frame, text="🚀 Fast (PIL)", variable=self.text_method, - value="fast", font=("Arial", 8)).pack(side="left") - tk.Radiobutton(method_frame, text="đŸŽŦ High Quality (MoviePy)", variable=self.text_method, - value="quality", font=("Arial", 8)).pack(side="left", padx=(10, 0)) + fast_radio = tk.Radiobutton(method_frame, text="🚀 Fast (PIL)", variable=self.text_method, + value="fast", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], + selectcolor=self.colors['accent_blue']) + fast_radio.pack(side="left") + + quality_radio = tk.Radiobutton(method_frame, text="đŸŽŦ High Quality (MoviePy)", variable=self.text_method, + value="quality", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], + selectcolor=self.colors['accent_blue']) + quality_radio.pack(side="left", padx=(10, 0)) # Info label for method explanation method_info = tk.Label(speed_frame, text="Fast: 3-5x faster, basic text | Quality: Slower, advanced effects", - font=("Arial", 7), fg="gray") + font=('Segoe UI', 7), fg=self.colors['text_muted'], + bg=self.colors['bg_tertiary']) method_info.pack(side="right") - # Button frame - button_frame = tk.Frame(text_overlay_frame) + # Modern button frame + button_frame = tk.Frame(text_overlay_frame, bg=self.colors['bg_tertiary']) button_frame.pack(fill="x", pady=5) - tk.Button(button_frame, text="📝 Add Text Overlay", - command=self.add_text_overlay, bg="#795548", fg="white", - font=("Arial", 10, "bold")).pack(side="right", padx=10) + text_btn = tk.Button(button_frame, text="📝 Add Text Overlay", + command=self.add_text_overlay, + font=self.fonts['subheading'], bg=self.colors['accent_orange'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=15, pady=5) + text_btn.pack(side="right", padx=10) + self.add_hover_effect(text_btn) - # Video Effects Tab - NEW - effects_advanced_frame = ttk.Frame(notebook) + # Modern Video Effects Tab + effects_advanced_frame = tk.Frame(notebook, bg=self.colors['bg_secondary']) notebook.add(effects_advanced_frame, text="🎨 Video Effects") - # Blur Effect - blur_frame = tk.LabelFrame(effects_advanced_frame, text="đŸŒĢī¸ Blur Effect", padx=10, pady=5) + # Modern Blur Effect + blur_frame = tk.LabelFrame(effects_advanced_frame, text="đŸŒĢī¸ Blur Effect", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) blur_frame.pack(fill="x", padx=10, pady=5) - blur_controls = tk.Frame(blur_frame) + blur_controls = tk.Frame(blur_frame, bg=self.colors['bg_tertiary']) blur_controls.pack(fill="x") - tk.Label(blur_controls, text="Strength:").pack(side="left") + blur_label = tk.Label(blur_controls, text="Strength:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + blur_label.pack(side="left") + self.blur_strength = tk.DoubleVar(value=2.0) - tk.Scale(blur_controls, from_=0.1, to=10.0, resolution=0.1, orient="horizontal", - variable=self.blur_strength, length=150).pack(side="left", padx=5) + blur_scale = tk.Scale(blur_controls, from_=0.1, to=10.0, resolution=0.1, orient="horizontal", + variable=self.blur_strength, length=150, + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], + troughcolor=self.colors['bg_primary'], highlightthickness=0) + blur_scale.pack(side="left", padx=5) - tk.Button(blur_controls, text="đŸŒĢī¸ Apply Blur", - command=self.apply_blur_effect, bg="#795548", fg="white").pack(side="right", padx=10) + blur_btn = tk.Button(blur_controls, text="đŸŒĢī¸ Apply Blur", + command=self.apply_blur_effect, + font=self.fonts['caption'], bg=self.colors['accent_orange'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + blur_btn.pack(side="right", padx=10) + self.add_hover_effect(blur_btn) - # Color Effects - color_frame = tk.LabelFrame(effects_advanced_frame, text="🎨 Color Effects", padx=10, pady=5) + # Modern Color Effects + color_frame = tk.LabelFrame(effects_advanced_frame, text="🎨 Color Effects", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) color_frame.pack(fill="x", padx=10, pady=5) - color_controls = tk.Frame(color_frame) + color_controls = tk.Frame(color_frame, bg=self.colors['bg_tertiary']) color_controls.pack(fill="x") - tk.Label(color_controls, text="Effect:").pack(side="left") + effect_label = tk.Label(color_controls, text="Effect:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + effect_label.pack(side="left") + self.color_effect_var = tk.StringVar(value="sepia") color_combo = ttk.Combobox(color_controls, textvariable=self.color_effect_var, - values=["sepia", "grayscale", "vintage", "cool"], width=12, state="readonly") + values=["sepia", "grayscale", "vintage", "cool"], width=12, + state="readonly", font=self.fonts['caption']) color_combo.pack(side="left", padx=5) - tk.Button(color_controls, text="🎨 Apply Color Effect", - command=self.apply_color_effect, bg="#E91E63", fg="white").pack(side="right", padx=10) + color_btn = tk.Button(color_controls, text="🎨 Apply Color Effect", + command=self.apply_color_effect, + font=self.fonts['caption'], bg=self.colors['accent_red'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + color_btn.pack(side="right", padx=10) + self.add_hover_effect(color_btn) - # Zoom Effects - zoom_frame = tk.LabelFrame(effects_advanced_frame, text="🔍 Zoom Effects", padx=10, pady=5) + # Modern Zoom Effects + zoom_frame = tk.LabelFrame(effects_advanced_frame, text="🔍 Zoom Effects", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) zoom_frame.pack(fill="x", padx=10, pady=5) - zoom_controls = tk.Frame(zoom_frame) + zoom_controls = tk.Frame(zoom_frame, bg=self.colors['bg_tertiary']) zoom_controls.pack(fill="x") - tk.Label(zoom_controls, text="Type:").pack(side="left") + # Zoom type control + zoom_type_label = tk.Label(zoom_controls, text="Type:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + zoom_type_label.pack(side="left") + self.zoom_effect_var = tk.StringVar(value="zoom_in") zoom_combo = ttk.Combobox(zoom_controls, textvariable=self.zoom_effect_var, - values=["zoom_in", "zoom_out", "static"], width=10, state="readonly") + values=["zoom_in", "zoom_out", "static"], width=10, + state="readonly", font=self.fonts['caption']) zoom_combo.pack(side="left", padx=5) - tk.Label(zoom_controls, text="Factor:").pack(side="left", padx=(10, 0)) + # Zoom factor control + factor_label = tk.Label(zoom_controls, text="Factor:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + factor_label.pack(side="left", padx=(10, 0)) + self.zoom_factor = tk.DoubleVar(value=1.5) - tk.Scale(zoom_controls, from_=1.0, to=3.0, resolution=0.1, orient="horizontal", - variable=self.zoom_factor, length=100).pack(side="left", padx=5) + zoom_scale = tk.Scale(zoom_controls, from_=1.0, to=3.0, resolution=0.1, orient="horizontal", + variable=self.zoom_factor, length=100, + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], + troughcolor=self.colors['bg_primary'], highlightthickness=0) + zoom_scale.pack(side="left", padx=5) - tk.Button(zoom_controls, text="🔍 Apply Zoom", - command=self.apply_zoom_effect, bg="#3F51B5", fg="white").pack(side="right", padx=10) + zoom_btn = tk.Button(zoom_controls, text="🔍 Apply Zoom", + command=self.apply_zoom_effect, + font=self.fonts['caption'], bg=self.colors['accent_blue'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + zoom_btn.pack(side="right", padx=10) + self.add_hover_effect(zoom_btn) - # Rotation Effects - rotation_frame = tk.LabelFrame(effects_advanced_frame, text="🔄 Rotation Effects", padx=10, pady=5) + # Modern Rotation Effects + rotation_frame = tk.LabelFrame(effects_advanced_frame, text="🔄 Rotation Effects", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) rotation_frame.pack(fill="x", padx=10, pady=5) - rotation_controls = tk.Frame(rotation_frame) + rotation_controls = tk.Frame(rotation_frame, bg=self.colors['bg_tertiary']) rotation_controls.pack(fill="x") - tk.Label(rotation_controls, text="Type:").pack(side="left") + # Rotation type control + rotation_type_label = tk.Label(rotation_controls, text="Type:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + rotation_type_label.pack(side="left") + self.rotation_type_var = tk.StringVar(value="static") rotation_combo = ttk.Combobox(rotation_controls, textvariable=self.rotation_type_var, - values=["static", "spinning"], width=10, state="readonly") + values=["static", "spinning"], width=10, + state="readonly", font=self.fonts['caption']) rotation_combo.pack(side="left", padx=5) - tk.Label(rotation_controls, text="Angle:").pack(side="left", padx=(10, 0)) + # Rotation angle control + angle_label = tk.Label(rotation_controls, text="Angle:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + angle_label.pack(side="left", padx=(10, 0)) + self.rotation_angle = tk.DoubleVar(value=0.0) - tk.Scale(rotation_controls, from_=-180, to=180, resolution=5, orient="horizontal", - variable=self.rotation_angle, length=120).pack(side="left", padx=5) + rotation_scale = tk.Scale(rotation_controls, from_=-180, to=180, resolution=5, orient="horizontal", + variable=self.rotation_angle, length=120, + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], + troughcolor=self.colors['bg_primary'], highlightthickness=0) + rotation_scale.pack(side="left", padx=5) - tk.Button(rotation_controls, text="🔄 Apply Rotation", - command=self.apply_rotation_effect, bg="#FF5722", fg="white").pack(side="right", padx=10) + rotation_btn = tk.Button(rotation_controls, text="🔄 Apply Rotation", + command=self.apply_rotation_effect, + font=self.fonts['caption'], bg=self.colors['accent_red'], + fg=self.colors['text_primary'], bd=0, relief="flat", + padx=10, pady=3) + rotation_btn.pack(side="right", padx=10) + self.add_hover_effect(rotation_btn) - # Export Tab - export_frame = ttk.Frame(notebook) + # Modern Export Tab + export_frame = tk.Frame(notebook, bg=self.colors['bg_secondary']) notebook.add(export_frame, text="💾 Export") - export_controls_frame = tk.LabelFrame(export_frame, text="💾 Export Final Video", padx=10, pady=5) + export_controls_frame = tk.LabelFrame(export_frame, text="💾 Export Final Video", + font=self.fonts['body'], + bg=self.colors['bg_tertiary'], + fg=self.colors['text_primary'], + bd=1, relief="flat", + padx=10, pady=5) export_controls_frame.pack(fill="x", padx=10, pady=5) - # Output filename - filename_frame = tk.Frame(export_controls_frame) + # Modern output filename + filename_frame = tk.Frame(export_controls_frame, bg=self.colors['bg_tertiary']) filename_frame.pack(fill="x", pady=5) - tk.Label(filename_frame, text="Filename:").pack(side="left") - self.output_filename = tk.StringVar(value="edited_video.mp4") - tk.Entry(filename_frame, textvariable=self.output_filename, width=25).pack(side="left", padx=5) + filename_label = tk.Label(filename_frame, text="Filename:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + filename_label.pack(side="left") - # Quality settings - quality_frame = tk.Frame(export_controls_frame) + self.output_filename = tk.StringVar(value="edited_video.mp4") + filename_entry = tk.Entry(filename_frame, textvariable=self.output_filename, width=25, + font=self.fonts['caption'], bg=self.colors['bg_primary'], + fg=self.colors['text_primary'], bd=0, relief="flat") + filename_entry.pack(side="left", padx=5) + + # Modern quality settings + quality_frame = tk.Frame(export_controls_frame, bg=self.colors['bg_tertiary']) quality_frame.pack(fill="x", pady=5) - tk.Label(quality_frame, text="Quality:").pack(side="left") + quality_label = tk.Label(quality_frame, text="Quality:", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) + quality_label.pack(side="left") + self.export_quality = tk.StringVar(value="medium") quality_combo = ttk.Combobox(quality_frame, textvariable=self.export_quality, - values=["low", "medium", "high"], width=10, state="readonly") + values=["low", "medium", "high"], width=10, + state="readonly", font=self.fonts['caption']) quality_combo.pack(side="left", padx=5) - # Export button - export_button_frame = tk.Frame(export_controls_frame) + # Modern export button frame + export_button_frame = tk.Frame(export_controls_frame, bg=self.colors['bg_tertiary']) export_button_frame.pack(fill="x", pady=10) self.export_button = tk.Button(export_button_frame, text="💾 Export Final Video", - command=self.export_edited_video, bg="#4CAF50", fg="white", - font=("Arial", 12, "bold")) + command=self.export_edited_video, + bg=self.colors['accent_green'], fg=self.colors['text_primary'], + font=self.fonts['subheading'], bd=0, relief="flat", + padx=15, pady=8) self.export_button.pack(pady=5) + self.add_hover_effect(self.export_button) # Progress bar (initially hidden) self.progress_var = tk.DoubleVar() self.progress_bar = ttk.Progressbar(export_button_frame, variable=self.progress_var, maximum=100) - self.progress_label = tk.Label(export_button_frame, text="", font=("Arial", 9)) + self.progress_label = tk.Label(export_button_frame, text="", font=self.fonts['caption'], + bg=self.colors['bg_tertiary'], fg=self.colors['text_primary']) # Reset button - tk.Button(export_button_frame, text="🔄 Reset All Changes", command=self.reset_edited_video, - bg="#F44336", fg="white", font=("Arial", 10)).pack(pady=5) + reset_btn = tk.Button(export_button_frame, text="🔄 Reset All Changes", command=self.reset_edited_video, + bg=self.colors['accent_red'], fg=self.colors['text_primary'], + font=self.fonts['caption'], bd=0, relief="flat", + padx=15, pady=5) + reset_btn.pack(pady=5) + self.add_hover_effect(reset_btn) # Initially disable all tools self.disable_editing_tools() def disable_editing_tools(self): """Disable all editing tools until a video is selected""" + # Only disable functionality, keep visual appearance normal for widget in self.tools_frame.winfo_children(): - self.set_widget_state(widget, "disabled") + self.set_widget_disabled_state(widget, True) def enable_editing_tools(self): """Enable editing tools when a video is selected""" for widget in self.tools_frame.winfo_children(): - self.set_widget_state(widget, "normal") + self.set_widget_disabled_state(widget, False) # Initialize video editor for current video try: @@ -2495,6 +2906,32 @@ class ShortsEditorGUI: if self.video_info: self.trim_end.set(min(self.video_info['duration'], 30.0)) + def set_widget_disabled_state(self, widget, disabled): + """Set widget disabled state while preserving appearance""" + try: + widget_class = widget.winfo_class() + if widget_class == 'Button': + if disabled: + # Store original command and disable it, but keep colors + if not hasattr(widget, '_original_command'): + widget._original_command = widget.cget('command') + # Disable the command but keep the visual appearance + widget.config(command=lambda: messagebox.showwarning("Select Video", "Please select a video first!")) + else: + # Restore original command + if hasattr(widget, '_original_command'): + widget.config(command=widget._original_command) + elif widget_class in ['Spinbox', 'Entry', 'Scale']: + widget.config(state='disabled' if disabled else 'normal') + elif widget_class == 'TCombobox': + widget.config(state='disabled' if disabled else 'readonly') + except: + pass + + # Recursively handle child widgets + for child in widget.winfo_children(): + self.set_widget_disabled_state(child, disabled) + def apply_blur_effect(self): """Apply blur effect to video""" if not hasattr(self, 'video_editor') or not self.video_editor: diff --git a/thumbnail_editor.py b/thumbnail_editor.py index 62d26c2..1dfabfa 100644 --- a/thumbnail_editor.py +++ b/thumbnail_editor.py @@ -108,18 +108,18 @@ class ModernThumbnailEditor: def setup_canvas_area(self, parent): """Setup the main canvas area with modern styling""" - # Canvas header + # Canvas header (reduced top padding) canvas_header = tk.Frame(parent, bg=self.colors['bg_secondary']) - canvas_header.pack(fill="x", padx=20, pady=(20, 10)) + canvas_header.pack(fill="x", padx=20, pady=(10, 5)) # Reduced from (20, 10) to (10, 5) canvas_title = tk.Label(canvas_header, text="đŸŽŦ Thumbnail Preview", font=self.fonts['heading'], bg=self.colors['bg_secondary'], fg=self.colors['text_primary']) canvas_title.pack(side="left") - # Canvas container + # Canvas container (reduced expand behavior to minimize empty space) canvas_container = tk.Frame(parent, bg=self.colors['bg_tertiary'], relief="flat", bd=2) - canvas_container.pack(fill="both", expand=True, padx=20, pady=(0, 20)) + canvas_container.pack(fill="x", padx=20, pady=(0, 5)) # Further reduced bottom padding from 10 to 5 # Calculate proper canvas size based on video dimensions video_width, video_height = self.clip.size @@ -136,10 +136,10 @@ class ModernThumbnailEditor: canvas_height = max_height canvas_width = int(max_height * aspect_ratio) - # Modern canvas with proper video proportions + # Modern canvas with proper video proportions (centered) self.canvas = tk.Canvas(canvas_container, bg='#000000', highlightthickness=0, relief="flat", bd=0, width=canvas_width, height=canvas_height) - self.canvas.pack(padx=10, pady=10) # Remove expand=True to maintain fixed size + self.canvas.pack(anchor="center", padx=5, pady=5) # Added anchor="center" for better positioning # Store canvas dimensions for boundary checking self.canvas_width = canvas_width @@ -158,12 +158,12 @@ class ModernThumbnailEditor: self.canvas.bind("", self.on_canvas_drag) self.canvas.bind("", self.on_canvas_release) - # Frame timeline slider + # Frame timeline slider (reduced spacing) timeline_frame = tk.Frame(parent, bg=self.colors['bg_secondary']) - timeline_frame.pack(fill="x", padx=20, pady=(0, 20)) + timeline_frame.pack(fill="x", padx=20, pady=(0, 5)) # Further reduced bottom padding from 10 to 5 tk.Label(timeline_frame, text="âąī¸ Timeline", font=self.fonts['subheading'], - bg=self.colors['bg_secondary'], fg=self.colors['text_primary']).pack(anchor="w", pady=(0, 10)) + bg=self.colors['bg_secondary'], fg=self.colors['text_primary']).pack(anchor="w", pady=(0, 5)) # Reduced from 10 to 5 # Modern slider styling style = ttk.Style()