Implement selection highlight
This commit is contained in:
+65
-16
@@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user