7 #include "Exceptions.h"
17 using namespace Atlas::Message;
22 Calendar::Calendar(Avatar& av) :
30 av.getView().TopLevelEntityChanged.connect(
31 sigc::mem_fun(
this, &Calendar::topLevelEntityChanged));
33 if (av.getView().getTopLevel()) topLevelEntityChanged();
36 void Calendar::topLevelEntityChanged()
38 m_calendarObserver.disconnect();
40 if (!tl || !tl->hasProperty(
"calendar"))
return;
42 m_calendarObserver = tl->observe(
"calendar", sigc::mem_fun(
this, &Calendar::calendarAttrChanged),
true);
45 void Calendar::calendarAttrChanged(
const Element& value)
52 initFromCalendarAttr(value.Map());
53 }
catch (
const InvalidAtlas& e) {
54 warning() <<
"Error when parsing calendar attribute. " << e.what();
59 void Calendar::initFromCalendarAttr(
const MapType& cal)
61 auto it = cal.find(
"days_per_month");
62 if (it == cal.end())
throw InvalidAtlas(
"malformed calendar data");
63 m_daysPerMonth = (int)it->second.asInt();
65 it = cal.find(
"hours_per_day");
66 if (it == cal.end())
throw InvalidAtlas(
"malformed calendar data");
67 m_hoursPerDay = (int)it->second.asInt();
69 it = cal.find(
"minutes_per_hour");
70 if (it == cal.end())
throw InvalidAtlas(
"malformed calendar data");
71 m_minutesPerHour = (int)it->second.asInt();
73 it = cal.find(
"months_per_year");
74 if (it == cal.end())
throw InvalidAtlas(
"malformed calendar data");
75 m_monthsPerYear = (int)it->second.asInt();
77 it = cal.find(
"seconds_per_minute");
78 if (it == cal.end())
throw InvalidAtlas(
"malformed calendar data");
79 m_secondsPerMinute = (int)it->second.asInt();
84 DateTime Calendar::now()
const
88 if (m_daysPerMonth == 0)
return n;
92 n.m_seconds = world_time % m_secondsPerMinute;
93 world_time /= m_secondsPerMinute;
95 n.m_minutes = world_time % m_minutesPerHour;
96 world_time /= m_minutesPerHour;
98 n.m_hours = world_time % m_hoursPerDay;
99 world_time /= m_hoursPerDay;
101 n.m_dayOfMonth = world_time % m_daysPerMonth;
102 world_time /= m_daysPerMonth;
104 n.m_month = world_time % m_monthsPerYear;
105 world_time /= m_monthsPerYear;
107 n.m_year =
static_cast<int>(world_time);