diff --git a/lib/folder_views/common.dart b/lib/folder_views/common.dart new file mode 100644 index 00000000..d1ceed76 --- /dev/null +++ b/lib/folder_views/common.dart @@ -0,0 +1,46 @@ +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/screens/note_editor.dart'; +import 'package:gitjournal/utils.dart'; + +import 'standard_view.dart'; + +enum FolderViewType { + Standard, + Journal, +} + +Widget buildFolderView( + BuildContext context, + FolderViewType viewType, + NotesFolderReadOnly folder, + String emptyText, +) { + var noteSelectionFn = (Note note) async { + var route = MaterialPageRoute( + builder: (context) => NoteEditor.fromNote(note), + ); + var showUndoSnackBar = await Navigator.of(context).push(route); + if (showUndoSnackBar != null) { + Fimber.d("Showing an undo snackbar"); + + var snackBar = buildUndoDeleteSnackbar(context, note); + Scaffold.of(context).showSnackBar(snackBar); + } + }; + + switch (viewType) { + case FolderViewType.Standard: + case FolderViewType.Journal: + return StandardView( + folder: folder, + noteSelectedFunction: noteSelectionFn, + emptyText: emptyText, + ); + } + + assert(false, "Code path should never be executed"); + return Container(); +} diff --git a/lib/widgets/journal_list.dart b/lib/folder_views/standard_view.dart similarity index 95% rename from lib/widgets/journal_list.dart rename to lib/folder_views/standard_view.dart index 50168f93..88ea662d 100644 --- a/lib/widgets/journal_list.dart +++ b/lib/folder_views/standard_view.dart @@ -1,33 +1,35 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; + +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + import 'package:gitjournal/core/sorting_mode.dart'; import 'package:gitjournal/settings.dart'; -import 'package:intl/intl.dart'; import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/utils.dart'; import 'package:gitjournal/widgets/icon_dismissable.dart'; -import 'package:provider/provider.dart'; typedef void NoteSelectedFunction(Note note); -class JournalList extends StatefulWidget { +class StandardView extends StatefulWidget { final NoteSelectedFunction noteSelectedFunction; final NotesFolderReadOnly folder; final String emptyText; - JournalList({ + StandardView({ @required this.folder, @required this.noteSelectedFunction, @required this.emptyText, }); @override - _JournalListState createState() => _JournalListState(); + _StandardViewState createState() => _StandardViewState(); } -class _JournalListState extends State { +class _StandardViewState extends State { var _listKey = GlobalKey(); var deletedViaDismissed = []; @@ -111,7 +113,7 @@ class _JournalListState extends State { Widget _buildNote( BuildContext context, Note note, Animation animation) { var viewItem = IconDismissable( - key: ValueKey("JournalList_" + note.filePath), + key: ValueKey("StandardView_" + note.filePath), child: Hero( tag: note.filePath, child: _buildRow(context, note), @@ -137,7 +139,7 @@ class _JournalListState extends State { ); return SizeTransition( - key: ValueKey("JournalList_tr_" + note.filePath), + key: ValueKey("StandardView_tr_" + note.filePath), axis: Axis.vertical, sizeFactor: animation, child: viewItem, diff --git a/lib/screens/folder_view.dart b/lib/screens/folder_view.dart index 6bf4f557..14d414b4 100644 --- a/lib/screens/folder_view.dart +++ b/lib/screens/folder_view.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:fimber/fimber.dart'; -import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/sorted_notes_folder.dart'; import 'package:gitjournal/core/sorting_mode.dart'; @@ -11,9 +9,9 @@ import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/utils.dart'; import 'package:gitjournal/widgets/app_drawer.dart'; import 'package:gitjournal/widgets/app_bar_menu_button.dart'; -import 'package:gitjournal/widgets/journal_list.dart'; import 'package:gitjournal/widgets/note_search_delegate.dart'; import 'package:gitjournal/widgets/sync_button.dart'; +import 'package:gitjournal/folder_views/common.dart'; import 'package:provider/provider.dart'; @@ -28,6 +26,7 @@ class FolderView extends StatefulWidget { class _FolderViewState extends State { SortedNotesFolder sortedNotesFolder; + FolderViewType _viewType; @override void initState() { @@ -36,6 +35,7 @@ class _FolderViewState extends State { folder: widget.notesFolder, sortingMode: Settings.instance.sortingMode, ); + _viewType = FolderViewType.Standard; } @override @@ -53,6 +53,18 @@ class _FolderViewState extends State { ? "Notes" : widget.notesFolder.pathSpec(); + var folderView = Builder( + builder: (BuildContext context) { + const emptyText = "Let's add some notes?"; + return buildFolderView( + context, + _viewType, + sortedNotesFolder, + emptyText, + ); + }, + ); + return Scaffold( appBar: AppBar( title: Text(title), @@ -64,7 +76,10 @@ class _FolderViewState extends State { onPressed: () { showSearch( context: context, - delegate: NoteSearchDelegate(sortedNotesFolder.notes), + delegate: NoteSearchDelegate( + sortedNotesFolder.notes, + _viewType, + ), ); }, ), @@ -78,7 +93,7 @@ class _FolderViewState extends State { body: Center( child: Builder( builder: (context) => RefreshIndicator( - child: Scrollbar(child: buildJournalList(sortedNotesFolder)), + child: Scrollbar(child: folderView), onRefresh: () async => _syncRepo(context), ), ), @@ -102,29 +117,6 @@ class _FolderViewState extends State { Navigator.of(context).push(route); } - Widget buildJournalList(NotesFolderReadOnly folder) { - return Builder( - builder: (context) { - return JournalList( - folder: folder, - noteSelectedFunction: (Note note) async { - var route = MaterialPageRoute( - builder: (context) => NoteEditor.fromNote(note), - ); - var showUndoSnackBar = await Navigator.of(context).push(route); - if (showUndoSnackBar != null) { - Fimber.d("Showing an undo snackbar"); - - var snackBar = buildUndoDeleteSnackbar(context, note); - Scaffold.of(context).showSnackBar(snackBar); - } - }, - emptyText: "Let's add some notes?", - ); - }, - ); - } - void _sortButtonPressed() async { var newSortingMode = await showDialog( context: context, diff --git a/lib/widgets/note_search_delegate.dart b/lib/widgets/note_search_delegate.dart index 893adba0..a71b57c2 100644 --- a/lib/widgets/note_search_delegate.dart +++ b/lib/widgets/note_search_delegate.dart @@ -1,17 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:fimber/fimber.dart'; import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/virtual_notes_folder.dart'; -import 'package:gitjournal/screens/note_editor.dart'; import 'package:gitjournal/themes.dart'; -import 'package:gitjournal/utils.dart'; -import 'package:gitjournal/widgets/journal_list.dart'; + +import 'package:gitjournal/folder_views/common.dart'; class NoteSearchDelegate extends SearchDelegate { final List notes; + final FolderViewType viewType; - NoteSearchDelegate(this.notes); + NoteSearchDelegate(this.notes, this.viewType); // Workaround because of https://github.com/flutter/flutter/issues/32180 @override @@ -54,15 +53,15 @@ class NoteSearchDelegate extends SearchDelegate { @override Widget buildResults(BuildContext context) { - return buildJournalList(context, query); + return buildView(context, query); } @override Widget buildSuggestions(BuildContext context) { - return buildJournalList(context, query); + return buildView(context, query); } - JournalList buildJournalList(BuildContext context, String query) { + Widget buildView(BuildContext context, String query) { // TODO: This should be made far more efficient var q = query.toLowerCase(); var filteredNotes = notes.where((note) { @@ -72,23 +71,9 @@ class NoteSearchDelegate extends SearchDelegate { return note.body.toLowerCase().contains(q); }).toList(); - Widget journalList = JournalList( - folder: VirtualNotesFolder(filteredNotes), - noteSelectedFunction: (Note note) async { - var route = MaterialPageRoute( - builder: (context) => NoteEditor.fromNote(note), - ); + var folder = VirtualNotesFolder(filteredNotes); + const emptyText = "No Search Results Found"; - var showUndoSnackBar = await Navigator.of(context).push(route); - if (showUndoSnackBar != null) { - Fimber.d("Showing an undo snackbar"); - - var snackBar = buildUndoDeleteSnackbar(context, note); - Scaffold.of(context).showSnackBar(snackBar); - } - }, - emptyText: "No Search Results Found", - ); - return journalList; + return buildFolderView(context, viewType, folder, emptyText); } }