Files
GitJournal/lib/core/folder/flattened_notes_folder.dart
Vishesh Handa e1ea7a4953 Fetch the modified + created time from git
Fixes #78

This is probably the largest commit that I have ever made. From now on -
every File always has an mtime and ctime which is fetched from git.
Notes can optionally override that time by providing yaml metadata.

Additionally the 'filePath' and 'folderPath' is now relative to the
repoPath instead of being the full path.

This will slow down GitJournal like crazy as all the mtimes and ctime
still need to be cached. For my test repo it takes about 23 seconds for
GitJournal to become responsive.
2021-10-26 17:49:08 +02:00

128 lines
2.9 KiB
Dart

/*
* SPDX-FileCopyrightText: 2019-2021 Vishesh Handa <me@vhanda.in>
*
* 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<bool> Function(Note note);
class FlattenedNotesFolder with NotesFolderNotifier implements NotesFolder {
final NotesFolder _parentFolder;
final String title;
final _notes = <Note>[];
final _folders = <NotesFolder>[];
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<void> _noteModified(int _, Note note) async {
notifyNoteModified(-1, note);
}
void _noteRenamed(int _, Note note, String oldPath) {
notifyNoteRenamed(-1, note, oldPath);
}
@override
List<Note> get notes => _notes;
@override
List<NotesFolder> get subFolders => [];
@override
bool get hasNotes => _notes.isNotEmpty;
@override
bool get isEmpty => _notes.isEmpty;
@override
NotesFolder? get parent => null;
@override
NotesFolder get fsFolder {
return _parentFolder;
}
@override
String get name => title;
@override
String get publicName => title;
@override
NotesFolderConfig get config {
return _parentFolder.config;
}
}