feat: filter the toolbar item should not be displayed

This commit is contained in:
Lucas.Xu 2022-08-23 09:59:14 +08:00
parent 70ea80878a
commit 44b4ef4ad7

View File

@ -39,27 +39,13 @@ class _FlowyToolbarState extends State<FlowyToolbar>
void showInOffset(Offset offset, LayerLink layerLink) {
hide();
final items = defaultToolbarItems
.where((item) => item.validator(widget.editorState))
.toList(growable: false)
..sort((a, b) => a.type.compareTo(b.type));
if (items.isEmpty) {
return;
}
final List<ToolbarItem> dividedItems = [items.first];
for (var i = 1; i < items.length; i++) {
if (items[i].type != items[i - 1].type) {
dividedItems.add(ToolbarItem.divider());
}
dividedItems.add(items[i]);
}
_toolbarOverlay = OverlayEntry(
builder: (context) => ToolbarWidget(
key: _toolbarWidgetKey,
editorState: widget.editorState,
layerLink: layerLink,
offset: offset.translate(0, -37.0),
items: dividedItems,
items: _filterItems(defaultToolbarItems),
),
);
Overlay.of(context)?.insert(_toolbarOverlay!);
@ -96,4 +82,24 @@ class _FlowyToolbarState extends State<FlowyToolbar>
super.dispose();
}
// Filter items that should not be displayed, sort according to type,
// and insert dividers between different types.
List<ToolbarItem> _filterItems(List<ToolbarItem> items) {
final filterItems = items
.where((item) => item.validator(widget.editorState))
.toList(growable: false)
..sort((a, b) => a.type.compareTo(b.type));
if (items.isEmpty) {
return [];
}
final List<ToolbarItem> dividedItems = [filterItems.first];
for (var i = 1; i < filterItems.length; i++) {
if (filterItems[i].type != filterItems[i - 1].type) {
dividedItems.add(ToolbarItem.divider());
}
dividedItems.add(filterItems[i]);
}
return dividedItems;
}
}