function _calc_indents in Calendar 8
Same name and namespace in other branches
- 6.2 calendar_multiday/theme/theme.inc \_calc_indents()
- 7.3 theme/theme.inc \_calc_indents()
- 7 calendar_multiday/theme/theme.inc \_calc_indents()
- 7.2 calendar_multiday/theme/theme.inc \_calc_indents()
Indent items based off a nested tree structure of overlapping items.
Parameters
array $overlapped_items: Tree of overlapped items.
date $start: Start time of the event.
date $end: End tiem of the event.
array $item: The event to add to the tree.
int $depth: Current depth of the tree.
Return value
rc Returns an array with the max depth of the branch and whether an overlap occurred.
2 calls to _calc_indents()
- template_preprocess_calendar_day in ./
calendar.theme.inc - Display a day view.
- template_preprocess_calendar_week in ./
calendar.theme.inc - Display a week view.
File
- ./
calendar.theme.inc, line 801 - Theme functions for the Calendar module.
Code
function _calc_indents(array &$overlapped_items, $start, $end, &$item, $depth = 0) {
// Are there any items at this depth?
if (!empty($overlapped_items)) {
// Iterate for each item as this depth and see if we overlap.
foreach ($overlapped_items as $index => &$entry) {
// We search depth-first, so if there are children for this item, recurse into
// each child tree looking for an overlap.
if (!empty($entry['children'])) {
$rc = _calc_indents($entry['children'], $start, $end, $item, $depth + 1);
// Was there an overlap in the child tree?
if ($rc['overlap']) {
if (is_object($entry['item'])) {
$entry['item']->indent = _calc_indent($entry['depth'], $rc['max_depth']);
$entry['item']->max_depth = $rc['max_depth'];
}
else {
$entry['item']['indent'] = _calc_indent($entry['depth'], $rc['max_depth']);
$entry['item']['max_depth'] = $rc['max_depth'];
}
// There was an overlap, pop out of this depth.
return $rc;
}
}
// No, child overlap, so check if we overlap this item.
if ($start >= $entry['start'] && $start < $entry['end']) {
// We overlap, create an overlapping entry.
$entry['children'][] = [
'item' => &$item,
'depth' => $depth + 1,
'start' => $start,
'end' => $end,
'children' => [],
];
if (is_object($entry['item'])) {
$max_depth = max($entry['item']->max_depth, $depth + 1);
$entry['item']->indent = _calc_indent($depth, $max_depth);
$entry['item']->max_depth = $max_depth;
}
else {
$max_depth = max($entry['item']['max_depth'], $depth + 1);
$entry['item']['indent'] = _calc_indent($depth, $max_depth);
$entry['item']['max_depth'] = $max_depth;
}
if (is_object($item)) {
$item->indent = _calc_indent($depth + 1, $max_depth);
$item->max_depth = $max_depth;
}
else {
$item['indent'] = _calc_indent($depth + 1, $max_depth);
$item['max_depth'] = $max_depth;
}
// We overlap, so pop out of this depth.
return [
'overlap' => TRUE,
'max_depth' => $max_depth,
];
}
}
// If there are items at this depth, but no overlap, then return no overlap and pop
// out of this depth.
if ($depth > 0) {
return [
'overlap' => FALSE,
'max_depth' => 0,
];
}
}
// No overlap at any depth, reset the array of overlaps.
if ($depth == 0) {
reset($overlapped_items);
$overlapped_items[0] = [
'item' => &$item,
'depth' => $depth,
'start' => $start,
'end' => $end,
'children' => [],
];
}
else {
$overlapped_items[] = [
'item' => &$item,
'depth' => $depth,
'start' => $start,
'end' => $end,
'children' => [],
];
}
if (is_object($item)) {
$item->indent = _calc_indent($depth, $depth);
$item->max_depth = $depth;
}
else {
$item['indent'] = _calc_indent($depth, $depth);
$item['max_depth'] = $depth;
}
return [
'overlap' => FALSE,
'max_depth' => $depth,
];
}