mirror of
https://github.com/GothenburgBitFactory/timewarrior.git
synced 2025-07-07 20:06:39 +02:00
Let Interval inherit from Range
- Remove 1 level of indirection - Remove public field Interval::range (instead use interval directly)
This commit is contained in:
parent
0d33700336
commit
9dd106116c
30 changed files with 289 additions and 280 deletions
|
@ -36,7 +36,7 @@ int CmdCancel (
|
|||
// If there is an open interval, cancel it by deleting it..
|
||||
auto latest = getLatestInterval (database);
|
||||
|
||||
if (!latest.range.is_open ())
|
||||
if (!latest.is_open ())
|
||||
{
|
||||
if (rules.getBoolean ("verbose"))
|
||||
std::cout << "There is no active time tracking.\n";
|
||||
|
|
|
@ -55,12 +55,12 @@ int CmdChartDay (
|
|||
{
|
||||
// Create a filter, and if empty, choose the current day.
|
||||
auto filter = getFilter (cli);
|
||||
if (! filter.range.is_started ())
|
||||
if (! filter.is_started ())
|
||||
{
|
||||
if (rules.has ("reports.day.range"))
|
||||
expandIntervalHint (rules.get ("reports.day.range"), filter.range);
|
||||
expandIntervalHint (rules.get ("reports.day.range"), filter);
|
||||
else
|
||||
filter.range = Range (Datetime ("today"), Datetime ("tomorrow"));
|
||||
filter.setRange (Range (Datetime ("today"), Datetime ("tomorrow")));
|
||||
}
|
||||
|
||||
return renderChart (cli, "day", filter, rules, database);
|
||||
|
@ -74,12 +74,12 @@ int CmdChartWeek (
|
|||
{
|
||||
// Create a filter, and if empty, choose the current week.
|
||||
auto filter = getFilter (cli);
|
||||
if (! filter.range.is_started ())
|
||||
if (! filter.is_started ())
|
||||
{
|
||||
if (rules.has ("reports.week.range"))
|
||||
expandIntervalHint (rules.get ("reports.week.range"), filter.range);
|
||||
expandIntervalHint (rules.get ("reports.week.range"), filter);
|
||||
else
|
||||
filter.range = Range (Datetime ("sow"), Datetime ("eow"));
|
||||
filter.setRange (Range (Datetime ("sow"), Datetime ("eow")));
|
||||
}
|
||||
|
||||
return renderChart (cli, "week", filter, rules, database);
|
||||
|
@ -93,12 +93,12 @@ int CmdChartMonth (
|
|||
{
|
||||
// Create a filter, and if empty, choose the current month.
|
||||
auto filter = getFilter (cli);
|
||||
if (! filter.range.is_started ())
|
||||
if (! filter.is_started ())
|
||||
{
|
||||
if (rules.has ("reports.month.range"))
|
||||
expandIntervalHint (rules.get ("reports.month.range"), filter.range);
|
||||
expandIntervalHint (rules.get ("reports.month.range"), filter);
|
||||
else
|
||||
filter.range = Range (Datetime ("som"), Datetime ("eom"));
|
||||
filter.setRange (Range (Datetime ("som"), Datetime ("eom")));
|
||||
}
|
||||
|
||||
return renderChart (cli, "month", filter, rules, database);
|
||||
|
@ -113,7 +113,7 @@ int renderChart (
|
|||
Database& database)
|
||||
{
|
||||
// Load the data.
|
||||
auto exclusions = getAllExclusions (rules, filter.range);
|
||||
auto exclusions = getAllExclusions (rules, filter);
|
||||
auto tracked = getTracked (database, rules, filter);
|
||||
|
||||
// Map tags to colors.
|
||||
|
@ -162,7 +162,7 @@ int renderChart (
|
|||
|
||||
// Each day is rendered separately.
|
||||
time_t total_work = 0;
|
||||
for (Datetime day = filter.range.start; day < filter.range.end; day++)
|
||||
for (Datetime day = filter.start; day < filter.end; day++)
|
||||
{
|
||||
// Render the exclusion blocks.
|
||||
int num_lines = 1;
|
||||
|
@ -246,24 +246,24 @@ static void determineHourRange (
|
|||
// Get the extreme time range for the filtered data.
|
||||
first_hour = 23;
|
||||
last_hour = 0;
|
||||
for (Datetime day = filter.range.start; day < filter.range.end; day++)
|
||||
for (Datetime day = filter.start; day < filter.end; day++)
|
||||
{
|
||||
auto day_range = getFullDay (day);
|
||||
|
||||
for (auto& track : tracked)
|
||||
{
|
||||
if (day_range.overlaps (track.range))
|
||||
if (day_range.overlaps (track))
|
||||
{
|
||||
Interval clipped = clip (track, day_range);
|
||||
if (track.range.is_open ())
|
||||
clipped.range.end = Datetime ();
|
||||
if (track.is_open ())
|
||||
clipped.end = Datetime ();
|
||||
|
||||
if (clipped.range.start.hour () < first_hour)
|
||||
first_hour = clipped.range.start.hour ();
|
||||
if (clipped.start.hour () < first_hour)
|
||||
first_hour = clipped.start.hour ();
|
||||
|
||||
if (! clipped.range.is_open () &&
|
||||
clipped.range.end.hour () > last_hour)
|
||||
last_hour = clipped.range.end.hour ();
|
||||
if (! clipped.is_open () &&
|
||||
clipped.end.hour () > last_hour)
|
||||
last_hour = clipped.end.hour ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -521,28 +521,28 @@ static void renderInterval (
|
|||
|
||||
// Ignore any track that doesn't overlap with day.
|
||||
auto day_range = getFullDay (day);
|
||||
if (!day_range.overlaps (track.range) ||
|
||||
(track.range.is_open () && day > now))
|
||||
if (! day_range.overlaps (track) ||
|
||||
(track.is_open () && day > now))
|
||||
return;
|
||||
|
||||
// If the track is open and day is today, then closed the track now, otherwise
|
||||
// it will be rendered until midnight.
|
||||
Interval clipped = clip (track, day_range);
|
||||
if (track.range.is_open ())
|
||||
if (track.is_open ())
|
||||
{
|
||||
if (day_range.start.sameDay (now))
|
||||
clipped.range.end = now;
|
||||
clipped.end = now;
|
||||
else
|
||||
clipped.range.end = day_range.end;
|
||||
clipped.end = day_range.end;
|
||||
}
|
||||
|
||||
auto start_mins = (clipped.range.start.hour () - first_hour) * 60 + clipped.range.start.minute ();
|
||||
auto end_mins = (clipped.range.end.hour () - first_hour) * 60 + clipped.range.end.minute ();
|
||||
auto start_mins = (clipped.start.hour () - first_hour) * 60 + clipped.start.minute ();
|
||||
auto end_mins = (clipped.end.hour () - first_hour) * 60 + clipped.end.minute ();
|
||||
|
||||
if (clipped.range.end.hour () == 0)
|
||||
end_mins += (clipped.range.end.day() + (clipped.range.end.month () - clipped.range.start.month () - 1) * clipped.range.start.day ()) * 24 * 60;
|
||||
if (clipped.end.hour () == 0)
|
||||
end_mins += (clipped.end.day() + (clipped.end.month () - clipped.start.month () - 1) * clipped.start.day ()) * 24 * 60;
|
||||
|
||||
work = clipped.range.total ();
|
||||
work = clipped.total ();
|
||||
|
||||
auto start_block = quantizeToNMinutes (start_mins, cell) / cell;
|
||||
auto end_block = quantizeToNMinutes (end_mins == start_mins ? start_mins + 60 : end_mins, cell) / cell;
|
||||
|
@ -584,7 +584,7 @@ static void renderInterval (
|
|||
|
||||
// An open interval gets a "..." in the bottom right corner, or
|
||||
// whatever fits.
|
||||
if (track.range.is_open ())
|
||||
if (track.is_open ())
|
||||
lines.back ().add ("+", start_offset + width - 1, colorTrack);
|
||||
}
|
||||
}
|
||||
|
@ -608,8 +608,8 @@ std::string renderHolidays (
|
|||
auto date = entry.substr (last_dot + 1);
|
||||
std::replace (date.begin (), date.end (), '_', '-');
|
||||
Datetime holiday (date);
|
||||
if (holiday >= filter.range.start &&
|
||||
holiday <= filter.range.end)
|
||||
if (holiday >= filter.start &&
|
||||
holiday <= filter.end)
|
||||
{
|
||||
out << Datetime (date).toString ("Y-M-D")
|
||||
<< " ["
|
||||
|
@ -640,26 +640,26 @@ static std::string renderSummary (
|
|||
{
|
||||
time_t total_unavailable = 0;
|
||||
for (auto& exclusion : exclusions)
|
||||
if (filter.range.overlaps (exclusion))
|
||||
total_unavailable += filter.range.intersect (exclusion).total ();
|
||||
if (filter.overlaps (exclusion))
|
||||
total_unavailable += filter.intersect (exclusion).total ();
|
||||
|
||||
time_t total_worked = 0;
|
||||
if (! blank)
|
||||
{
|
||||
for (auto& interval : tracked)
|
||||
{
|
||||
if (filter.range.overlaps (interval.range))
|
||||
if (filter.overlaps (interval))
|
||||
{
|
||||
Interval clipped = clip (interval, filter.range);
|
||||
if (interval.range.is_open ())
|
||||
clipped.range.end = Datetime ();
|
||||
Interval clipped = clip (interval, filter);
|
||||
if (interval.is_open ())
|
||||
clipped.end = Datetime ();
|
||||
|
||||
total_worked += clipped.range.total ();
|
||||
total_worked += clipped.total ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto total_available = filter.range.total () - total_unavailable;
|
||||
auto total_available = filter.total () - total_unavailable;
|
||||
assert (total_available >= 0);
|
||||
auto total_remaining = total_available - total_worked;
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ int CmdContinue (
|
|||
if (latest.empty ())
|
||||
throw std::string ("There is no previous tracking to continue.");
|
||||
|
||||
if (latest.range.is_open ())
|
||||
if (latest.is_open ())
|
||||
throw std::string ("There is already active tracking.");
|
||||
|
||||
to_copy = latest;
|
||||
|
@ -75,10 +75,10 @@ int CmdContinue (
|
|||
|
||||
database.startTransaction ();
|
||||
|
||||
if (filter.range.start.toEpoch () != 0)
|
||||
if (filter.start.toEpoch () != 0)
|
||||
{
|
||||
start_time = filter.range.start;
|
||||
end_time = filter.range.end;
|
||||
start_time = filter.start;
|
||||
end_time = filter.end;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -86,13 +86,13 @@ int CmdContinue (
|
|||
end_time = 0;
|
||||
}
|
||||
|
||||
if (latest.range.is_open ())
|
||||
if (latest.is_open ())
|
||||
{
|
||||
auto exclusions = getAllExclusions (rules, filter.range);
|
||||
auto exclusions = getAllExclusions (rules, filter);
|
||||
|
||||
// Stop it, at the given start time, if applicable.
|
||||
Interval modified {latest};
|
||||
modified.range.end = start_time;
|
||||
modified.end = start_time;
|
||||
|
||||
// Update database.
|
||||
database.deleteInterval (latest);
|
||||
|
@ -106,8 +106,8 @@ int CmdContinue (
|
|||
}
|
||||
|
||||
// Create an identical interval and update the DB.
|
||||
to_copy.range.start = start_time;
|
||||
to_copy.range.end = end_time;
|
||||
to_copy.start = start_time;
|
||||
to_copy.end = end_time;
|
||||
|
||||
validate (cli, rules, database, to_copy);
|
||||
database.addInterval (to_copy, rules.getBoolean ("verbose"));
|
||||
|
|
|
@ -35,7 +35,7 @@ int CmdDefault (Rules& rules, Database& database)
|
|||
// Load the most recent interval, summarize and display.
|
||||
auto interval = getLatestInterval (database);
|
||||
|
||||
if (interval.range.is_open ())
|
||||
if (interval.is_open ())
|
||||
{
|
||||
if (rules.getBoolean ("verbose"))
|
||||
{
|
||||
|
|
|
@ -57,7 +57,7 @@ int CmdDelete (
|
|||
if (tracked[tracked.size() - id].synthetic && dirty)
|
||||
{
|
||||
auto latest = getLatestInterval(database);
|
||||
auto exclusions = getAllExclusions (rules, filter.range);
|
||||
auto exclusions = getAllExclusions (rules, filter);
|
||||
|
||||
Interval modified {latest};
|
||||
|
||||
|
|
|
@ -39,12 +39,12 @@ int CmdGaps (
|
|||
{
|
||||
// If filter is empty, choose 'today'.
|
||||
auto filter = getFilter (cli);
|
||||
if (! filter.range.is_started ())
|
||||
if (! filter.is_started ())
|
||||
{
|
||||
if (rules.has ("reports.gaps.range"))
|
||||
expandIntervalHint (rules.get ("reports.gaps.range"), filter.range);
|
||||
expandIntervalHint (rules.get ("reports.gaps.range"), filter);
|
||||
else
|
||||
filter.range = Range (Datetime ("today"), Datetime ("tomorrow"));
|
||||
filter.setRange (Range (Datetime ("today"), Datetime ("tomorrow")));
|
||||
}
|
||||
|
||||
// Is the :blank hint being used?
|
||||
|
@ -52,7 +52,7 @@ int CmdGaps (
|
|||
|
||||
std::vector <Range> untracked;
|
||||
if (blank)
|
||||
untracked = subtractRanges ({filter.range}, getAllExclusions (rules, filter.range));
|
||||
untracked = subtractRanges ({filter}, getAllExclusions (rules, filter));
|
||||
else
|
||||
untracked = getUntracked (database, rules, filter);
|
||||
|
||||
|
@ -70,7 +70,7 @@ int CmdGaps (
|
|||
// Each day is rendered separately.
|
||||
time_t grand_total = 0;
|
||||
Datetime previous;
|
||||
for (Datetime day = filter.range.start; day < filter.range.end; day++)
|
||||
for (Datetime day = filter.start; day < filter.end; day++)
|
||||
{
|
||||
auto day_range = getFullDay (day);
|
||||
time_t daily_total = 0;
|
||||
|
|
|
@ -72,7 +72,7 @@ int CmdJoin (
|
|||
// TODO Require confirmation if tags don't match.
|
||||
|
||||
auto combined = second;
|
||||
combined.range.end = first.range.end;
|
||||
combined.end = first.end;
|
||||
database.deleteInterval (first);
|
||||
database.deleteInterval (second);
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ int CmdLengthen (
|
|||
if (tracked[tracked.size () - id].synthetic && dirty)
|
||||
{
|
||||
auto latest = getLatestInterval (database);
|
||||
auto exclusions = getAllExclusions (rules, filter.range);
|
||||
auto exclusions = getAllExclusions (rules, filter);
|
||||
|
||||
Interval modified {latest};
|
||||
|
||||
|
@ -90,13 +90,13 @@ int CmdLengthen (
|
|||
throw format ("ID '@{1}' does not correspond to any tracking.", id);
|
||||
|
||||
Interval i = tracked[tracked.size () - id];
|
||||
if (i.range.is_open ())
|
||||
if (i.is_open ())
|
||||
throw format ("Cannot lengthen open interval @{1}", id);
|
||||
|
||||
database.deleteInterval (tracked[tracked.size () - id]);
|
||||
|
||||
Duration dur (delta);
|
||||
i.range.end += dur.toTime_t ();
|
||||
i.end += dur.toTime_t ();
|
||||
validate (cli, rules, database, i);
|
||||
database.addInterval (i, rules.getBoolean ("verbose"));
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ int CmdMove (
|
|||
if (tracked[tracked.size() - id].synthetic)
|
||||
{
|
||||
auto latest = getLatestInterval(database);
|
||||
auto exclusions = getAllExclusions (rules, filter.range);
|
||||
auto exclusions = getAllExclusions (rules, filter);
|
||||
|
||||
Interval modified {latest};
|
||||
|
||||
|
@ -89,19 +89,19 @@ int CmdMove (
|
|||
|
||||
// Changing the start date should also change the end date by the same
|
||||
// amount.
|
||||
if (i.range.start < start)
|
||||
if (i.start < start)
|
||||
{
|
||||
auto delta = start - i.range.start;
|
||||
i.range.start = start;
|
||||
if (! i.range.is_open ())
|
||||
i.range.end += delta;
|
||||
auto delta = start - i.start;
|
||||
i.start = start;
|
||||
if (! i.is_open ())
|
||||
i.end += delta;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto delta = i.range.start - start;
|
||||
i.range.start = start;
|
||||
if (! i.range.is_open ())
|
||||
i.range.end -= delta;
|
||||
auto delta = i.start - start;
|
||||
i.start = start;
|
||||
if (! i.is_open ())
|
||||
i.end -= delta;
|
||||
}
|
||||
|
||||
database.deleteInterval (tracked[tracked.size () - id]);
|
||||
|
@ -112,7 +112,7 @@ int CmdMove (
|
|||
database.endTransaction ();
|
||||
|
||||
if (rules.getBoolean ("verbose"))
|
||||
std::cout << "Moved @" << id << " to " << i.range.start.toISOLocalExtended () << '\n';
|
||||
std::cout << "Moved @" << id << " to " << i.start.toISOLocalExtended () << '\n';
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -82,8 +82,8 @@ int CmdReport (
|
|||
auto filter = getFilter (cli);
|
||||
auto tracked = getTracked (database, rules, filter);
|
||||
|
||||
rules.set ("temp.report.start", filter.range.start.toEpoch () > 0 ? filter.range.start.toISO () : "");
|
||||
rules.set ("temp.report.end", filter.range.end.toEpoch () > 0 ? filter.range.end.toISO () : "");
|
||||
rules.set ("temp.report.start", filter.start.toEpoch () > 0 ? filter.start.toISO () : "");
|
||||
rules.set ("temp.report.end", filter.end.toEpoch () > 0 ? filter.end.toISO () : "");
|
||||
rules.set ("temp.report.tags", joinQuotedIfNeeded (",", filter.tags ()));
|
||||
rules.set ("temp.version", VERSION);
|
||||
|
||||
|
|
|
@ -65,13 +65,13 @@ int CmdResize (
|
|||
throw format ("ID '@{1}' does not correspond to any tracking.", id);
|
||||
|
||||
Interval i = tracked[tracked.size () - id];
|
||||
if (i.range.is_open ())
|
||||
if (i.is_open ())
|
||||
throw format ("Cannot resize open interval @{1}", id);
|
||||
|
||||
Duration dur (delta);
|
||||
database.deleteInterval (tracked[tracked.size () - id]);
|
||||
|
||||
i.range.end = i.range.start + dur.toTime_t ();
|
||||
i.end = i.start + dur.toTime_t ();
|
||||
validate (cli, rules, database, i);
|
||||
database.addInterval (i, rules.getBoolean ("verbose"));
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ int CmdShorten (
|
|||
if (tracked[tracked.size() - id].synthetic && dirty)
|
||||
{
|
||||
auto latest = getLatestInterval(database);
|
||||
auto exclusions = getAllExclusions (rules, filter.range);
|
||||
auto exclusions = getAllExclusions (rules, filter);
|
||||
|
||||
Interval modified {latest};
|
||||
|
||||
|
@ -88,16 +88,16 @@ int CmdShorten (
|
|||
throw format ("ID '@{1}' does not correspond to any tracking.", id);
|
||||
|
||||
Interval i = tracked[tracked.size () - id];
|
||||
if (i.range.is_open ())
|
||||
if (i.is_open ())
|
||||
throw format ("Cannot shorten open interval @{1}", id);
|
||||
|
||||
Duration dur (delta);
|
||||
if (dur > (i.range.end - i.range.start))
|
||||
throw format ("Cannot shorten interval @{1} by {2} because it is only {3} in length.", id, dur.formatHours (), Duration (i.range.end - i.range.start).formatHours ());
|
||||
if (dur > (i.end - i.start))
|
||||
throw format ("Cannot shorten interval @{1} by {2} because it is only {3} in length.", id, dur.formatHours (), Duration (i.end - i.start).formatHours ());
|
||||
|
||||
database.deleteInterval (tracked[tracked.size () - id]);
|
||||
|
||||
i.range.end -= dur.toTime_t ();
|
||||
i.end -= dur.toTime_t ();
|
||||
validate (cli, rules, database, i);
|
||||
database.addInterval (i, rules.getBoolean ("verbose"));
|
||||
|
||||
|
|
|
@ -59,19 +59,19 @@ int CmdSplit (
|
|||
Interval first = tracked[tracked.size () - id];
|
||||
Interval second = first;
|
||||
|
||||
if (first.range.is_open ())
|
||||
if (first.is_open ())
|
||||
{
|
||||
Datetime midpoint;
|
||||
midpoint -= (midpoint - first.range.start) / 2;
|
||||
first.range.end = midpoint;
|
||||
second.range.start = midpoint;
|
||||
midpoint -= (midpoint - first.start) / 2;
|
||||
first.end = midpoint;
|
||||
second.start = midpoint;
|
||||
}
|
||||
else
|
||||
{
|
||||
Datetime midpoint = first.range.start;
|
||||
midpoint += (first.range.end - first.range.start) / 2;
|
||||
first.range.end = midpoint;
|
||||
second.range.start = midpoint;
|
||||
Datetime midpoint = first.start;
|
||||
midpoint += (first.end - first.start) / 2;
|
||||
first.end = midpoint;
|
||||
second.start = midpoint;
|
||||
}
|
||||
|
||||
database.deleteInterval (tracked[tracked.size () - id]);
|
||||
|
|
|
@ -41,7 +41,7 @@ int CmdStart (
|
|||
database.startTransaction ();
|
||||
|
||||
// If the latest interval is open, close it.
|
||||
if (latest.range.is_open ())
|
||||
if (latest.is_open ())
|
||||
{
|
||||
// If the new interval tags match those of the currently open interval, then
|
||||
// do nothing - the tags are already being tracked.
|
||||
|
@ -55,16 +55,16 @@ int CmdStart (
|
|||
|
||||
// Stop it, at the given start time, if applicable.
|
||||
Interval modified {latest};
|
||||
if (filter.range.start.toEpoch () != 0)
|
||||
modified.range.end = filter.range.start;
|
||||
if (filter.start.toEpoch () != 0)
|
||||
modified.end = filter.start;
|
||||
else
|
||||
modified.range.end = Datetime ();
|
||||
modified.end = Datetime ();
|
||||
|
||||
// Update database.
|
||||
database.deleteInterval (latest);
|
||||
validate (cli, rules, database, modified);
|
||||
|
||||
for (auto& interval : flatten (modified, getAllExclusions (rules, modified.range)))
|
||||
for (auto& interval : flatten (modified, getAllExclusions (rules, modified)))
|
||||
{
|
||||
database.addInterval (interval, rules.getBoolean ("verbose"));
|
||||
|
||||
|
@ -75,10 +75,10 @@ int CmdStart (
|
|||
|
||||
// Now add the new open interval.
|
||||
Interval now;
|
||||
if (filter.range.start.toEpoch () != 0)
|
||||
now.range.start = filter.range.start;
|
||||
if (filter.start.toEpoch () != 0)
|
||||
now.start = filter.start;
|
||||
else
|
||||
now.range.start = Datetime ();
|
||||
now.start = Datetime ();
|
||||
|
||||
for (auto& tag : filter.tags ())
|
||||
now.tag (tag);
|
||||
|
|
|
@ -51,32 +51,32 @@ int CmdStop (
|
|||
auto latest = getLatestInterval (database);
|
||||
|
||||
// Verify the interval is open.
|
||||
if (! latest.range.is_open ())
|
||||
if (! latest.is_open ())
|
||||
throw std::string ("There is no active time tracking.");
|
||||
|
||||
database.startTransaction ();
|
||||
|
||||
Interval modified {latest};
|
||||
|
||||
// If a stop date is specified (and occupies filter.range.start) then use
|
||||
// If a stop date is specified (and occupies filter.start) then use
|
||||
// that instead of the current time.
|
||||
if (filter.range.start.toEpoch () != 0)
|
||||
if (filter.start.toEpoch () != 0)
|
||||
{
|
||||
if (modified.range.start >= filter.range.start)
|
||||
if (modified.start >= filter.start)
|
||||
throw std::string ("The end of a date range must be after the start.");
|
||||
|
||||
modified.range.end = filter.range.start;
|
||||
modified.end = filter.start;
|
||||
}
|
||||
else
|
||||
{
|
||||
modified.range.end = Datetime ();
|
||||
modified.end = Datetime ();
|
||||
}
|
||||
|
||||
// Close the interval.
|
||||
database.deleteInterval (latest);
|
||||
validate (cli, rules, database, modified);
|
||||
|
||||
for (auto& interval : flatten (modified, getAllExclusions (rules, modified.range)))
|
||||
for (auto& interval : flatten (modified, getAllExclusions (rules, modified)))
|
||||
{
|
||||
database.addInterval (interval, rules.getBoolean ("verbose"));
|
||||
|
||||
|
@ -100,8 +100,8 @@ int CmdStop (
|
|||
if (! filter.tags ().empty () &&
|
||||
modified.tags ().size () != latest.tags ().size ())
|
||||
{
|
||||
modified.range.start = modified.range.end;
|
||||
modified.range.end = {0};
|
||||
modified.start = modified.end;
|
||||
modified.end = {0};
|
||||
validate (cli, rules, database, modified);
|
||||
database.addInterval (modified, rules.getBoolean ("verbose"));
|
||||
if (rules.getBoolean ("verbose"))
|
||||
|
|
|
@ -43,11 +43,11 @@ int CmdSummary (
|
|||
{
|
||||
// Create a filter, and if empty, choose 'today'.
|
||||
auto filter = getFilter (cli);
|
||||
if (! filter.range.is_started ())
|
||||
filter.range = Range (Datetime ("today"), Datetime ("tomorrow"));
|
||||
if (! filter.is_started ())
|
||||
filter.setRange (Range (Datetime ("today"), Datetime ("tomorrow")));
|
||||
|
||||
if (! filter.range.is_ended())
|
||||
filter.range.end = filter.range.start + Duration("1d").toTime_t();
|
||||
if (! filter.is_ended())
|
||||
filter.end = filter.start + Duration("1d").toTime_t();
|
||||
|
||||
// Load the data.
|
||||
auto tracked = getTracked (database, rules, filter);
|
||||
|
@ -58,11 +58,11 @@ int CmdSummary (
|
|||
{
|
||||
std::cout << "No filtered data found";
|
||||
|
||||
if (filter.range.is_started ())
|
||||
if (filter.is_started ())
|
||||
{
|
||||
std::cout << " in the range " << filter.range.start.toISOLocalExtended ();
|
||||
if (filter.range.is_ended ())
|
||||
std::cout << " - " << filter.range.end.toISOLocalExtended ();
|
||||
std::cout << " in the range " << filter.start.toISOLocalExtended ();
|
||||
if (filter.is_ended ())
|
||||
std::cout << " - " << filter.end.toISOLocalExtended ();
|
||||
}
|
||||
|
||||
if (! filter.tags ().empty ())
|
||||
|
@ -102,7 +102,7 @@ int CmdSummary (
|
|||
// Each day is rendered separately.
|
||||
time_t grand_total = 0;
|
||||
Datetime previous;
|
||||
for (Datetime day = filter.range.start; day < filter.range.end; day++)
|
||||
for (Datetime day = filter.start; day < filter.end; day++)
|
||||
{
|
||||
auto day_range = getFullDay (day);
|
||||
time_t daily_total = 0;
|
||||
|
@ -111,7 +111,7 @@ int CmdSummary (
|
|||
for (auto& track : subset (day_range, tracked))
|
||||
{
|
||||
// Make sure the track only represents one day.
|
||||
if ((track.range.is_open () && day > Datetime ()))
|
||||
if ((track.is_open () && day > Datetime ()))
|
||||
continue;
|
||||
|
||||
row = table.addRow ();
|
||||
|
@ -125,8 +125,8 @@ int CmdSummary (
|
|||
}
|
||||
|
||||
// Intersect track with day.
|
||||
auto today = day_range.intersect (track.range);
|
||||
if (track.range.is_open () && day <= Datetime () && today.end > Datetime ())
|
||||
auto today = day_range.intersect (track);
|
||||
if (track.is_open () && day <= Datetime () && today.end > Datetime ())
|
||||
today.end = Datetime ();
|
||||
|
||||
std::string tags = join(", ", track.tags());
|
||||
|
@ -136,7 +136,7 @@ int CmdSummary (
|
|||
|
||||
table.set (row, (ids ? 4 : 3), tags);
|
||||
table.set (row, (ids ? 5 : 4), today.start.toString ("h:N:S"));
|
||||
table.set (row, (ids ? 6 : 5), (track.range.is_open () ? "-" : today.end.toString ("h:N:S")));
|
||||
table.set (row, (ids ? 6 : 5), (track.is_open () ? "-" : today.end.toString ("h:N:S")));
|
||||
table.set (row, (ids ? 7 : 6), Duration (today.total ()).formatHours ());
|
||||
|
||||
daily_total += today.total ();
|
||||
|
|
|
@ -63,7 +63,7 @@ int CmdTag (
|
|||
if (tracked[tracked.size() - id].synthetic && dirty)
|
||||
{
|
||||
auto latest = getLatestInterval(database);
|
||||
auto exclusions = getAllExclusions (rules, filter.range);
|
||||
auto exclusions = getAllExclusions (rules, filter);
|
||||
|
||||
Interval modified {latest};
|
||||
|
||||
|
@ -83,7 +83,7 @@ int CmdTag (
|
|||
throw std::string ("There is no active time tracking.");
|
||||
}
|
||||
|
||||
if (!tracked.back ().range.is_open ())
|
||||
if (!tracked.back ().is_open ())
|
||||
{
|
||||
throw std::string ("At least one ID must be specified. See 'timew help tag'.");
|
||||
}
|
||||
|
|
|
@ -38,8 +38,8 @@ int CmdTrack (
|
|||
|
||||
// If this is not a proper closed interval, then the user is trying to make
|
||||
// the 'track' command behave like 'start', so delegate to CmdStart.
|
||||
if (! filter.range.is_started () ||
|
||||
! filter.range.is_ended ())
|
||||
if (! filter.is_started () ||
|
||||
! filter.is_ended ())
|
||||
return CmdStart (cli, rules, database);
|
||||
|
||||
database.startTransaction ();
|
||||
|
@ -47,7 +47,7 @@ int CmdTrack (
|
|||
// Validation must occur before flattening.
|
||||
validate (cli, rules, database, filter);
|
||||
|
||||
for (auto& interval : flatten (filter, getAllExclusions (rules, filter.range)))
|
||||
for (auto& interval : flatten (filter, getAllExclusions (rules, filter)))
|
||||
{
|
||||
database.addInterval (interval, rules.getBoolean ("verbose"));
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ int CmdUntag (
|
|||
if (tracked[tracked.size() - id].synthetic && dirty)
|
||||
{
|
||||
auto latest = getLatestInterval(database);
|
||||
auto exclusions = getAllExclusions (rules, filter.range);
|
||||
auto exclusions = getAllExclusions (rules, filter);
|
||||
|
||||
Interval modified {latest};
|
||||
|
||||
|
@ -83,7 +83,7 @@ int CmdUntag (
|
|||
throw std::string ("There is no active time tracking.");
|
||||
}
|
||||
|
||||
if (!tracked.back ().range.is_open ())
|
||||
if (!tracked.back ().is_open ())
|
||||
{
|
||||
throw std::string ("At least one ID must be specified. See 'timew help tag'.");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue