handle drag n drop

This commit is contained in:
2026-03-02 09:09:00 +01:00
parent f3b645ac53
commit 22067c4904
8 changed files with 195 additions and 96 deletions

View File

@@ -83,6 +83,7 @@ class _MainAppState extends State<MainApp> {
start: start,
end: end,
lane: item.lane,
hasEnd: item.end != null,
),
);
}
@@ -118,16 +119,21 @@ class _MainAppState extends State<MainApp> {
String newGroupId,
int newLane,
) {
final duration = entry.end.difference(entry.start);
final newEnd = newStart.add(duration);
emitEvent('entry_moved', {
final payload = <String, Object?>{
'entryId': entry.id,
'newStart': newStart.toIso8601String(),
'newEnd': newEnd.toIso8601String(),
'newGroupId': newGroupId,
'newLane': newLane,
});
};
if (entry.hasEnd) {
final duration = entry.end.difference(entry.start);
payload['newEnd'] = newStart.add(duration).toIso8601String();
} else {
payload['newEnd'] = null;
}
emitEvent('entry_moved', payload);
}
void _emitContentHeight() {

View File

@@ -8,6 +8,7 @@ class TimelineEntry {
required this.start,
required this.end,
required this.lane,
this.hasEnd = true,
}) : assert(!end.isBefore(start), 'Entry end must be on/after start');
final String id;
@@ -15,6 +16,7 @@ class TimelineEntry {
final DateTime start;
final DateTime end;
final int lane; // provided by consumer for stacking
final bool hasEnd; // false for point-events (end is synthetic)
bool overlaps(DateTime a, DateTime b) {
return !(end.isBefore(a) || start.isAfter(b));
@@ -26,6 +28,7 @@ class TimelineEntry {
DateTime? start,
DateTime? end,
int? lane,
bool? hasEnd,
}) {
return TimelineEntry(
id: id ?? this.id,
@@ -33,11 +36,12 @@ class TimelineEntry {
start: start ?? this.start,
end: end ?? this.end,
lane: lane ?? this.lane,
hasEnd: hasEnd ?? this.hasEnd,
);
}
@override
int get hashCode => Object.hash(id, groupId, start, end, lane);
int get hashCode => Object.hash(id, groupId, start, end, lane, hasEnd);
@override
bool operator ==(Object other) {
@@ -46,10 +50,11 @@ class TimelineEntry {
other.groupId == groupId &&
other.start == start &&
other.end == end &&
other.lane == lane;
other.lane == lane &&
other.hasEnd == hasEnd;
}
@override
String toString() =>
'TimelineEntry(id: $id, groupId: $groupId, start: $start, end: $end, lane: $lane)';
'TimelineEntry(id: $id, groupId: $groupId, start: $start, end: $end, lane: $lane, hasEnd: $hasEnd)';
}