From 4d95ae185f55db743a9da5ca8067b55c2cb4ee92 Mon Sep 17 00:00:00 2001 From: nick black Date: Mon, 5 Oct 2020 16:46:56 -0400 Subject: [PATCH] account for reel borders when laying out tablets #1036 --- src/lib/reel.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/lib/reel.c b/src/lib/reel.c index 569cbb341..85073fce9 100644 --- a/src/lib/reel.c +++ b/src/lib/reel.c @@ -222,6 +222,13 @@ tablet_geom(const ncreel* nr, nctablet* t, int* begx, int* begy, if(!(nr->ropts.bordermask & NCBOXMASK_RIGHT)){ --*lenx; } + if(!(nr->ropts.bordermask & NCBOXMASK_TOP)){ + ++*begy; + --*leny; + } + if(!(nr->ropts.bordermask & NCBOXMASK_BOTTOM)){ + --*leny; + } // at this point, our coordinates describe the largest possible tablet for // this ncreel. this is the correct solution for the focused tablet. other // tablets can only grow in one of two directions, so tighten them up. @@ -233,6 +240,9 @@ tablet_geom(const ncreel* nr, nctablet* t, int* begx, int* begy, *begy = frontiertop - *leny; } } + if(*leny <= 0 || *lenx <= 0){ + return -1; + } return 0; } @@ -256,7 +266,7 @@ ncreel_draw_tablet(const ncreel* nr, nctablet* t, int frontiertop, //fprintf(stderr, "no room: %p base %d/%d len %d/%d dir %d\n", t, begy, begx, leny, lenx, direction); return -1; } -//fprintf(stderr, "tplacement: %p base %d/%d len %d/%d frontiery %d %d dir %d\n", t, begy, begx, leny, lenx, frontiertop, frontierbottom, direction); +//fprintf(stderr, "p tplacement: %p base %d/%d len %d/%d frontiery %d %d dir %d\n", t, begy, begx, leny, lenx, frontiertop, frontierbottom, direction); ncplane* fp = ncplane_new(nr->p, leny, lenx, begy, begx, NULL, "tab"); if((t->p = fp) == NULL){ //fprintf(stderr, "failure creating border plane %d %d %d %d\n", leny, lenx, begy, begx); @@ -276,7 +286,7 @@ ncreel_draw_tablet(const ncreel* nr, nctablet* t, int frontiertop, ++cbx; } if(cbleny - cby + 1 > 0){ -//fprintf(stderr, "CREATING %dx%d\n", cbleny, cblenx); +//fprintf(stderr, "cbp placement %dx%d @ %dx%d\n", cbleny, cblenx, cby, cbx); t->cbp = ncplane_new(t->p, cbleny, cblenx, cby, cbx, NULL, "tdat"); if(t->cbp == NULL){ //fprintf(stderr, "failure creating data plane %d %d %d %d\n", cbleny, cblenx, cby, cbx); @@ -329,9 +339,10 @@ ncreel_draw_tablet(const ncreel* nr, nctablet* t, int frontiertop, static nctablet* draw_following_tablets(const ncreel* nr, nctablet* otherend, int frontiertop, int* frontierbottom){ + const bool botborder = !(nr->ropts.bordermask & NCBOXMASK_BOTTOM); //fprintf(stderr, "following otherend: %p ->p: %p %d/%d\n", otherend, otherend->p, frontiertop, *frontierbottom); nctablet* working = nr->tablets->next; - const int maxx = ncplane_dim_y(nr->p) - 1; + const int maxx = ncplane_dim_y(nr->p) - 1 - botborder; // move down past the focused tablet, filling up the reel to the bottom while(*frontierbottom <= maxx && (working != otherend || !otherend->p)){ if(working->p){ @@ -358,10 +369,11 @@ draw_following_tablets(const ncreel* nr, nctablet* otherend, static nctablet* draw_previous_tablets(const ncreel* nr, nctablet* otherend, int* frontiertop, int frontierbottom){ + const bool topborder = !(nr->ropts.bordermask & NCBOXMASK_TOP); nctablet* upworking = nr->tablets->prev; //fprintf(stderr, "preceding %p otherend: %p ->p: %p frontiers: %d %d\n", upworking, otherend, otherend->p, *frontiertop, frontierbottom); // modify frontier based off the one we're at - while(*frontiertop >= 0 && (upworking != otherend || !otherend->p)){ + while(*frontiertop >= topborder && (upworking != otherend || !otherend->p)){ if(upworking->p){ break; } @@ -650,6 +662,7 @@ int ncreel_redraw(ncreel* nr){ if(focused){ //fprintf(stderr, "drawing focused tablet %p dir: %d fulcrum: %d!\n", focused, nr->direction, fulcrum); if(ncreel_draw_tablet(nr, focused, fulcrum, fulcrum, DIRECTION_DOWN)){ + logerror(nr->p->nc, "Error drawing tablet\n"); return -1; } //fprintf(stderr, "drew focused tablet %p -> %p lastdir: %d!\n", focused, focused->p, nr->direction); @@ -661,21 +674,25 @@ int ncreel_redraw(ncreel* nr){ if(nr->direction == LASTDIRECTION_DOWN){ otherend = draw_previous_tablets(nr, otherend, &frontiertop, frontierbottom); if(otherend == NULL){ + logerror(nr->p->nc, "Error drawing higher tablets\n"); return -1; } otherend = draw_following_tablets(nr, otherend, frontiertop, &frontierbottom); }else{ // DIRECTION_UP otherend = draw_previous_tablets(nr, otherend, &frontiertop, frontierbottom); if(otherend == NULL){ + logerror(nr->p->nc, "Error drawing higher tablets\n"); return -1; } otherend = draw_following_tablets(nr, otherend, frontiertop, &frontierbottom); } if(otherend == NULL){ + logerror(nr->p->nc, "Error drawing following tablets\n"); return -1; } //notcurses_debug(nr->p->nc, stderr); if(tighten_reel(nr)){ + logerror(nr->p->nc, "Error tightening reel\n"); return -1; } //notcurses_debug(nr->p->nc, stderr); @@ -683,6 +700,7 @@ int ncreel_redraw(ncreel* nr){ nr->vft = nr->tablets; // update the visually-focused tablet pointer //fprintf(stderr, "DONE ARRANGING\n"); if(draw_ncreel_borders(nr)){ + logerror(nr->p->nc, "Error drawing reel borders\n"); return -1; // enforces specified dimensional minima } return 0;