Skip to content

Commit

Permalink
Add global search helper
Browse files Browse the repository at this point in the history
  • Loading branch information
CodeDoctorDE committed Jun 21, 2023
1 parent aeb9592 commit f65343d
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
31 changes: 24 additions & 7 deletions api/lib/src/helpers/search_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,17 @@ import '../../butterfly_api.dart';
class SearchResult<T> {
final String name;
final Point<double> location;
final String? page;
final T item;

SearchResult(this.name, this.location, this.item);
SearchResult(this.name, this.location, this.item, [this.page]);

SearchResult withPage(String page) => SearchResult(
name,
location,
item,
page,
);
}

extension ElementSearchHelper on PadElement {
Expand Down Expand Up @@ -47,21 +55,30 @@ extension WaypointSearchHelper on Waypoint {
}
}

extension GlobalSearchHelper on NoteData {
Iterable<SearchResult> search(Pattern query) sync* {
for (final pageName in getPages()) {
final page = getPage(pageName);
if (page == null) continue;
yield SearchResult(pageName, Point(0, 0), page, pageName);
yield* page.search(query).map((e) => e.withPage(pageName));
}
}
}

extension SearchHelper on DocumentPage {
List<SearchResult> search(Pattern query) {
final results = <SearchResult>[];
Iterable<SearchResult> search(Pattern query) sync* {
for (final area in areas) {
final result = area.matches(query);
if (result != null) results.add(result);
if (result != null) yield result;
}
for (final waypoint in waypoints) {
final result = waypoint.matches(query);
if (result != null) results.add(result);
if (result != null) yield result;
}
for (final element in content) {
final result = element.matches(query);
if (result != null) results.add(result);
if (result != null) yield result;
}
return results;
}
}
9 changes: 5 additions & 4 deletions app/lib/dialogs/search.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@ class SearchDialog extends StatefulWidget {
State<SearchDialog> createState() => _SearchDialogState();
}

Future<List<SearchResult>> _searchIsolate(DocumentPage page, String query) =>
Future<Iterable<SearchResult>> _searchIsolate(
DocumentPage page, String query) =>
Isolate.run(() => page.search(RegExp(query, caseSensitive: false)));

class _SearchDialogState extends State<SearchDialog> {
final TextEditingController _searchController = TextEditingController();
Future<List<SearchResult>> _searchResults = Future.value([]);
Future<Iterable<SearchResult>> _searchResults = Future.value([]);
final FocusNode _focusNode = FocusNode();

@override
Expand Down Expand Up @@ -114,7 +115,7 @@ class _SearchDialogState extends State<SearchDialog> {
),
const SizedBox(height: 16),
Flexible(
child: FutureBuilder<List<SearchResult>>(
child: FutureBuilder<Iterable<SearchResult>>(
future: _searchResults,
builder: (context, snapshot) {
if (snapshot.hasError) {
Expand All @@ -129,7 +130,7 @@ class _SearchDialogState extends State<SearchDialog> {
],
);
}
final results = snapshot.data ?? [];
final results = snapshot.data?.toList() ?? [];
return ListView.builder(
itemCount: results.length,
shrinkWrap: true,
Expand Down

0 comments on commit f65343d

Please sign in to comment.