diff --git a/lib/note_folder.dart b/lib/note_folder.dart new file mode 100644 index 00000000..19ba13bc --- /dev/null +++ b/lib/note_folder.dart @@ -0,0 +1,40 @@ +import 'package:gitjournal/note.dart'; + +class NoteFSEntity { + NoteFolder parent; + NoteFolder folder; + Note note; + + NoteFSEntity(this.parent, {this.folder, this.note}) { + assert(folder != null || note != null); + } + + bool get isNote { + return note != null; + } + + bool get isFolder { + return folder != null; + } +} + +class NoteFolder { + List entities = []; + String folderPath; + + NoteFolder(this.folderPath); + + // Recurisvely gets all Notes within this folder + List getAllNotes() { + var notes = []; + + for (var entity in entities) { + if (entity.isNote) { + notes.add(entity.note); + } else { + notes.addAll(entity.folder.getAllNotes()); + } + } + return notes; + } +} diff --git a/lib/storage/git_storage.dart b/lib/storage/git_storage.dart index 6c22ac52..efd54f68 100644 --- a/lib/storage/git_storage.dart +++ b/lib/storage/git_storage.dart @@ -5,6 +5,7 @@ import 'package:fimber/fimber.dart'; import 'package:flutter/foundation.dart'; import 'package:gitjournal/apis/git.dart'; import 'package:gitjournal/note.dart'; +import 'package:gitjournal/note_folder.dart'; import 'package:gitjournal/settings.dart'; import 'package:path/path.dart' as p; @@ -76,22 +77,39 @@ class GitNoteRepository { } Future> listNotes() async { - final dir = Directory(notesBasePath); + var noteFolder = await loadFolder(NoteFolder(notesBasePath)); + var notes = noteFolder.getAllNotes(); + notes.sort((a, b) => b.compareTo(a)); - var notes = []; - var lister = dir.list(recursive: false); - await for (var fileEntity in lister) { - var note = Note(fileEntity.path); + return notes; + } + + // FIXME: This asynchronously loads everything. Maybe it should just list them, and the individual entities + // should be loaded as required? + Future loadFolder(NoteFolder rootFolder) async { + final dir = Directory(rootFolder.folderPath); + + var lister = dir.list(recursive: false, followLinks: false); + await for (var fsEntity in lister) { + if (fsEntity is Directory) { + var subFolder = NoteFolder(fsEntity.path); + subFolder = await loadFolder(subFolder); + + var noteFSEntity = NoteFSEntity(rootFolder, folder: subFolder); + rootFolder.entities.add(noteFSEntity); + } + + var note = Note(fsEntity.path); if (!note.filePath.toLowerCase().endsWith('.md')) { continue; } await note.load(); - notes.add(note); + + var noteFSEntity = NoteFSEntity(rootFolder, note: note); + rootFolder.entities.add(noteFSEntity); } - // Reverse sort - notes.sort((a, b) => b.compareTo(a)); - return notes; + return rootFolder; } Future sync() async {