102 lines
3.1 KiB
Python
102 lines
3.1 KiB
Python
"""
|
|
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")
|