From ad3eb59d5838e7cc711cfa44c1fa369365949b24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sun, 12 Jan 2020 00:23:32 +0100 Subject: [PATCH] add wrap-around option to the menu --- main/scenes/scene_manual_menu.c | 1 + main/scenes/scene_menu.c | 12 ++++++++++-- main/scenes/scene_menu.h | 7 +++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/main/scenes/scene_manual_menu.c b/main/scenes/scene_manual_menu.c index a1f7c48..f56065c 100644 --- a/main/scenes/scene_manual_menu.c +++ b/main/scenes/scene_manual_menu.c @@ -104,6 +104,7 @@ struct Scene *NewScene_MenuTest() { scene->base.paint = (Scene_paint_t) paint; scene->extra = priv; scene->extra_deinit = (Scene_deinit_t) priv_deinit; + scene->wraparound = true; // add a child return handler (base does not use this) scene->base.onChildReturn = (Scene_onChildReturn_t) onChildReturn; diff --git a/main/scenes/scene_menu.c b/main/scenes/scene_menu.c index 31797a1..ceced9e 100644 --- a/main/scenes/scene_menu.c +++ b/main/scenes/scene_menu.c @@ -57,10 +57,18 @@ static struct SceneEvent onInput(struct MenuScene *self, struct InputEvent event case InputEventKind_Wheel:; self->selected += event.wheel.direction; if (self->selected < 0) { - self->selected = 0; + if (self->wraparound) { + self->selected = self->items_len - 1; + } else { + self->selected = 0; + } } else if (self->selected >= self->items_len) { - self->selected = self->items_len - 1; + if (self->wraparound) { + self->selected = 0; + } else { + self->selected = self->items_len - 1; + } } // hacky scroll adjust diff --git a/main/scenes/scene_menu.h b/main/scenes/scene_menu.h index 3019bba..2e3a6d6 100644 --- a/main/scenes/scene_menu.h +++ b/main/scenes/scene_menu.h @@ -8,6 +8,7 @@ #define REFLOWER_SCENE_MENU_H #include +#include #include #define MENUITEM_LABEL_LEN 30 @@ -38,10 +39,10 @@ struct MenuScene { struct Scene base; // items array struct MenuItem *items; + // allow wrap-around + bool wraparound; // items count size_t items_len; - // number of visible characters in a line at a time - uint8_t ncols; // Vertical scroll offset (how many steps is the topmost item moved above the screen) int32_t scroll_up; // Start X @@ -56,6 +57,8 @@ struct MenuScene { int32_t hscroll_cnt; // Number of lines visible at a time uint8_t nlines; + // number of visible characters in a line at a time + uint8_t ncols; // selection handler MenuScene_onSelect_t onSelect; // Extra field for the subclass's private use.