Files
tft/src/tree.hpp
T
2023-11-02 21:25:56 +02:00

113 lines
3.5 KiB
C++

#pragma once
#include <climits>
#include <vector>
#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 <class Str>
explicit Tree(Str&& Name) : treeName_(std::forward<Str>(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<person_id> 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<person_id> findChildren(person_id person) const;
std::vector<person_id> 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<U8> &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<Person> people_; //The data for each member
std::vector<std::vector<Relation>> 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.
};