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