Files
GitJournal/lib/widgets/note_search_delegate.dart
Vishesh Handa 7fd1c99287 Use Provider's context.read/watch
Instead of the legacy Provider.of. Less scope of bugs this way and the
code is so much nicer to read.
2023-12-06 08:20:40 +01:00

102 lines
2.6 KiB
Dart

/*
* SPDX-FileCopyrightText: 2019-2021 Vishesh Handa <me@vhanda.in>
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import 'package:flutter/material.dart';
import 'package:gitjournal/core/folder/notes_folder.dart';
import 'package:gitjournal/core/folder/virtual_notes_folder.dart';
import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/folder_views/common.dart';
import 'package:gitjournal/folder_views/standard_view.dart';
import 'package:gitjournal/l10n.dart';
import 'package:provider/provider.dart';
class NoteSearchDelegate extends SearchDelegate<Note?> {
final List<Note> notes;
final FolderViewType viewType;
NoteSearchDelegate(this.notes, this.viewType);
@override
List<Widget> buildActions(BuildContext context) {
return [
IconButton(
icon: const Icon(Icons.close),
onPressed: () {
if (query.isEmpty) {
close(context, null);
} else {
query = '';
}
},
),
];
}
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () {
close(context, null);
},
);
}
@override
Widget buildResults(BuildContext context) {
return buildView(context, query);
}
@override
Widget buildSuggestions(BuildContext context) {
return buildView(context, query);
}
Widget buildView(BuildContext context, String query) {
var fv = _buildFolderView(context, query);
return CustomScrollView(
slivers: [fv],
);
}
Widget _buildFolderView(BuildContext context, String query) {
// TODO: This should be made far more efficient
var q = query.toLowerCase();
var filteredNotes = notes.where((note) {
var title = note.title?.toLowerCase() ?? "";
if (title.contains(q)) {
return true;
}
if (note.fileName.toLowerCase().contains(q)) {
return true;
}
return note.body.toLowerCase().contains(q);
}).toList();
var folderConfig = context.watch<NotesFolderConfig>();
var folder = VirtualNotesFolder(filteredNotes, folderConfig);
var emptyText = context.loc.widgetsFolderViewSearchFailed;
return buildFolderView(
viewType: viewType,
folder: folder,
emptyText: emptyText,
header: StandardViewHeader.TitleOrFileName,
showSummary: true,
noteTapped: (Note note) => openNoteEditor(
context,
note,
folder,
highlightString: q,
),
noteLongPressed: (Note note) {},
isNoteSelected: (n) => false,
searchTerm: query,
);
}
}