bool TimeEntryDialog(const TCHAR *caption, RoughTime &value, RoughTimeDelta time_zone, bool nullable) { /* create the dialog */ const DialogLook &look = UIGlobals::GetDialogLook(); WidgetDialog dialog(look); dialog.CreatePreliminary(UIGlobals::GetMainWindow(), caption); ContainerWindow &client_area = dialog.GetClientAreaWindow(); /* create the input control */ WindowStyle control_style; control_style.Hide(); control_style.TabStop(); DigitEntry entry(look); entry.CreateTime(client_area, client_area.GetClientRect(), control_style); entry.Resize(entry.GetRecommendedSize()); entry.SetValue(value + time_zone); entry.SetActionListener(dialog, mrOK); /* create buttons */ dialog.AddButton(_("OK"), dialog, mrOK); dialog.AddButton(_("Cancel"), dialog, mrCancel); auto now_listener = MakeLambdaActionListener([&entry, time_zone](unsigned){ const BrokenTime bt = BrokenDateTime::NowUTC(); RoughTime now_utc = RoughTime(bt.hour, bt.minute); entry.SetValue(now_utc + time_zone); }); dialog.AddButton(_("Now"), now_listener, 0); auto clear_listener = MakeLambdaActionListener([&entry](unsigned){ entry.SetInvalid(); }); if (nullable) dialog.AddButton(_("Clear"), clear_listener, 0); /* run it */ FixedWindowWidget widget(&entry); dialog.FinishPreliminary(&widget); bool result = dialog.ShowModal() == mrOK; dialog.StealWidget(); if (!result) return false; value = entry.GetTimeValue() - time_zone; return true; }
void RoughTimeDataField::Dec() { RoughTime new_value = value; if (new_value.IsValid()) --new_value; else { const BrokenTime bt = BrokenDateTime::NowUTC(); new_value = RoughTime(bt.hour, bt.minute); } ModifyValue(new_value); }
RoughTime DigitEntry::GetTimeValue() const { assert(length == 4); assert(columns[0].type == Column::Type::HOUR); assert(columns[1].type == Column::Type::COLON); assert(columns[2].type == Column::Type::DIGIT6); assert(columns[3].type == Column::Type::DIGIT); if (!valid) return RoughTime::Invalid(); return RoughTime(columns[0].value, columns[2].value * 10 + columns[3].value); }
RoughTime ConstDataNode::GetAttributeRoughTime(const TCHAR *name) const { const TCHAR *p = GetAttribute(name); if (p == nullptr) return RoughTime::Invalid(); TCHAR *endptr; unsigned hours = ParseUnsigned(p, &endptr, 10); if (endptr == p || *endptr != ':' || hours >= 24) return RoughTime::Invalid(); p = endptr + 1; unsigned minutes = ParseUnsigned(p, &endptr, 10); if (endptr == p || *endptr != 0 || minutes >= 60) return RoughTime::Invalid(); return RoughTime(hours, minutes); }
static constexpr RoughTime Invalid() { return RoughTime(INVALID); }
gcc_const static RoughTime FromMinuteOfDayChecked(unsigned mod) { return RoughTime(mod % MAX); }
gcc_const static RoughTime FromMinuteOfDay(unsigned mod) { assert(mod < MAX); return RoughTime(mod); }
int main(int argc, char **argv) { plan_tests(77); RoughTime a = RoughTime::Invalid(); ok1(!a.IsValid()); a = RoughTime(12, 1); ok1(a.IsValid()); ok1(a.GetHour() == 12); ok1(a.GetMinute() == 1); ok1(a.GetMinuteOfDay() == 12 * 60 + 1); /* compare a RoughTime with itself */ ok1(a == a); ok1(!(a != a)); ok1(a <= a); ok1(a >= a); ok1(!(a < a)); ok1(!(a > a)); /* compare a RoughTime with another one */ RoughTime b(11, 59); ok1(b.IsValid()); ok1(a != b); ok1(!(a == b)); ok1(!(a <= b)); ok1(a >= b); ok1(!(a < b)); ok1(a > b); ok1(b != a); ok1(!(b == a)); ok1(b <= a); ok1(!(b >= a)); ok1(b < a); ok1(!(b > a)); /* test RoughTimeSpan::IsInside() */ RoughTimeSpan s = RoughTimeSpan::Invalid(); ok1(!s.IsDefined()); ok1(s.IsInside(a)); ok1(s.IsInside(b)); s = RoughTimeSpan(RoughTime(12, 0), RoughTime::Invalid()); ok1(s.IsDefined()); ok1(s.IsInside(a)); ok1(!s.IsInside(b)); s = RoughTimeSpan(RoughTime::Invalid(), RoughTime(12, 0)); ok1(s.IsDefined()); ok1(!s.IsInside(a)); ok1(s.IsInside(b)); s = RoughTimeSpan(RoughTime(12, 0), RoughTime(12, 1)); ok1(s.IsDefined()); ok1(!s.IsInside(a)); ok1(!s.IsInside(b)); s = RoughTimeSpan(RoughTime(12, 0), RoughTime(12, 30)); ok1(s.IsDefined()); ok1(s.IsInside(a)); ok1(!s.IsInside(b)); /* test midnight wraparound */ a = RoughTime(0, 0); b = RoughTime(23, 59); ok1(b.IsValid()); ok1(a != b); ok1(!(a == b)); ok1(!(a <= b)); ok1(a >= b); ok1(!(a < b)); ok1(a > b); ok1(b != a); ok1(!(b == a)); ok1(b <= a); ok1(!(b >= a)); ok1(b < a); ok1(!(b > a)); RoughTime c(22, 0); RoughTime d(2, 0); s = RoughTimeSpan(RoughTime(23, 0), RoughTime::Invalid()); ok1(s.IsDefined()); ok1(s.IsInside(a)); ok1(s.IsInside(b)); ok1(!s.IsInside(c)); ok1(s.IsInside(d)); s = RoughTimeSpan(RoughTime::Invalid(), RoughTime(1, 0)); ok1(s.IsDefined()); ok1(s.IsInside(a)); ok1(s.IsInside(b)); ok1(s.IsInside(c)); ok1(!s.IsInside(d)); s = RoughTimeSpan(RoughTime(23, 1), RoughTime(0, 30)); ok1(s.IsDefined()); ok1(s.IsInside(a)); ok1(s.IsInside(b)); ok1(!s.IsInside(c)); ok1(!s.IsInside(d)); /* test operator+(RoughTime, RoughTimeDelta) */ ok1(RoughTime(0, 0) + RoughTimeDelta::FromMinutes(0) == RoughTime(0, 0)); ok1(RoughTime(0, 0) + RoughTimeDelta::FromMinutes(1) == RoughTime(0, 1)); ok1(RoughTime(0, 0) + RoughTimeDelta::FromMinutes(60) == RoughTime(1, 0)); ok1(RoughTime(0, 0) + RoughTimeDelta::FromHours(24) == RoughTime(0, 0)); ok1(RoughTime(0, 0) + RoughTimeDelta::FromHours(25) == RoughTime(1, 0)); ok1(RoughTime(0, 0) - RoughTimeDelta::FromMinutes(0) == RoughTime(0, 0)); ok1(RoughTime(0, 0) - RoughTimeDelta::FromMinutes(1) == RoughTime(23, 59)); ok1(RoughTime(0, 0) - RoughTimeDelta::FromMinutes(60) == RoughTime(23, 0)); ok1(RoughTime(0, 0) - RoughTimeDelta::FromHours(24) == RoughTime(0, 0)); ok1(RoughTime(0, 0) - RoughTimeDelta::FromHours(25) == RoughTime(23, 0)); return exit_status(); }