mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-29 02:07:39 +08:00
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:
46
lib/folder_views/common.dart
Normal file
46
lib/folder_views/common.dart
Normal 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();
|
||||
}
|
@ -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,
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user