#include "demo.h" // we list all distributions on which notcurses is known to exist static struct ncselector_item select_items[] = { #define SITEM(short, long) { short, long, 0, 0, } SITEM("fbsd", "FreeBSD"), SITEM("deb", "Debian Unstable Linux"), SITEM("rpm", "Fedora Rawhide Linux"), SITEM("pac", "Arch Linux"), SITEM("apk", "Alpine Edge Linux"), SITEM(NULL, NULL), #undef SITEM }; static struct ncmselector_item mselect_items[] = { { "Pa231", "Protactinium-231 (162kg)", .selected = false, }, { "U233", "Uranium-233 (15kg)", .selected = false, }, { "U235", "Uranium-235 (50kg)", .selected = false, }, { "Np236", "Neptunium-236 (7kg)", .selected = false, }, { "Np237", "Neptunium-237 (60kg)", .selected = false, }, { "Pu238", "Plutonium-238 (10kg)", .selected = false, }, { "Pu239", "Plutonium-239 (10kg)", .selected = false, }, { "Pu240", "Plutonium-240 (40kg)", .selected = false, }, { "Pu241", "Plutonium-241 (13kg)", .selected = false, }, { "Am241", "Americium-241 (100kg)", .selected = false, }, { "Pu242", "Plutonium-242 (100kg)", .selected = false, }, { "Am242", "Americium-242 (18kg)", .selected = false, }, { "Am243", "Americium-243 (155kg)", .selected = false, }, { "Cm243", "Curium-243 (10kg)", .selected = false, }, { "Cm244", "Curium-244 (30kg)", .selected = false, }, { "Cm245", "Curium-245 (13kg)", .selected = false, }, { "Cm246", "Curium-246 (84kg)", .selected = false, }, { "Cm247", "Curium-247 (7kg)", .selected = false, }, { "Bk247", "Berkelium-247 (10kg)", .selected = false, }, { "Cf249", "Californium-249 (6kg)", .selected = false, }, { "Cf251", "Californium-251 (9kg)", .selected = false, }, { NULL, NULL, .selected = false, }, }; static struct ncmultiselector* multiselector_demo(struct notcurses* nc, struct ncplane* n, int dimx, int y){ ncmultiselector_options mopts = { .maxdisplay = 8, .title = "multi-item selector", .items = mselect_items, .boxchannels = CHANNELS_RGB_INITIALIZER(0x20, 0xe0, 0xe0, 0x20, 0, 0), .opchannels = CHANNELS_RGB_INITIALIZER(0xe0, 0x80, 0x40, 0, 0, 0), .descchannels = CHANNELS_RGB_INITIALIZER(0x80, 0xe0, 0x40, 0, 0, 0), .footchannels = CHANNELS_RGB_INITIALIZER(0xe0, 0, 0x40, 0x20, 0x20, 0), .titlechannels = CHANNELS_RGB_INITIALIZER(0x20, 0xff, 0xff, 0, 0, 0x20), .bgchannels = CHANNELS_RGB_INITIALIZER(0, 0x20, 0, 0, 0x20, 0), }; channels_set_fg_alpha(&mopts.bgchannels, CELL_ALPHA_BLEND); channels_set_bg_alpha(&mopts.bgchannels, CELL_ALPHA_BLEND); struct ncmultiselector* mselector = ncmultiselector_create(n, y, 0, &mopts); if(mselector == NULL){ return NULL; } struct ncplane* mplane = ncmultiselector_plane(mselector); struct timespec swoopdelay; timespec_div(&demodelay, dimx / 3, &swoopdelay); int length = ncplane_dim_x(mplane); ncplane_move_yx(mplane, y, -length); ncinput ni; for(int i = -length + 1 ; i < dimx - (length + 1) ; ++i){ if(demo_render(nc)){ ncmultiselector_destroy(mselector); return NULL; } ncplane_move_yx(mplane, y, i); char32_t wc = demo_getc(nc, &swoopdelay, &ni); if(wc == (char32_t)-1){ ncmultiselector_destroy(mselector); return NULL; }else if(wc){ ncmultiselector_offer_input(mselector, &ni); } } if(demo_render(nc)){ ncmultiselector_destroy(mselector); return NULL; } struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); uint64_t cur = timespec_to_ns(&ts); uint64_t targ = cur + GIG; do{ struct timespec rel; ns_to_timespec(targ - cur, &rel); char32_t wc = demo_getc(nc, &rel, &ni); if(wc == (char32_t)-1){ ncmultiselector_destroy(mselector); return NULL; }else if(wc){ ncmultiselector_offer_input(mselector, &ni); } clock_gettime(CLOCK_MONOTONIC, &ts); cur = timespec_to_ns(&ts); }while(cur < targ); return mselector; } static int draw_background(struct notcurses* nc){ if(notcurses_canopen_images(nc)){ struct ncplane* n = notcurses_stdplane(nc); nc_err_e err; struct ncvisual* ncv = ncvisual_from_file("../data/changes.jpg", &err); if(!ncv){ return -1; } struct ncvisual_options vopts = { .scaling = NCSCALE_STRETCH, .n = n, }; if(ncvisual_render(nc, ncv, &vopts) == NULL){ ncvisual_destroy(ncv); return -1; } } return 0; } static struct ncselector* selector_demo(struct notcurses* nc, struct ncplane* n, int dimx, int y){ ncselector_options sopts = { .title = "single-item selector", .items = select_items, .defidx = 4, .maxdisplay = 3, .boxchannels = CHANNELS_RGB_INITIALIZER(0x20, 0xe0, 0x40, 0x20, 0x20, 0x20), .opchannels = CHANNELS_RGB_INITIALIZER(0xe0, 0x80, 0x40, 0, 0, 0), .descchannels = CHANNELS_RGB_INITIALIZER(0x80, 0xe0, 0x40, 0, 0, 0), .footchannels = CHANNELS_RGB_INITIALIZER(0xe0, 0, 0x40, 0x20, 0, 0), .titlechannels = CHANNELS_RGB_INITIALIZER(0xff, 0xff, 0x80, 0, 0, 0x20), .bgchannels = CHANNELS_RGB_INITIALIZER(0, 0x20, 0, 0, 0x20, 0), }; channels_set_fg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND); channels_set_bg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND); struct ncselector* selector = ncselector_create(n, y, dimx, &sopts); if(selector == NULL){ return NULL; } struct ncplane* splane = ncselector_plane(selector); struct timespec swoopdelay; timespec_div(&demodelay, dimx / 3, &swoopdelay); ncinput ni; for(int i = dimx - 1 ; i > 1 ; --i){ if(demo_render(nc)){ ncselector_destroy(selector, NULL); return NULL; } ncplane_move_yx(splane, y, i); char32_t wc = demo_getc(nc, &swoopdelay, &ni); if(wc == (char32_t)-1){ ncselector_destroy(selector, NULL); return NULL; }else if(wc){ ncselector_offer_input(selector, &ni); } } if(demo_render(nc)){ ncselector_destroy(selector, NULL); return NULL; } struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); uint64_t cur = timespec_to_ns(&ts); uint64_t targ = cur + GIG; do{ struct timespec rel; ns_to_timespec(targ - cur, &rel); char32_t wc = demo_getc(nc, &rel, &ni); if(wc == (char32_t)-1){ ncselector_destroy(selector, NULL); return NULL; }else if(wc){ ncselector_offer_input(selector, &ni); } clock_gettime(CLOCK_MONOTONIC, &ts); cur = timespec_to_ns(&ts); }while(cur < targ); return selector; } int zoo_demo(struct notcurses* nc){ int dimx; if(draw_background(nc)){ return -1; } struct ncplane* n = notcurses_stddim_yx(nc, NULL, &dimx); struct ncselector* selector = selector_demo(nc, n, dimx, 2); struct ncmultiselector* mselector = multiselector_demo(nc, n, dimx, 8); // FIXME calculate from splane if(selector == NULL || mselector == NULL){ goto err; } ncselector_destroy(selector, NULL); ncmultiselector_destroy(mselector); DEMO_RENDER(nc); return 0; err: ncselector_destroy(selector, NULL); ncmultiselector_destroy(mselector); return -1; }