From 4bbec23a95152da6d9d3fd0a46dbfc1e6ecf4cdd Mon Sep 17 00:00:00 2001 From: Wintermute Date: Tue, 22 Oct 2013 22:43:28 +0200 Subject: [PATCH] =?utf8?q?Men=C3=BC:=20Scrollen,=20wenn=20Knopf=20gedr?= =?utf8?q?=C3=BCckt=20gehalten.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- badge/ui/menu.c | 73 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/badge/ui/menu.c b/badge/ui/menu.c index b64e6d7..110b5ba 100644 --- a/badge/ui/menu.c +++ b/badge/ui/menu.c @@ -69,35 +69,60 @@ size_t badge_menu(char const *const *menu, size_t *first_visible, size_t selected) { + unsigned scroll_ticks = 0; + int scroll_direction = 0; + for(;;) { - if(n <= MENU_ENTRIES_VISIBLE) { - *first_visible = 0; - } else if(selected + 1 == n) { - *first_visible = n - MENU_ENTRIES_VISIBLE; - } else if(selected <= *first_visible) { - *first_visible = selected == 0 ? 0 : selected - 1; - } else if(selected - *first_visible + 2 > MENU_ENTRIES_VISIBLE) { - *first_visible = selected - MENU_ENTRIES_VISIBLE + 2; + if(scroll_ticks == 0) { + if (scroll_direction == 1 && selected + 1 < n) { + ++selected; + } else if(scroll_direction == -1 && selected != 0) { + --selected; + } + + if(n <= MENU_ENTRIES_VISIBLE) { + *first_visible = 0; + } else if(selected + 1 == n) { + *first_visible = n - MENU_ENTRIES_VISIBLE; + } else if(selected <= *first_visible) { + *first_visible = selected == 0 ? 0 : selected - 1; + } else if(selected - *first_visible + 2 > MENU_ENTRIES_VISIBLE) { + *first_visible = selected - MENU_ENTRIES_VISIBLE + 2; + } + + badge_menu_show(menu, n, *first_visible, selected); + + scroll_ticks = 25; } - badge_menu_show(menu, n, *first_visible, selected); - badge_event_t ev; - do { - ev = badge_event_wait(); - } while(badge_event_type(ev) != BADGE_EVENT_USER_INPUT); - - uint8_t old_state = badge_event_old_input_state(ev); - uint8_t new_state = badge_event_new_input_state(ev); - uint8_t new_buttons = new_state & (old_state ^ new_state); - - if(new_buttons & (BADGE_EVENT_KEY_BTN_A | BADGE_EVENT_KEY_BTN_B)) { - return selected; - } else if((new_buttons & BADGE_EVENT_KEY_UP ) && selected != 0) { - --selected; - } else if(new_buttons & BADGE_EVENT_KEY_DOWN && selected + 1 < n) { - ++selected; + ev = badge_event_wait(); + switch(badge_event_type(ev)) { + case BADGE_EVENT_USER_INPUT: + { + uint8_t old_state = badge_event_old_input_state(ev); + uint8_t new_state = badge_event_new_input_state(ev); + uint8_t new_buttons = new_state & (old_state ^ new_state); + + if(new_buttons & (BADGE_EVENT_KEY_BTN_A | BADGE_EVENT_KEY_BTN_B)) { + return selected; + } else if((new_buttons & BADGE_EVENT_KEY_UP )) { + scroll_direction = -1; + } else if((new_buttons & BADGE_EVENT_KEY_DOWN)) { + scroll_direction = 1; + } else { + scroll_direction = 0; + } + + scroll_ticks = 0; + break; + } + case BADGE_EVENT_GAME_TICK: + { + --scroll_ticks; + break; + } } } } -- 2.20.1