relatica/lib/utils/entry_tree_item_flattening.dart

54 lines
1.3 KiB
Dart
Raw Normal View History

import '../models/entry_tree_item.dart';
import '../models/flattened_tree_item.dart';
extension FlatteningExtensions on EntryTreeItem {
2024-07-26 14:15:24 +00:00
static const baseLevel = 0;
List<FlattenedTreeItem> flatten(
2024-07-26 14:15:24 +00:00
{int level = baseLevel, bool topLevelOnly = false}) {
final items = <FlattenedTreeItem>[];
final myEntry = FlattenedTreeItem(
timelineEntry: entry,
isMine: isMine,
level: level,
);
items.add(myEntry);
if (topLevelOnly) {
return items;
}
final sortedChildren = [...children];
sortedChildren.sort((c1, c2) =>
c1.entry.creationTimestamp.compareTo(c2.entry.creationTimestamp));
for (final child in sortedChildren) {
int childLevel = level + 1;
2024-07-26 14:15:24 +00:00
if (child.entry.authorId == entry.authorId && level != baseLevel) {
childLevel = level;
}
final childItems = child.flatten(level: childLevel);
childItems.sort((c1, c2) {
if (c2.level == c1.level) {
return c1.timelineEntry.creationTimestamp
.compareTo(c2.timelineEntry.creationTimestamp);
}
if (c1.level == childLevel) {
return -1;
}
if (c2.level == childLevel) {
return 1;
}
return 0;
});
items.addAll(childItems);
}
return items;
}
}