fix borders and links
This commit is contained in:
+8
-3
@@ -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,
|
||||
|
||||
@@ -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; */
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user