mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-30 19:36:25 +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/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,
|
@ -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,
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user