fix borders and links

This commit is contained in:
vrd
2022-12-31 12:26:31 +02:00
parent f77f55366e
commit 3f402e058c
3 changed files with 46 additions and 40 deletions
+8 -3
View File
@@ -176,13 +176,18 @@ U16 Person::boxWidth() const
/* return pad; */ /* 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(); U16 width = boxWidth();
WINDOW* pad = newpad(BOX_HEIGHT, width); WINDOW* pad = newpad(BOX_HEIGHT, width);
wborder(pad, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE, ACS_LTEE, ACS_URCORNER, ACS_LTEE, ACS_LRCORNER ); wborder(pad, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE,
/* box(pad, BOX_HEIGHT, width); */ 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()); mvwaddstr(pad, 2, 2, name_.data());
pnoutrefresh(pad, 0, 0, pnoutrefresh(pad, 0, 0,
+1 -1
View File
@@ -47,7 +47,7 @@ public:
/* Draw a Person's box on the terminal /* Draw a Person's box on the terminal
drawY,drawX - the coordinates where to draw drawY,drawX - the coordinates where to draw
returns the width of the box*/ 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; */ /* WINDOW* createPad()const; */
+37 -36
View File
@@ -489,14 +489,15 @@ void Tree::commonAncestorRec(person_id id, const Array<char> &visited)const
} }
} }
static U8 linkToFirstBorn(I16 startY, I16 startX) static U8 linkToFirstBorn(I16 startY, I16 startX, bool moreSiblings)
{ {
if(startY >= -2 && startX >= 0) if(startY >= -2 && startX >= 0)
{ {
WINDOW* win = newwin(3, 1, startY, startX); /* TODO: pad */ WINDOW* win = newwin(3, 1, startY, startX); /* TODO: pad */
waddch(win, ACS_VLINE); 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); mvwaddch(win, 2, 0, ACS_VLINE);
wnoutrefresh(win); wnoutrefresh(win);
@@ -505,7 +506,7 @@ static U8 linkToFirstBorn(I16 startY, I16 startX)
return 3; 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); assert(endX >= startX);
@@ -517,7 +518,7 @@ static U8 linkToChild(I16 startY, I16 startX, I16 endX)
for(U16 i = 0; i < len-1; ++i) for(U16 i = 0; i < len-1; ++i)
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
/* whline(win, '_', len-1); */ /* whline(win, '_', len-1); */
waddch(win, ACS_TTEE); waddch(win, moreSiblings ? ACS_TTEE : ACS_URCORNER);
mvwaddch(win, 1, len-1, ACS_VLINE); 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 /* I16 Tree::drawLine(person_id id, I16 drawY, I16 drawX) const */
{ /* { */
people[id].draw(drawY, drawX); /* people[id].draw(drawY, drawX, true, false, true); */
std::vector<person_id> children; /* std::vector<person_id> children; */
for(U32 i=0; i<relations[id].gNum(); ++i) /* for(U32 i=0; i<relations[id].gNum(); ++i) */
{ /* { */
if(relations[id][i].type == RelType::Parent) /* if(relations[id][i].type == RelType::Parent) */
children.push_back(relations[id][i].id); /* children.push_back(relations[id][i].id); */
} /* } */
if(!children.empty()) /* if(!children.empty()) */
{ /* { */
auto prevX = drawX; /* auto prevX = drawX; */
drawY += BOX_HEIGHT; /* drawY += BOX_HEIGHT; */
auto lnHt = linkToFirstBorn(drawY, drawX); /* Link height */ /* auto lnHt = linkToFirstBorn(drawY, drawX); /\* Link height *\/ */
drawX = drawLine(children[0], drawY + lnHt, drawX); /* drawX = drawLine(children[0], drawY + lnHt, drawX); */
for(size_t j = 1; j < children.size(); ++j) /* for(size_t j = 1; j < children.size(); ++j) */
{ /* { */
lnHt = linkToChild(drawY+1, prevX+1, drawX+1); /* lnHt = linkToChild(drawY+1, prevX+1, drawX+1); */
prevX = drawX; /* prevX = drawX; */
drawX = drawLine(children[j], drawY + lnHt, drawX); /* drawX = drawLine(children[j], drawY + lnHt, drawX); */
} /* } */
return drawX; /* return drawX; */
} /* } */
return drawX + people[id].boxWidth() + dist_between; /* return drawX + people[id].boxWidth() + dist_between; */
} /* } */
I16 Tree::drawLineWithWives(person_id id, I16 drawY, const I16 drawX) const I16 Tree::drawLineWithWives(person_id id, I16 drawY, const I16 drawX) const
{ {
const Person& person = people[id]; const Person& person = people[id];
const auto& rels = relations[id]; const auto& rels = relations[id];
person.draw(drawY, drawX);
person_id spouse = Nobody; person_id spouse = Nobody;
std::vector<person_id> children; std::vector<person_id> children;
for(person_id i = 0; i < rels.gNum(); ++i) 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) else if(rels[i].type == RelType::Spouse && spouse == Nobody)
spouse = rels[i].id; spouse = rels[i].id;
} }
const size_t numKids = children.size();
person.draw(drawY, drawX, spouse!=Nobody, false, numKids!=0);
U16 spouse_width = 0; U16 spouse_width = 0;
if(spouse != Nobody) 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(); spouse_width = spouse_dist + people[spouse].boxWidth();
} }
auto childX = drawX; auto childX = drawX;
if(!children.empty()) if(numKids!=0)
{ {
auto prevX = childX; auto prevX = childX;
drawY += BOX_HEIGHT; 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); 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; prevX = childX;
childX = drawLineWithWives(children[j], drawY + lnHt, childX); childX = drawLineWithWives(children[j], drawY + lnHt, childX);
} }