From 3f402e058c26dd51b0101e3680d2b3371a92755f Mon Sep 17 00:00:00 2001 From: Venelin Date: Sat, 31 Dec 2022 12:26:31 +0200 Subject: [PATCH] fix borders and links --- person.cpp | 11 +++++--- person.h | 2 +- tree.cpp | 73 +++++++++++++++++++++++++++--------------------------- 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/person.cpp b/person.cpp index aa65a6a..2386e18 100644 --- a/person.cpp +++ b/person.cpp @@ -176,13 +176,18 @@ U16 Person::boxWidth() const /* return pad; */ /* } */ -void Person::draw(I16 drawY, I16 drawX) const +void Person::draw(I16 drawY, I16 drawX, bool hasSpouse, bool isSpouse, bool hasKids) const { U16 width = boxWidth(); WINDOW* pad = newpad(BOX_HEIGHT, width); - wborder(pad, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE, ACS_LTEE, ACS_URCORNER, ACS_LTEE, ACS_LRCORNER ); - /* box(pad, BOX_HEIGHT, width); */ + wborder(pad, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE, + isSpouse ? ACS_TTEE : ACS_LTEE, hasSpouse ? ACS_TTEE : ACS_URCORNER, + hasKids ? ACS_LTEE : ACS_LLCORNER, ACS_LRCORNER ); + /* if(hasSpouse) */ + /* { */ + /* mvaddch( */ + mvwaddstr(pad, 2, 2, name_.data()); pnoutrefresh(pad, 0, 0, diff --git a/person.h b/person.h index 7c21bb4..a01b218 100644 --- a/person.h +++ b/person.h @@ -47,7 +47,7 @@ public: /* Draw a Person's box on the terminal drawY,drawX - the coordinates where to draw returns the width of the box*/ - void draw(I16 drawY, I16 drawX) const; + void draw(I16 drawY, I16 drawX, bool hasSpouse, bool isSpouse, bool hasChildren=false) const; /* WINDOW* createPad()const; */ diff --git a/tree.cpp b/tree.cpp index d126ea7..fd23696 100644 --- a/tree.cpp +++ b/tree.cpp @@ -489,14 +489,15 @@ void Tree::commonAncestorRec(person_id id, const Array &visited)const } } -static U8 linkToFirstBorn(I16 startY, I16 startX) +static U8 linkToFirstBorn(I16 startY, I16 startX, bool moreSiblings) { if(startY >= -2 && startX >= 0) { WINDOW* win = newwin(3, 1, startY, startX); /* TODO: pad */ waddch(win, ACS_VLINE); - mvwaddch(win, 1, 0, ACS_LTEE); + mvwaddch(win, 1, 0, + moreSiblings ? ACS_LTEE : ACS_VLINE); mvwaddch(win, 2, 0, ACS_VLINE); wnoutrefresh(win); @@ -505,7 +506,7 @@ static U8 linkToFirstBorn(I16 startY, I16 startX) return 3; } -static U8 linkToChild(I16 startY, I16 startX, I16 endX) +static U8 linkToChild(I16 startY, I16 startX, I16 endX, bool moreSiblings) { assert(endX >= startX); @@ -517,7 +518,7 @@ static U8 linkToChild(I16 startY, I16 startX, I16 endX) for(U16 i = 0; i < len-1; ++i) waddch(win, ACS_HLINE); /* whline(win, '_', len-1); */ - waddch(win, ACS_TTEE); + waddch(win, moreSiblings ? ACS_TTEE : ACS_URCORNER); mvwaddch(win, 1, len-1, ACS_VLINE); @@ -528,44 +529,42 @@ static U8 linkToChild(I16 startY, I16 startX, I16 endX) } -I16 Tree::drawLine(person_id id, I16 drawY, I16 drawX) const -{ - people[id].draw(drawY, drawX); +/* I16 Tree::drawLine(person_id id, I16 drawY, I16 drawX) const */ +/* { */ +/* people[id].draw(drawY, drawX, true, false, true); */ - std::vector children; - for(U32 i=0; i children; */ +/* for(U32 i=0; i children; for(person_id i = 0; i < rels.gNum(); ++i) @@ -576,26 +575,28 @@ I16 Tree::drawLineWithWives(person_id id, I16 drawY, const I16 drawX) const else if(rels[i].type == RelType::Spouse && spouse == Nobody) spouse = rels[i].id; } + const size_t numKids = children.size(); + person.draw(drawY, drawX, spouse!=Nobody, false, numKids!=0); U16 spouse_width = 0; if(spouse != Nobody) { - people[spouse].draw(drawY, drawX + person.boxWidth() + spouse_dist); + people[spouse].draw(drawY, drawX + person.boxWidth() + spouse_dist, false, true); spouse_width = spouse_dist + people[spouse].boxWidth(); } auto childX = drawX; - if(!children.empty()) + if(numKids!=0) { auto prevX = childX; drawY += BOX_HEIGHT; - auto lnHt = linkToFirstBorn(drawY, childX); /* Link height */ + auto lnHt = linkToFirstBorn(drawY, childX, numKids > 1); /* Link height */ childX = drawLineWithWives(children[0], drawY + lnHt, childX); - for(size_t j = 1; j < children.size(); ++j) + for(size_t j = 1; j < numKids; ++j) { - lnHt = linkToChild(drawY+1, prevX+1, childX+1); + lnHt = linkToChild(drawY+1, prevX+1, childX+1, j < numKids-1); prevX = childX; childX = drawLineWithWives(children[j], drawY + lnHt, childX); }