192 lines
4.3 KiB
C++
192 lines
4.3 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 - 1; /* 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) const
|
|
{
|
|
U16 width = boxWidth();
|
|
WINDOW* pad = newpad(BOX_HEIGHT, width);
|
|
|
|
box(pad, BOX_HEIGHT, width);
|
|
mvwaddstr(pad, 2, 2, name_.data());
|
|
|
|
pnoutrefresh(pad, 0, 0,
|
|
drawY, drawX,
|
|
drawY + BOX_HEIGHT-1, drawX + width-1);
|
|
delwin(pad);
|
|
}
|