ncmenu: right-align selected sections #332

pull/344/head
nick black 5 years ago committed by Nick Black
parent 71dbfd74f7
commit 28bfa4d854

@ -137,7 +137,11 @@ dup_menu_sections(ncmenu* ncm, const ncmenu_options* opts, int* totalwidth, int*
for(i = 0 ; i < opts->sectioncount ; ++i){ for(i = 0 ; i < opts->sectioncount ; ++i){
if(opts->sections[i].name){ if(opts->sections[i].name){
int cols = mbswidth(opts->sections[i].name); int cols = mbswidth(opts->sections[i].name);
if(rightaligned){ // FIXME handle more than one right-aligned section
ncm->sections[i].xoff = -(cols + 2);
}else{
ncm->sections[i].xoff = xoff; ncm->sections[i].xoff = xoff;
}
if(cols < 0 || (ncm->sections[i].name = strdup(opts->sections[i].name)) == NULL){ if(cols < 0 || (ncm->sections[i].name = strdup(opts->sections[i].name)) == NULL){
goto err; goto err;
} }
@ -194,7 +198,7 @@ static int
write_header(ncmenu* ncm){ ncm->ncp->channels = ncm->headerchannels; write_header(ncmenu* ncm){ ncm->ncp->channels = ncm->headerchannels;
int dimy, dimx; int dimy, dimx;
ncplane_dim_yx(ncm->ncp, &dimy, &dimx); ncplane_dim_yx(ncm->ncp, &dimy, &dimx);
int xoff = 2; // 2-column margin on left int xoff = 0; // 2-column margin on left
int ypos = ncm->bottom ? dimy - 1 : 0; int ypos = ncm->bottom ? dimy - 1 : 0;
if(ncplane_cursor_move_yx(ncm->ncp, ypos, 0)){ if(ncplane_cursor_move_yx(ncm->ncp, ypos, 0)){
return -1; return -1;
@ -209,13 +213,21 @@ write_header(ncmenu* ncm){ ncm->ncp->channels = ncm->headerchannels;
} }
for(int i = 0 ; i < ncm->sectioncount ; ++i){ for(int i = 0 ; i < ncm->sectioncount ; ++i){
if(ncm->sections[i].name){ if(ncm->sections[i].name){
if(ncplane_putstr_yx(ncm->ncp, ypos, xoff, ncm->sections[i].name) < 0){ ncplane_cursor_move_yx(ncm->ncp, ypos, xoff);
return -1; int spaces = ncm->sections[i].xoff - xoff;
if(ncm->sections[i].xoff < 0){ // right-aligned
spaces = dimx + ncm->sections[i].xoff - xoff;
if(spaces < 0){
spaces = 0;
}
} }
xoff += spaces;
while(spaces--){
if(ncplane_putc(ncm->ncp, &c) < 0){ if(ncplane_putc(ncm->ncp, &c) < 0){
return -1; return -1;
} }
if(ncplane_putc(ncm->ncp, &c) < 0){ }
if(ncplane_putstr_yx(ncm->ncp, ypos, xoff, ncm->sections[i].name) < 0){
return -1; return -1;
} }
if(ncm->sections[i].shortcut_offset >= 0){ if(ncm->sections[i].shortcut_offset >= 0){
@ -229,7 +241,7 @@ write_header(ncmenu* ncm){ ncm->ncp->channels = ncm->headerchannels;
} }
cell_release(ncm->ncp, &cl); cell_release(ncm->ncp, &cl);
} }
xoff += mbswidth(ncm->sections[i].name) + 2; xoff += mbswidth(ncm->sections[i].name);
} }
} }
while(xoff < dimx){ while(xoff < dimx){
@ -323,7 +335,11 @@ int ncmenu_unroll(ncmenu* n, int sectionidx){
ncplane_dim_yx(n->ncp, &dimy, &dimx); ncplane_dim_yx(n->ncp, &dimy, &dimx);
const int height = section_height(n, sectionidx); const int height = section_height(n, sectionidx);
const int width = section_width(n, sectionidx); const int width = section_width(n, sectionidx);
const int xpos = n->sections[sectionidx].xoff; int xpos = n->sections[sectionidx].xoff < 0 ?
dimx + (n->sections[sectionidx].xoff - 2) : n->sections[sectionidx].xoff;
if(xpos + width >= dimx){
xpos = dimx - (width + 2);
}
int ypos = n->bottom ? dimy - height - 1 : 1; int ypos = n->bottom ? dimy - height - 1 : 1;
if(ncplane_cursor_move_yx(n->ncp, ypos, xpos)){ if(ncplane_cursor_move_yx(n->ncp, ypos, xpos)){
return -1; return -1;

Loading…
Cancel
Save