zoo: time text layout accurately

This commit is contained in:
nick black 2020-08-29 22:18:00 -04:00
parent 6e112cd6f4
commit 0060a60756
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC
2 changed files with 43 additions and 7 deletions

View File

@ -3557,7 +3557,7 @@ maketitle(struct ncplane* std){
ncplane_destroy(title);
return NULL;
}
ncplane_set_fg(title, 0x808080);
ncplane_set_fg(title, 0xd0b0b0);
if(ncplane_putstr_aligned(title, 0, NCALIGN_CENTER, "mojibake 文字化けmodʑibake (english: \"garbled\")") < 0){
ncplane_destroy(title);
return NULL;

View File

@ -182,6 +182,24 @@ run_out_text(struct ncreader* reader, const char* text, size_t* textpos,
return 0;
}
static int
get_word_count(const char* text){
bool inspace = true;
int words = 0;
while(*text){
if(isspace(*text)){
if(!inspace){
++words;
inspace = true;
}
}else{
inspace = false;
}
++text;
}
return words;
}
// selector moves across to the left; reader moves up halfway to the center
static int
selector_run(struct notcurses* nc, struct ncreader* reader, struct ncselector* selector){
@ -190,6 +208,7 @@ selector_run(struct notcurses* nc, struct ncreader* reader, struct ncselector* s
"This NCReader widget facilitates free-form text entry complete with readline-style bindings.\n\n"
"NCSelector allows a single option to be selected from a list.\n\n"
"NCFdplane streams a file descriptor, while NCSubproc spawns a subprocess and streams its output.\n\n";
int titers = get_word_count(text);
int ret = 0, dimy, dimx;
ncplane_dim_yx(notcurses_stdplane(nc), &dimy, &dimx);
const int centery = (dimy - ncplane_dim_y(ncreader_plane(reader))) / 2;
@ -198,18 +217,26 @@ selector_run(struct notcurses* nc, struct ncreader* reader, struct ncselector* s
ncplane_yx(ncselector_plane(selector), &sy, &sx);
const int xiters = sx - 2;
const int yiters = (ry - centery) / 2;
const int iters = yiters > xiters ? yiters : xiters;
int iters = yiters > xiters ? yiters : xiters;
if(titers > iters){
iters = titers;
}
const double eachy = (double)iters / yiters;
const double eachx = (double)iters / xiters;
const double eacht = (double)iters / titers;
int xi = 1;
int yi = 1;
int ti = 1;
struct timespec iterdelay, start;
timespec_div(&demodelay, iters / 4, &iterdelay);
size_t textpos = 0;
clock_gettime(CLOCK_MONOTONIC, &start);
for(int i = 0 ; i < iters ; ++i){
if( (ret = layout_next_text(reader, text, &textpos)) ){
return ret;
if(i == (int)(ti * eacht)){
if( (ret = layout_next_text(reader, text, &textpos)) ){
return ret;
}
++ti;
}
if(i == (int)(xi * eachx)){
if(ncplane_move_yx(ncselector_plane(selector), sy, --sx)){
@ -253,6 +280,7 @@ mselector_run(struct notcurses* nc, struct ncreader* reader, struct ncmultiselec
"NCMultiselector allows 0..n options to be selected from a list of n items.\n\n"
"A variety of plots are supported, and menus can be placed along the top and/or bottom of any plane.\n\n"
"Widgets can be controlled with the keyboard and/or mouse. They are implemented atop ncplanes, and these planes can be manipulated like all others.";
const int titers = get_word_count(text);
int ret = 0, dimy, dimx;
ncplane_dim_yx(notcurses_stdplane(nc), &dimy, &dimx);
const int centery = (dimy - ncplane_dim_y(ncreader_plane(reader))) / 2;
@ -261,18 +289,26 @@ mselector_run(struct notcurses* nc, struct ncreader* reader, struct ncmultiselec
ncplane_yx(ncmultiselector_plane(mselector), &sy, &sx);
const int xiters = dimx - ncplane_dim_x(ncmultiselector_plane(mselector));
const int yiters = ry - centery;
const int iters = yiters > xiters ? yiters : xiters;
int iters = yiters > xiters ? yiters : xiters;
if(titers > iters){
iters = titers;
}
const double eachy = (double)iters / yiters;
const double eachx = (double)iters / xiters;
const double eacht = (double)iters / titers;
int xi = 1;
int yi = 1;
int ti = 1;
struct timespec iterdelay, start;
timespec_div(&demodelay, iters / 4, &iterdelay);
clock_gettime(CLOCK_MONOTONIC, &start);
size_t textpos = 0;
for(int i = 0 ; i < iters ; ++i){
if( (ret = layout_next_text(reader, text, &textpos)) ){
return ret;
if(i == (int)(ti * eacht)){
if( (ret = layout_next_text(reader, text, &textpos)) ){
return ret;
}
++ti;
}
if(i == (int)(xi * eachx)){
if(ncplane_move_yx(ncmultiselector_plane(mselector), sy, ++sx)){