eee_alarm_clock/clock/ui/add_alarm.py

109 lines
3.9 KiB
Python

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))