madari-oss/lib/features/doc_viewer/container/pdf/outline_view.dart
Madari Developers 16fe4a653f Project import generated by Copybara.
GitOrigin-RevId: 829626e92d5dba6a4586d1e7c4bd1615ec396e88
2025-01-02 18:46:26 +00:00

54 lines
1.4 KiB
Dart

//
// Just a rough implementation of the document index
//
import 'package:flutter/material.dart';
import 'package:pdfrx/pdfrx.dart';
class OutlineView extends StatelessWidget {
const OutlineView({
super.key,
required this.outline,
required this.controller,
});
final List<PdfOutlineNode>? outline;
final PdfViewerController controller;
@override
Widget build(BuildContext context) {
final list = _getOutlineList(outline, 0).toList();
return SizedBox(
width: list.isEmpty ? 0 : 200,
child: ListView.builder(
itemCount: list.length,
itemBuilder: (context, index) {
final item = list[index];
return InkWell(
onTap: () => controller.goToDest(item.node.dest),
child: Container(
margin: EdgeInsets.only(
left: item.level * 16.0 + 8,
top: 8,
bottom: 8,
),
child: Text(
item.node.title,
softWrap: false,
),
),
);
},
),
);
}
/// Recursively create outline indent structure
Iterable<({PdfOutlineNode node, int level})> _getOutlineList(
List<PdfOutlineNode>? outline, int level) sync* {
if (outline == null) return;
for (var node in outline) {
yield (node: node, level: level);
yield* _getOutlineList(node.children, level + 1);
}
}
}