/* * SPDX-FileCopyrightText: 2019-2021 Vishesh Handa * * SPDX-License-Identifier: AGPL-3.0-or-later */ import 'package:gitjournal/core/folder/notes_folder.dart'; import 'package:gitjournal/core/folder/notes_folder_notifier.dart'; import 'package:gitjournal/core/note.dart'; typedef NotesFilter = Future Function(Note note); class FlattenedNotesFolder with NotesFolderNotifier implements NotesFolder { final NotesFolder _parentFolder; final String title; final _notes = []; final _folders = []; FlattenedNotesFolder(this._parentFolder, {required this.title}) { _addFolder(_parentFolder); } void _addFolder(NotesFolder folder) { _folders.add(folder); // Add Change notifiers folder.addFolderAddedListener(_folderAdded); folder.addFolderRemovedListener(_folderRemoved); folder.addNoteAddedListener(_noteAdded); folder.addNoteRemovedListener(_noteRemoved); folder.addNoteModifiedListener(_noteModified); folder.addNoteRenameListener(_noteRenamed); // 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) { // // FIXME: Wouldn't all the notes from this folder also need to be removed? // folder.removeFolderAddedListener(_folderAdded); folder.removeFolderRemovedListener(_folderRemoved); folder.removeNoteAddedListener(_noteAdded); folder.removeNoteRemovedListener(_noteRemoved); folder.removeNoteModifiedListener(_noteModified); folder.removeNoteRenameListener(_noteRenamed); } void _noteAdded(int _, Note note) { _notes.add(note); notifyNoteAdded(_notes.length - 1, note); } void _noteRemoved(int _, Note note) { var i = _notes.indexWhere((n) => n.filePath == note.filePath); if (i == -1) { return; } assert(i != -1); var _ = _notes.removeAt(i); notifyNoteRemoved(i, note); } Future _noteModified(int _, Note note) async { notifyNoteModified(-1, note); } void _noteRenamed(int _, Note note, String oldPath) { notifyNoteRenamed(-1, note, oldPath); } @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 NotesFolder? get fsFolder => _parentFolder.fsFolder; @override String get name => title; @override String get publicName => title; @override NotesFolderConfig get config { return _parentFolder.config; } }