From 4f6aedc4fafc52184c2690e82e6278fb3f0abd3e Mon Sep 17 00:00:00 2001 From: = <=> Date: Mon, 11 May 2020 06:15:24 +0100 Subject: [PATCH] Begin adding support for Window creation --- src/calc.c | 118 ++++++++++++++++++++++++++++++++++++++--------------- src/calc.h | 7 +++- 2 files changed, 90 insertions(+), 35 deletions(-) diff --git a/src/calc.c b/src/calc.c index 514b383..bfa560a 100644 --- a/src/calc.c +++ b/src/calc.c @@ -107,28 +107,29 @@ static uint16_t get_num_rows_callback(MenuLayer *menu_layer, static void draw_row_callback(GContext *ctx, const Layer *cell_layer, MenuIndex *cell_index, void *context) { - static char s_buff[16]; - snprintf(s_buff, sizeof(s_buff), "Script %d", 1 + (int)cell_index->row); + static char s_buff[16]; + snprintf(s_buff, sizeof(s_buff), "Script %d", 1 + (int)cell_index->row); - // Draw this row's index - menu_cell_basic_draw(ctx, cell_layer, s_buff, NULL, NULL); + // Draw this row's index + menu_cell_basic_draw(ctx, cell_layer, s_buff, NULL, NULL); } static int16_t get_cell_height_callback(struct MenuLayer *menu_layer, MenuIndex *cell_index, void *context) { - const int16_t cell_height = 44; - return cell_height; + const int16_t cell_height = 44; + return cell_height; } void code_window_push() { - if(!s_code_window) { - s_code_window = window_create(); - WindowHandlers wh = { - .load = code_window_load, - .unload = code_window_unload }; - window_set_window_handlers(s_code_window, wh); - } - window_stack_push(s_code_window, true); + if(!s_code_window) { + s_code_window = window_create(); + WindowHandlers wh = { + .load = code_window_load, + .unload = code_window_unload }; + window_set_window_handlers(s_code_window, wh); + } + + window_stack_push(s_code_window, true); } static void select_callback(struct MenuLayer *menu_layer, @@ -140,22 +141,22 @@ static void select_callback(struct MenuLayer *menu_layer, static void menu_load(Window *window) { - Layer *window_layer = window_get_root_layer(window); - GRect bounds = layer_get_bounds(window_layer); + Layer *window_layer = window_get_root_layer(window); + GRect bounds = layer_get_bounds(window_layer); - s_menu_layer = menu_layer_create(bounds); - menu_layer_set_click_config_onto_window(s_menu_layer, window); + s_menu_layer = menu_layer_create(bounds); + menu_layer_set_click_config_onto_window(s_menu_layer, window); #if defined(PBL_COLOR) - menu_layer_set_normal_colors(s_menu_layer, GColorBlack, GColorWhite); - menu_layer_set_highlight_colors(s_menu_layer, GColorDukeBlue, GColorWhite); + menu_layer_set_normal_colors(s_menu_layer, GColorBlack, GColorWhite); + menu_layer_set_highlight_colors(s_menu_layer, GColorDukeBlue, GColorWhite); #endif - menu_layer_set_callbacks(s_menu_layer, NULL, (MenuLayerCallbacks) { - .get_num_rows = get_num_rows_callback, - .draw_row = draw_row_callback, - .get_cell_height = get_cell_height_callback, - .select_click = select_callback, - }); - layer_add_child(window_layer, menu_layer_get_layer(s_menu_layer)); + menu_layer_set_callbacks(s_menu_layer, NULL, (MenuLayerCallbacks) { + .get_num_rows = get_num_rows_callback, + .draw_row = draw_row_callback, + .get_cell_height = get_cell_height_callback, + .select_click = select_callback, + }); + layer_add_child(window_layer, menu_layer_get_layer(s_menu_layer)); } static void menu_unload(Window *window) @@ -190,12 +191,6 @@ void code_window_load(Window *window) window_stack_push(s_code_window, true); // If possible, load the previous code text - // Object obj = parseEval("(def ad (fn (a) (* 3 a)))", &env); - // Object obj2 = parseEval("(map ad (1 50 99))", &env); - // printObj(&obj); - // printObj(&obj2); - // cleanObject(&obj); - // cleanObject(&obj2); if(persist_exists(current_code)) { persist_read_string(current_code, mytext, SMAX_LENGTH); updateText(); @@ -214,8 +209,63 @@ void code_window_unload(Window *window) s_code_window = NULL; } +void custom_load(Window *window) +{ + Layer *window_layer = window_get_root_layer(window); + GRect bounds = layer_get_bounds(window_layer); + + // Register click config provider + window_set_click_config_provider(s_custom_window, click_config_provider); + + // Header text layer setup + s_heading_text_layer = text_layer_create(bounds); + text_layer_set_text(s_heading_text_layer, header); + text_layer_set_font(s_heading_text_layer, + fonts_get_system_font(FONT_KEY_BITHAM_30_BLACK)); + layer_add_child(window_get_root_layer(s_custom_window), + text_layer_get_layer(s_heading_text_layer)); + + // Push the window, setting the window animation to 'true' + window_stack_push(s_custom_window, true); +} + +void custom_unload(Window *window) +{ + text_layer_destroy(s_heading_text_layer); + //text_layer_destroy(s_input_text_layer); + + window_destroy(window); + s_custom_window = NULL; +} + +Object add_window(Object obj1, Object obj2, struct Environment *env) +{ + if(obj1.type == TYPE_STRING) { + strcpy(header, obj1.string); + } + + if(!s_custom_window) { + s_custom_window = window_create(); + WindowHandlers wh = { + .load = custom_load, + .unload = custom_unload }; + window_set_window_handlers(s_custom_window, wh); + } + + window_stack_push(s_custom_window, true); + + return numberObject(1); +} + +static struct Environment pebbleEnv() { + struct Environment e = defaultEnv(); + // Needs two args + addFunc("window", &add_window, &e); + return e; +} + static void init(void) { - env = defaultEnv(); + env = pebbleEnv(); s_menu_window = window_create(); window_set_window_handlers(s_menu_window, (WindowHandlers) { .load = menu_load, diff --git a/src/calc.h b/src/calc.h index 95a77a9..ae6bc66 100644 --- a/src/calc.h +++ b/src/calc.h @@ -13,6 +13,11 @@ Window *s_menu_window; Window *s_code_window; +// Custom layers +Window *s_custom_window; +TextLayer *s_heading_text_layer; +char header[30] = ""; + // Code layers TextLayer *s_input_text_layer; TextLayer *s_result_text_layer; @@ -43,7 +48,7 @@ char *tokens[] = { "7","8","9", "0", "a", "b", "c", "d", "e", "= ", "< ", "> ", - "spent", + "spent", "window", "\"", "map", "fn", "def", "if", "\n", END_PHRASE