From cc9b0ccc2118e13bd5e02d2a1e3a7c2ede6cd80e Mon Sep 17 00:00:00 2001 From: Venelin Date: Tue, 27 Dec 2022 20:07:56 +0200 Subject: [PATCH] relation change --- array.h | 304 +++++++++++++++++++++++----------------------- help.cpp | 29 ----- help.h | 17 ++- main.cpp | 346 +++++++++++++++++++++++++++-------------------------- person.cpp | 26 ++-- person.h | 6 +- tree.cpp | 259 +++++++++++++++++++++------------------ tree.h | 25 ++-- 8 files changed, 515 insertions(+), 497 deletions(-) diff --git a/array.h b/array.h index 8113450..c63a5f8 100644 --- a/array.h +++ b/array.h @@ -1,152 +1,152 @@ -#pragma once -#include - -template -class Array -{ -private: - unsigned size, num; //Size and number of elements - T* arr; - - void copy(const Array &other); -public: - - - Array(); - Array(unsigned S); - // - Array& operator=(const Array &other); - ~Array(); - - void resize(unsigned toAdd = 0); - unsigned gSize()const; - unsigned gNum()const; - void sNum(unsigned); - void push(const T&); - void remove(const unsigned id); - - T& operator[](const unsigned i); - T& operator[](const unsigned i)const; - Array& operator+=(const Array &other); -}; - - - -template -Array::Array() : - size(0), - num(0), - arr(nullptr) -{} - -template -Array::Array(unsigned S) : - size(S), - num(0) -{ - arr = new T[S]; -} - -template -Array& Array::operator=(const Array &other) -{ - copy(other); - return *this; -} - -template -Array::~Array() -{ - delete[] arr; -} - - - -template -void Array::resize(unsigned toAdd) -{ - toAdd = toAdd ? toAdd : size / 2; - T *temp = new T[num]; - for (unsigned i = 0; i < num; ++i) - temp[i] = arr[i]; - delete[] arr; - arr = new T[size + toAdd + 1]; - for (unsigned i = 0; i < num; ++i) - arr[i]=temp[i]; - size += toAdd + 1; - delete[] temp; -} - -template -unsigned Array::gSize()const -{ - return size; -} - -template -unsigned Array::gNum()const -{ - return num; -} - -template -void Array::sNum(unsigned newNum) -{ - num = newNum; -} - -template -void Array::copy(const Array &other) -{ - if (size < other.num) - { - delete[] arr; - arr = new T[other.num]; - size = other.num; - } - for (unsigned i = 0; i < other.num; ++i) - arr[i] = other.arr[i]; - num = other.num; -} - -template -void Array::push(const T& newEl) -{ - if (num >= size) - resize(); - arr[num] = newEl; - ++num; -} - -template -void Array::remove(const unsigned id) -{ - --num; - arr[id] = arr[num]; -} - - - -template -T& Array::operator[](const unsigned i) -{ - return arr[i]; -} - -template -T& Array::operator[](const unsigned i)const -{ - return arr[i]; -} - -template -Array& Array::operator+=(const Array &other) -{ - if (size < other.num + num) - resize(other.num); - unsigned i = 0; - for (; i < other.num; ++i) - arr[num + i] = other.arr[i]; - num += i; - return *this; -} \ No newline at end of file +#pragma once +#include + +template +class Array +{ +private: + unsigned size, num; //Size and number of elements + T* arr; + + void copy(const Array &other); +public: + + + Array(); + Array(unsigned S); + // + Array& operator=(const Array &other); + ~Array(); + + void resize(unsigned toAdd = 0); + unsigned gSize()const; + unsigned gNum()const; + void sNum(unsigned); + void push(const T&); + void remove(const unsigned id); + + T& operator[](const unsigned i); + T& operator[](const unsigned i)const; + Array& operator+=(const Array &other); +}; + + + +template +Array::Array() : + size(0), + num(0), + arr(nullptr) +{} + +template +Array::Array(unsigned S) : + size(S), + num(0) +{ + arr = new T[S]; +} + +template +Array& Array::operator=(const Array &other) +{ + copy(other); + return *this; +} + +template +Array::~Array() +{ + delete[] arr; +} + + + +template +void Array::resize(unsigned toAdd) +{ + toAdd = toAdd ? toAdd : size / 2; + T *temp = new T[num]; + for (unsigned i = 0; i < num; ++i) + temp[i] = arr[i]; + delete[] arr; + arr = new T[size + toAdd + 1]; + for (unsigned i = 0; i < num; ++i) + arr[i]=temp[i]; + size += toAdd + 1; + delete[] temp; +} + +template +unsigned Array::gSize()const +{ + return size; +} + +template +unsigned Array::gNum()const +{ + return num; +} + +template +void Array::sNum(unsigned newNum) +{ + num = newNum; +} + +template +void Array::copy(const Array &other) +{ + if (size < other.num) + { + delete[] arr; + arr = new T[other.num]; + size = other.num; + } + for (unsigned i = 0; i < other.num; ++i) + arr[i] = other.arr[i]; + num = other.num; +} + +template +void Array::push(const T& newEl) +{ + if (num >= size) + resize(); + arr[num] = newEl; + ++num; +} + +template +void Array::remove(const unsigned id) +{ + --num; + arr[id] = arr[num]; +} + + + +template +T& Array::operator[](const unsigned i) +{ + return arr[i]; +} + +template +T& Array::operator[](const unsigned i)const +{ + return arr[i]; +} + +template +Array& Array::operator+=(const Array &other) +{ + if (size < other.num + num) + resize(other.num); + unsigned i = 0; + for (; i < other.num; ++i) + arr[num + i] = other.arr[i]; + num += i; + return *this; +} diff --git a/help.cpp b/help.cpp index e181713..8eeba0e 100644 --- a/help.cpp +++ b/help.cpp @@ -38,32 +38,3 @@ char* mergeStr(const char* first, const char* second) //Create new string from 2 result[j] = '\0'; return result; } - -Relation strToRel(const char* str) -{ - if (strComp(str, "Father")) - return Father; - else if (strComp(str, "Mother")) - return Mother; - else if (strComp(str, "Son")) - return Son; - else if (strComp(str, "Daughter")) - return Daughter; - else if (strComp(str, "Brother")) - return Brother; - else if (strComp(str, "Sister")) - return Sister; - else if (strComp(str, "HalfBrother")) - return HalfBrother; - else if (strComp(str, "HalfSister")) - return HalfSister; - else if (strComp(str, "Wife")) - return Wife; - else if (strComp(str, "Husband")) - return Husband; - else if (strComp(str, "ExWife")) - return ExWife; - else if (strComp(str, "ExHusband")) - return ExHusband; - return Invalid; -} diff --git a/help.h b/help.h index 7252979..29e9cf7 100644 --- a/help.h +++ b/help.h @@ -1,11 +1,10 @@ -#pragma once +#pragma once #include "common/basicTypes.h" - -enum Relation : U8; - -unsigned strLen(const char* str); -void strCopy(char *to, const char* from); -bool strComp(const char* firts, const char* second); //0 - diffrent 1 - same -char* mergeStr(const char* first, const char* second); -Relation strToRel(const char* str); + +enum Relation : U8; + +unsigned strLen(const char* str); +void strCopy(char *to, const char* from); +bool strComp(const char* firts, const char* second); //0 - diffrent 1 - same +char* mergeStr(const char* first, const char* second); diff --git a/main.cpp b/main.cpp index 8f791c4..8033110 100644 --- a/main.cpp +++ b/main.cpp @@ -1,3 +1,4 @@ + #include #include #include "tree.h" @@ -46,13 +47,24 @@ int main() firstTree.addPerson("Адам", true, Nobody, Nobody, {0, 1, 6}); firstTree.addPerson("Ева", false, Nobody, Nobody, {0, 1, 6}); - firstTree.addRelation(0, Husband, 1); + firstTree.addRelation(0, Spouse, 1); firstTree.addPerson("Кайн", true, 0, 1); + firstTree.addPerson("Авел", true, 0, 1); + firstTree.addRelation(2, Sibling, 3); + firstTree.addPerson("Сит", true, 0, 1, 230); - firstTree.addRelation(2, Brother, 3); - firstTree.addRelation(2, Brother, 4); + firstTree.addRelation(2, Sibling, 4); + firstTree.addPerson("Енос", true, 4, Nobody, 435); + firstTree.addPerson("Каинан", true, 5 , Nobody, 605); + firstTree.addPerson("Малелеил", true, 6, Nobody, 605); + + + firstTree.addPerson("Енох", true, 3 , Nobody); + firstTree.addPerson("Гаидад", true, 8 , Nobody); + firstTree.addPerson("Малелеил", true, 9, Nobody); + /* firstTree.print(); */ firstTree.draw(); @@ -107,173 +119,173 @@ int main() bool sex; unsigned father, mother; // IDs - do - { - clear(); - printw("Enter a command\n"); - refresh(); - // getmaxyx(stdscr,row,col); /* get the number of rows and columns */ + /* do */ + /* { */ + /* clear(); */ + /* printw("Enter a command\n"); */ + /* refresh(); */ + /* // getmaxyx(stdscr,row,col); /\* get the number of rows and columns *\/ */ - std::cin >> input; - for (i = 0; i < numCom; ++i) - { - if (strComp(input, commandList[i])) - break; - } + /* std::cin >> input; */ + /* for (i = 0; i < numCom; ++i) */ + /* { */ + /* if (strComp(input, commandList[i])) */ + /* break; */ + /* } */ - switch (i) - { - default: - std::cout << "Unknown command, try again\n\n"; - break; - case 0: //quit - quit = 1; - break; - case 1: //rename - std::cout << "Enter new name\n\n"; - std::cin >> name; - trees[curTree].rename(name); - break; - case 2: //load - cin >> input; - trees.push(Tree(input)); - if (!trees[trees.gNum() - 1].loadTree()) - std::cout << "File doesnt exist or is empty.\n\n"; - break; - case 3: //save - trees[curTree].saveTree(); - break; - case 4: //addPerson - std::cin >> name >> day >> month >> year >> sex; - trees[curTree].addPerson(name, sex, Nobody, Nobody, EventTime(year, month, day)); - break; - case 5: //addPersonWP - std::cin >> name >> day >> month >> year >> sex >> father >> mother; - trees[curTree].addPerson(name, sex, father, mother, EventTime(year, month, day)); - break; - case 6: //addRelation - std::cin >> name >> input >> secondName; - while (!strToRel(input)) - { - std::cout << "Invalid Relation, try again!\n"; - std::cin >> input; - } - if(!trees[curTree].addRelation(name, strToRel(input), secondName)) - std::cout << "Failure! One or both of the relatives don't exist.\n\n"; - break; - case 7: //addRelationID - std::cin >> id >> input >> secondId; - while (!strToRel(input)) - { - std::cout << "Invalid Relation, try again!\n"; - std::cin >> input; - } - if(trees[curTree].addRelation(id, strToRel(input), secondId)) - std::cout << "Failure! One or both of the relatives don't exist.\n\n"; - break; - case 8: //findID - std::cin >> name; - id = trees[curTree].findId(name); - if (id == Nobody) - std::cout << "No such person in tree " << curTree <<"\n\n"; - else - std::cout << id << "\n\n"; - break; - case 9: //equate - std::cin >> id >> secondId; - trees[id] = trees[secondId]; - break; - case 10: //combine - std::cin >> id >> secondId; - trees[id] += trees[secondId]; - break; - case 11: //subtract - std::cin >> id >> secondId; - trees[id] -= trees[secondId]; - break; - case 12: //removePerson - std::cin >> name; - if (trees[curTree].findId(name) != Nobody) - trees[curTree].removePerson(name); - else - std::cout << "No such member!\n\n"; - break; - case 13: //removePersonID - std::cin >> id; - if (trees[curTree].gNumP() > id) - trees[curTree].removePerson(id); - else - std::cout << "No such member!\n\n"; - break; - case 14: //removeRelation - std::cin >> name >> secondName; - if (trees[curTree].gNumP() > trees[curTree].findId(name) && trees[curTree].gNumP() > trees[curTree].findId(secondName)) - trees[curTree].removeRelation(name, secondName); - else - std::cout << "No such member!\n\n"; - break; - case 15: //removeRelationID - std::cin >> id >> secondId; - if (trees[curTree].gNumP() > id && trees[curTree].gNumP() > secondId) - trees[curTree].removeRelation(id, secondId); - else - std::cout << "No such member\n\n"; - break; - case 16: //addTree - std::cin >> name; - newTree = new Tree(name); - trees.push(*newTree); - delete newTree; - break; - case 17: //printRelatives - std::cin >> id; - if (id < trees[curTree].gNumP()) - trees[curTree].printRel(id); - else - std::cout << "No such member\n\n"; - break; - case 18: //printMember - std::cin >> id; - if (id < trees[curTree].gNumP()) - trees[curTree].printMember(id); - else - std::cout << "No such member\n\n"; - break; - case 19: //printAncestors - std::cin >> id; - /*if (id < trees[curTree].gNumP()) - trees[curTree].printAncestors(id); - else - std::cout << "No such member\n\n";*/ - break; - case 20: //chooseTree - std::cout << "Enter tree ID\n\n"; - std::cin >> id; - if (id < trees.gNum()) - curTree = id; - else - std::cout << "No such tree\n\n"; - break; - case 21: //prtCommonAncestor - std::cin >> id >> secondId; - if (id < trees[curTree].gNumP() || secondId < trees[curTree].gNumP()) - trees[curTree].printMember(trees[curTree].findCommonAncestor(id, secondId)); - else - std::cout << "No such member\n\n"; - break; - case 22: //prtOldestAncestors - std::cin >> id; - if (id < trees[curTree].gNumP()) - trees[curTree].printOldestAncestors(id); - else - std::cout << "No such member\n\n"; - break; - case 23: - trees[curTree].print(); - break; - } + /* switch (i) */ + /* { */ + /* default: */ + /* std::cout << "Unknown command, try again\n\n"; */ + /* break; */ + /* case 0: //quit */ + /* quit = 1; */ + /* break; */ + /* case 1: //rename */ + /* std::cout << "Enter new name\n\n"; */ + /* std::cin >> name; */ + /* trees[curTree].rename(name); */ + /* break; */ + /* case 2: //load */ + /* cin >> input; */ + /* trees.push(Tree(input)); */ + /* if (!trees[trees.gNum() - 1].loadTree()) */ + /* std::cout << "File doesnt exist or is empty.\n\n"; */ + /* break; */ + /* case 3: //save */ + /* trees[curTree].saveTree(); */ + /* break; */ + /* case 4: //addPerson */ + /* std::cin >> name >> day >> month >> year >> sex; */ + /* trees[curTree].addPerson(name, sex, Nobody, Nobody, EventTime(year, month, day)); */ + /* break; */ + /* case 5: //addPersonWP */ + /* std::cin >> name >> day >> month >> year >> sex >> father >> mother; */ + /* trees[curTree].addPerson(name, sex, father, mother, EventTime(year, month, day)); */ + /* break; */ + /* case 6: //addRelation */ + /* std::cin >> name >> input >> secondName; */ + /* while (!strToRel(input)) */ + /* { */ + /* std::cout << "Invalid Relation, try again!\n"; */ + /* std::cin >> input; */ + /* } */ + /* if(!trees[curTree].addRelation(name, strToRel(input), secondName)) */ + /* std::cout << "Failure! One or both of the relatives don't exist.\n\n"; */ + /* break; */ + /* case 7: //addRelationID */ + /* std::cin >> id >> input >> secondId; */ + /* while (!strToRel(input)) */ + /* { */ + /* std::cout << "Invalid Relation, try again!\n"; */ + /* std::cin >> input; */ + /* } */ + /* if(trees[curTree].addRelation(id, strToRel(input), secondId)) */ + /* std::cout << "Failure! One or both of the relatives don't exist.\n\n"; */ + /* break; */ + /* case 8: //findID */ + /* std::cin >> name; */ + /* id = trees[curTree].findId(name); */ + /* if (id == Nobody) */ + /* std::cout << "No such person in tree " << curTree <<"\n\n"; */ + /* else */ + /* std::cout << id << "\n\n"; */ + /* break; */ + /* case 9: //equate */ + /* std::cin >> id >> secondId; */ + /* trees[id] = trees[secondId]; */ + /* break; */ + /* case 10: //combine */ + /* std::cin >> id >> secondId; */ + /* trees[id] += trees[secondId]; */ + /* break; */ + /* case 11: //subtract */ + /* std::cin >> id >> secondId; */ + /* trees[id] -= trees[secondId]; */ + /* break; */ + /* case 12: //removePerson */ + /* std::cin >> name; */ + /* if (trees[curTree].findId(name) != Nobody) */ + /* trees[curTree].removePerson(name); */ + /* else */ + /* std::cout << "No such member!\n\n"; */ + /* break; */ + /* case 13: //removePersonID */ + /* std::cin >> id; */ + /* if (trees[curTree].gNumP() > id) */ + /* trees[curTree].removePerson(id); */ + /* else */ + /* std::cout << "No such member!\n\n"; */ + /* break; */ + /* case 14: //removeRelation */ + /* std::cin >> name >> secondName; */ + /* if (trees[curTree].gNumP() > trees[curTree].findId(name) && trees[curTree].gNumP() > trees[curTree].findId(secondName)) */ + /* trees[curTree].removeRelation(name, secondName); */ + /* else */ + /* std::cout << "No such member!\n\n"; */ + /* break; */ + /* case 15: //removeRelationID */ + /* std::cin >> id >> secondId; */ + /* if (trees[curTree].gNumP() > id && trees[curTree].gNumP() > secondId) */ + /* trees[curTree].removeRelation(id, secondId); */ + /* else */ + /* std::cout << "No such member\n\n"; */ + /* break; */ + /* case 16: //addTree */ + /* std::cin >> name; */ + /* newTree = new Tree(name); */ + /* trees.push(*newTree); */ + /* delete newTree; */ + /* break; */ + /* case 17: //printRelatives */ + /* std::cin >> id; */ + /* if (id < trees[curTree].gNumP()) */ + /* trees[curTree].printRel(id); */ + /* else */ + /* std::cout << "No such member\n\n"; */ + /* break; */ + /* case 18: //printMember */ + /* std::cin >> id; */ + /* if (id < trees[curTree].gNumP()) */ + /* trees[curTree].printMember(id); */ + /* else */ + /* std::cout << "No such member\n\n"; */ + /* break; */ + /* case 19: //printAncestors */ + /* std::cin >> id; */ + /* /\*if (id < trees[curTree].gNumP()) */ + /* trees[curTree].printAncestors(id); */ + /* else */ + /* std::cout << "No such member\n\n";*\/ */ + /* break; */ + /* case 20: //chooseTree */ + /* std::cout << "Enter tree ID\n\n"; */ + /* std::cin >> id; */ + /* if (id < trees.gNum()) */ + /* curTree = id; */ + /* else */ + /* std::cout << "No such tree\n\n"; */ + /* break; */ + /* case 21: //prtCommonAncestor */ + /* std::cin >> id >> secondId; */ + /* if (id < trees[curTree].gNumP() || secondId < trees[curTree].gNumP()) */ + /* trees[curTree].printMember(trees[curTree].findCommonAncestor(id, secondId)); */ + /* else */ + /* std::cout << "No such member\n\n"; */ + /* break; */ + /* case 22: //prtOldestAncestors */ + /* std::cin >> id; */ + /* if (id < trees[curTree].gNumP()) */ + /* trees[curTree].printOldestAncestors(id); */ + /* else */ + /* std::cout << "No such member\n\n"; */ + /* break; */ + /* case 23: */ + /* trees[curTree].print(); */ + /* break; */ + /* } */ - } while (!quit); + /* } while (!quit); */ endwin(); /* stop ncursers */ diff --git a/person.cpp b/person.cpp index 26833a7..db80652 100644 --- a/person.cpp +++ b/person.cpp @@ -159,20 +159,26 @@ void Person::print()const /* cout << '\n'; */ } -WINDOW* Person::createPad()const +U16 Person::boxWidth() const { - U16 width = name_.size() + 4; - WINDOW* pad = newpad(5, width); - - box(pad, 5, width); - mvwaddstr(pad, 2, 2, name_.data()); - - return pad; + return name_.size() + 4 - 1; /* TODO: get actual lenght */ } -void Person::draw(U16 drawY, U16 drawX) const + +/* WINDOW* Person::createPad()const */ +/* { */ +/* U16 width = name_.size() + 4; */ +/* WINDOW* pad = newpad(5, width); */ + +/* box(pad, 5, width); */ +/* mvwaddstr(pad, 2, 2, name_.data()); */ + +/* return pad; */ +/* } */ + +void Person::draw(I16 drawY, I16 drawX) const { - U16 width = name_.size() + 4; /* TODO: get actual lenght */ + U16 width = boxWidth(); WINDOW* pad = newpad(BOX_HEIGHT, width); box(pad, BOX_HEIGHT, width); diff --git a/person.h b/person.h index 911cd78..d014beb 100644 --- a/person.h +++ b/person.h @@ -39,12 +39,14 @@ public: void print() const; + U16 boxWidth() const; + /* Draw a Person's box on the terminal drawY,drawX - the coordinates where to draw returns the width of the box*/ - void draw(U16 drawY, U16 drawX) const; + void draw(I16 drawY, I16 drawX) const; - WINDOW* createPad()const; + /* WINDOW* createPad()const; */ /* staitc constexpr U8 BOX_HEIGHT = 5; */ friend class Tree; diff --git a/tree.cpp b/tree.cpp index a3cf868..2cb0477 100644 --- a/tree.cpp +++ b/tree.cpp @@ -1,5 +1,7 @@ #include -#include +#include +#include +#include #include"tree.h" #include"person.h" #include"help.h" @@ -169,7 +171,7 @@ unsigned Tree::findOldestAncestor(const unsigned &id, const bool &isMale)const { for (unsigned i = 0; i < people[id].numRel_; ++i) { - if (relations[id][i] == Son && people[ relatives[id][i] ].isMale_ == isMale) + if (relations[id][i] == Child && people[ relatives[id][i] ].isMale_ == isMale) return findOldestAncestor(relatives[id][i], isMale); } return id; @@ -273,8 +275,8 @@ void Tree::addPerson(const char* name, bool isMale, unsigned father, unsigned mo Array newRelation; relations.push(newRelation); ++numPeople; - addRelation(father, Father, numPeople - 1); - addRelation(mother, Mother, numPeople - 1); + addRelation(father, Parent, numPeople - 1); + addRelation(mother, Parent, numPeople - 1); } bool Tree::addRelation(const char* firstName, const Relation type, const char* secondName) @@ -306,61 +308,20 @@ bool Tree::addRelation(const unsigned firstId, const Relation type, const unsign if (!opposite) { - if (people[secondId].isMale_) + switch (type) { - switch (type) - { - case Father: - case Mother: - addRelation(secondId, Son, firstId, 1); - break; - case Son: - case Daughter: - addRelation(secondId, Father, firstId, 1); - break; - case Brother: - case Sister: - addRelation(secondId, Brother, firstId, 1); - break; - case HalfBrother: - case HalfSister: - addRelation(secondId, HalfBrother, firstId, 1); - break; - case Wife: - addRelation(secondId, Husband, firstId, 1); - break; - case ExWife: - addRelation(secondId, ExHusband, firstId, 1); - break; - } - } - else - { - switch (type) - { - case Father: - case Mother: - addRelation(secondId, Daughter, firstId, 1); - break; - case Son: - case Daughter: - addRelation(secondId, Mother, firstId, 1); - break; - case Brother: - case Sister: - addRelation(secondId, Sister, firstId, 1); - break; - case HalfBrother: - case HalfSister: - addRelation(secondId, HalfSister, firstId, 1); - break; - case Husband: - addRelation(secondId, Wife, firstId, 1); - break; - case ExHusband: - addRelation(secondId, ExWife, firstId, 1); - break; - } + case Parent: + addRelation(secondId, Child, firstId, 1); + break; + case Child: + addRelation(secondId, Parent, firstId, 1); + break; + case Sibling: + case HalfSibling: + case Spouse: + case ExSpouse: + addRelation(secondId, type, firstId, 1); + break; } } return 1; @@ -450,14 +411,25 @@ void Tree::draw() const /* 1, drawX, */ /* 1 +fh-1, drawX + fw-1); */ + const U32 numPpl = people.gNum(); + std::vector drawn(numPpl, false); - people[0].draw(0, 0); + U16 drawY = 0/* (LINES) / 2 */; + U16 drawX = 0/* (COLS) / 2 */; + drawLineRec(0, drawY, drawX); + /* people[0].draw(drawY, drawY); */ + /* for(U32 i=0; i &visited)const { for (unsigned i = 0; i < people[id].numRel_; ++i) { - if (relations[id][i] == Son) + if (relations[id][i] == Child) { ++visited[relatives[id][i]]; commonAncestorRec(relatives[id][i], visited); } } } + +static void linkToFirstBorn(I16 startY, I16 startX) +{ + 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, 2, 0, ACS_VLINE); + + wnoutrefresh(win); + delwin(win); + } +} + +static void linkToChild(I16 startY, I16 startX, I16 endX) +{ + assert(endX >= startX); + + if(startY >= -1 && endX >= 0) + { + const I16 len = endX - startX; + WINDOW* win = newwin(2, len, startY, startX); + + for(U16 i = 0; i < len-1; ++i) + waddch(win, ACS_HLINE); + /* whline(win, '_', len-1); */ + waddch(win, ACS_TTEE); + + mvwaddch(win, 1, len-1, ACS_VLINE); + + wnoutrefresh(win); + delwin(win); + } +} + +I16 Tree::drawLineRec(person_id id, I16 drawY, I16 drawX) const +{ + people[id].draw(drawY, drawX); + std::vector sons; + for(U32 i=0; i Tree(Str&& Name) : treeName(std::forward(Name)) {} @@ -62,10 +58,11 @@ public: void printMember(const unsigned id)const; void printOldestAncestors(const unsigned id)const;// - unsigned gNumP()const; - private: void commonAncestorRec(const unsigned &id, const Array &visited)const; + /* draw a line of people starting from person with id + return the farthest X that will be drawn */ + I16 drawLineRec(person_id id, I16 drawY, I16 drawX) const; std::string treeName = "Unnamed"; unsigned numPeople = 0;