add popover

This commit is contained in:
2026-03-05 17:04:00 +01:00
parent 765aa83fb6
commit acb2878ed6
5 changed files with 561 additions and 68 deletions

View File

@@ -254,6 +254,74 @@ class _MainAppState extends State<MainApp> {
return _groupColors[groupIndex % _groupColors.length];
}
static const _months = [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec',
];
String _formatDate(DateTime d) {
return '${_months[d.month - 1]} ${d.day}, ${d.year}';
}
String _formatDateRange(DateTime start, DateTime? end) {
final s = _formatDate(start);
if (end == null) return s;
final e = _formatDate(end);
return s == e ? s : '$s $e';
}
Widget? _buildPopoverContent(String entryId) {
final item = _state?.items[entryId];
if (item == null) return null;
final start = DateTime.parse(item.start);
final end = item.end != null ? DateTime.parse(item.end!) : null;
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.title,
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 13),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
if (item.description != null && item.description!.isNotEmpty) ...[
const SizedBox(height: 4),
Text(
item.description!,
style: const TextStyle(fontSize: 12),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
const SizedBox(height: 4),
Text(
_formatDateRange(start, end),
style: TextStyle(fontSize: 11, color: Colors.grey[400]),
),
],
);
}
Widget _buildCompactDate(DateTime start, DateTime end) {
return Text(
_formatDateRange(start, end),
style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w500),
);
}
@override
Widget build(BuildContext context) {
final viewport = _viewport;
@@ -269,25 +337,29 @@ class _MainAppState extends State<MainApp> {
? const Center(child: Text('Waiting for state...'))
: ZTimelineScope(
viewport: viewport,
child: Column(
children: [
const ZTimelineBreadcrumb(),
const ZTimelineTieredHeader(),
Expanded(
child: ZTimelineInteractor(
child: ZTimelineView(
groups: _groups,
entries: _entries,
viewport: viewport,
labelBuilder: _labelForEntry,
colorBuilder: _colorForEntry,
enableDrag: true,
onEntryMoved: _onEntryMoved,
onEntryResized: _onEntryResized,
child: EntryPopoverOverlay(
popoverContentBuilder: _buildPopoverContent,
compactDateBuilder: _buildCompactDate,
child: Column(
children: [
const ZTimelineBreadcrumb(),
const ZTimelineTieredHeader(),
Expanded(
child: ZTimelineInteractor(
child: ZTimelineView(
groups: _groups,
entries: _entries,
viewport: viewport,
labelBuilder: _labelForEntry,
colorBuilder: _colorForEntry,
enableDrag: true,
onEntryMoved: _onEntryMoved,
onEntryResized: _onEntryResized,
),
),
),
),
],
],
),
),
),
),