Initial trig menu implementation
This commit is contained in:
+108
-22
@@ -1,5 +1,6 @@
|
|||||||
#include "src/resource_ids.auto.h"
|
#include "src/resource_ids.auto.h"
|
||||||
#include <pebble.h>
|
#include <pebble.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
// types
|
// types
|
||||||
typedef struct TheTime {
|
typedef struct TheTime {
|
||||||
@@ -11,6 +12,7 @@ typedef struct TheTime {
|
|||||||
|
|
||||||
// layer-age
|
// layer-age
|
||||||
static Window *s_window;
|
static Window *s_window;
|
||||||
|
static Window *s_drop_window;
|
||||||
static Layer *s_top_bar_layer;
|
static Layer *s_top_bar_layer;
|
||||||
static Layer *s_bottom_bar_layer;
|
static Layer *s_bottom_bar_layer;
|
||||||
//// setter
|
//// setter
|
||||||
@@ -23,12 +25,13 @@ static Layer *s_setter_highlight_layer;
|
|||||||
static TextLayer *s_type_txt_layer;
|
static TextLayer *s_type_txt_layer;
|
||||||
static TextLayer *s_theta_txt_layer;
|
static TextLayer *s_theta_txt_layer;
|
||||||
static TextLayer *s_parenthesis_txt_layer;
|
static TextLayer *s_parenthesis_txt_layer;
|
||||||
static Layer *s_drop_type_layer;
|
static Layer *s_drop_bg_type_layer;
|
||||||
static Layer *s_drop_function_layer;
|
static Layer *s_drop_bg_function_layer;
|
||||||
static Layer *s_drop_over_layer;
|
static Layer *s_drop_bg_over_layer;
|
||||||
static Layer *s_drop_under_layer;
|
static Layer *s_drop_bg_under_layer;
|
||||||
static Layer *s_division_layer;
|
static Layer *s_division_layer;
|
||||||
static Layer *s_alarm_highlight_layer;
|
static Layer *s_alarm_highlight_layer;
|
||||||
|
static MenuLayer *s_drop_menu_layer;
|
||||||
|
|
||||||
// fonts
|
// fonts
|
||||||
//// setter
|
//// 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_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_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 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));
|
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() {
|
static void alarm_window_load() {
|
||||||
s_setter_highlight_color = s_primary_color;
|
s_setter_highlight_color = s_primary_color;
|
||||||
Layer *window_layer = window_get_root_layer(s_window);
|
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
|
// top&bottom bars
|
||||||
add_bar_layers_to_window(window_layer);
|
add_bar_layers_to_window(window_layer);
|
||||||
@@ -385,21 +465,21 @@ static void alarm_window_load() {
|
|||||||
|
|
||||||
// drop backgrounds
|
// drop backgrounds
|
||||||
//// type
|
//// type
|
||||||
s_drop_type_layer = layer_create(s_drop_type_grect);
|
s_drop_bg_type_layer = layer_create(s_drop_type_grect);
|
||||||
layer_set_update_proc(s_drop_type_layer, drop_layer_update_proc);
|
layer_set_update_proc(s_drop_bg_type_layer, drop_layer_update_proc);
|
||||||
layer_add_child(window_layer, s_drop_type_layer);
|
layer_add_child(window_layer, s_drop_bg_type_layer);
|
||||||
//// function
|
//// function
|
||||||
s_drop_function_layer = layer_create(s_drop_function_grect);
|
s_drop_bg_function_layer = layer_create(s_drop_function_grect);
|
||||||
layer_set_update_proc(s_drop_function_layer, drop_layer_update_proc);
|
layer_set_update_proc(s_drop_bg_function_layer, drop_layer_update_proc);
|
||||||
layer_add_child(window_layer, s_drop_function_layer);
|
layer_add_child(window_layer, s_drop_bg_function_layer);
|
||||||
//// over
|
//// over
|
||||||
s_drop_over_layer = layer_create(s_drop_over_grect);
|
s_drop_bg_over_layer = layer_create(s_drop_over_grect);
|
||||||
layer_set_update_proc(s_drop_over_layer, drop_layer_update_proc);
|
layer_set_update_proc(s_drop_bg_over_layer, drop_layer_update_proc);
|
||||||
layer_add_child(window_layer, s_drop_over_layer);
|
layer_add_child(window_layer, s_drop_bg_over_layer);
|
||||||
//// under
|
//// under
|
||||||
s_drop_under_layer = layer_create(s_drop_under_grect);
|
s_drop_bg_under_layer = layer_create(s_drop_under_grect);
|
||||||
layer_set_update_proc(s_drop_under_layer, drop_layer_update_proc);
|
layer_set_update_proc(s_drop_bg_under_layer, drop_layer_update_proc);
|
||||||
layer_add_child(window_layer, s_drop_under_layer);
|
layer_add_child(window_layer, s_drop_bg_under_layer);
|
||||||
|
|
||||||
// parenthesis text
|
// parenthesis text
|
||||||
s_font_mansalva_big = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_MANSALVA_REGULAR_50));
|
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_alarm_highlight_layer);
|
||||||
layer_destroy(s_division_layer);
|
layer_destroy(s_division_layer);
|
||||||
text_layer_destroy(s_parenthesis_txt_layer);
|
text_layer_destroy(s_parenthesis_txt_layer);
|
||||||
layer_destroy(s_drop_under_layer);
|
layer_destroy(s_drop_bg_under_layer);
|
||||||
layer_destroy(s_drop_over_layer);
|
layer_destroy(s_drop_bg_over_layer);
|
||||||
layer_destroy(s_drop_function_layer);
|
layer_destroy(s_drop_bg_function_layer);
|
||||||
layer_destroy(s_drop_type_layer);
|
layer_destroy(s_drop_bg_type_layer);
|
||||||
text_layer_destroy(s_theta_txt_layer);
|
text_layer_destroy(s_theta_txt_layer);
|
||||||
text_layer_destroy(s_type_txt_layer);
|
text_layer_destroy(s_type_txt_layer);
|
||||||
layer_destroy(s_bottom_bar_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();
|
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) {
|
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();
|
wakeup_cancel_all();
|
||||||
int8_t status = schedule_main_alarm();
|
int8_t status = schedule_main_alarm();
|
||||||
while (status < 0) {
|
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_BACK, NULL);
|
||||||
window_single_click_subscribe(BUTTON_ID_UP, alarm_up_click_handler);
|
window_single_click_subscribe(BUTTON_ID_UP, alarm_up_click_handler);
|
||||||
window_single_click_subscribe(BUTTON_ID_DOWN, alarm_down_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() {
|
static void init() {
|
||||||
|
|||||||
Reference in New Issue
Block a user