""" Result Frame UI component for displaying secret generation results. """ import customtkinter as ctk from typing import Callable class ResultFrame(ctk.CTkFrame): """Frame for displaying secret generation results.""" def __init__(self, parent, on_generate_another: Callable = None): """ Initialize the result frame. Args: parent: Parent widget on_generate_another: Callback function when "Generate Another" is clicked """ super().__init__(parent) self.on_generate_another = on_generate_another # Configure frame with success colors self.configure( corner_radius=10, border_width=3, border_color="green", fg_color=("#E8F5E9", "#1B5E20") # Light green / Dark green ) # Success title self.success_label = ctk.CTkLabel( self, text="✓ Secret Generated Successfully!", font=ctk.CTkFont(size=20, weight="bold"), text_color="green" ) self.success_label.grid(row=0, column=0, columnspan=2, padx=20, pady=(20, 15), sticky="w") # Secret Name Label self.name_title_label = ctk.CTkLabel( self, text="Secret Name:", font=ctk.CTkFont(size=14, weight="bold") ) self.name_title_label.grid(row=1, column=0, padx=20, pady=(0, 5), sticky="w") self.name_value_label = ctk.CTkLabel( self, text="", font=ctk.CTkFont(size=14) ) self.name_value_label.grid(row=1, column=1, padx=20, pady=(0, 5), sticky="w") # Key Vault Label self.vault_title_label = ctk.CTkLabel( self, text="Key Vault:", font=ctk.CTkFont(size=14, weight="bold") ) self.vault_title_label.grid(row=2, column=0, padx=20, pady=(0, 5), sticky="w") self.vault_value_label = ctk.CTkLabel( self, text="", font=ctk.CTkFont(size=14) ) self.vault_value_label.grid(row=2, column=1, padx=20, pady=(0, 5), sticky="w") # Old Secrets Removed Label (initially hidden) self.removed_title_label = ctk.CTkLabel( self, text="Old Secrets Removed:", font=ctk.CTkFont(size=14, weight="bold") ) self.removed_title_label.grid(row=3, column=0, padx=20, pady=(0, 15), sticky="w") self.removed_title_label.grid_remove() # Hide initially self.removed_value_label = ctk.CTkLabel( self, text="", font=ctk.CTkFont(size=14) ) self.removed_value_label.grid(row=3, column=1, padx=20, pady=(0, 15), sticky="w") self.removed_value_label.grid_remove() # Hide initially # Secret Value Label self.secret_label = ctk.CTkLabel( self, text="Secret Value (copy this now):", font=ctk.CTkFont(size=14, weight="bold") ) self.secret_label.grid(row=4, column=0, columnspan=2, padx=20, pady=(10, 5), sticky="w") # Secret Value Textbox (read-only) self.secret_textbox = ctk.CTkTextbox( self, height=80, font=ctk.CTkFont(family="Consolas", size=12), wrap="word" ) self.secret_textbox.grid(row=5, column=0, columnspan=2, padx=20, pady=(0, 15), sticky="ew") # Buttons frame self.buttons_frame = ctk.CTkFrame(self, fg_color="transparent") self.buttons_frame.grid(row=6, column=0, columnspan=2, padx=20, pady=(0, 20)) # Copy button self.copy_button = ctk.CTkButton( self.buttons_frame, text="Copy to Clipboard", command=self._on_copy_clicked, width=180, height=40, font=ctk.CTkFont(size=14, weight="bold") ) self.copy_button.grid(row=0, column=0, padx=(0, 10)) # Generate Another button self.another_button = ctk.CTkButton( self.buttons_frame, text="Generate Another Secret", command=self._on_another_clicked, width=200, height=40, font=ctk.CTkFont(size=14, weight="bold") ) self.another_button.grid(row=0, column=1, padx=(10, 0)) # Configure grid self.grid_columnconfigure(1, weight=1) # Initially hide the frame self.grid_remove() def show_result( self, secret_name: str, vault_name: str, secret_value: str, removed_count: int = 0 ): """ Display secret generation result. Args: secret_name: The sanitized secret name vault_name: The Key Vault name secret_value: The secret value removed_count: Number of old secrets removed (0 if not applicable) """ # Update labels self.name_value_label.configure(text=secret_name) self.vault_value_label.configure(text=vault_name) # Show/hide removed count if removed_count > 0: self.removed_value_label.configure(text=str(removed_count)) self.removed_title_label.grid() self.removed_value_label.grid() else: self.removed_title_label.grid_remove() self.removed_value_label.grid_remove() # Set secret value in textbox self.secret_textbox.delete("1.0", "end") self.secret_textbox.insert("1.0", secret_value) self.secret_textbox.configure(state="disabled") # Show the frame self.grid() def _on_copy_clicked(self): """Handle copy button click.""" # Get secret value from textbox secret_value = self.secret_textbox.get("1.0", "end").strip() # Copy to clipboard self.clipboard_clear() self.clipboard_append(secret_value) # Show temporary confirmation original_text = self.copy_button.cget("text") self.copy_button.configure(text="✓ Copied!") self.after(2000, lambda: self.copy_button.configure(text=original_text)) def _on_another_clicked(self): """Handle generate another button click.""" if self.on_generate_another: self.on_generate_another() def hide(self): """Hide the result frame.""" self.grid_remove()