From 49367e26d27ee3a5052c0c6cfe6a24a145bbe502 Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Thu, 6 Aug 2026 00:20:13 -0400 Subject: [PATCH] Initial trig menu implementation --- src/c/main.c | 130 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 108 insertions(+), 22 deletions(-) diff --git a/src/c/main.c b/src/c/main.c index 3050286..e8cece2 100644 --- a/src/c/main.c +++ b/src/c/main.c @@ -1,5 +1,6 @@ #include "src/resource_ids.auto.h" #include +#include // types typedef struct TheTime { @@ -11,6 +12,7 @@ typedef struct TheTime { // layer-age static Window *s_window; +static Window *s_drop_window; static Layer *s_top_bar_layer; static Layer *s_bottom_bar_layer; //// setter @@ -23,12 +25,13 @@ static Layer *s_setter_highlight_layer; static TextLayer *s_type_txt_layer; static TextLayer *s_theta_txt_layer; static TextLayer *s_parenthesis_txt_layer; -static Layer *s_drop_type_layer; -static Layer *s_drop_function_layer; -static Layer *s_drop_over_layer; -static Layer *s_drop_under_layer; +static Layer *s_drop_bg_type_layer; +static Layer *s_drop_bg_function_layer; +static Layer *s_drop_bg_over_layer; +static Layer *s_drop_bg_under_layer; static Layer *s_division_layer; static Layer *s_alarm_highlight_layer; +static MenuLayer *s_drop_menu_layer; // fonts //// setter @@ -61,6 +64,9 @@ static const GRect s_drop_type_grect = GRect(PBL_IF_ROUND_ELSE(48, 62), (s_top_b static const GRect s_drop_function_grect = GRect(PBL_IF_ROUND_ELSE(55, 45), s_bottom_bar_grect.origin.y + ((s_bottom_bar_grect.size.h / 2) - PBL_IF_ROUND_ELSE(s_drop_height - 1, s_drop_height / 2)), 50, s_drop_height); static const GRect s_drop_over_grect = GRect(s_drop_function_grect.origin.x + 78, s_drop_function_grect.origin.y - 13, s_drop_function_grect.size.w + 1, s_drop_function_grect.size.h); static const GRect s_drop_under_grect = GRect(s_drop_over_grect.origin.x, s_drop_over_grect.origin.y + s_drop_over_grect.size.h + 5, s_drop_function_grect.size.w, s_drop_over_grect.size.h); +static const char *s_sin[2] = {"sin⁻¹", "csc⁻¹"}; +static const char *s_cos[2] = {"cos⁻¹", "sec⁻¹"}; +static const char *s_tan[2] = {"tan⁻¹", "cot⁻¹"}; ///////////////////////////////// @@ -357,9 +363,83 @@ static void alarm_highlight_layer_update_proc(Layer *layer, GContext *ctx) { graphics_draw_rect(ctx, layer_get_bounds(layer)); } +static uint16_t menu_get_num_rows(MenuLayer *menu_layer, uint16_t section_index, void *context) { + return 3; +} + +static void menu_draw_row(GContext *ctx, const Layer *cell_layer, MenuIndex *cell_index, void *context) { + switch (s_highlight_pos) { + case 0: + switch (cell_index->row) { + case 0: + menu_cell_basic_draw(ctx, cell_layer, "Equilateral", NULL, NULL); + break; + case 1: + menu_cell_basic_draw(ctx, cell_layer, "Isosceles", NULL, NULL); + break; + case 2: + menu_cell_basic_draw(ctx, cell_layer, "Scalene", NULL, NULL); + } + break; + case 1: + switch (cell_index->row) { + case 0: + menu_cell_basic_draw(ctx, cell_layer, s_sin[rand() % 2], NULL, NULL); + break; + case 1: + menu_cell_basic_draw(ctx, cell_layer, s_cos[rand() % 2], NULL, NULL); + break; + case 2: + menu_cell_basic_draw(ctx, cell_layer, s_tan[rand() % 2], NULL, NULL); + } + break; + case 2: + __attribute__((fallthrough)); + case 3: + switch (cell_index->row) { + case 0: + menu_cell_basic_draw(ctx, cell_layer, "1", NULL, NULL); + break; + case 1: + menu_cell_basic_draw(ctx, cell_layer, "2", NULL, NULL); + break; + case 2: + menu_cell_basic_draw(ctx, cell_layer, "3", NULL, NULL); + } + } +} + +static void menu_select(MenuLayer *menu_layer, MenuIndex *cell_index, void *context) { + // TODO +} + +// when the user presses select, call this to load a menu; +// this function will determine the type of menu to load by checking the highlight position; +// once the user presses select in this menu, the result is written to a text layer and the menu is exited +static void drop_menu_window_load(Window *window) { + Layer *window_layer = window_get_root_layer(window); + s_drop_menu_layer = menu_layer_create(layer_get_bounds(window_layer)); + menu_layer_set_callbacks(s_drop_menu_layer, NULL, (MenuLayerCallbacks){ + .get_num_rows = menu_get_num_rows, + .draw_row = menu_draw_row, + .select_click = menu_select, + }); + menu_layer_set_click_config_onto_window(s_drop_menu_layer, window); + layer_add_child(window_layer, menu_layer_get_layer(s_drop_menu_layer)); +} + +static void drop_menu_window_unload(Window *window) { + menu_layer_destroy(s_drop_menu_layer); + s_drop_menu_layer = NULL; +} + static void alarm_window_load() { s_setter_highlight_color = s_primary_color; Layer *window_layer = window_get_root_layer(s_window); + s_drop_window = window_create(); // TODO destroy on window unload? + window_set_window_handlers( + s_drop_window, + (WindowHandlers){.unload = drop_menu_window_unload}); // top&bottom bars add_bar_layers_to_window(window_layer); @@ -385,21 +465,21 @@ static void alarm_window_load() { // drop backgrounds //// type - s_drop_type_layer = layer_create(s_drop_type_grect); - layer_set_update_proc(s_drop_type_layer, drop_layer_update_proc); - layer_add_child(window_layer, s_drop_type_layer); + s_drop_bg_type_layer = layer_create(s_drop_type_grect); + layer_set_update_proc(s_drop_bg_type_layer, drop_layer_update_proc); + layer_add_child(window_layer, s_drop_bg_type_layer); //// function - s_drop_function_layer = layer_create(s_drop_function_grect); - layer_set_update_proc(s_drop_function_layer, drop_layer_update_proc); - layer_add_child(window_layer, s_drop_function_layer); + s_drop_bg_function_layer = layer_create(s_drop_function_grect); + layer_set_update_proc(s_drop_bg_function_layer, drop_layer_update_proc); + layer_add_child(window_layer, s_drop_bg_function_layer); //// over - s_drop_over_layer = layer_create(s_drop_over_grect); - layer_set_update_proc(s_drop_over_layer, drop_layer_update_proc); - layer_add_child(window_layer, s_drop_over_layer); + s_drop_bg_over_layer = layer_create(s_drop_over_grect); + layer_set_update_proc(s_drop_bg_over_layer, drop_layer_update_proc); + layer_add_child(window_layer, s_drop_bg_over_layer); //// under - s_drop_under_layer = layer_create(s_drop_under_grect); - layer_set_update_proc(s_drop_under_layer, drop_layer_update_proc); - layer_add_child(window_layer, s_drop_under_layer); + s_drop_bg_under_layer = layer_create(s_drop_under_grect); + layer_set_update_proc(s_drop_bg_under_layer, drop_layer_update_proc); + layer_add_child(window_layer, s_drop_bg_under_layer); // parenthesis text s_font_mansalva_big = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_MANSALVA_REGULAR_50)); @@ -428,10 +508,10 @@ static void alarm_window_unload() { layer_destroy(s_alarm_highlight_layer); layer_destroy(s_division_layer); text_layer_destroy(s_parenthesis_txt_layer); - layer_destroy(s_drop_under_layer); - layer_destroy(s_drop_over_layer); - layer_destroy(s_drop_function_layer); - layer_destroy(s_drop_type_layer); + layer_destroy(s_drop_bg_under_layer); + layer_destroy(s_drop_bg_over_layer); + layer_destroy(s_drop_bg_function_layer); + layer_destroy(s_drop_bg_type_layer); text_layer_destroy(s_theta_txt_layer); text_layer_destroy(s_type_txt_layer); layer_destroy(s_bottom_bar_layer); @@ -474,8 +554,13 @@ static void alarm_down_click_handler(void *recognizer, void *ctx) { set_alarm_highlighter_frame(); } -// DEBUG: logic will eventually be mapped to when triangle is solved static void alarm_select_click_handler(void *recognizer, void *ctx) { + drop_menu_window_load(s_drop_window); + window_stack_push(s_drop_window, true); +} + +// DEBUG: logic will eventually be mapped to when triangle is solved +static void alarm_select_hold_handler(void *recognizer, void *ctx) { wakeup_cancel_all(); int8_t status = schedule_main_alarm(); while (status < 0) { @@ -496,7 +581,8 @@ static void alarm_click_config_provider(void *ctx) { window_single_click_subscribe(BUTTON_ID_BACK, NULL); window_single_click_subscribe(BUTTON_ID_UP, alarm_up_click_handler); window_single_click_subscribe(BUTTON_ID_DOWN, alarm_down_click_handler); - window_long_click_subscribe(BUTTON_ID_SELECT, 5000, alarm_select_click_handler, NULL); + window_single_click_subscribe(BUTTON_ID_SELECT, alarm_select_click_handler); + window_long_click_subscribe(BUTTON_ID_SELECT, 5000, alarm_select_hold_handler, NULL); } static void init() {