You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

86 lines
2.5 KiB

// Copyright 2022 Andrew Dunai (@and3rson)
// SPDX-License-Identifier: GPL-2.0-or-later
#include "menu.h"
static int8_t menu_depth = -1;
static menu_t *menus[8];
#define MENU_OPENED menu_depth != -1
#define MENU_CURRENT menus[menu_depth]
#define MENU_MAX_ITEMS 10
bool menu_process_record(uint16_t keycode, keyrecord_t *record) {
if (MENU_OPENED) {
/* Menu is open */
if (record->event.pressed) {
if (keycode == KC_EGMENU) {
menu_t *menu = MENU_CURRENT;
menu_item_t item = menu->items[menu->current];
if (item.submenu != NULL) {
item.submenu->current = 0;
item.submenu->scroll = 0;
menus[++menu_depth] = item.submenu;
item.submenu->opened(item.submenu);
} else if (item.func != NULL) {
item.func();
menu_depth = -1;
}
} else {
menu_depth--;
}
}
return false;
} else if (keycode == KC_EGMENU) {
/* Menu is not open, KC_EGMENU pressed */
if (record->event.pressed) {
main_menu.current = 0;
main_menu.scroll = 0;
menus[++menu_depth] = &main_menu;
}
return false;
}
return true;
}
bool menu_encoder_update(uint8_t index, bool clockwise) {
if (MENU_OPENED) {
menu_t *menu = MENU_CURRENT;
if (clockwise) {
if (menu->current < menu->count - 1) {
menu->current++;
}
if (menu->current - menu->scroll >= MENU_MAX_ITEMS) {
menu->scroll++;
}
} else {
if (menu->current) {
menu->current--;
}
if (menu->current < menu->scroll) {
menu->scroll--;
}
}
return false;
}
return true;
}
bool menu_oled_task(void) {
if (MENU_OPENED) {
oled_clear();
oled_write_P(logo, false);
menu_t *menu = MENU_CURRENT;
char title[7] = " \0\0";
sprintf(title, "%-5s", menu->title);
title[5] = '\n';
oled_write(title, false);
for (uint8_t i = menu->scroll; i < (menu->count >= MENU_MAX_ITEMS ? menu->scroll + MENU_MAX_ITEMS : menu->count); i++) {
char buf[6] = " \0";
sprintf(buf, "%-5s", menu->items[i].title);
oled_write(buf, menu->current == i);
}
return false;
}
return true;
}