From 35f76ebe4cc0bd875f50225380c058a21a58ed60 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Mon, 7 Sep 2020 17:48:21 +0200 Subject: [PATCH] StandardView/JournalView: Implement search highlighting Fixes #14 --- lib/folder_views/journal_view.dart | 10 +++++++--- lib/folder_views/standard_view.dart | 17 +++++++++++------ lib/widgets/highlighted_text.dart | 14 ++------------ 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/lib/folder_views/journal_view.dart b/lib/folder_views/journal_view.dart index 60e7afbc..e2c07e00 100644 --- a/lib/folder_views/journal_view.dart +++ b/lib/folder_views/journal_view.dart @@ -7,6 +7,7 @@ import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/sorting_mode.dart'; import 'package:gitjournal/folder_views/list_view.dart'; +import 'package:gitjournal/widgets/highlighted_text.dart'; class JournalView extends StatelessWidget { final NoteSelectedFunction noteTapped; @@ -16,6 +17,7 @@ class JournalView extends StatelessWidget { final NotesFolder folder; final String emptyText; final String searchTerm; + final String searchTermLowerCase; static final _dateFormat = DateFormat('dd MMM, yyyy '); static final _timeFormat = DateFormat('Hm'); @@ -27,7 +29,7 @@ class JournalView extends StatelessWidget { @required this.isNoteSelected, @required this.emptyText, @required this.searchTerm, - }); + }) : searchTermLowerCase = searchTerm.toLowerCase(); @override Widget build(BuildContext context) { @@ -70,11 +72,13 @@ class JournalView extends StatelessWidget { var children = [ const SizedBox(height: 8.0), - Text( - note.summary + '\n', // no minLines option + HighlightedText( + text: note.summary + '\n', // no minLines option maxLines: 3, overflow: TextOverflow.ellipsis, style: textTheme.bodyText2, + highlightText: searchTerm, + highlightTextLowerCase: searchTermLowerCase, ), ]; diff --git a/lib/folder_views/standard_view.dart b/lib/folder_views/standard_view.dart index 30126f21..13cd832f 100644 --- a/lib/folder_views/standard_view.dart +++ b/lib/folder_views/standard_view.dart @@ -7,6 +7,7 @@ import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/sorting_mode.dart'; import 'package:gitjournal/folder_views/list_view.dart'; +import 'package:gitjournal/widgets/highlighted_text.dart'; enum StandardViewHeader { TitleOrFileName, @@ -26,6 +27,7 @@ class StandardView extends StatelessWidget { final bool showSummary; final String searchTerm; + final String searchTermLowerCase; static final _dateFormat = DateFormat('dd MMM, yyyy'); @@ -38,9 +40,8 @@ class StandardView extends StatelessWidget { @required this.showSummary, @required this.isNoteSelected, @required this.searchTerm, - }); + }) : searchTermLowerCase = searchTerm.toLowerCase(); - @override @override Widget build(BuildContext context) { return FolderListView( @@ -79,10 +80,12 @@ class StandardView extends StatelessWidget { assert(false, "StandardViewHeader must not be null"); } - Widget titleWidget = Text( - title, + Widget titleWidget = HighlightedText( + text: title, style: textTheme.headline6, overflow: TextOverflow.ellipsis, + highlightText: searchTerm, + highlightTextLowerCase: searchTermLowerCase, ); Widget trailing = Container(); @@ -110,11 +113,13 @@ class StandardView extends StatelessWidget { if (showSummary) { var summary = [ const SizedBox(height: 8.0), - Text( - note.summary + '\n', // no minLines option + HighlightedText( + text: note.summary + '\n', // no minLines option maxLines: 3, overflow: TextOverflow.ellipsis, style: textTheme.bodyText2, + highlightText: searchTerm, + highlightTextLowerCase: searchTermLowerCase, ), ]; diff --git a/lib/widgets/highlighted_text.dart b/lib/widgets/highlighted_text.dart index 8a62f18d..938224e3 100644 --- a/lib/widgets/highlighted_text.dart +++ b/lib/widgets/highlighted_text.dart @@ -21,22 +21,12 @@ class HighlightedText extends StatelessWidget { @override Widget build(BuildContext context) { if (highlightText.isEmpty) { - return Text( - text, - maxLines: maxLines - 1, - overflow: overflow, - style: style, - ); + return Text(text, maxLines: maxLines, overflow: overflow, style: style); } var i = text.toLowerCase().indexOf(highlightTextLowerCase); if (i == -1) { - return Text( - text, - maxLines: maxLines - 1, - overflow: overflow, - style: style, - ); + return Text(text, maxLines: maxLines, overflow: overflow, style: style); } var highlightStyle = style.copyWith(