resize plane in additem and delitem when necessary

Signed-off-by: Cheong Sik Feng <sikfeng@gmail.com>
pull/852/head
Cheong Sik Feng 4 years ago committed by Nick Black
parent c6e136f7c9
commit 91613528f2

@ -273,6 +273,8 @@ freeitems:
} }
int ncselector_additem(ncselector* n, const struct ncselector_item* item){ int ncselector_additem(ncselector* n, const struct ncselector_item* item){
int origdimy, origdimx;
ncselector_dim_yx(n->ncp->nc, n, &origdimy, &origdimx);
size_t newsize = sizeof(*n->items) * (n->itemcount + 1); size_t newsize = sizeof(*n->items) * (n->itemcount + 1);
struct ncselector_item* items = realloc(n->items, newsize); struct ncselector_item* items = realloc(n->items, newsize);
if(!items){ if(!items){
@ -292,10 +294,19 @@ int ncselector_additem(ncselector* n, const struct ncselector_item* item){
n->longdesc = cols; n->longdesc = cols;
} }
++n->itemcount; ++n->itemcount;
int dimy, dimx;
ncselector_dim_yx(n->ncp->nc, n, &dimy, &dimx);
if(origdimx < dimx || origdimy < dimy){ // resize if too small
ncplane_resize(n->ncp, 0, 0, 0, 0, 0, 0, dimy, dimx);
}
return ncselector_draw(n); return ncselector_draw(n);
} }
int ncselector_delitem(ncselector* n, const char* item){ int ncselector_delitem(ncselector* n, const char* item){
int origdimy, origdimx;
ncselector_dim_yx(n->ncp->nc, n, &origdimy, &origdimx);
bool found = false;
int maxop = 0, maxdesc = 0;
for(unsigned idx = 0 ; idx < n->itemcount ; ++idx){ for(unsigned idx = 0 ; idx < n->itemcount ; ++idx){
if(strcmp(n->items[idx].option, item) == 0){ // found it if(strcmp(n->items[idx].option, item) == 0){ // found it
free(n->items[idx].option); free(n->items[idx].option);
@ -308,8 +319,28 @@ int ncselector_delitem(ncselector* n, const char* item){
} }
} }
--n->itemcount; --n->itemcount;
return ncselector_draw(n); found = true;
--idx;
}else{
int cols = mbswidth(n->items[idx].option);
if(cols > maxop){
maxop = cols;
}
cols = mbswidth(n->items[idx].desc);
if(cols > maxdesc){
maxdesc = cols;
}
}
}
if(found){
n->longop = maxop;
n->longdesc = maxdesc;
int dimy, dimx;
ncselector_dim_yx(n->ncp->nc, n, &dimy, &dimx);
if(origdimx > dimx || origdimy > dimy){ // resize if too big
ncplane_resize(n->ncp, 0, 0, 0, 0, 0, 0, dimy, dimx);
} }
return ncselector_draw(n);
} }
return -1; // wasn't found return -1; // wasn't found
} }

Loading…
Cancel
Save