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 BitmapLayer *s_check_bmp_layer;
|
||||||
static TextLayer *s_remaining_txt_layer;
|
static TextLayer *s_remaining_txt_layer;
|
||||||
static TextLayer *s_setter_txt_layer;
|
static TextLayer *s_setter_txt_layer;
|
||||||
|
static Layer *s_highlight_layer;
|
||||||
|
|
||||||
// bitmaps
|
// bitmaps
|
||||||
static GBitmap *s_clock_bmp;
|
static GBitmap *s_clock_bmp;
|
||||||
static GBitmap *s_check_bmp;
|
static GBitmap *s_check_bmp;
|
||||||
|
|
||||||
// global vars
|
// global vars
|
||||||
static GColor s_bar_color = GColorMayGreen;
|
static uint8_t s_highlight_pos = 0;
|
||||||
|
|
||||||
// constants
|
// constants
|
||||||
static const uint8_t s_edge_bar_height = ((PBL_DISPLAY_HEIGHT / 7) * 2);
|
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) {
|
static void select_click_handler(void *recognizer, void *ctx) {
|
||||||
graphics_context_set_fill_color(ctx, s_bar_color);
|
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);
|
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() {
|
static void setter_window_load() {
|
||||||
|
Layer *window_layer = window_get_root_layer(s_window);
|
||||||
|
|
||||||
// top&bottom bars
|
// top&bottom bars
|
||||||
static const GRect top_bar_grect = GRect(0, 0, PBL_DISPLAY_WIDTH, s_edge_bar_height);
|
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);
|
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);
|
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);
|
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
|
// clock icon
|
||||||
s_clock_bmp = gbitmap_create_with_resource(RESOURCE_ID_CLOCK35);
|
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_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_alignment(s_clock_bmp_layer, PBL_IF_ROUND_ELSE(GAlignTop, GAlignLeft));
|
||||||
bitmap_layer_set_compositing_mode(s_clock_bmp_layer, GCompOpSet);
|
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
|
// check icon
|
||||||
s_check_bmp = gbitmap_create_with_resource(RESOURCE_ID_CHECK);
|
s_check_bmp = gbitmap_create_with_resource(RESOURCE_ID_CHECK);
|
||||||
s_check_bmp_layer = bitmap_layer_create(bottom_bar_grect);
|
s_check_bmp_layer = bitmap_layer_create(bottom_bar_grect);
|
||||||
bitmap_layer_set_bitmap(s_check_bmp_layer, s_check_bmp);
|
bitmap_layer_set_bitmap(s_check_bmp_layer, s_check_bmp);
|
||||||
bitmap_layer_set_compositing_mode(s_check_bmp_layer, GCompOpSet);
|
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
|
// 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));
|
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_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_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");
|
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
|
// setter
|
||||||
s_setter_txt_layer = text_layer_create(GRect(0, (PBL_DISPLAY_HEIGHT / 2) - 39, PBL_DISPLAY_WIDTH, 60));
|
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_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_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"));
|
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));
|
layer_add_child(window_layer, text_layer_get_layer(s_setter_txt_layer));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setter_window_unload() {
|
static void setter_window_unload() {
|
||||||
|
layer_destroy(s_highlight_layer);
|
||||||
text_layer_destroy(s_setter_txt_layer);
|
text_layer_destroy(s_setter_txt_layer);
|
||||||
text_layer_destroy(s_remaining_txt_layer);
|
text_layer_destroy(s_remaining_txt_layer);
|
||||||
bitmap_layer_destroy(s_check_bmp_layer);
|
bitmap_layer_destroy(s_check_bmp_layer);
|
||||||
@@ -97,6 +145,7 @@ static void init() {
|
|||||||
window_set_window_handlers(
|
window_set_window_handlers(
|
||||||
s_window,
|
s_window,
|
||||||
(WindowHandlers){.load = setter_window_load, .unload = setter_window_unload});
|
(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);
|
window_stack_push(s_window, false);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user