diff --git a/lib/folder_views/common.dart b/lib/folder_views/common.dart index d1ceed76..26ca1abe 100644 --- a/lib/folder_views/common.dart +++ b/lib/folder_views/common.dart @@ -2,6 +2,7 @@ import 'package:fimber/fimber.dart'; import 'package:flutter/material.dart'; import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/folder_views/journal_view.dart'; import 'package:gitjournal/screens/note_editor.dart'; import 'package:gitjournal/utils.dart'; @@ -33,12 +34,17 @@ Widget buildFolderView( switch (viewType) { case FolderViewType.Standard: - case FolderViewType.Journal: return StandardView( folder: folder, noteSelectedFunction: noteSelectionFn, emptyText: emptyText, ); + case FolderViewType.Journal: + return JournalView( + folder: folder, + noteSelectedFunction: noteSelectionFn, + emptyText: emptyText, + ); } assert(false, "Code path should never be executed"); diff --git a/lib/folder_views/journal_view.dart b/lib/folder_views/journal_view.dart new file mode 100644 index 00000000..4577f3ce --- /dev/null +++ b/lib/folder_views/journal_view.dart @@ -0,0 +1,99 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:gitjournal/folder_views/list_view.dart'; + +import 'package:intl/intl.dart'; + +import 'package:gitjournal/core/sorting_mode.dart'; +import 'package:gitjournal/settings.dart'; +import 'package:gitjournal/core/note.dart'; +import 'package:gitjournal/core/notes_folder.dart'; + +class JournalView extends StatelessWidget { + final NoteSelectedFunction noteSelectedFunction; + final NotesFolderReadOnly folder; + final String emptyText; + + JournalView({ + @required this.folder, + @required this.noteSelectedFunction, + @required this.emptyText, + }); + + @override + @override + Widget build(BuildContext context) { + return FolderListView( + folder: folder, + noteSelectedFunction: noteSelectedFunction, + emptyText: emptyText, + noteTileBuilder: _buildRow, + ); + } + + Widget _buildRow(BuildContext context, Note note) { + Widget titleWidget = Container(); + var textTheme = Theme.of(context).textTheme; + DateTime date; + if (Settings.instance.sortingMode == SortingMode.Modified) { + date = note.modified; + } else if (Settings.instance.sortingMode == SortingMode.Created) { + date = note.created; + } + if (date != null) { + var formatter = DateFormat('dd MMM, yyyy '); + var dateStr = formatter.format(date); + + var timeFormatter = DateFormat('Hm'); + var time = timeFormatter.format(date); + + var timeColor = textTheme.body1.color.withAlpha(100); + + titleWidget = Row( + children: [ + Text(dateStr, style: textTheme.title), + Text(time, style: textTheme.body1.copyWith(color: timeColor)), + ], + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + ); + } + + var children = [ + const SizedBox(height: 8.0), + Text( + note.summary, + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: textTheme.body1, + ), + ]; + + var tile = ListTile( + isThreeLine: true, + title: titleWidget, + subtitle: Column( + children: children, + crossAxisAlignment: CrossAxisAlignment.start, + ), + onTap: () => noteSelectedFunction(note), + ); + + var dc = Theme.of(context).dividerColor; + var divider = Container( + height: 1.0, + child: Divider(color: dc.withOpacity(dc.opacity / 3)), + ); + + return Column( + children: [ + divider, + Padding( + padding: const EdgeInsets.only(top: 16.0, bottom: 16.0), + child: tile, + ), + divider, + ], + ); + } +} diff --git a/lib/screens/folder_view.dart b/lib/screens/folder_view.dart index 14d414b4..5cf9cb24 100644 --- a/lib/screens/folder_view.dart +++ b/lib/screens/folder_view.dart @@ -70,6 +70,10 @@ class _FolderViewState extends State { title: Text(title), leading: GJAppBarMenuButton(), actions: [ + IconButton( + icon: const Icon(Icons.library_books), + onPressed: _folderViewChooserSelected, + ), if (appState.remoteGitRepoConfigured) SyncButton(), IconButton( icon: Icon(Icons.search), @@ -154,4 +158,42 @@ class _FolderViewState extends State { }); } } + + void _folderViewChooserSelected() async { + var onViewChange = (FolderViewType vt) => Navigator.of(context).pop(vt); + + var newViewType = await showDialog( + context: context, + builder: (BuildContext context) { + var children = [ + RadioListTile( + title: const Text("Standard View"), + value: FolderViewType.Standard, + groupValue: _viewType, + onChanged: onViewChange, + ), + RadioListTile( + title: const Text("Journal View"), + value: FolderViewType.Journal, + groupValue: _viewType, + onChanged: onViewChange, + ), + ]; + + return AlertDialog( + title: const Text("Select View"), + content: Column( + children: children, + mainAxisSize: MainAxisSize.min, + ), + ); + }, + ); + + if (newViewType != null) { + setState(() { + _viewType = newViewType; + }); + } + } }