diff --git a/assets/langs/en.yaml b/assets/langs/en.yaml index 2ef014b4..cf47d755 100644 --- a/assets/langs/en.yaml +++ b/assets/langs/en.yaml @@ -73,4 +73,13 @@ widgets: empty: Please enter a name exists: Already Exists contains: Cannot contain / + backlinks: + title: + zero: "" + one: "{} Note links to this Note" + many: "{} Notes link to this Note" + two: "{} Notes link to this Note" + few: "{} Notes link to this Note" + other: "{} Notes link to this Note" + rootFolder: Root Folder diff --git a/lib/core/note.dart b/lib/core/note.dart index 8b03f6be..f8db3eca 100644 --- a/lib/core/note.dart +++ b/lib/core/note.dart @@ -406,6 +406,10 @@ class Note with NotesNotifier { _links = links; return links; } + + List links() { + return _links; + } } String buildTitleFileName(String parentDir, String title) { diff --git a/lib/widgets/note_viewer.dart b/lib/widgets/note_viewer.dart index 493edb3c..4d3516ca 100644 --- a/lib/widgets/note_viewer.dart +++ b/lib/widgets/note_viewer.dart @@ -76,6 +76,7 @@ class NoteViewer extends StatelessWidget { url, note.parent.folderPath + p.separator, null, null), ), ), + const SizedBox(height: 16.0), NoteBacklinkRenderer(note: note, rootFolder: rootFolder), // _buildFooter(context), ], diff --git a/lib/widgets/notes_backlinks.dart b/lib/widgets/notes_backlinks.dart index 0abe16fa..9b255d8f 100644 --- a/lib/widgets/notes_backlinks.dart +++ b/lib/widgets/notes_backlinks.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:gitjournal/folder_views/common.dart'; @@ -51,49 +52,110 @@ class _NoteBacklinkRendererState extends State { return Container(); } + var title = widget.note.title; + if (title.isEmpty) { + title = widget.note.fileName; + } + + var num = linkedNotes.length; var textTheme = Theme.of(context).textTheme; var c = Column( children: [ - Text('BackLinks', style: textTheme.headline5), + Text( + plural("widgets.backlinks.title", num), + style: textTheme.headline6, + ), const SizedBox(height: 8.0), - for (var n in linkedNotes) - NoteSnippet(n, () { - openNoteEditor(context, n); - }), + for (var note in linkedNotes) + NoteSnippet( + note: note, + parentNote: widget.note, + onTap: () { + openNoteEditor(context, note); + }, + ), ], mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, ); - return Padding( - padding: const EdgeInsets.fromLTRB(0.0, 16.0, 0.0, 16.0), - child: c, + var backgroundColor = Colors.grey[200]; + if (Theme.of(context).brightness == Brightness.dark) { + backgroundColor = Theme.of(context).backgroundColor; + } + return Container( + color: backgroundColor, + width: MediaQuery.of(context).size.width, + child: Padding( + padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 16.0), + child: c, + ), ); } } class NoteSnippet extends StatelessWidget { final Note note; + final Note parentNote; final Function onTap; - NoteSnippet(this.note, this.onTap); + NoteSnippet({ + @required this.note, + @required this.parentNote, + @required this.onTap, + }); @override Widget build(BuildContext context) { - var textTheme = Theme.of(context).textTheme; + var theme = Theme.of(context); + var textTheme = theme.textTheme; var title = note.title; if (title.isEmpty) { title = note.fileName; } return Padding( - padding: const EdgeInsets.fromLTRB(0.0, 8.0, 0, 8.0), - child: GestureDetector( - onTap: () { - openNoteEditor(context, note); - }, - child: Text('- $title', style: textTheme.bodyText1), + padding: const EdgeInsets.fromLTRB(0.0, 8.0, 0.0, 8.0), + child: Container( + color: theme.scaffoldBackgroundColor, + width: MediaQuery.of(context).size.width, + child: GestureDetector( + onTap: () { + openNoteEditor(context, note); + }, + child: Column( + children: [ + Text('$title', style: textTheme.bodyText1), + const SizedBox(height: 8.0), + _buildSummary(context), + ], + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + ), + ), ), ); } + + Widget _buildSummary(BuildContext context) { + var textTheme = Theme.of(context).textTheme; + var links = note.links(); + if (links == null) { + return Container(); + } + + var link = links.where((l) => l.filePath == parentNote.filePath).first; + var body = note.body.split('\n'); + var paragraph = body.firstWhere( + (line) => line.contains('[${link.term}]'), + orElse: () => "", + ); + // vHanda: This isn't a very fool proof way of figuring out the line + + return Text( + paragraph, + style: textTheme.bodyText2, + maxLines: 3, + ); + } }