""" Login Frame UI component for authentication. """ import customtkinter as ctk from typing import Callable class LoginFrame(ctk.CTkFrame): """Frame for authentication UI.""" def __init__(self, parent, on_connect: Callable = None): """ Initialize the login frame. Args: parent: Parent widget on_connect: Callback function when connect button is clicked """ super().__init__(parent) self.on_connect = on_connect self.is_authenticated = False # Configure frame self.configure(corner_radius=10, border_width=2) # Title self.title_label = ctk.CTkLabel( self, text="Authentication", font=ctk.CTkFont(size=18, weight="bold") ) self.title_label.grid(row=0, column=0, columnspan=3, padx=20, pady=(20, 10), sticky="w") # Status indicator (colored circle) self.status_indicator = ctk.CTkLabel( self, text="●", font=ctk.CTkFont(size=20), text_color="red" ) self.status_indicator.grid(row=1, column=0, padx=(20, 5), pady=10) # Status text self.status_label = ctk.CTkLabel( self, text="Not Connected", font=ctk.CTkFont(size=14) ) self.status_label.grid(row=1, column=1, padx=5, pady=10, sticky="w") # Connect button self.connect_button = ctk.CTkButton( self, text="Connect to Azure", command=self._on_connect_clicked, width=200, height=40, font=ctk.CTkFont(size=14, weight="bold") ) self.connect_button.grid(row=1, column=2, padx=20, pady=10, sticky="e") # Configure grid self.grid_columnconfigure(1, weight=1) def _on_connect_clicked(self): """Handle connect button click.""" if self.on_connect: self.on_connect() def set_authenticated(self, authenticated: bool): """ Update authentication status. Args: authenticated: Whether authentication succeeded """ self.is_authenticated = authenticated if authenticated: self.status_indicator.configure(text_color="green") self.status_label.configure(text="Connected") self.connect_button.configure(state="disabled", text="Connected") else: self.status_indicator.configure(text_color="red") self.status_label.configure(text="Not Connected") self.connect_button.configure(state="normal", text="Connect to Azure") def set_connecting(self): """Set UI to connecting state.""" self.status_indicator.configure(text_color="orange") self.status_label.configure(text="Connecting...") self.connect_button.configure(state="disabled", text="Connecting...") def enable_button(self): """Enable the connect button (for retry after error).""" if not self.is_authenticated: self.connect_button.configure(state="normal", text="Connect to Azure")