Initial trig menu implementation

This commit is contained in:
2026-08-06 00:20:13 -04:00
parent 0532de08fc
commit 49367e26d2
+108 -22
View File
@@ -1,5 +1,6 @@
#include "src/resource_ids.auto.h"
#include <pebble.h>
#include <stdlib.h>
// 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() {