You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
notcurses/src/poc/menu.c

164 lines
5.0 KiB
C

#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
#include <notcurses/notcurses.h>
static int
run_menu(struct notcurses* nc, struct ncmenu* ncm){
ncplane_options nopts = {
.y = 10,
.x = NCALIGN_CENTER,
.rows = 3,
.cols = 40,
.flags = NCPLANE_OPTION_HORALIGNED,
};
struct ncplane* selplane = ncplane_create(notcurses_stdplane(nc), &nopts);
if(selplane == NULL){
return -1;
}
ncplane_set_fg_rgb(selplane, 0x0);
ncplane_set_bg_rgb(selplane, 0xdddddd);
uint64_t channels = 0;
ncchannels_set_fg_rgb(&channels, 0x000088);
ncchannels_set_bg_rgb(&channels, 0x88aa00);
if(ncplane_set_base(selplane, " ", 0, channels) < 0){
goto err;
}
uint32_t keypress;
ncinput ni;
notcurses_render(nc);
while((keypress = notcurses_get_blocking(nc, &ni)) != (uint32_t)-1){
if(!ncmenu_offer_input(ncm, &ni)){
const char* sel;
if( (sel = ncmenu_mouse_selected(ncm, &ni, NULL)) ){
if(sel && !strcmp(sel, "Quit")){
ncmenu_destroy(ncm);
ncplane_destroy(selplane);
return 0;
}
}else if(ni.evtype == NCTYPE_RELEASE){
continue;
}else if(keypress == 'q'){
ncmenu_destroy(ncm);
ncplane_destroy(selplane);
return 0;
}else if(keypress == NCKEY_ENTER){ // selected a menu item
if( (sel = ncmenu_selected(ncm, &ni)) ){
if(strcmp(sel, "Quit") == 0){
ncmenu_destroy(ncm);
ncplane_destroy(selplane);
return 0;
}
}
}
}
ncplane_erase(selplane);
ncinput selni;
const char* selitem = ncmenu_selected(ncm, &selni);
ncplane_putstr_aligned(selplane, 1, NCALIGN_CENTER, selitem ? selitem : "");
notcurses_render(nc);
}
ncmenu_destroy(ncm);
return 0;
err:
ncplane_destroy(selplane);
return -1;
}
int main(void){
notcurses_options opts = { };
struct notcurses* nc = notcurses_core_init(&opts, NULL);
if(nc == NULL){
return EXIT_FAILURE;
}
notcurses_mice_enable(nc, NCMICE_BUTTON_EVENT);
struct ncmenu_item demo_items[] = {
{ .desc = "Restart", .shortcut = { .id = 'r', .modifiers = NCKEY_MOD_CTRL, }, },
{ .desc = "Derp", .shortcut = { .id = 'd', }, },
};
struct ncmenu_item file_items[] = {
{ .desc = "New", .shortcut = { .id = 'n', .modifiers = NCKEY_MOD_CTRL, }, },
{ .desc = "Open", .shortcut = { .id = 'o', .modifiers = NCKEY_MOD_CTRL, }, },
{ .desc = "Close", .shortcut = { .id = 'c', .modifiers = NCKEY_MOD_CTRL, }, },
{ .desc = NULL, },
{ .desc = "Quit", .shortcut = { .id = 'q', }, },
};
struct ncmenu_item help_items[] = {
{ .desc = "About", .shortcut = { .id = 'a', .modifiers = NCKEY_MOD_CTRL, }, },
};
struct ncmenu_section sections[] = {
{ .name = "Schwarzgerät", .items = demo_items,
.itemcount = sizeof(demo_items) / sizeof(*demo_items),
.shortcut = { .id = 0x00e4, .modifiers = NCKEY_MOD_ALT, }, },
{ .name = "File", .items = file_items,
.itemcount = sizeof(file_items) / sizeof(*file_items),
.shortcut = { .id = 'f', .modifiers = NCKEY_MOD_ALT, }, },
{ .name = NULL, .items = NULL, .itemcount = 0, },
{ .name = "Help", .items = help_items,
.itemcount = sizeof(help_items) / sizeof(*help_items),
.shortcut = { .id = 'h', .modifiers = NCKEY_MOD_ALT, }, },
};
ncmenu_options mopts;
memset(&mopts, 0, sizeof(mopts));
mopts.sections = sections;
mopts.sectioncount = sizeof(sections) / sizeof(*sections);
ncchannels_set_fg_rgb(&mopts.headerchannels, 0x00ff00);
ncchannels_set_bg_rgb(&mopts.headerchannels, 0x440000);
ncchannels_set_fg_rgb(&mopts.sectionchannels, 0xb0d700);
ncchannels_set_bg_rgb(&mopts.sectionchannels, 0x002000);
unsigned dimy, dimx;
struct ncplane* n = notcurses_stddim_yx(nc, &dimy, &dimx);
struct ncmenu* top = ncmenu_create(n, &mopts);
if(top == NULL){
goto err;
}
if(ncmenu_item_set_status(top, "Schwarzgerät", "Restart", false)){
goto err;
}
if(ncmenu_item_set_status(top, "File", "Open", false)){
goto err;
}
uint64_t channels = 0;
ncchannels_set_fg_rgb(&channels, 0x88aa00);
ncchannels_set_bg_rgb(&channels, 0x000088);
if(ncplane_set_base(n, "x", 0, channels) < 0){
return EXIT_FAILURE;
}
notcurses_render(nc);
ncplane_set_fg_rgb(n, 0x00dddd);
if(ncplane_putstr_aligned(n, dimy - 1, NCALIGN_RIGHT, " -=+ menu poc. press q to exit +=- ") < 0){
return EXIT_FAILURE;
}
run_menu(nc, top);
ncplane_erase(n);
mopts.flags |= NCMENU_OPTION_BOTTOM;
struct ncmenu* bottom = ncmenu_create(n, &mopts);
if(bottom == NULL){
goto err;
}
if(ncmenu_item_set_status(bottom, "Schwarzgerät", "Restart", false)){
goto err;
}
if(ncmenu_item_set_status(bottom, "Schwarzgerät", "Derp", false)){
goto err;
}
if(ncplane_putstr_aligned(n, 0, NCALIGN_RIGHT, " -=+ menu poc. press q to exit +=- ") < 0){
return EXIT_FAILURE;
}
run_menu(nc, bottom);
if(notcurses_stop(nc)){
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
err:
notcurses_stop(nc);
return EXIT_FAILURE;
}