Add initial status window

This commit is contained in:
2026-08-10 23:22:28 -04:00
parent 938d0accd9
commit 25a2b9fd2e
2 changed files with 99 additions and 13 deletions
+96 -13
View File
@@ -1,3 +1,4 @@
#include "main.h"
#include "scheduler.h" #include "scheduler.h"
#include "triangles.h" #include "triangles.h"
#include <pebble.h> #include <pebble.h>
@@ -5,10 +6,12 @@
// layer-age // layer-age
static Window *s_window; static Window *s_window;
static Window *s_status_window;
static Window *s_drop_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;
static TextLayer *s_counter_txt_layer; static TextLayer *s_counter_txt_layer;
static TextLayer *s_status_txt_layer;
//// setter //// setter
static BitmapLayer *s_clock_bmp_layer; static BitmapLayer *s_clock_bmp_layer;
static BitmapLayer *s_check_bmp_layer; static BitmapLayer *s_check_bmp_layer;
@@ -78,7 +81,82 @@ static const char *s_options_function[3];
static char *s_options_over[2]; static char *s_options_over[2];
static char *s_options_under[2]; static char *s_options_under[2];
///////////////////////////////// ////////////////////// STATUS //////////////////////
static void status_0_1_back_click_handler(void *recognizer, void *ctx) {
s_highlight_pos = 0;
window_stack_pop_all(true);
push_setter_window();
}
static void status_0_select_click_handler(void *recognizer, void *ctx) {
window_stack_pop_all(true);
}
static void status_2_select_click_handler(void *recognizer, void *ctx) {
window_stack_pop(true);
}
static void status_0_click_config_provider(void *ctx) {
window_single_click_subscribe(BUTTON_ID_BACK, status_0_1_back_click_handler);
window_single_click_subscribe(BUTTON_ID_SELECT, status_0_select_click_handler);
}
static void status_1_click_config_provider(void *ctx) {
window_single_click_subscribe(BUTTON_ID_BACK, status_0_1_back_click_handler);
window_single_click_subscribe(BUTTON_ID_SELECT, status_0_1_back_click_handler);
window_single_click_subscribe(BUTTON_ID_UP, status_0_1_back_click_handler);
window_single_click_subscribe(BUTTON_ID_DOWN, status_0_1_back_click_handler);
}
static void status_2_click_config_provider(void *ctx) {
window_single_click_subscribe(BUTTON_ID_SELECT, status_2_select_click_handler);
}
static void status_window_load(uint8_t reason) {
Layer *window_layer = window_get_root_layer(s_status_window);
switch (reason) {
case 0:
tick_timer_service_unsubscribe();
s_status_txt_layer = text_layer_create(GRect(0, 8, PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT));
text_layer_set_font(s_status_txt_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24));
text_layer_set_text(s_status_txt_layer, "Alarm disarmed and re-set successfully.\n\nLast four times:\n1. 12:23\n2. 13:41\n3. 16:11\n4. 16:17");
window_set_click_config_provider(s_status_window, status_0_click_config_provider);
break;
case 1:
tick_timer_service_unsubscribe();
s_status_txt_layer = text_layer_create(GRect(0, PBL_DISPLAY_HEIGHT / 2, PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT));
text_layer_set_font(s_status_txt_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28));
text_layer_set_text(s_status_txt_layer, "Failed to set primary alarm.\nPress any button to return to alarm setter.");
window_set_click_config_provider(s_status_window, status_1_click_config_provider);
break;
case 2:
s_status_txt_layer = text_layer_create(GRect(0, (PBL_DISPLAY_HEIGHT / 2) - 37, PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT));
text_layer_set_font(s_status_txt_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28));
text_layer_set_text(s_status_txt_layer, "Incorrect equation.\nTry again!");
window_set_click_config_provider(s_status_window, status_2_click_config_provider);
}
text_layer_set_background_color(s_status_txt_layer, GColorClear);
text_layer_set_text_alignment(s_status_txt_layer, GTextAlignmentCenter);
layer_add_child(window_layer, text_layer_get_layer(s_status_txt_layer));
}
static void status_window_unload() {
text_layer_destroy(s_status_txt_layer);
}
// reasons: 0 = confirmation, 1 = failure to set alarm, 2 = user sucks at math
static void push_status_window(uint8_t reason) {
s_status_window = window_create();
window_set_window_handlers(
s_status_window,
(WindowHandlers){.unload = status_window_unload});
status_window_load(reason);
window_stack_push(s_status_window, true);
}
////////////////////// MISC //////////////////////
static bool schedule_alarm(bool is_fallback) { static bool schedule_alarm(bool is_fallback) {
time_t target; time_t target;
@@ -101,7 +179,8 @@ static bool schedule_alarm(bool is_fallback) {
status = wakeup_schedule_simple_robust(target, SECONDS_PER_MINUTE, is_fallback); status = wakeup_schedule_simple_robust(target, SECONDS_PER_MINUTE, is_fallback);
} }
if (status < 0) { if (status < 0) {
return false; // TODO show failure window - user must acknowledge this window to close it push_status_window(1);
return false;
} }
return true; return true;
} }
@@ -452,10 +531,10 @@ static void alarm_window_load() {
s_options_function[1] = s_cos; s_options_function[1] = s_cos;
s_options_function[2] = s_tan; s_options_function[2] = s_tan;
//// create drop window //// create drop window
s_drop_window = window_create(); // TODO destroy on window unload? s_drop_window = window_create();
window_set_window_handlers( window_set_window_handlers(
s_drop_window, s_drop_window,
(WindowHandlers){.unload = drop_menu_window_unload}); (WindowHandlers){.load = drop_menu_window_load, .unload = drop_menu_window_unload});
// stopwatch // stopwatch
s_counter_txt_layer = text_layer_create(GRect(0, (s_small_top_bar_height / 2) - PBL_IF_ROUND_ELSE(6, 10), PBL_DISPLAY_WIDTH, s_small_top_bar_height)); s_counter_txt_layer = text_layer_create(GRect(0, (s_small_top_bar_height / 2) - PBL_IF_ROUND_ELSE(6, 10), PBL_DISPLAY_WIDTH, s_small_top_bar_height));
@@ -527,7 +606,6 @@ static void alarm_down_click_handler(void *recognizer, void *ctx) {
} }
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); window_stack_push(s_drop_window, true);
} }
@@ -535,14 +613,14 @@ static void alarm_select_hold_handler(void *recognizer, void *ctx) {
// check solution // check solution
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
if (s_selected_indices[i] != s_solution_indices[i]) { if (s_selected_indices[i] != s_solution_indices[i]) {
return; // TODO pop-up telling the user they are wrong push_status_window(2);
return;
} }
} }
bool success = schedule_alarm(false); bool success = schedule_alarm(false);
if (success) { if (success) {
// TODO confirmation window push_status_window(0);
window_stack_pop_all(true);
} }
} }
@@ -702,6 +780,7 @@ static void setter_click_config_provider(void *ctx) {
} }
static void live_wakeup_handler_for_setter(WakeupId id, int32_t reason) { static void live_wakeup_handler_for_setter(WakeupId id, int32_t reason) {
s_highlight_pos = 0;
window_stack_pop_all(false); window_stack_pop_all(false);
push_alarm_window(); push_alarm_window();
} }
@@ -770,6 +849,14 @@ static void setter_window_unload() {
fonts_unload_custom_font(s_font_lecoish_big); fonts_unload_custom_font(s_font_lecoish_big);
} }
static void push_setter_window() {
window_set_window_handlers(
s_window,
(WindowHandlers){.load = setter_window_load, .unload = setter_window_unload});
window_set_click_config_provider(s_window, setter_click_config_provider);
window_stack_push(s_window, false);
}
static void init() { static void init() {
s_window = window_create(); s_window = window_create();
s_font_lecoish_small = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LECOISH_MONO_BOLD_20)); s_font_lecoish_small = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LECOISH_MONO_BOLD_20));
@@ -784,11 +871,7 @@ static void init() {
push_alarm_window(); push_alarm_window();
break; break;
default: default:
window_set_window_handlers( push_setter_window();
s_window,
(WindowHandlers){.load = setter_window_load, .unload = setter_window_unload});
window_set_click_config_provider(s_window, setter_click_config_provider);
window_stack_push(s_window, false);
}; };
} }
+3
View File
@@ -0,0 +1,3 @@
#pragma once
static void push_setter_window();