Implement selection highlight

This commit is contained in:
2026-07-30 21:59:24 -04:00
parent 86e99b361a
commit 154de005a1
+65 -16
View File
@@ -8,36 +8,82 @@ static BitmapLayer *s_clock_bmp_layer;
static BitmapLayer *s_check_bmp_layer;
static TextLayer *s_remaining_txt_layer;
static TextLayer *s_setter_txt_layer;
static Layer *s_highlight_layer;
// bitmaps
static GBitmap *s_clock_bmp;
static GBitmap *s_check_bmp;
// global vars
static GColor s_bar_color = GColorMayGreen;
static uint8_t s_highlight_pos = 0;
// constants
static const uint8_t s_edge_bar_height = ((PBL_DISPLAY_HEIGHT / 7) * 2);
static void game1_window_load() {}
static void game1_window_unload() {}
/////////////////////////////////
static void rect_fill_layer_update_proc(Layer *layer, GContext *ctx) {
graphics_context_set_fill_color(ctx, s_bar_color);
static void select_click_handler(void *recognizer, void *ctx) {
if (s_highlight_pos == 2) {
s_highlight_pos = 0;
} else {
s_highlight_pos++;
}
layer_mark_dirty(s_highlight_layer);
layer_mark_dirty(s_bottom_bar_layer);
}
static void back_click_handler(void *recognizer, void *ctx) {
if (s_highlight_pos == 0) {
window_stack_pop_all(true); // exit app
} else {
s_highlight_pos--;
}
layer_mark_dirty(s_highlight_layer);
layer_mark_dirty(s_bottom_bar_layer);
}
static void click_config_provider(void *ctx) {
window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);
window_single_click_subscribe(BUTTON_ID_BACK, back_click_handler);
}
static void top_bar_layer_update_proc(Layer *layer, GContext *ctx) {
graphics_context_set_fill_color(ctx, GColorMayGreen);
graphics_fill_rect(ctx, layer_get_bounds(layer), 0, GCornerNone);
}
static void bottom_bar_layer_update_proc(Layer *layer, GContext *ctx) {
graphics_context_set_fill_color(ctx, (s_highlight_pos == 2 ? GColorLightGray : GColorMayGreen));
graphics_fill_rect(ctx, layer_get_bounds(layer), 0, GCornerNone);
}
static void highlight_layer_update_proc(Layer *layer, GContext *ctx) {
GRect fill_area = layer_get_bounds(layer);
fill_area.size.w = PBL_DISPLAY_WIDTH / 2;
switch (s_highlight_pos) {
case 2:
return; // do not draw highlight
case 1:
// draw highlight on minutes site
fill_area.origin.x = fill_area.size.w;
break;
}
graphics_context_set_fill_color(ctx, GColorLightGray);
graphics_fill_rect(ctx, fill_area, 0, GCornerNone);
}
static void setter_window_load() {
Layer *window_layer = window_get_root_layer(s_window);
// top&bottom bars
static const GRect top_bar_grect = GRect(0, 0, PBL_DISPLAY_WIDTH, s_edge_bar_height);
s_top_bar_layer = layer_create(top_bar_grect);
layer_set_update_proc(s_top_bar_layer, rect_fill_layer_update_proc);
layer_set_update_proc(s_top_bar_layer, top_bar_layer_update_proc);
layer_add_child(window_layer, s_top_bar_layer);
static const GRect bottom_bar_grect = GRect(0, PBL_DISPLAY_HEIGHT - s_edge_bar_height, PBL_DISPLAY_WIDTH, s_edge_bar_height);
s_bottom_bar_layer = layer_create(bottom_bar_grect);
layer_set_update_proc(s_bottom_bar_layer, rect_fill_layer_update_proc);
layer_set_update_proc(s_bottom_bar_layer, bottom_bar_layer_update_proc);
layer_add_child(window_layer, s_bottom_bar_layer);
// clock icon
s_clock_bmp = gbitmap_create_with_resource(RESOURCE_ID_CLOCK35);
@@ -45,12 +91,14 @@ static void setter_window_load() {
bitmap_layer_set_bitmap(s_clock_bmp_layer, s_clock_bmp);
bitmap_layer_set_alignment(s_clock_bmp_layer, PBL_IF_ROUND_ELSE(GAlignTop, GAlignLeft));
bitmap_layer_set_compositing_mode(s_clock_bmp_layer, GCompOpSet);
layer_add_child(window_layer, bitmap_layer_get_layer(s_clock_bmp_layer));
// check icon
s_check_bmp = gbitmap_create_with_resource(RESOURCE_ID_CHECK);
s_check_bmp_layer = bitmap_layer_create(bottom_bar_grect);
bitmap_layer_set_bitmap(s_check_bmp_layer, s_check_bmp);
bitmap_layer_set_compositing_mode(s_check_bmp_layer, GCompOpSet);
layer_add_child(window_layer, bitmap_layer_get_layer(s_check_bmp_layer));
// remaining time
s_remaining_txt_layer = text_layer_create(GRect(PBL_IF_ROUND_ELSE(0, 39), PBL_IF_ROUND_ELSE(37, (top_bar_grect.size.h / 2) - (top_bar_grect.size.h / 3)), PBL_IF_ROUND_ELSE(top_bar_grect.size.w, top_bar_grect.size.w - 39), 32));
@@ -59,6 +107,12 @@ static void setter_window_load() {
text_layer_set_background_color(s_remaining_txt_layer, GColorClear);
text_layer_set_font(s_remaining_txt_layer, fonts_get_system_font(FONT_KEY_LECO_32_BOLD_NUMBERS));
text_layer_set_text(s_remaining_txt_layer, "00:00:00");
layer_add_child(window_layer, text_layer_get_layer(s_remaining_txt_layer));
// highlighter
s_highlight_layer = layer_create(GRect(0, top_bar_grect.size.h, PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT - (2 * top_bar_grect.size.h)));
layer_set_update_proc(s_highlight_layer, highlight_layer_update_proc);
layer_add_child(window_layer, s_highlight_layer);
// setter
s_setter_txt_layer = text_layer_create(GRect(0, (PBL_DISPLAY_HEIGHT / 2) - 39, PBL_DISPLAY_WIDTH, 60));
@@ -66,17 +120,11 @@ static void setter_window_load() {
text_layer_set_background_color(s_setter_txt_layer, GColorClear);
text_layer_set_font(s_setter_txt_layer, fonts_get_system_font(FONT_KEY_LECO_60_NUMBERS_AM_PM));
text_layer_set_text(s_setter_txt_layer, PBL_IF_ROUND_ELSE("00 : 00", "00:00"));
Layer *window_layer = window_get_root_layer(s_window);
layer_add_child(window_layer, s_top_bar_layer);
layer_add_child(window_layer, s_bottom_bar_layer);
layer_add_child(window_layer, bitmap_layer_get_layer(s_clock_bmp_layer));
layer_add_child(window_layer, bitmap_layer_get_layer(s_check_bmp_layer));
layer_add_child(window_layer, text_layer_get_layer(s_remaining_txt_layer));
layer_add_child(window_layer, text_layer_get_layer(s_setter_txt_layer));
}
static void setter_window_unload() {
layer_destroy(s_highlight_layer);
text_layer_destroy(s_setter_txt_layer);
text_layer_destroy(s_remaining_txt_layer);
bitmap_layer_destroy(s_check_bmp_layer);
@@ -97,6 +145,7 @@ static void init() {
window_set_window_handlers(
s_window,
(WindowHandlers){.load = setter_window_load, .unload = setter_window_unload});
window_set_click_config_provider(s_window, click_config_provider);
window_stack_push(s_window, false);
};
}