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/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<JournalList> {
class _StandardViewState extends State<StandardView> {
var _listKey = GlobalKey<AnimatedListState>();
var deletedViaDismissed = <String>[];
@ -111,7 +113,7 @@ class _JournalListState extends State<JournalList> {
Widget _buildNote(
BuildContext context, Note note, Animation<double> 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<JournalList> {
);
return SizeTransition(
key: ValueKey("JournalList_tr_" + note.filePath),
key: ValueKey("StandardView_tr_" + note.filePath),
axis: Axis.vertical,
sizeFactor: animation,
child: viewItem,

View File

@ -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<FolderView> {
SortedNotesFolder sortedNotesFolder;
FolderViewType _viewType;
@override
void initState() {
@ -36,6 +35,7 @@ class _FolderViewState extends State<FolderView> {
folder: widget.notesFolder,
sortingMode: Settings.instance.sortingMode,
);
_viewType = FolderViewType.Standard;
}
@override
@ -53,6 +53,18 @@ class _FolderViewState extends State<FolderView> {
? "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<FolderView> {
onPressed: () {
showSearch(
context: context,
delegate: NoteSearchDelegate(sortedNotesFolder.notes),
delegate: NoteSearchDelegate(
sortedNotesFolder.notes,
_viewType,
),
);
},
),
@ -78,7 +93,7 @@ class _FolderViewState extends State<FolderView> {
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<FolderView> {
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<SortingMode>(
context: context,

View File

@ -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<Note> {
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
@override
@ -54,15 +53,15 @@ class NoteSearchDelegate extends SearchDelegate<Note> {
@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<Note> {
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);
}
}