mirror of
https://github.com/dankamongmen/notcurses.git
synced 2024-11-18 03:25:55 +00:00
selector/multiselect: kill itemcount options field #831
This commit is contained in:
parent
83c0a6a33d
commit
bac02bccd0
@ -27,7 +27,6 @@ typedef struct ncmultiselector_options {
|
|||||||
char* secondary; // secondary may be NULL
|
char* secondary; // secondary may be NULL
|
||||||
char* footer; // footer may be NULL
|
char* footer; // footer may be NULL
|
||||||
struct ncmselector_item* items; // initial items, statuses
|
struct ncmselector_item* items; // initial items, statuses
|
||||||
unsigned itemcount; // number of initial items
|
|
||||||
// default item (selected at start)
|
// default item (selected at start)
|
||||||
unsigned defidx;
|
unsigned defidx;
|
||||||
// maximum number of options to display at once
|
// maximum number of options to display at once
|
||||||
|
@ -26,7 +26,6 @@ typedef struct ncselector_options {
|
|||||||
char* secondary; // secondary may be NULL
|
char* secondary; // secondary may be NULL
|
||||||
char* footer; // footer may be NULL
|
char* footer; // footer may be NULL
|
||||||
struct ncselector_item* items; // initial items and descriptions
|
struct ncselector_item* items; // initial items and descriptions
|
||||||
unsigned itemcount; // number of initial items and descriptions
|
|
||||||
// default item (selected at start)
|
// default item (selected at start)
|
||||||
unsigned defidx;
|
unsigned defidx;
|
||||||
// maximum number of options to display at once
|
// maximum number of options to display at once
|
||||||
|
@ -2664,9 +2664,8 @@ typedef struct ncselector_options {
|
|||||||
char* secondary; // secondary may be NULL
|
char* secondary; // secondary may be NULL
|
||||||
char* footer; // footer may be NULL
|
char* footer; // footer may be NULL
|
||||||
struct ncselector_item* items; // initial items and descriptions
|
struct ncselector_item* items; // initial items and descriptions
|
||||||
unsigned itemcount; // number of initial items and descriptions
|
// default item (selected at start), must be < itemcount unless itemcount is
|
||||||
// default item (selected at start), must be < itemcount unless 'itemcount'
|
// 0, in which case 'defidx' must also be 0
|
||||||
// is 0, in which case 'defidx' must also be 0
|
|
||||||
unsigned defidx;
|
unsigned defidx;
|
||||||
// maximum number of options to display at once, 0 to use all available space
|
// maximum number of options to display at once, 0 to use all available space
|
||||||
unsigned maxdisplay;
|
unsigned maxdisplay;
|
||||||
@ -2742,7 +2741,6 @@ typedef struct ncmultiselector_options {
|
|||||||
char* secondary; // secondary may be NULL
|
char* secondary; // secondary may be NULL
|
||||||
char* footer; // footer may be NULL
|
char* footer; // footer may be NULL
|
||||||
struct ncmselector_item* items; // initial items, descriptions, and statuses
|
struct ncmselector_item* items; // initial items, descriptions, and statuses
|
||||||
unsigned itemcount; // number of items and descriptions, can't be 0
|
|
||||||
// maximum number of options to display at once, 0 to use all available space
|
// maximum number of options to display at once, 0 to use all available space
|
||||||
unsigned maxdisplay;
|
unsigned maxdisplay;
|
||||||
// exhaustive styling options
|
// exhaustive styling options
|
||||||
|
@ -178,7 +178,13 @@ ncselector_dim_yx(notcurses* nc, const ncselector* n, int* ncdimy, int* ncdimx){
|
|||||||
}
|
}
|
||||||
|
|
||||||
ncselector* ncselector_create(ncplane* nc, int y, int x, const ncselector_options* opts){
|
ncselector* ncselector_create(ncplane* nc, int y, int x, const ncselector_options* opts){
|
||||||
if(opts->defidx && opts->defidx >= opts->itemcount){
|
unsigned itemcount = 0;
|
||||||
|
if(opts->items){
|
||||||
|
for(const struct ncselector_item* i = opts->items ; i->option ; ++i){
|
||||||
|
++itemcount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(opts->defidx && opts->defidx >= itemcount){
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
ncselector* ns = malloc(sizeof(*ns));
|
ncselector* ns = malloc(sizeof(*ns));
|
||||||
@ -200,8 +206,8 @@ ncselector* ncselector_create(ncplane* nc, int y, int x, const ncselector_option
|
|||||||
ns->footchannels = opts->footchannels;
|
ns->footchannels = opts->footchannels;
|
||||||
ns->boxchannels = opts->boxchannels;
|
ns->boxchannels = opts->boxchannels;
|
||||||
ns->darrowy = ns->uarrowy = ns->arrowx = -1;
|
ns->darrowy = ns->uarrowy = ns->arrowx = -1;
|
||||||
if(opts->itemcount){
|
if(itemcount){
|
||||||
if(!(ns->items = malloc(sizeof(*ns->items) * opts->itemcount))){
|
if(!(ns->items = malloc(sizeof(*ns->items) * itemcount))){
|
||||||
free(ns->title); free(ns->secondary); free(ns->footer);
|
free(ns->title); free(ns->secondary); free(ns->footer);
|
||||||
free(ns);
|
free(ns);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -209,7 +215,7 @@ ncselector* ncselector_create(ncplane* nc, int y, int x, const ncselector_option
|
|||||||
}else{
|
}else{
|
||||||
ns->items = NULL;
|
ns->items = NULL;
|
||||||
}
|
}
|
||||||
for(ns->itemcount = 0 ; ns->itemcount < opts->itemcount ; ++ns->itemcount){
|
for(ns->itemcount = 0 ; ns->itemcount < itemcount ; ++ns->itemcount){
|
||||||
const struct ncselector_item* src = &opts->items[ns->itemcount];
|
const struct ncselector_item* src = &opts->items[ns->itemcount];
|
||||||
int cols = mbswidth(src->option);
|
int cols = mbswidth(src->option);
|
||||||
ns->items[ns->itemcount].opcolumns = cols;
|
ns->items[ns->itemcount].opcolumns = cols;
|
||||||
@ -675,6 +681,12 @@ ncmultiselector_dim_yx(notcurses* nc, const ncmultiselector* n, int* ncdimy, int
|
|||||||
|
|
||||||
ncmultiselector* ncmultiselector_create(ncplane* nc, int y, int x,
|
ncmultiselector* ncmultiselector_create(ncplane* nc, int y, int x,
|
||||||
const ncmultiselector_options* opts){
|
const ncmultiselector_options* opts){
|
||||||
|
unsigned itemcount = 0;
|
||||||
|
if(opts->items){
|
||||||
|
for(const struct ncmselector_item* i = opts->items ; i->option ; ++i){
|
||||||
|
++itemcount;
|
||||||
|
}
|
||||||
|
}
|
||||||
ncmultiselector* ns = malloc(sizeof(*ns));
|
ncmultiselector* ns = malloc(sizeof(*ns));
|
||||||
ns->title = opts->title ? strdup(opts->title) : NULL;
|
ns->title = opts->title ? strdup(opts->title) : NULL;
|
||||||
ns->titlecols = opts->title ? mbswidth(opts->title) : 0;
|
ns->titlecols = opts->title ? mbswidth(opts->title) : 0;
|
||||||
@ -693,8 +705,8 @@ ncmultiselector* ncmultiselector_create(ncplane* nc, int y, int x,
|
|||||||
ns->footchannels = opts->footchannels;
|
ns->footchannels = opts->footchannels;
|
||||||
ns->boxchannels = opts->boxchannels;
|
ns->boxchannels = opts->boxchannels;
|
||||||
ns->darrowy = ns->uarrowy = ns->arrowx = -1;
|
ns->darrowy = ns->uarrowy = ns->arrowx = -1;
|
||||||
if(opts->itemcount){
|
if(itemcount){
|
||||||
if(!(ns->items = malloc(sizeof(*ns->items) * opts->itemcount))){
|
if(!(ns->items = malloc(sizeof(*ns->items) * itemcount))){
|
||||||
free(ns->title); free(ns->secondary); free(ns->footer);
|
free(ns->title); free(ns->secondary); free(ns->footer);
|
||||||
free(ns);
|
free(ns);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -702,7 +714,7 @@ ncmultiselector* ncmultiselector_create(ncplane* nc, int y, int x,
|
|||||||
}else{
|
}else{
|
||||||
ns->items = NULL;
|
ns->items = NULL;
|
||||||
}
|
}
|
||||||
for(ns->itemcount = 0 ; ns->itemcount < opts->itemcount ; ++ns->itemcount){
|
for(ns->itemcount = 0 ; ns->itemcount < itemcount ; ++ns->itemcount){
|
||||||
const struct ncmselector_item* src = &opts->items[ns->itemcount];
|
const struct ncmselector_item* src = &opts->items[ns->itemcount];
|
||||||
int cols = mbswidth(src->option);
|
int cols = mbswidth(src->option);
|
||||||
if(cols > ns->longitem){
|
if(cols > ns->longitem){
|
||||||
|
@ -8,7 +8,6 @@ ncmultiselector_options MultiSelector::default_options = {
|
|||||||
/* secondary */ nullptr,
|
/* secondary */ nullptr,
|
||||||
/* footer */ nullptr,
|
/* footer */ nullptr,
|
||||||
/* items */ nullptr,
|
/* items */ nullptr,
|
||||||
/* itemcount */ 0,
|
|
||||||
/* maxdisplay */ 0,
|
/* maxdisplay */ 0,
|
||||||
/* opchannels */ 0,
|
/* opchannels */ 0,
|
||||||
/* descchannels */ 0,
|
/* descchannels */ 0,
|
||||||
|
@ -8,7 +8,6 @@ ncselector_options Selector::default_options = {
|
|||||||
/* secondary */ nullptr,
|
/* secondary */ nullptr,
|
||||||
/* footer */ nullptr,
|
/* footer */ nullptr,
|
||||||
/* items */ nullptr,
|
/* items */ nullptr,
|
||||||
/* itemcount */ 0,
|
|
||||||
/* defidx */ 0,
|
/* defidx */ 0,
|
||||||
/* maxdisplay */ 0,
|
/* maxdisplay */ 0,
|
||||||
/* opchannels */ 0,
|
/* opchannels */ 0,
|
||||||
|
@ -18,6 +18,7 @@ static struct ncmselector_item items[] = {
|
|||||||
{ "9", "And, eventually noticing the rest of the world was there,", .selected = false, },
|
{ "9", "And, eventually noticing the rest of the world was there,", .selected = false, },
|
||||||
{ "10", "Decided to rule it.", .selected = false, },
|
{ "10", "Decided to rule it.", .selected = false, },
|
||||||
{ "11", "This is their story.", .selected = false, },
|
{ "11", "This is their story.", .selected = false, },
|
||||||
|
{ NULL, NULL, .selected = false, },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -66,17 +67,19 @@ int main(void){
|
|||||||
memset(&sopts, 0, sizeof(sopts));
|
memset(&sopts, 0, sizeof(sopts));
|
||||||
sopts.maxdisplay = 10;
|
sopts.maxdisplay = 10;
|
||||||
sopts.items = items;
|
sopts.items = items;
|
||||||
sopts.itemcount = sizeof(items) / sizeof(*items);
|
|
||||||
sopts.title = "this is truly an awfully long example of a MULTISELECTOR title";
|
sopts.title = "this is truly an awfully long example of a MULTISELECTOR title";
|
||||||
sopts.secondary = "pick one (you will die regardless)";
|
sopts.secondary = "pick one (you will die regardless)";
|
||||||
sopts.footer = "press q to exit (there is sartrev(\"no exit\"))";
|
sopts.footer = "press q to exit (there is sartrev(\"no exit\"))";
|
||||||
channels_set_fg(&sopts.boxchannels, 0x20e0e0);
|
channels_set_fg(&sopts.boxchannels, 0x20e0e0);
|
||||||
|
channels_set_bg(&sopts.boxchannels, 0x200000);
|
||||||
channels_set_fg(&sopts.opchannels, 0xe08040);
|
channels_set_fg(&sopts.opchannels, 0xe08040);
|
||||||
channels_set_fg(&sopts.descchannels, 0xe0e040);
|
|
||||||
channels_set_bg(&sopts.opchannels, 0);
|
channels_set_bg(&sopts.opchannels, 0);
|
||||||
|
channels_set_fg(&sopts.descchannels, 0xe0e040);
|
||||||
channels_set_bg(&sopts.descchannels, 0);
|
channels_set_bg(&sopts.descchannels, 0);
|
||||||
channels_set_fg(&sopts.footchannels, 0xe00040);
|
channels_set_fg(&sopts.footchannels, 0xe00040);
|
||||||
channels_set_fg(&sopts.titlechannels, 0x80ffff);
|
channels_set_bg(&sopts.footchannels, 0x202000);
|
||||||
|
channels_set_fg(&sopts.titlechannels, 0x20ffff);
|
||||||
|
channels_set_bg(&sopts.titlechannels, 0x000020);
|
||||||
channels_set_fg(&sopts.bgchannels, 0x002000);
|
channels_set_fg(&sopts.bgchannels, 0x002000);
|
||||||
channels_set_bg(&sopts.bgchannels, 0x002000);
|
channels_set_bg(&sopts.bgchannels, 0x002000);
|
||||||
channels_set_fg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND);
|
channels_set_fg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND);
|
||||||
|
@ -17,6 +17,7 @@ static struct ncselector_item items[] = {
|
|||||||
SITEM("8 8 8", "the chinese 平仮名平平仮名仮名love me, i'm told"),
|
SITEM("8 8 8", "the chinese 平仮名平平仮名仮名love me, i'm told"),
|
||||||
SITEM("nine", "nine, nine, nine 'cause you left me"),
|
SITEM("nine", "nine, nine, nine 'cause you left me"),
|
||||||
SITEM("ten", "stunning and brave"),
|
SITEM("ten", "stunning and brave"),
|
||||||
|
SITEM(NULL, NULL),
|
||||||
#undef SITEM
|
#undef SITEM
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -66,7 +67,6 @@ int main(void){
|
|||||||
memset(&sopts, 0, sizeof(sopts));
|
memset(&sopts, 0, sizeof(sopts));
|
||||||
sopts.maxdisplay = 4;
|
sopts.maxdisplay = 4;
|
||||||
sopts.items = items;
|
sopts.items = items;
|
||||||
sopts.itemcount = sizeof(items) / sizeof(*items);
|
|
||||||
sopts.title = "this is truly, absolutely an awfully long example of a selector title";
|
sopts.title = "this is truly, absolutely an awfully long example of a selector title";
|
||||||
sopts.secondary = "pick one (you will die regardless)";
|
sopts.secondary = "pick one (you will die regardless)";
|
||||||
sopts.footer = "press q to exit (there is no exit)";
|
sopts.footer = "press q to exit (there is no exit)";
|
||||||
|
@ -79,7 +79,6 @@ TEST_CASE("Selectors") {
|
|||||||
};
|
};
|
||||||
struct ncselector_options opts{};
|
struct ncselector_options opts{};
|
||||||
opts.items = items;
|
opts.items = items;
|
||||||
opts.itemcount = sizeof(items) / sizeof(*items);
|
|
||||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||||
REQUIRE(nullptr != ncs);
|
REQUIRE(nullptr != ncs);
|
||||||
CHECK(0 == notcurses_render(nc_));
|
CHECK(0 == notcurses_render(nc_));
|
||||||
@ -116,7 +115,6 @@ TEST_CASE("Selectors") {
|
|||||||
};
|
};
|
||||||
struct ncselector_options opts{};
|
struct ncselector_options opts{};
|
||||||
opts.items = items;
|
opts.items = items;
|
||||||
opts.itemcount = sizeof(items) / sizeof(*items);
|
|
||||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||||
REQUIRE(nullptr != ncs);
|
REQUIRE(nullptr != ncs);
|
||||||
auto sel = ncselector_selected(ncs);
|
auto sel = ncselector_selected(ncs);
|
||||||
@ -154,7 +152,6 @@ TEST_CASE("Selectors") {
|
|||||||
struct ncselector_options opts{};
|
struct ncselector_options opts{};
|
||||||
opts.maxdisplay = 1;
|
opts.maxdisplay = 1;
|
||||||
opts.items = items;
|
opts.items = items;
|
||||||
opts.itemcount = sizeof(items) / sizeof(*items);
|
|
||||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||||
REQUIRE(nullptr != ncs);
|
REQUIRE(nullptr != ncs);
|
||||||
CHECK(0 == notcurses_render(nc_));
|
CHECK(0 == notcurses_render(nc_));
|
||||||
@ -197,7 +194,6 @@ TEST_CASE("Selectors") {
|
|||||||
struct ncselector_options opts{};
|
struct ncselector_options opts{};
|
||||||
opts.maxdisplay = 2;
|
opts.maxdisplay = 2;
|
||||||
opts.items = items;
|
opts.items = items;
|
||||||
opts.itemcount = sizeof(items) / sizeof(*items);
|
|
||||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||||
REQUIRE(nullptr != ncs);
|
REQUIRE(nullptr != ncs);
|
||||||
CHECK(0 == notcurses_render(nc_));
|
CHECK(0 == notcurses_render(nc_));
|
||||||
|
Loading…
Reference in New Issue
Block a user