#include #include #include #include #include"person.hpp" #include "utils.hpp" using std::cout; using std::string; static WINDOW* info_tab; EventTime::EventTime(I16 Year, U8 Month, U16 Day, I8 Hour, I8 Minute) : year(Year) , month(Month) , day(Day) , hour(Hour) , minute(Minute) { assert(month <= 12 && day <= 31 && hour <= 23 && minute <= 59 && "Invalid EventTime data"); } void EventTime::print() const { /* if (day != UNKNOWN_DATE) */ /* cout << (I32)day; */ /* else */ /* cout << "??"; */ /* cout << '.'; */ /* if (month != UNKNOWN_DATE) */ /* cout << (I32)month; */ /* else */ /* cout << "??"; */ /* cout << '.'; */ /* if (year != UNKNOWN_DATE) */ /* cout << year; */ /* else */ /* cout << "????"; */ /* cout << '\n'; */ if (day != UNKNOWN_DATE) wprintw(info_tab, "%d", day); else waddstr(info_tab, "??"); waddch(info_tab, '.'); if (month != UNKNOWN_DATE) wprintw(info_tab, "%d", month); else waddstr(info_tab, "??"); waddch(info_tab, '.'); if (year != UNKNOWN_DATE) wprintw(info_tab, "%d", year); else waddstr(info_tab, "????"); waddch(info_tab, '\n'); } Person::Person(const char* aName, EventTime birth, Sex aSex, EventTime death) : name(aName) , birth_(birth) , sex(aSex) , death_(death) { } bool Person::operator==(const Person &other)const { return name == other.name; //&& sex == other.sex; //TODO && day == other.day || !day || !other.day) && (month == other.month || !month || !other.month) && (year == other.year || !year || !other.year); } void Person::write(std::ofstream &file)const { // char nameLen = name.size(); file.write(reinterpret_cast(&nameLen), sizeof(nameLen)); file.write(name.data(), nameLen * sizeof(name[0])); file.write(reinterpret_cast(&sex), sizeof(sex)); //file.write(reinterpret_cast(&day), sizeof(day)); TODO //file.write(reinterpret_cast(&month), sizeof(month)); //file.write(reinterpret_cast(&year), sizeof(year)); } void Person::read(std::ifstream &file) { U8 nameLen; file.read((char*)&nameLen, sizeof(nameLen)); //Check len char nameBuf[128]; file.read(nameBuf, nameLen * sizeof(*nameBuf)); nameBuf[nameLen] = '\0'; name = nameBuf; file.read(reinterpret_cast(&sex), sizeof(sex)); //file.read(reinterpret_cast(&day), sizeof(day)); TODO //file.read(reinterpret_cast(&month), sizeof(month)); //file.read(reinterpret_cast(&year), sizeof(year)); } void Person::rename(const char* newName) { name = newName; } void Person::displayInfo()const { info_tab = newwin(LINES, COLS, 0, 0); waddstr(info_tab, name.data()); waddch(info_tab,'\n'); waddstr(info_tab, "Birth: "); birth_.print(); waddstr(info_tab, "Death: "); death_.print(); mvwaddstr(info_tab, LINES-1, 0, "Press any key to return."); wrefresh(info_tab); getch(); /* waint press */ werase(info_tab); wrefresh(info_tab); /* todo: dont update */ delwin(info_tab); } static U16 strUtf8Symbols(const std::string& str) { U16 num = 0; for(char c: str) num += ((c & 0xC0) != 0x80); return num; } /* U16 Person::boxWidth() const */ /* { */ /* return strUtf8Symbols(name) + 4; */ /* } */ /* 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; */ /* } */ U16 Person::draw(const I16 drawY, const I16 drawX, bool selected, bool hasSpouse, bool hasParents, bool hasKids, bool wholeName) const { string display_name; /* todo remove? */ if(wholeName) { display_name = name; } else { size_t space = name.find(' '); if(space != string::npos) { /* name[space] = '\0'; */ display_name = name.substr(0, space); /* name[space] = ' '; */ } else { display_name = name; } } const U16 width = strUtf8Symbols(display_name) + 4; /* pad width */ if(willBeVisible(drawY, drawX, BOX_HEIGHT, width)) { WINDOW* pad = newpad(BOX_HEIGHT, width); auto color_pair = COLOR_PAIR( selected ? COLOR_SELECTED : (sex==M ? COLOR_MALE : COLOR_FEMALE) ); wbkgd(pad, color_pair); /* wattron(pad, color_pair); */ wborder(pad, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE, hasParents ? ACS_LTEE : ACS_TTEE, hasSpouse ? ACS_TTEE : ACS_URCORNER, hasKids ? ACS_LTEE : ACS_LLCORNER, ACS_LRCORNER ); mvwaddstr(pad, 2, 2, display_name.data()); /* wattroff(pad, color_pair); */ drawpad(pad, drawY, drawX); delwin(pad); } return width; }