import curses from datetime import datetime from .utils import init_colors def draw_add_alarm(stdscr, alarm_draft): """Draw the add alarm screen""" if alarm_draft is None: alarm_draft = { 'hour': datetime.now().hour, 'minute': datetime.now().minute, 'name': 'New Alarm', 'enabled': True, 'date': None, 'weekdays': [], 'current_weekday': 0, 'editing_name': False, 'temp_name': '', 'selected_item': 0 # Added to handle selection } init_colors() height, width = stdscr.getmaxyx() # Center the form vertically with good spacing form_y = height // 2 - 8 # Title title = "Add New Alarm" stdscr.attron(curses.color_pair(1) | curses.A_BOLD) stdscr.addstr(form_y, width // 2 - len(title) // 2, title) stdscr.attroff(curses.color_pair(1) | curses.A_BOLD) def draw_field(y, label, value, is_selected): label_str = f"{label}: " x = width // 2 - (len(label_str) + len(str(value))) // 2 stdscr.attron(curses.color_pair(1)) stdscr.addstr(y, x, label_str) stdscr.attroff(curses.color_pair(1)) # Draw value (highlighted if selected) if is_selected: stdscr.attron(curses.color_pair(2)) # Highlighted selection stdscr.addstr(y, x + len(label_str), str(value)) if is_selected: stdscr.attroff(curses.color_pair(2)) # Get selected_item either from alarm_draft or passed separately selected_item = alarm_draft.get('selected_item', 0) # Order: Time → Date → Weekdays → Name → Enabled draw_field(form_y + 2, "Time", f"{alarm_draft['hour']:02d}:{alarm_draft['minute']:02d}", selected_item == 0 or selected_item == 1) # Date Selection date_y = form_y + 4 if alarm_draft['weekdays']: draw_field(date_y, "Date", "Repeating weekly", selected_item == 2) else: draw_field(date_y, "Date", alarm_draft['date'].strftime("%Y-%m-%d") if alarm_draft['date'] else "None", selected_item == 2) # Weekday Selection weekday_y = form_y + 6 weekday_label = "Repeat: " label_x = width // 2 - 20 # Adjust this value to move the entire "Repeat" section left or right # Draw the "Repeat: " label once stdscr.attron(curses.color_pair(1)) stdscr.addstr(weekday_y, label_x, weekday_label) stdscr.attroff(curses.color_pair(1)) # Draw weekdays starting right after the label weekday_x = label_x + len(weekday_label) weekday_names = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] for i, day in enumerate(weekday_names): x_pos = weekday_x + i * 4 # Space between weekdays is_selected = (selected_item == 3 and i == alarm_draft.get('current_weekday', 0)) is_active = i in alarm_draft.get('weekdays', []) if is_selected: stdscr.attron(curses.color_pair(2)) # Highlight current selection elif is_active: stdscr.attron(curses.color_pair(1) | curses.A_BOLD) # Selected weekday else: stdscr.attron(curses.color_pair(1)) stdscr.addstr(weekday_y, x_pos, day) if is_selected: stdscr.attroff(curses.color_pair(2)) elif is_active: stdscr.attroff(curses.color_pair(1) | curses.A_BOLD) else: stdscr.attroff(curses.color_pair(1)) # Name field draw_field(form_y + 8, "Name", alarm_draft['name'], selected_item == 4) # Enabled Toggle status_y = form_y + 10 enabled_str = "● Enabled" if alarm_draft['enabled'] else "○ Disabled" draw_field(status_y, "Status", enabled_str, selected_item == 5) # Instructions instructions = "j/k: Change h/l: Move Space: Toggle Enter: Save Esc: Cancel" stdscr.attron(curses.color_pair(1)) stdscr.addstr(height - 2, width // 2 - len(instructions) // 2, instructions) stdscr.attroff(curses.color_pair(1))