Extract rules from determineHourRange

This commit is contained in:
Thomas Lauf 2018-12-28 21:20:08 +01:00
parent f7b342cd50
commit 4c095c60c6

View file

@ -36,7 +36,7 @@
#include <cassert> #include <cassert>
int renderChart (const CLI&, const std::string&, Interval&, Rules&, Database&); int renderChart (const CLI&, const std::string&, Interval&, Rules&, Database&);
static std::pair<int, int> determineHourRange (const std::string&, const Rules&, const Interval&, const std::vector <Interval>&); static std::pair <int, int> determineHourRange (const Interval&, const std::vector <Interval>&);
static void renderAxis (const std::string&, int, int, bool, const Color&, const Color&, int); static void renderAxis (const std::string&, int, int, bool, const Color&, const Color&, int);
static std::string renderMonth (const Datetime&, const Datetime&); static std::string renderMonth (const Datetime&, const Datetime&);
static std::string renderWeek (const Datetime&, const Datetime&); static std::string renderWeek (const Datetime&, const Datetime&);
@ -128,12 +128,18 @@ int renderChart (
Color colorToday (with_colors ? rules.get ("theme.colors.today") : ""); Color colorToday (with_colors ? rules.get ("theme.colors.today") : "");
Color colorHoliday (with_colors ? rules.get ("theme.colors.holiday") : ""); Color colorHoliday (with_colors ? rules.get ("theme.colors.holiday") : "");
const auto not_full_day = rules.get ("reports." + type + ".hours") == "auto";
// Determine hours shown. // Determine hours shown.
auto hour_range = determineHourRange (type, rules, filter, tracked); auto hour_range = not_full_day
? determineHourRange (filter, tracked)
: std::make_pair (0, 23);
int first_hour = hour_range.first; int first_hour = hour_range.first;
int last_hour = hour_range.second; int last_hour = hour_range.second;
debug (format ("Day range is from {1}:00 - {2}:00", first_hour, last_hour));
const auto indent_size = getIndentSize (type, rules); const auto indent_size = getIndentSize (type, rules);
auto indent = std::string (indent_size, ' '); auto indent = std::string (indent_size, ' ');
@ -259,8 +265,6 @@ unsigned long getIndentSize (const std::string &type, const Rules &rules)
// Scan all tracked intervals, looking for the earliest and latest hour into // Scan all tracked intervals, looking for the earliest and latest hour into
// which an interval extends. // which an interval extends.
static std::pair <int, int> determineHourRange ( static std::pair <int, int> determineHourRange (
const std::string& type,
const Rules& rules,
const Interval& filter, const Interval& filter,
const std::vector <Interval>& tracked) const std::vector <Interval>& tracked)
{ {
@ -268,52 +272,53 @@ static std::pair <int, int> determineHourRange (
auto first_hour = 0; auto first_hour = 0;
auto last_hour = 23; auto last_hour = 23;
if (rules.get ("reports." + type + ".hours") == "auto") // If there is no data,
// show the whole day.
if (! tracked.empty ())
{ {
// If there is no data, show the whole day. // Get the extreme time range for the filtered data.
if (! tracked.empty ()) first_hour = 23;
last_hour = 0;
for (Datetime day = filter.start; day < filter.end; day++)
{ {
// Get the extreme time range for the filtered data. auto day_range = getFullDay (day);
first_hour = 23;
last_hour = 0; for (auto& track : tracked)
for (Datetime day = filter.start; day < filter.end; day++)
{ {
auto day_range = getFullDay (day); if (day_range.overlaps (track))
for (auto& track : tracked)
{ {
if (day_range.overlaps (track)) Interval clipped = clip (track, day_range);
if (track.is_open ())
{ {
Interval clipped = clip (track, day_range); clipped.end = Datetime ();
if (track.is_open ()) }
clipped.end = Datetime ();
if (clipped.start.hour () < first_hour) if (clipped.start.hour () < first_hour)
first_hour = clipped.start.hour (); {
first_hour = clipped.start.hour ();
}
if (! clipped.is_open () && if (! clipped.is_open () && clipped.end.hour () > last_hour)
clipped.end.hour () > last_hour) {
last_hour = clipped.end.hour (); last_hour = clipped.end.hour ();
} }
} }
} }
}
if (first_hour == 23 && if (first_hour == 23 && last_hour == 0)
last_hour == 0) {
{ first_hour = Datetime ().hour ();
first_hour = Datetime ().hour (); last_hour = std::min (first_hour + 1, 23);
last_hour = std::min (first_hour + 1, 23); }
} else
else {
{ first_hour = std::max (first_hour - 1, 0);
first_hour = std::max (first_hour - 1, 0); last_hour = std::min (last_hour + 1, 23);
last_hour = std::min (last_hour + 1, 23);
}
} }
} }
debug (format ("Day range is from {1}:00 - {2}:00", first_hour, last_hour));
return std::make_pair (first_hour, last_hour); return std::make_pair (first_hour, last_hour);
} }