Files
tft/person.cpp
T
2022-12-31 12:26:31 +02:00

198 lines
4.5 KiB
C++

#include <iostream>
#include <assert.h>
#include <ncursesw/ncurses.h>
#include"person.h"
#include "help.h"
using std::cout;
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* name, EventTime birth, bool isMale, EventTime death)
: name_(name)
, numRel_(0)
, birth_(birth)
, isMale_(isMale)
, death_(death)
{
}
/*Person& Person::operator=(const Person &other)
{
if (&other!=this)
{
rename(other.name);
numRel = other.numRel;
isMale = other.isMale;
day = other.day;
month = other.month;
year = other.year;
}
return *this;
}*/
bool Person::operator==(const Person &other)const
{
return name_ == other.name_ && isMale_ == other.isMale_; //TODO && day == other.day || !day || !other.day) && (month == other.month || !month || !other.month) && (year == other.year || !year || !other.year);
}
void Person::save(std::ofstream &file)const
{
//
char nameLen = name_.size();
file.write(reinterpret_cast<char*>(&nameLen), sizeof(nameLen));
file.write(name_.data(), nameLen * sizeof(name_[0]));
file.write(reinterpret_cast<const char*>(&numRel_), sizeof(numRel_));
file.write(reinterpret_cast<const char*>(&isMale_), sizeof(isMale_));
//file.write(reinterpret_cast<const char*>(&day), sizeof(day)); TODO
//file.write(reinterpret_cast<const char*>(&month), sizeof(month));
//file.write(reinterpret_cast<const char*>(&year), sizeof(year));
}
void Person::load(std::ifstream &file)
{
char nameLen;
file.read((char*)&nameLen, sizeof(nameLen)); //Check len
C8 nameBuf[128];
file.read(nameBuf, nameLen * sizeof(*nameBuf));
nameBuf[nameLen] = '\0';
name_ = nameBuf;
file.read(reinterpret_cast<char*>(&numRel_), sizeof(numRel_));
file.read(reinterpret_cast<char*>(&isMale_), sizeof(isMale_));
//file.read(reinterpret_cast<char*>(&day), sizeof(day)); TODO
//file.read(reinterpret_cast<char*>(&month), sizeof(month));
//file.read(reinterpret_cast<char*>(&year), sizeof(year));
}
void Person::rename(const char* newName)
{
name_ = newName;
}
void Person::print()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);
delwin(info_tab);
/* cout << name_ << '\n'; */
/* cout << (isMale_ ? "Male\n" : "Female\n"); */
/* cout << "Birth: "; */
/* birth_.print(); */
/* cout << "Death: "; //TODO: only print if known */
/* death_.print(); */
/* cout << '\n'; */
}
U16 Person::boxWidth() const
{
return name_.size() + 4; /* TODO: get actual lenght */
}
/* 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, bool hasSpouse, bool isSpouse, bool hasKids) const
{
U16 width = boxWidth();
WINDOW* pad = newpad(BOX_HEIGHT, width);
wborder(pad, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE,
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());
pnoutrefresh(pad, 0, 0,
drawY, drawX,
drawY + BOX_HEIGHT-1, drawX + width-1);
delwin(pad);
}