Skip to content

Instantly share code, notes, and snippets.

@Helco
Last active February 10, 2018 18:02
Show Gist options
  • Save Helco/429efdad090628ae8998ad5490808273 to your computer and use it in GitHub Desktop.
Save Helco/429efdad090628ae8998ad5490808273 to your computer and use it in GitHub Desktop.
RebbleOS - Menu layer test app
/* test.c
* routines for [...]
* RebbleOS
*
* Author: Hermann Noll
*/
#include "rebbleos.h"
#include "test.h"
#include "librebble.h"
#include "menu_layer.h"
#include "simple_menu_layer.h"
#define NUM_MENU_ITEMS 8
static Window *s_main_window;
static SimpleMenuLayer *s_simple_menu_layer;
static MenuLayer* s_menu_layer;
static SimpleMenuSection s_menu_section;
static SimpleMenuItem s_menu_items[NUM_MENU_ITEMS];
static MenuRowAlign s_row_align = MenuRowAlignCenter;
static MenuLayerReloadBehaviour s_reload_beh = MenuLayerReloadBehaviourManual;
static bool s_padding_enabled = true;
static void _menu_select_callback(ClickRecognizerRef recognizer, void *context)
{
MenuIndex index = menu_layer_get_selected_index(s_menu_layer);
if (index.row == 0) {
bool value = !menu_layer_get_center_focused(s_menu_layer);
s_menu_items[0].subtitle = value ? "true" : "false";
menu_layer_set_center_focused(s_menu_layer, value);
} else if (index.row == 1) {
const char* name;
switch(s_row_align) {
default:
case MenuRowAlignTop: {
s_row_align = MenuRowAlignCenter;
name = "center";
}break;
case MenuRowAlignCenter: {
s_row_align = MenuRowAlignBottom;
name = "bottom";
}break;
case MenuRowAlignBottom: {
s_row_align = MenuRowAlignTop;
name = "top";
}break;
}
s_menu_items[1].subtitle = name;
MenuIndex menu_index = menu_layer_get_selected_index(s_menu_layer);
menu_layer_set_selected_index(s_menu_layer, menu_index, s_row_align, true);
layer_mark_dirty(menu_layer_get_layer(s_menu_layer));
} else if (index.row == 2) {
s_padding_enabled = !s_padding_enabled;
s_menu_items[2].subtitle = s_padding_enabled ? "true" : "false";
menu_layer_pad_bottom_enable(s_menu_layer, s_padding_enabled);
layer_mark_dirty(menu_layer_get_layer(s_menu_layer));
} else if (index.row == 3) {
const char* name;
switch(s_reload_beh) {
default:
case MenuLayerReloadBehaviourManual: {
s_reload_beh = MenuLayerReloadBehaviourOnSelection;
name = "Selection";
}break;
case MenuLayerReloadBehaviourOnSelection: {
s_reload_beh = MenuLayerReloadBehaviourOnRender;
name = "Render";
}break;
case MenuLayerReloadBehaviourOnRender: {
s_reload_beh = MenuLayerReloadBehaviourManual;
name = "Manual";
}break;
}
s_menu_items[3].subtitle = name;
menu_layer_set_reload_behaviour(s_menu_layer, s_reload_beh);
layer_mark_dirty(menu_layer_get_layer(s_menu_layer));
} else if (index.row == 4) {
layer_mark_dirty(menu_layer_get_layer(s_menu_layer));
} else if (index.row == 5) {
menu_layer_reload_data(s_menu_layer);
}
}
static void _menu_next_callback(ClickRecognizerRef recognizer, void *context)
{
menu_layer_set_selected_next(s_menu_layer, false, s_row_align, true);
}
static void _menu_prev_callback(ClickRecognizerRef recognizer, void *context)
{
menu_layer_set_selected_next(s_menu_layer, true, s_row_align, true);
}
static void _deinit();
static void _menu_exit_callback(ClickRecognizerRef recognizer, void* context)
{
_deinit();
window_stack_pop(true);
appmanager_app_start("System");
}
static void _click_provider_config(void *context)
{
window_single_click_subscribe(BUTTON_ID_SELECT, (ClickHandler)_menu_select_callback);
window_single_click_subscribe(BUTTON_ID_DOWN, (ClickHandler)_menu_next_callback);
window_single_click_subscribe(BUTTON_ID_UP, (ClickHandler)_menu_prev_callback);
window_single_click_subscribe(BUTTON_ID_BACK, (ClickHandler)_menu_exit_callback);
}
static void _main_window_load(Window *window)
{
int num_a_items = 0;
s_menu_items[num_a_items++] = (SimpleMenuItem){
.title = "Centered",
.subtitle = "falrue"
};
s_menu_items[num_a_items++] = (SimpleMenuItem){
.title = "Row Align",
.subtitle = "center"
};
s_menu_items[num_a_items++] = (SimpleMenuItem){
.title = "Bottom Padding",
.subtitle = "true"
};
s_menu_items[num_a_items++] = (SimpleMenuItem){
.title = "Reload Behaviour",
.subtitle = "Manual"
};
s_menu_items[num_a_items++] = (SimpleMenuItem){
.title = "Mark as dirty"
};
s_menu_items[num_a_items++] = (SimpleMenuItem){
.title = "Reload data"
};
s_menu_items[num_a_items++] = (SimpleMenuItem){
.title = "to"
};
s_menu_items[num_a_items++] = (SimpleMenuItem){
.title = "fill"
};
s_menu_section = (SimpleMenuSection){
.title = NULL,
.items = s_menu_items,
.num_items = num_a_items
};
Layer *window_layer = window_get_root_layer(window);
GRect bounds = layer_get_frame(window_layer);
s_simple_menu_layer = simple_menu_layer_create(bounds, window, &s_menu_section, 1, NULL);
s_menu_layer = simple_menu_layer_get_menu_layer(s_simple_menu_layer);
layer_add_child(window_layer, simple_menu_layer_get_layer(s_simple_menu_layer));
menu_layer_set_highlight_colors(s_menu_layer, GColorRed, GColorBlack);
s_menu_items[0].subtitle = menu_layer_get_center_focused(s_menu_layer) ? "true" : "false";
window_set_click_config_provider(window, _click_provider_config
);
}
static void _main_window_unload(Window *window)
{
simple_menu_layer_destroy(s_simple_menu_layer);
}
static void _init()
{
s_main_window = window_create();
window_set_window_handlers(s_main_window, (WindowHandlers){
.load = _main_window_load,
.unload = _main_window_unload,
});
window_stack_push(s_main_window, true);
}
static void _deinit()
{
window_destroy(s_main_window);
}
void test_main(void)
{
_init();
app_event_loop();
_deinit();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment