From 0a8d27957f8dd1f5b7d6e744d394598fe9452612 Mon Sep 17 00:00:00 2001 From: William Valentin Date: Wed, 30 Jul 2025 12:41:25 -0700 Subject: [PATCH] feat: enhance symptom scale creation with improved layout and dynamic value display --- src/ui_manager.py | 109 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 95 insertions(+), 14 deletions(-) diff --git a/src/ui_manager.py b/src/ui_manager.py index fd48677..f004345 100644 --- a/src/ui_manager.py +++ b/src/ui_manager.py @@ -133,25 +133,21 @@ class UIManager: "appetite": tk.IntVar(value=0), } - # Create scales for symptoms + # Create enhanced scales for symptoms symptom_labels: list[tuple[str, str]] = [ - ("Depression (0-10):", "depression"), - ("Anxiety (0-10):", "anxiety"), - ("Sleep Quality (0-10):", "sleep"), - ("Appetite (0-10):", "appetite"), + ("Depression", "depression"), + ("Anxiety", "anxiety"), + ("Sleep Quality", "sleep"), + ("Appetite", "appetite"), ] + # Configure input frame columns for better layout + input_frame.grid_columnconfigure(1, weight=1) + for idx, (label, var_name) in enumerate(symptom_labels): - ttk.Label(input_frame, text=label).grid( - row=idx, column=0, sticky="w", padx=5, pady=2 + self._create_enhanced_symptom_scale( + input_frame, idx, label, var_name, 0, symptom_vars ) - ttk.Scale( - input_frame, - from_=0, - to=10, - orient=tk.HORIZONTAL, - variable=symptom_vars[var_name], - ).grid(row=idx, column=1, sticky="ew") # Medicine tracking section (simplified) ttk.Label(input_frame, text="Treatment:").grid( @@ -688,6 +684,91 @@ class UIManager: scale.bind("", update_value_label) update_value_label() # Set initial color + def _create_enhanced_symptom_scale( + self, + parent: ttk.Frame, + row: int, + label: str, + key: str, + value: int, + vars_dict: dict[str, tk.IntVar], + ) -> None: + """Create enhanced symptom scale for new entry form (like edit window).""" + # Ensure value is properly converted + try: + value = int(float(value)) if value not in ["", None] else 0 + except (ValueError, TypeError): + value = 0 + + # Label + label_widget = ttk.Label( + parent, text=f"{label} (0-10):", font=("TkDefaultFont", 10, "bold") + ) + label_widget.grid(row=row, column=0, sticky="w", padx=5, pady=8) + + # Scale container + scale_container = ttk.Frame(parent) + scale_container.grid(row=row, column=1, sticky="ew", padx=(20, 5), pady=8) + scale_container.grid_columnconfigure(0, weight=1) + + # Scale with value labels + scale_frame = ttk.Frame(scale_container) + scale_frame.grid(row=0, column=0, sticky="ew") + scale_frame.grid_columnconfigure(1, weight=1) + + # Current value display + value_label = ttk.Label( + scale_frame, + text=str(value), + font=("TkDefaultFont", 12, "bold"), + foreground="#2E86AB", + width=3, + ) + value_label.grid(row=0, column=0, padx=(0, 10)) + + # Scale widget + scale = ttk.Scale( + scale_frame, + from_=0, + to=10, + variable=vars_dict[key], + orient=tk.HORIZONTAL, + length=250, # Slightly smaller than edit window to fit better + ) + scale.grid(row=0, column=1, sticky="ew") + + # Scale labels (0, 5, 10) + labels_frame = ttk.Frame(scale_container) + labels_frame.grid(row=1, column=0, sticky="ew", pady=(5, 0)) + + ttk.Label(labels_frame, text="0", font=("TkDefaultFont", 8)).grid( + row=0, column=0, sticky="w" + ) + labels_frame.grid_columnconfigure(1, weight=1) + ttk.Label(labels_frame, text="5", font=("TkDefaultFont", 8)).grid( + row=0, column=1 + ) + ttk.Label(labels_frame, text="10", font=("TkDefaultFont", 8)).grid( + row=0, column=2, sticky="e" + ) + + # Update label when scale changes + def update_value_label(event=None): + current_val = vars_dict[key].get() + value_label.configure(text=str(current_val)) + # Change color based on value + if current_val <= 3: + value_label.configure(foreground="#28A745") # Green for low/good + elif current_val <= 6: + value_label.configure(foreground="#FFC107") # Yellow for medium + else: + value_label.configure(foreground="#DC3545") # Red for high/bad + + scale.bind("", update_value_label) + scale.bind("", update_value_label) + scale.bind("", update_value_label) + update_value_label() # Set initial color + def _create_medicine_section( self, parent: ttk.Frame, bup: int, hydro: int, gaba: int, prop: int, quet: int ) -> dict[str, tk.IntVar]: