#pragma once #include #include #include "person.hpp" using person_id = U32; enum: person_id { Nobody = UINT32_MAX }; enum RelType : U8 { None = 0, Parent, Child, Sibling, HalfSibling, Spouse, ExSpouse, Other }; struct Relation { person_id id; RelType type; }; class Tree { public: Tree() = default; template explicit Tree(Str&& Name) : treeName_(std::forward(Name)) {} /* Tree(const Tree&) = default; */ /* Tree& operator= (const Tree& other); */ Tree operator+ (const Tree& other) const; Tree operator- (const Tree& other) const; /* todo */ Tree& operator+= (const Tree& other); Tree& operator-= (const Tree& other); void rename(const char* newName); person_id last(); std::vector findId(const std::string& name) const; person_id findId(const std::string& name, Sex) const; person_id findRootAncestor(person_id) const; person_id findOldestAncestor(person_id, Sex) const;// //oldest common ancestor ID, a person is considerd an ancestor of himself person_id findCommonAncestor(person_id first, person_id second) const; /* needs to be fixed, never return nobody */ RelType findRelation(person_id first, person_id second) const; person_id findParent(person_id child, Sex parentSex) const; person_id findSpouse(person_id person) const; std::vector findChildren(person_id person) const; std::vector findChildren(person_id person, person_id exclude) const; void addPerson(const char* name, Sex sex, person_id father=Nobody, person_id mother=Nobody, EventTime birth={}, EventTime death={}); bool addRelation(const char* firstName, RelType, const char* secondName); //Adds a new relation or edits an old one. 0 - failure 1 - success bool addRelation(person_id first, RelType, person_id second, bool update=true); //0 - failure 1 - success void removePerson(person_id id); //Removes a member and the last one takes his ID /* void removePerson(const char*, short year = 0, const unsigned char month = 0, const unsigned char day = 0); */ void removeRelation(person_id first, person_id second); void removeRelation(const char* firstName, const char* secondName); /* display the tree and wait process key input */ void display(); void print()const; /* void printRel(person_id id)const; //Prints out close relatives */ void printMember(person_id)const; void printOldestAncestors(person_id)const;// private: void commonAncestorRec(person_id, std::vector &visited)const; void addRelOneSide(person_id first, RelType, person_id second); /* update a person's relations after adding a relation (example adds siblings after parents are added) */ void updateRels(person_id); void draw() const; /* draw a line of people starting from person with id return the farthest X that will be drawn */ I16 drawLineWithWives(person_id, I16 drawY, I16 drawX) const; void selectLeft(); void selectDown(); void selectUp(); void selectRight(); void selectLeftSibSpouse(person_id); void selectRightSib(person_id); std::string treeName_; std::vector people_; //The data for each member std::vector> relations_; //The relatives of each member person_id focused_ = 0; /* the tree was draw based on this person */ person_id selected_ = 0; I16 offsetX_ = 0; /* offset of the tree in relation to the screen*/ I16 offsetY_ = 0; U8 zoom_ = 0; U8 dist_between_ = 1; /* distance between people */ U8 spouse_dist_ = 0; /* distance between spouses */ //Search, ect. };