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/demo/zoo.c

134 lines
4.0 KiB
C

#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 ncmultiselector*
multiselector_demo(struct notcurses* nc, struct ncplane* n, int dimx, int y){
ncmultiselector_options mopts = {
.maxdisplay = 8,
.title = "multi-item selector",
};
channels_set_fg(&mopts.boxchannels, 0x20e040);
channels_set_fg(&mopts.opchannels, 0xe08040);
channels_set_fg(&mopts.descchannels, 0x80e040);
channels_set_bg(&mopts.opchannels, 0);
channels_set_bg(&mopts.descchannels, 0);
channels_set_fg(&mopts.footchannels, 0xe00040);
channels_set_fg(&mopts.titlechannels, 0xffff80);
channels_set_fg(&mopts.bgchannels, 0x002000);
channels_set_bg(&mopts.bgchannels, 0x002000);
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);
for(int i = 0 ; i < dimx - (length + 1) ; ++i){
if(demo_render(nc)){
ncmultiselector_destroy(mselector);
return NULL;
}
ncplane_move_yx(mplane, y, i);
ncinput ni;
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);
}
}
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;
}
int zoo_demo(struct notcurses* nc){
int dimx;
if(draw_background(nc)){
return -1;
}
struct ncmultiselector* mselector = NULL;
struct ncplane* n = notcurses_stddim_yx(nc, NULL, &dimx);
ncselector_options sopts = {
.maxdisplay = 4,
.title = "single-item selector",
.items = select_items,
};
channels_set_fg(&sopts.boxchannels, 0x20e040);
channels_set_fg(&sopts.opchannels, 0xe08040);
channels_set_fg(&sopts.descchannels, 0x80e040);
channels_set_bg(&sopts.opchannels, 0);
channels_set_bg(&sopts.descchannels, 0);
channels_set_fg(&sopts.footchannels, 0xe00040);
channels_set_fg(&sopts.titlechannels, 0xffff80);
channels_set_fg(&sopts.bgchannels, 0x002000);
channels_set_bg(&sopts.bgchannels, 0x002000);
channels_set_fg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND);
channels_set_bg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND);
struct ncselector* selector = ncselector_create(n, 2, dimx, &sopts);
if(selector == NULL){
goto err;
}
struct ncplane* splane = ncselector_plane(selector);
struct timespec swoopdelay;
timespec_div(&demodelay, dimx / 3, &swoopdelay);
for(int i = dimx - 1 ; i > 1 ; --i){
DEMO_RENDER(nc);
ncplane_move_yx(splane, 2, i);
ncinput ni;
char32_t wc = demo_getc(nc, &swoopdelay, &ni);
if(wc == (char32_t)-1){
goto err;
}else if(wc){
ncselector_offer_input(selector, &ni);
}
}
mselector = multiselector_demo(nc, n, dimx, 8); // FIXME calculate from splane
if(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;
}