feat: add status bar to UI for improved user feedback and information display
This commit is contained in:
@@ -28,6 +28,11 @@ class UIManager:
|
||||
self.medicine_manager = medicine_manager
|
||||
self.pathology_manager = pathology_manager
|
||||
|
||||
# Status bar attributes
|
||||
self.status_bar: tk.Frame | None = None
|
||||
self.status_label: tk.Label | None = None
|
||||
self.file_info_label: tk.Label | None = None
|
||||
|
||||
def setup_application_icon(self, img_path: str) -> bool:
|
||||
"""Set up the application icon."""
|
||||
try:
|
||||
@@ -297,6 +302,103 @@ class UIManager:
|
||||
|
||||
return button_frame
|
||||
|
||||
def create_status_bar(self, parent_frame: tk.Widget) -> tk.Frame:
|
||||
"""Create and configure the status bar at the bottom of the application."""
|
||||
# Create the status bar frame
|
||||
self.status_bar = tk.Frame(parent_frame, relief=tk.SUNKEN, bd=1)
|
||||
self.status_bar.grid(row=2, column=0, columnspan=2, sticky="ew", padx=5, pady=2)
|
||||
|
||||
# Configure the parent to make the status bar stretch
|
||||
parent_frame.grid_columnconfigure(0, weight=1)
|
||||
|
||||
# Create status message label (left side)
|
||||
self.status_label = tk.Label(
|
||||
self.status_bar,
|
||||
text="Ready",
|
||||
anchor=tk.W,
|
||||
font=("TkDefaultFont", 9),
|
||||
padx=10,
|
||||
pady=2,
|
||||
)
|
||||
self.status_label.pack(side=tk.LEFT, fill=tk.X, expand=True)
|
||||
|
||||
# Create file info label (right side)
|
||||
self.file_info_label = tk.Label(
|
||||
self.status_bar,
|
||||
text="",
|
||||
anchor=tk.E,
|
||||
font=("TkDefaultFont", 9),
|
||||
padx=10,
|
||||
pady=2,
|
||||
)
|
||||
self.file_info_label.pack(side=tk.RIGHT)
|
||||
|
||||
return self.status_bar
|
||||
|
||||
def update_status(self, message: str, message_type: str = "info") -> None:
|
||||
"""
|
||||
Update the status bar with a message.
|
||||
|
||||
Args:
|
||||
message: The message to display
|
||||
message_type: Type of message ('info', 'success', 'warning', 'error')
|
||||
"""
|
||||
if not self.status_label:
|
||||
return
|
||||
|
||||
# Color mapping for different message types
|
||||
colors = {
|
||||
"info": "#000000", # Black
|
||||
"success": "#28A745", # Green
|
||||
"warning": "#FFC107", # Yellow/Orange
|
||||
"error": "#DC3545", # Red
|
||||
}
|
||||
|
||||
color = colors.get(message_type, "#000000")
|
||||
self.status_label.config(text=message, fg=color)
|
||||
|
||||
# Clear the message after 5 seconds for non-info messages
|
||||
if message_type != "info":
|
||||
self.root.after(5000, lambda: self.update_status("Ready", "info"))
|
||||
|
||||
def update_file_info(self, filename: str, entry_count: int = 0) -> None:
|
||||
"""
|
||||
Update the file information in the status bar.
|
||||
|
||||
Args:
|
||||
filename: Name of the current data file
|
||||
entry_count: Number of entries in the file
|
||||
"""
|
||||
if not self.file_info_label:
|
||||
return
|
||||
|
||||
file_display = os.path.basename(filename) if filename else "No file"
|
||||
info_text = f"{file_display}"
|
||||
if entry_count > 0:
|
||||
info_text += f" ({entry_count} entries)"
|
||||
|
||||
self.file_info_label.config(text=info_text)
|
||||
|
||||
def show_status_message(self, message: str, duration: int = 3000) -> None:
|
||||
"""
|
||||
Show a temporary status message for a specific duration.
|
||||
|
||||
Args:
|
||||
message: The message to display
|
||||
duration: How long to show the message in milliseconds
|
||||
"""
|
||||
if not self.status_label:
|
||||
return
|
||||
|
||||
original_text = self.status_label.cget("text")
|
||||
original_color = self.status_label.cget("fg")
|
||||
|
||||
self.status_label.config(text=message, fg="#2E86AB")
|
||||
self.root.after(
|
||||
duration,
|
||||
lambda: self.status_label.config(text=original_text, fg=original_color),
|
||||
)
|
||||
|
||||
def create_edit_window(
|
||||
self, values: tuple[str, ...], callbacks: dict[str, Callable]
|
||||
) -> tk.Toplevel:
|
||||
|
||||
Reference in New Issue
Block a user