mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2025-08-05 15:29:59 +00:00

* fix: scroll event will be intercepted by tooltips * fix: improve the logic to filter emojis or icons by keyword * feat: add the recent icons and emojis to the selector * refactor: optimize the code Co-authored-by: Mathias Mogensen <42929161+Xazin@users.noreply.github.com> Co-authored-by: LucasXu0 <lucas.xu@appflowy.io> * fix: ensure the focus of emoji_search_bar not be lost within a second --------- Co-authored-by: Mathias Mogensen <42929161+Xazin@users.noreply.github.com> Co-authored-by: LucasXu0 <lucas.xu@appflowy.io>
87 lines
1.9 KiB
Dart
87 lines
1.9 KiB
Dart
import 'package:json_annotation/json_annotation.dart';
|
|
|
|
part 'icon.g.dart';
|
|
|
|
@JsonSerializable()
|
|
class IconGroup {
|
|
factory IconGroup.fromJson(Map<String, dynamic> json) {
|
|
final group = _$IconGroupFromJson(json);
|
|
// Set the iconGroup reference for each icon
|
|
for (final icon in group.icons) {
|
|
icon.iconGroup = group;
|
|
}
|
|
return group;
|
|
}
|
|
|
|
factory IconGroup.fromMapEntry(MapEntry<String, dynamic> entry) =>
|
|
IconGroup.fromJson({
|
|
'name': entry.key,
|
|
'icons': entry.value,
|
|
});
|
|
|
|
IconGroup({
|
|
required this.name,
|
|
required this.icons,
|
|
}) {
|
|
// Set the iconGroup reference for each icon
|
|
for (final icon in icons) {
|
|
icon.iconGroup = this;
|
|
}
|
|
}
|
|
|
|
final String name;
|
|
final List<Icon> icons;
|
|
|
|
String get displayName => name.replaceAll('_', ' ');
|
|
|
|
IconGroup filter(String keyword) {
|
|
final lowercaseKey = keyword.toLowerCase();
|
|
final filteredIcons = icons
|
|
.where(
|
|
(icon) =>
|
|
icon.keywords.any((k) => k.contains(lowercaseKey)) ||
|
|
icon.name.contains(lowercaseKey),
|
|
)
|
|
.toList();
|
|
return IconGroup(name: name, icons: filteredIcons);
|
|
}
|
|
|
|
String? getSvgContent(String iconName) {
|
|
final icon = icons.firstWhere(
|
|
(icon) => icon.name == iconName,
|
|
);
|
|
return icon.content;
|
|
}
|
|
|
|
Map<String, dynamic> toJson() => _$IconGroupToJson(this);
|
|
}
|
|
|
|
@JsonSerializable()
|
|
class Icon {
|
|
factory Icon.fromJson(Map<String, dynamic> json) => _$IconFromJson(json);
|
|
|
|
Icon({
|
|
required this.name,
|
|
required this.keywords,
|
|
required this.content,
|
|
});
|
|
|
|
final String name;
|
|
final List<String> keywords;
|
|
final String content;
|
|
|
|
// Add reference to parent IconGroup
|
|
IconGroup? iconGroup;
|
|
|
|
String get displayName => name.replaceAll('-', ' ');
|
|
|
|
Map<String, dynamic> toJson() => _$IconToJson(this);
|
|
|
|
String get iconPath {
|
|
if (iconGroup == null) {
|
|
return '';
|
|
}
|
|
return '${iconGroup!.name}/$name';
|
|
}
|
|
}
|