Add the concept of a FolderView

For now we just have the StandardView which is the same as it was
previously.
This commit is contained in:
Vishesh Handa
2020-03-05 02:10:27 +01:00
parent 6d3b093499
commit b25ed00830
4 changed files with 86 additions and 61 deletions

View File

@ -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();
}

View File

@ -1,33 +1,35 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.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/core/sorting_mode.dart';
import 'package:gitjournal/settings.dart'; import 'package:gitjournal/settings.dart';
import 'package:intl/intl.dart';
import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/notes_folder.dart';
import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/state_container.dart';
import 'package:gitjournal/utils.dart'; import 'package:gitjournal/utils.dart';
import 'package:gitjournal/widgets/icon_dismissable.dart'; import 'package:gitjournal/widgets/icon_dismissable.dart';
import 'package:provider/provider.dart';
typedef void NoteSelectedFunction(Note note); typedef void NoteSelectedFunction(Note note);
class JournalList extends StatefulWidget { class StandardView extends StatefulWidget {
final NoteSelectedFunction noteSelectedFunction; final NoteSelectedFunction noteSelectedFunction;
final NotesFolderReadOnly folder; final NotesFolderReadOnly folder;
final String emptyText; final String emptyText;
JournalList({ StandardView({
@required this.folder, @required this.folder,
@required this.noteSelectedFunction, @required this.noteSelectedFunction,
@required this.emptyText, @required this.emptyText,
}); });
@override @override
_JournalListState createState() => _JournalListState(); _StandardViewState createState() => _StandardViewState();
} }
class _JournalListState extends State<JournalList> { class _StandardViewState extends State<StandardView> {
var _listKey = GlobalKey<AnimatedListState>(); var _listKey = GlobalKey<AnimatedListState>();
var deletedViaDismissed = <String>[]; var deletedViaDismissed = <String>[];
@ -111,7 +113,7 @@ class _JournalListState extends State<JournalList> {
Widget _buildNote( Widget _buildNote(
BuildContext context, Note note, Animation<double> animation) { BuildContext context, Note note, Animation<double> animation) {
var viewItem = IconDismissable( var viewItem = IconDismissable(
key: ValueKey("JournalList_" + note.filePath), key: ValueKey("StandardView_" + note.filePath),
child: Hero( child: Hero(
tag: note.filePath, tag: note.filePath,
child: _buildRow(context, note), child: _buildRow(context, note),
@ -137,7 +139,7 @@ class _JournalListState extends State<JournalList> {
); );
return SizeTransition( return SizeTransition(
key: ValueKey("JournalList_tr_" + note.filePath), key: ValueKey("StandardView_tr_" + note.filePath),
axis: Axis.vertical, axis: Axis.vertical,
sizeFactor: animation, sizeFactor: animation,
child: viewItem, child: viewItem,

View File

@ -1,7 +1,5 @@
import 'package:flutter/material.dart'; 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/notes_folder.dart';
import 'package:gitjournal/core/sorted_notes_folder.dart'; import 'package:gitjournal/core/sorted_notes_folder.dart';
import 'package:gitjournal/core/sorting_mode.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/utils.dart';
import 'package:gitjournal/widgets/app_drawer.dart'; import 'package:gitjournal/widgets/app_drawer.dart';
import 'package:gitjournal/widgets/app_bar_menu_button.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/note_search_delegate.dart';
import 'package:gitjournal/widgets/sync_button.dart'; import 'package:gitjournal/widgets/sync_button.dart';
import 'package:gitjournal/folder_views/common.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -28,6 +26,7 @@ class FolderView extends StatefulWidget {
class _FolderViewState extends State<FolderView> { class _FolderViewState extends State<FolderView> {
SortedNotesFolder sortedNotesFolder; SortedNotesFolder sortedNotesFolder;
FolderViewType _viewType;
@override @override
void initState() { void initState() {
@ -36,6 +35,7 @@ class _FolderViewState extends State<FolderView> {
folder: widget.notesFolder, folder: widget.notesFolder,
sortingMode: Settings.instance.sortingMode, sortingMode: Settings.instance.sortingMode,
); );
_viewType = FolderViewType.Standard;
} }
@override @override
@ -53,6 +53,18 @@ class _FolderViewState extends State<FolderView> {
? "Notes" ? "Notes"
: widget.notesFolder.pathSpec(); : widget.notesFolder.pathSpec();
var folderView = Builder(
builder: (BuildContext context) {
const emptyText = "Let's add some notes?";
return buildFolderView(
context,
_viewType,
sortedNotesFolder,
emptyText,
);
},
);
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(title), title: Text(title),
@ -64,7 +76,10 @@ class _FolderViewState extends State<FolderView> {
onPressed: () { onPressed: () {
showSearch( showSearch(
context: context, context: context,
delegate: NoteSearchDelegate(sortedNotesFolder.notes), delegate: NoteSearchDelegate(
sortedNotesFolder.notes,
_viewType,
),
); );
}, },
), ),
@ -78,7 +93,7 @@ class _FolderViewState extends State<FolderView> {
body: Center( body: Center(
child: Builder( child: Builder(
builder: (context) => RefreshIndicator( builder: (context) => RefreshIndicator(
child: Scrollbar(child: buildJournalList(sortedNotesFolder)), child: Scrollbar(child: folderView),
onRefresh: () async => _syncRepo(context), onRefresh: () async => _syncRepo(context),
), ),
), ),
@ -102,29 +117,6 @@ class _FolderViewState extends State<FolderView> {
Navigator.of(context).push(route); 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 { void _sortButtonPressed() async {
var newSortingMode = await showDialog<SortingMode>( var newSortingMode = await showDialog<SortingMode>(
context: context, context: context,

View File

@ -1,17 +1,16 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fimber/fimber.dart';
import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/virtual_notes_folder.dart'; import 'package:gitjournal/core/virtual_notes_folder.dart';
import 'package:gitjournal/screens/note_editor.dart';
import 'package:gitjournal/themes.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<Note> { class NoteSearchDelegate extends SearchDelegate<Note> {
final List<Note> notes; final List<Note> notes;
final FolderViewType viewType;
NoteSearchDelegate(this.notes); NoteSearchDelegate(this.notes, this.viewType);
// Workaround because of https://github.com/flutter/flutter/issues/32180 // Workaround because of https://github.com/flutter/flutter/issues/32180
@override @override
@ -54,15 +53,15 @@ class NoteSearchDelegate extends SearchDelegate<Note> {
@override @override
Widget buildResults(BuildContext context) { Widget buildResults(BuildContext context) {
return buildJournalList(context, query); return buildView(context, query);
} }
@override @override
Widget buildSuggestions(BuildContext context) { 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 // TODO: This should be made far more efficient
var q = query.toLowerCase(); var q = query.toLowerCase();
var filteredNotes = notes.where((note) { var filteredNotes = notes.where((note) {
@ -72,23 +71,9 @@ class NoteSearchDelegate extends SearchDelegate<Note> {
return note.body.toLowerCase().contains(q); return note.body.toLowerCase().contains(q);
}).toList(); }).toList();
Widget journalList = JournalList( var folder = VirtualNotesFolder(filteredNotes);
folder: VirtualNotesFolder(filteredNotes), const emptyText = "No Search Results Found";
noteSelectedFunction: (Note note) async {
var route = MaterialPageRoute(
builder: (context) => NoteEditor.fromNote(note),
);
var showUndoSnackBar = await Navigator.of(context).push(route); return buildFolderView(context, viewType, folder, emptyText);
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;
} }
} }