diff --git a/lib/core/flattened_notes_folder.dart b/lib/core/flattened_notes_folder.dart new file mode 100644 index 00000000..ec092498 --- /dev/null +++ b/lib/core/flattened_notes_folder.dart @@ -0,0 +1,105 @@ +import 'package:gitjournal/core/note.dart'; +import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_notifier.dart'; + +class FlattenedNotesFolder + with NotesFolderNotifier + implements NotesFolderReadOnly { + final NotesFolder _parentFolder; + + var _notes = []; + var _noteExtraInfo = {}; + + var _folders = []; + + FlattenedNotesFolder(this._parentFolder) { + _addFolder(_parentFolder); + } + + void _addFolder(NotesFolderReadOnly folder) { + _folders.add(folder); + + // Add Change notifiers + folder.addFolderAddedListener(_folderAdded); + folder.addFolderRemovedListener(_folderRemoved); + + folder.addNoteAddedListener(_noteAdded); + folder.addNoteRemovedListener(_noteRemoved); + folder.addNoteModifiedListener(_noteModified); + + // Add Individual Notes + for (var note in folder.notes) { + _noteAdded(-1, note); + } + + // Add Sub-Folders + for (var folder in folder.subFolders) { + _addFolder(folder); + } + } + + @override + void dispose() { + for (var folder in _folders) { + _folderRemoved(-1, folder); + } + + super.dispose(); + } + + void _folderAdded(int _, NotesFolder folder) { + _addFolder(folder); + } + + void _folderRemoved(int _, NotesFolder folder) { + folder.removeFolderAddedListener(_folderAdded); + folder.removeFolderRemovedListener(_folderRemoved); + + folder.removeNoteAddedListener(_noteAdded); + folder.removeNoteRemovedListener(_noteRemoved); + folder.removeNoteModifiedListener(_noteModified); + } + + void _noteAdded(int _, Note note) { + _notes.add(note); + _noteExtraInfo[note] = _notes.length - 1; + + notifyNoteAdded(-1, note); + } + + void _noteRemoved(int _, Note note) { + assert(_noteExtraInfo.containsKey(note)); + + var i = _noteExtraInfo[note]; + _notes.removeAt(i); + + notifyNoteRemoved(-1, note); + } + + void _noteModified(int i, Note note) { + notifyNoteModified(-1, note); + } + + @override + List get notes => _notes; + + @override + List get subFolders => []; + + @override + bool get hasNotes => _notes.isNotEmpty; + + @override + bool get isEmpty => _notes.isEmpty; + + @override + NotesFolder get parent => null; + + @override + String pathSpec() => ""; + + @override + NotesFolder get fsFolder { + return _parentFolder; + } +} diff --git a/lib/core/notes_folder.dart b/lib/core/notes_folder.dart index 88a0469b..e7c836a5 100644 --- a/lib/core/notes_folder.dart +++ b/lib/core/notes_folder.dart @@ -11,11 +11,17 @@ abstract class NotesFolderReadOnly implements NotesFolderNotifier { bool get isEmpty; bool get hasNotes; List get notes; + List get subFolders; + NotesFolderReadOnly get parent; + NotesFolder get fsFolder; + + String pathSpec(); } class NotesFolder with NotesFolderNotifier implements NotesFolderReadOnly, Comparable { + @override final NotesFolder parent; String _folderPath; @@ -110,6 +116,7 @@ class NotesFolder return _notes; } + @override List get subFolders { // FIXME: This is really not ideal _folders.sort(); @@ -304,6 +311,7 @@ class NotesFolder notifyListeners(); } + @override String pathSpec() { if (parent == null) { return ""; @@ -328,4 +336,9 @@ class NotesFolder } } } + + @override + NotesFolder get fsFolder { + return this; + } } diff --git a/lib/core/sorted_notes_folder.dart b/lib/core/sorted_notes_folder.dart index f4fc5a31..c37d7069 100644 --- a/lib/core/sorted_notes_folder.dart +++ b/lib/core/sorted_notes_folder.dart @@ -9,7 +9,7 @@ import 'notes_folder_notifier.dart'; class SortedNotesFolder with NotesFolderNotifier implements NotesFolderReadOnly { - final NotesFolder folder; + final NotesFolderReadOnly folder; SortingMode _sortingMode; NoteSortingFunction _sortFunc; @@ -83,7 +83,7 @@ class SortedNotesFolder _notes.removeAt(i); _insertInCorrectPos(note); - notifyListeners(); + notifyNoteModified(-1, note); } int _insertInCorrectPos(Note note) { @@ -101,6 +101,9 @@ class SortedNotesFolder @override List get notes => _notes; + @override + List get subFolders => folder.subFolders; + @override bool get hasNotes => folder.hasNotes; @@ -117,4 +120,15 @@ class SortedNotesFolder } SortingMode get sortingMode => _sortingMode; + + @override + NotesFolder get parent => folder.parent; + + @override + String pathSpec() => folder.pathSpec(); + + @override + NotesFolder get fsFolder { + return folder; + } } diff --git a/lib/core/virtual_notes_folder.dart b/lib/core/virtual_notes_folder.dart index 6459e11a..f997e45e 100644 --- a/lib/core/virtual_notes_folder.dart +++ b/lib/core/virtual_notes_folder.dart @@ -12,9 +12,23 @@ class VirtualNotesFolder @override List get notes => _notes; + @override + List get subFolders => []; + @override bool get isEmpty => _notes.isEmpty; @override bool get hasNotes => _notes.isNotEmpty; + + @override + NotesFolder get parent => null; + + @override + String pathSpec() => ""; + + @override + NotesFolder get fsFolder { + return null; + } } diff --git a/lib/screens/folder_view.dart b/lib/screens/folder_view.dart index 1b912f22..168c6d41 100644 --- a/lib/screens/folder_view.dart +++ b/lib/screens/folder_view.dart @@ -23,7 +23,7 @@ enum DropDownChoices { } class FolderView extends StatefulWidget { - final NotesFolder notesFolder; + final NotesFolderReadOnly notesFolder; FolderView({@required this.notesFolder}); @@ -173,7 +173,7 @@ class _FolderViewState extends State { void _newPost(BuildContext context) { var route = MaterialPageRoute( - builder: (context) => NoteEditor.newNote(widget.notesFolder)); + builder: (context) => NoteEditor.newNote(widget.notesFolder.fsFolder)); Navigator.of(context).push(route); } diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index b2ba7ab0..04262fe6 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -1,14 +1,36 @@ import 'package:flutter/material.dart'; +import 'package:gitjournal/core/flattened_notes_folder.dart'; import 'package:provider/provider.dart'; import 'package:gitjournal/core/notes_folder.dart'; import 'folder_view.dart'; -class HomeScreen extends StatelessWidget { +class HomeScreen extends StatefulWidget { + @override + _HomeScreenState createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + FlattenedNotesFolder flattenedNotesFolder; + + @override + void initState() { + super.initState(); + Future.delayed(Duration.zero, () { + final rootFolder = Provider.of(context); + setState(() { + flattenedNotesFolder = FlattenedNotesFolder(rootFolder); + }); + }); + } + @override Widget build(BuildContext context) { - final notesFolder = Provider.of(context); - return FolderView(notesFolder: notesFolder); + if (flattenedNotesFolder == null) { + return Container(); + } + + return FolderView(notesFolder: flattenedNotesFolder); } }