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; */
/* } */
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,
+1 -1
View File
@@ -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; */
+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)
{
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<person_id> children;
for(U32 i=0; i<relations[id].gNum(); ++i)
{
if(relations[id][i].type == RelType::Parent)
children.push_back(relations[id][i].id);
}
/* std::vector<person_id> children; */
/* for(U32 i=0; i<relations[id].gNum(); ++i) */
/* { */
/* if(relations[id][i].type == RelType::Parent) */
/* children.push_back(relations[id][i].id); */
/* } */
if(!children.empty())
{
auto prevX = drawX;
drawY += BOX_HEIGHT;
/* if(!children.empty()) */
/* { */
/* auto prevX = drawX; */
/* drawY += BOX_HEIGHT; */
auto lnHt = linkToFirstBorn(drawY, drawX); /* Link height */
drawX = drawLine(children[0], drawY + lnHt, drawX);
/* auto lnHt = linkToFirstBorn(drawY, drawX); /\* Link height *\/ */
/* drawX = drawLine(children[0], drawY + lnHt, drawX); */
for(size_t j = 1; j < children.size(); ++j)
{
lnHt = linkToChild(drawY+1, prevX+1, drawX+1);
prevX = drawX;
drawX = drawLine(children[j], drawY + lnHt, drawX);
}
return drawX;
}
/* for(size_t j = 1; j < children.size(); ++j) */
/* { */
/* lnHt = linkToChild(drawY+1, prevX+1, drawX+1); */
/* prevX = drawX; */
/* drawX = drawLine(children[j], drawY + lnHt, 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
{
const Person& person = people[id];
const auto& rels = relations[id];
person.draw(drawY, drawX);
person_id spouse = Nobody;
std::vector<person_id> 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);
}